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
f4fbfb0d
Commit
f4fbfb0d
authored
Jul 19, 2007
by
Tony Luck
Browse files
Options
Browse Files
Download
Plain Diff
Pull vector-domain into release branch
parents
ffc72040
bf903d0a
Changes
9
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
634 additions
and
400 deletions
+634
-400
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+3
-0
arch/ia64/kernel/iosapic.c
arch/ia64/kernel/iosapic.c
+298
-354
arch/ia64/kernel/irq.c
arch/ia64/kernel/irq.c
+1
-1
arch/ia64/kernel/irq_ia64.c
arch/ia64/kernel/irq_ia64.c
+282
-35
arch/ia64/kernel/msi_ia64.c
arch/ia64/kernel/msi_ia64.c
+19
-4
arch/ia64/kernel/smpboot.c
arch/ia64/kernel/smpboot.c
+4
-0
include/asm-ia64/hw_irq.h
include/asm-ia64/hw_irq.h
+16
-2
include/asm-ia64/iosapic.h
include/asm-ia64/iosapic.h
+4
-2
include/asm-ia64/irq.h
include/asm-ia64/irq.h
+7
-2
No files found.
Documentation/kernel-parameters.txt
View file @
f4fbfb0d
...
@@ -1885,6 +1885,9 @@ and is between 256 and 4096 characters. It is defined in the file
...
@@ -1885,6 +1885,9 @@ and is between 256 and 4096 characters. It is defined in the file
vdso=1: enable VDSO (default)
vdso=1: enable VDSO (default)
vdso=0: disable VDSO mapping
vdso=0: disable VDSO mapping
vector= [IA-64,SMP]
vector=percpu: enable percpu vector domain
video= [FB] Frame buffer configuration
video= [FB] Frame buffer configuration
See Documentation/fb/modedb.txt.
See Documentation/fb/modedb.txt.
...
...
arch/ia64/kernel/iosapic.c
View file @
f4fbfb0d
This diff is collapsed.
Click to expand it.
arch/ia64/kernel/irq.c
View file @
f4fbfb0d
...
@@ -35,7 +35,7 @@ void ack_bad_irq(unsigned int irq)
...
@@ -35,7 +35,7 @@ void ack_bad_irq(unsigned int irq)
#ifdef CONFIG_IA64_GENERIC
#ifdef CONFIG_IA64_GENERIC
unsigned
int
__ia64_local_vector_to_irq
(
ia64_vector
vec
)
unsigned
int
__ia64_local_vector_to_irq
(
ia64_vector
vec
)
{
{
return
(
unsigned
int
)
vec
;
return
__get_cpu_var
(
vector_irq
)[
vec
]
;
}
}
#endif
#endif
...
...
arch/ia64/kernel/irq_ia64.c
View file @
f4fbfb0d
...
@@ -46,6 +46,12 @@
...
@@ -46,6 +46,12 @@
#define IRQ_DEBUG 0
#define IRQ_DEBUG 0
#define IRQ_VECTOR_UNASSIGNED (0)
#define IRQ_UNUSED (0)
#define IRQ_USED (1)
#define IRQ_RSVD (2)
/* These can be overridden in platform_irq_init */
/* These can be overridden in platform_irq_init */
int
ia64_first_device_vector
=
IA64_DEF_FIRST_DEVICE_VECTOR
;
int
ia64_first_device_vector
=
IA64_DEF_FIRST_DEVICE_VECTOR
;
int
ia64_last_device_vector
=
IA64_DEF_LAST_DEVICE_VECTOR
;
int
ia64_last_device_vector
=
IA64_DEF_LAST_DEVICE_VECTOR
;
...
@@ -54,6 +60,8 @@ int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR;
...
@@ -54,6 +60,8 @@ int ia64_last_device_vector = IA64_DEF_LAST_DEVICE_VECTOR;
void
__iomem
*
ipi_base_addr
=
((
void
__iomem
*
)
void
__iomem
*
ipi_base_addr
=
((
void
__iomem
*
)
(
__IA64_UNCACHED_OFFSET
|
IA64_IPI_DEFAULT_BASE_ADDR
));
(
__IA64_UNCACHED_OFFSET
|
IA64_IPI_DEFAULT_BASE_ADDR
));
static
cpumask_t
vector_allocation_domain
(
int
cpu
);
/*
/*
* Legacy IRQ to IA-64 vector translation table.
* Legacy IRQ to IA-64 vector translation table.
*/
*/
...
@@ -64,46 +72,269 @@ __u8 isa_irq_to_vector_map[16] = {
...
@@ -64,46 +72,269 @@ __u8 isa_irq_to_vector_map[16] = {
};
};
EXPORT_SYMBOL
(
isa_irq_to_vector_map
);
EXPORT_SYMBOL
(
isa_irq_to_vector_map
);
static
unsigned
long
ia64_vector_mask
[
BITS_TO_LONGS
(
IA64_MAX_DEVICE_VECTORS
)];
DEFINE_SPINLOCK
(
vector_lock
);
struct
irq_cfg
irq_cfg
[
NR_IRQS
]
__read_mostly
=
{
[
0
...
NR_IRQS
-
1
]
=
{
.
vector
=
IRQ_VECTOR_UNASSIGNED
,
.
domain
=
CPU_MASK_NONE
}
};
DEFINE_PER_CPU
(
int
[
IA64_NUM_VECTORS
],
vector_irq
)
=
{
[
0
...
IA64_NUM_VECTORS
-
1
]
=
IA64_SPURIOUS_INT_VECTOR
};
static
cpumask_t
vector_table
[
IA64_MAX_DEVICE_VECTORS
]
=
{
[
0
...
IA64_MAX_DEVICE_VECTORS
-
1
]
=
CPU_MASK_NONE
};
static
int
irq_status
[
NR_IRQS
]
=
{
[
0
...
NR_IRQS
-
1
]
=
IRQ_UNUSED
};
int
check_irq_used
(
int
irq
)
{
if
(
irq_status
[
irq
]
==
IRQ_USED
)
return
1
;
return
-
1
;
}
static
void
reserve_irq
(
unsigned
int
irq
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
vector_lock
,
flags
);
irq_status
[
irq
]
=
IRQ_RSVD
;
spin_unlock_irqrestore
(
&
vector_lock
,
flags
);
}
static
inline
int
find_unassigned_irq
(
void
)
{
int
irq
;
for
(
irq
=
IA64_FIRST_DEVICE_VECTOR
;
irq
<
NR_IRQS
;
irq
++
)
if
(
irq_status
[
irq
]
==
IRQ_UNUSED
)
return
irq
;
return
-
ENOSPC
;
}
static
inline
int
find_unassigned_vector
(
cpumask_t
domain
)
{
cpumask_t
mask
;
int
pos
;
cpus_and
(
mask
,
domain
,
cpu_online_map
);
if
(
cpus_empty
(
mask
))
return
-
EINVAL
;
for
(
pos
=
0
;
pos
<
IA64_NUM_DEVICE_VECTORS
;
pos
++
)
{
cpus_and
(
mask
,
domain
,
vector_table
[
pos
]);
if
(
!
cpus_empty
(
mask
))
continue
;
return
IA64_FIRST_DEVICE_VECTOR
+
pos
;
}
return
-
ENOSPC
;
}
static
int
__bind_irq_vector
(
int
irq
,
int
vector
,
cpumask_t
domain
)
{
cpumask_t
mask
;
int
cpu
,
pos
;
struct
irq_cfg
*
cfg
=
&
irq_cfg
[
irq
];
cpus_and
(
mask
,
domain
,
cpu_online_map
);
if
(
cpus_empty
(
mask
))
return
-
EINVAL
;
if
((
cfg
->
vector
==
vector
)
&&
cpus_equal
(
cfg
->
domain
,
domain
))
return
0
;
if
(
cfg
->
vector
!=
IRQ_VECTOR_UNASSIGNED
)
return
-
EBUSY
;
for_each_cpu_mask
(
cpu
,
mask
)
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
irq
;
cfg
->
vector
=
vector
;
cfg
->
domain
=
domain
;
irq_status
[
irq
]
=
IRQ_USED
;
pos
=
vector
-
IA64_FIRST_DEVICE_VECTOR
;
cpus_or
(
vector_table
[
pos
],
vector_table
[
pos
],
domain
);
return
0
;
}
int
bind_irq_vector
(
int
irq
,
int
vector
,
cpumask_t
domain
)
{
unsigned
long
flags
;
int
ret
;
spin_lock_irqsave
(
&
vector_lock
,
flags
);
ret
=
__bind_irq_vector
(
irq
,
vector
,
domain
);
spin_unlock_irqrestore
(
&
vector_lock
,
flags
);
return
ret
;
}
static
void
__clear_irq_vector
(
int
irq
)
{
int
vector
,
cpu
,
pos
;
cpumask_t
mask
;
cpumask_t
domain
;
struct
irq_cfg
*
cfg
=
&
irq_cfg
[
irq
];
BUG_ON
((
unsigned
)
irq
>=
NR_IRQS
);
BUG_ON
(
cfg
->
vector
==
IRQ_VECTOR_UNASSIGNED
);
vector
=
cfg
->
vector
;
domain
=
cfg
->
domain
;
cpus_and
(
mask
,
cfg
->
domain
,
cpu_online_map
);
for_each_cpu_mask
(
cpu
,
mask
)
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
IA64_SPURIOUS_INT_VECTOR
;
cfg
->
vector
=
IRQ_VECTOR_UNASSIGNED
;
cfg
->
domain
=
CPU_MASK_NONE
;
irq_status
[
irq
]
=
IRQ_UNUSED
;
pos
=
vector
-
IA64_FIRST_DEVICE_VECTOR
;
cpus_andnot
(
vector_table
[
pos
],
vector_table
[
pos
],
domain
);
}
static
void
clear_irq_vector
(
int
irq
)
{
unsigned
long
flags
;
spin_lock_irqsave
(
&
vector_lock
,
flags
);
__clear_irq_vector
(
irq
);
spin_unlock_irqrestore
(
&
vector_lock
,
flags
);
}
int
int
assign_irq_vector
(
int
irq
)
assign_irq_vector
(
int
irq
)
{
{
int
pos
,
vector
;
unsigned
long
flags
;
again:
int
vector
,
cpu
;
pos
=
find_first_zero_bit
(
ia64_vector_mask
,
IA64_NUM_DEVICE_VECTORS
);
cpumask_t
domain
;
vector
=
IA64_FIRST_DEVICE_VECTOR
+
pos
;
if
(
vector
>
IA64_LAST_DEVICE_VECTOR
)
vector
=
-
ENOSPC
;
return
-
ENOSPC
;
if
(
test_and_set_bit
(
pos
,
ia64_vector_mask
))
spin_lock_irqsave
(
&
vector_lock
,
flags
);
goto
again
;
if
(
irq
<
0
)
{
goto
out
;
}
for_each_online_cpu
(
cpu
)
{
domain
=
vector_allocation_domain
(
cpu
);
vector
=
find_unassigned_vector
(
domain
);
if
(
vector
>=
0
)
break
;
}
if
(
vector
<
0
)
goto
out
;
BUG_ON
(
__bind_irq_vector
(
irq
,
vector
,
domain
));
out:
spin_unlock_irqrestore
(
&
vector_lock
,
flags
);
return
vector
;
return
vector
;
}
}
void
void
free_irq_vector
(
int
vector
)
free_irq_vector
(
int
vector
)
{
{
int
pos
;
if
(
vector
<
IA64_FIRST_DEVICE_VECTOR
||
vector
>
IA64_LAST_DEVICE_VECTOR
)
if
(
vector
<
IA64_FIRST_DEVICE_VECTOR
||
vector
>
IA64_LAST_DEVICE_VECTOR
)
return
;
return
;
clear_irq_vector
(
vector
);
pos
=
vector
-
IA64_FIRST_DEVICE_VECTOR
;
if
(
!
test_and_clear_bit
(
pos
,
ia64_vector_mask
))
printk
(
KERN_WARNING
"%s: double free!
\n
"
,
__FUNCTION__
);
}
}
int
int
reserve_irq_vector
(
int
vector
)
reserve_irq_vector
(
int
vector
)
{
{
int
pos
;
if
(
vector
<
IA64_FIRST_DEVICE_VECTOR
||
if
(
vector
<
IA64_FIRST_DEVICE_VECTOR
||
vector
>
IA64_LAST_DEVICE_VECTOR
)
vector
>
IA64_LAST_DEVICE_VECTOR
)
return
-
EINVAL
;
return
-
EINVAL
;
return
!!
bind_irq_vector
(
vector
,
vector
,
CPU_MASK_ALL
);
}
pos
=
vector
-
IA64_FIRST_DEVICE_VECTOR
;
/*
return
test_and_set_bit
(
pos
,
ia64_vector_mask
);
* Initialize vector_irq on a new cpu. This function must be called
* with vector_lock held.
*/
void
__setup_vector_irq
(
int
cpu
)
{
int
irq
,
vector
;
/* Clear vector_irq */
for
(
vector
=
0
;
vector
<
IA64_NUM_VECTORS
;
++
vector
)
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
IA64_SPURIOUS_INT_VECTOR
;
/* Mark the inuse vectors */
for
(
irq
=
0
;
irq
<
NR_IRQS
;
++
irq
)
{
if
(
!
cpu_isset
(
cpu
,
irq_cfg
[
irq
].
domain
))
continue
;
vector
=
irq_to_vector
(
irq
);
per_cpu
(
vector_irq
,
cpu
)[
vector
]
=
irq
;
}
}
#if defined(CONFIG_SMP) && (defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG))
static
enum
vector_domain_type
{
VECTOR_DOMAIN_NONE
,
VECTOR_DOMAIN_PERCPU
}
vector_domain_type
=
VECTOR_DOMAIN_NONE
;
static
cpumask_t
vector_allocation_domain
(
int
cpu
)
{
if
(
vector_domain_type
==
VECTOR_DOMAIN_PERCPU
)
return
cpumask_of_cpu
(
cpu
);
return
CPU_MASK_ALL
;
}
static
int
__init
parse_vector_domain
(
char
*
arg
)
{
if
(
!
arg
)
return
-
EINVAL
;
if
(
!
strcmp
(
arg
,
"percpu"
))
{
vector_domain_type
=
VECTOR_DOMAIN_PERCPU
;
no_int_routing
=
1
;
}
return
1
;
}
early_param
(
"vector"
,
parse_vector_domain
);
#else
static
cpumask_t
vector_allocation_domain
(
int
cpu
)
{
return
CPU_MASK_ALL
;
}
#endif
void
destroy_and_reserve_irq
(
unsigned
int
irq
)
{
dynamic_irq_cleanup
(
irq
);
clear_irq_vector
(
irq
);
reserve_irq
(
irq
);
}
static
int
__reassign_irq_vector
(
int
irq
,
int
cpu
)
{
struct
irq_cfg
*
cfg
=
&
irq_cfg
[
irq
];
int
vector
;
cpumask_t
domain
;
if
(
cfg
->
vector
==
IRQ_VECTOR_UNASSIGNED
||
!
cpu_online
(
cpu
))
return
-
EINVAL
;
if
(
cpu_isset
(
cpu
,
cfg
->
domain
))
return
0
;
domain
=
vector_allocation_domain
(
cpu
);
vector
=
find_unassigned_vector
(
domain
);
if
(
vector
<
0
)
return
-
ENOSPC
;
__clear_irq_vector
(
irq
);
BUG_ON
(
__bind_irq_vector
(
irq
,
vector
,
domain
));
return
0
;
}
int
reassign_irq_vector
(
int
irq
,
int
cpu
)
{
unsigned
long
flags
;
int
ret
;
spin_lock_irqsave
(
&
vector_lock
,
flags
);
ret
=
__reassign_irq_vector
(
irq
,
cpu
);
spin_unlock_irqrestore
(
&
vector_lock
,
flags
);
return
ret
;
}
}
/*
/*
...
@@ -111,18 +342,35 @@ reserve_irq_vector (int vector)
...
@@ -111,18 +342,35 @@ reserve_irq_vector (int vector)
*/
*/
int
create_irq
(
void
)
int
create_irq
(
void
)
{
{
int
vector
=
assign_irq_vector
(
AUTO_ASSIGN
);
unsigned
long
flags
;
int
irq
,
vector
,
cpu
;
if
(
vector
>=
0
)
cpumask_t
domain
;
dynamic_irq_init
(
vector
);
irq
=
vector
=
-
ENOSPC
;
return
vector
;
spin_lock_irqsave
(
&
vector_lock
,
flags
);
for_each_online_cpu
(
cpu
)
{
domain
=
vector_allocation_domain
(
cpu
);
vector
=
find_unassigned_vector
(
domain
);
if
(
vector
>=
0
)
break
;
}
if
(
vector
<
0
)
goto
out
;
irq
=
find_unassigned_irq
();
if
(
irq
<
0
)
goto
out
;
BUG_ON
(
__bind_irq_vector
(
irq
,
vector
,
domain
));
out:
spin_unlock_irqrestore
(
&
vector_lock
,
flags
);
if
(
irq
>=
0
)
dynamic_irq_init
(
irq
);
return
irq
;
}
}
void
destroy_irq
(
unsigned
int
irq
)
void
destroy_irq
(
unsigned
int
irq
)
{
{
dynamic_irq_cleanup
(
irq
);
dynamic_irq_cleanup
(
irq
);
free
_irq_vector
(
irq
);
clear
_irq_vector
(
irq
);
}
}
#ifdef CONFIG_SMP
#ifdef CONFIG_SMP
...
@@ -301,14 +549,13 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
...
@@ -301,14 +549,13 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
irq_desc_t
*
desc
;
irq_desc_t
*
desc
;
unsigned
int
irq
;
unsigned
int
irq
;
for
(
irq
=
0
;
irq
<
NR_IRQS
;
++
irq
)
irq
=
vec
;
if
(
irq_to_vector
(
irq
)
==
vec
)
{
BUG_ON
(
bind_irq_vector
(
irq
,
vec
,
CPU_MASK_ALL
));
desc
=
irq_desc
+
irq
;
desc
=
irq_desc
+
irq
;
desc
->
status
|=
IRQ_PER_CPU
;
desc
->
status
|=
IRQ_PER_CPU
;
desc
->
chip
=
&
irq_type_ia64_lsapic
;
desc
->
chip
=
&
irq_type_ia64_lsapic
;
if
(
action
)
if
(
action
)
setup_irq
(
irq
,
action
);
setup_irq
(
irq
,
action
);
}
}
}
void
__init
void
__init
...
...
arch/ia64/kernel/msi_ia64.c
View file @
f4fbfb0d
...
@@ -13,6 +13,7 @@
...
@@ -13,6 +13,7 @@
#define MSI_DATA_VECTOR_SHIFT 0
#define MSI_DATA_VECTOR_SHIFT 0
#define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT)
#define MSI_DATA_VECTOR(v) (((u8)v) << MSI_DATA_VECTOR_SHIFT)
#define MSI_DATA_VECTOR_MASK 0xffffff00
#define MSI_DATA_DELIVERY_SHIFT 8
#define MSI_DATA_DELIVERY_SHIFT 8
#define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT)
#define MSI_DATA_DELIVERY_FIXED (0 << MSI_DATA_DELIVERY_SHIFT)
...
@@ -50,17 +51,29 @@ static struct irq_chip ia64_msi_chip;
...
@@ -50,17 +51,29 @@ static struct irq_chip ia64_msi_chip;
static
void
ia64_set_msi_irq_affinity
(
unsigned
int
irq
,
cpumask_t
cpu_mask
)
static
void
ia64_set_msi_irq_affinity
(
unsigned
int
irq
,
cpumask_t
cpu_mask
)
{
{
struct
msi_msg
msg
;
struct
msi_msg
msg
;
u32
addr
;
u32
addr
,
data
;
int
cpu
=
first_cpu
(
cpu_mask
);
if
(
!
cpu_online
(
cpu
))
return
;
if
(
reassign_irq_vector
(
irq
,
cpu
))
return
;
read_msi_msg
(
irq
,
&
msg
);
read_msi_msg
(
irq
,
&
msg
);
addr
=
msg
.
address_lo
;
addr
=
msg
.
address_lo
;
addr
&=
MSI_ADDR_DESTID_MASK
;
addr
&=
MSI_ADDR_DESTID_MASK
;
addr
|=
MSI_ADDR_DESTID_CPU
(
cpu_physical_id
(
first_cpu
(
cpu_mask
)
));
addr
|=
MSI_ADDR_DESTID_CPU
(
cpu_physical_id
(
cpu
));
msg
.
address_lo
=
addr
;
msg
.
address_lo
=
addr
;
data
=
msg
.
data
;
data
&=
MSI_DATA_VECTOR_MASK
;
data
|=
MSI_DATA_VECTOR
(
irq_to_vector
(
irq
));
msg
.
data
=
data
;
write_msi_msg
(
irq
,
&
msg
);
write_msi_msg
(
irq
,
&
msg
);
irq_desc
[
irq
].
affinity
=
cpu
_mask
;
irq_desc
[
irq
].
affinity
=
cpu
mask_of_cpu
(
cpu
)
;
}
}
#endif
/* CONFIG_SMP */
#endif
/* CONFIG_SMP */
...
@@ -69,13 +82,15 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
...
@@ -69,13 +82,15 @@ int ia64_setup_msi_irq(struct pci_dev *pdev, struct msi_desc *desc)
struct
msi_msg
msg
;
struct
msi_msg
msg
;
unsigned
long
dest_phys_id
;
unsigned
long
dest_phys_id
;
int
irq
,
vector
;
int
irq
,
vector
;
cpumask_t
mask
;
irq
=
create_irq
();
irq
=
create_irq
();
if
(
irq
<
0
)
if
(
irq
<
0
)
return
irq
;
return
irq
;
set_irq_msi
(
irq
,
desc
);
set_irq_msi
(
irq
,
desc
);
dest_phys_id
=
cpu_physical_id
(
first_cpu
(
cpu_online_map
));
cpus_and
(
mask
,
irq_to_domain
(
irq
),
cpu_online_map
);
dest_phys_id
=
cpu_physical_id
(
first_cpu
(
mask
));
vector
=
irq_to_vector
(
irq
);
vector
=
irq_to_vector
(
irq
);
msg
.
address_hi
=
0
;
msg
.
address_hi
=
0
;
...
...
arch/ia64/kernel/smpboot.c
View file @
f4fbfb0d
...
@@ -395,9 +395,13 @@ smp_callin (void)
...
@@ -395,9 +395,13 @@ smp_callin (void)
fix_b0_for_bsp
();
fix_b0_for_bsp
();
lock_ipi_calllock
();
lock_ipi_calllock
();
spin_lock
(
&
vector_lock
);
/* Setup the per cpu irq handling data structures */
__setup_vector_irq
(
cpuid
);
cpu_set
(
cpuid
,
cpu_online_map
);
cpu_set
(
cpuid
,
cpu_online_map
);
unlock_ipi_calllock
();
unlock_ipi_calllock
();
per_cpu
(
cpu_state
,
cpuid
)
=
CPU_ONLINE
;
per_cpu
(
cpu_state
,
cpuid
)
=
CPU_ONLINE
;
spin_unlock
(
&
vector_lock
);
smp_setup_percpu_timer
();
smp_setup_percpu_timer
();
...
...
include/asm-ia64/hw_irq.h
View file @
f4fbfb0d
...
@@ -90,13 +90,27 @@ enum {
...
@@ -90,13 +90,27 @@ enum {
extern
__u8
isa_irq_to_vector_map
[
16
];
extern
__u8
isa_irq_to_vector_map
[
16
];
#define isa_irq_to_vector(x) isa_irq_to_vector_map[(x)]
#define isa_irq_to_vector(x) isa_irq_to_vector_map[(x)]
struct
irq_cfg
{
ia64_vector
vector
;
cpumask_t
domain
;
};
extern
spinlock_t
vector_lock
;
extern
struct
irq_cfg
irq_cfg
[
NR_IRQS
];
#define irq_to_domain(x) irq_cfg[(x)].domain
DECLARE_PER_CPU
(
int
[
IA64_NUM_VECTORS
],
vector_irq
);
extern
struct
hw_interrupt_type
irq_type_ia64_lsapic
;
/* CPU-internal interrupt controller */
extern
struct
hw_interrupt_type
irq_type_ia64_lsapic
;
/* CPU-internal interrupt controller */
extern
int
bind_irq_vector
(
int
irq
,
int
vector
,
cpumask_t
domain
);
extern
int
assign_irq_vector
(
int
irq
);
/* allocate a free vector */
extern
int
assign_irq_vector
(
int
irq
);
/* allocate a free vector */
extern
void
free_irq_vector
(
int
vector
);
extern
void
free_irq_vector
(
int
vector
);
extern
int
reserve_irq_vector
(
int
vector
);
extern
int
reserve_irq_vector
(
int
vector
);
extern
void
__setup_vector_irq
(
int
cpu
);
extern
int
reassign_irq_vector
(
int
irq
,
int
cpu
);
extern
void
ia64_send_ipi
(
int
cpu
,
int
vector
,
int
delivery_mode
,
int
redirect
);
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
);
extern
void
register_percpu_irq
(
ia64_vector
vec
,
struct
irqaction
*
action
);
extern
int
check_irq_used
(
int
irq
);
extern
void
destroy_and_reserve_irq
(
unsigned
int
irq
);
static
inline
void
ia64_resend_irq
(
unsigned
int
vector
)
static
inline
void
ia64_resend_irq
(
unsigned
int
vector
)
{
{
...
@@ -113,7 +127,7 @@ extern irq_desc_t irq_desc[NR_IRQS];
...
@@ -113,7 +127,7 @@ extern irq_desc_t irq_desc[NR_IRQS];
static
inline
unsigned
int
static
inline
unsigned
int
__ia64_local_vector_to_irq
(
ia64_vector
vec
)
__ia64_local_vector_to_irq
(
ia64_vector
vec
)
{
{
return
(
unsigned
int
)
vec
;
return
__get_cpu_var
(
vector_irq
)[
vec
]
;
}
}
#endif
#endif
...
@@ -131,7 +145,7 @@ __ia64_local_vector_to_irq (ia64_vector vec)
...
@@ -131,7 +145,7 @@ __ia64_local_vector_to_irq (ia64_vector vec)
static
inline
ia64_vector
static
inline
ia64_vector
irq_to_vector
(
int
irq
)
irq_to_vector
(
int
irq
)
{
{
return
(
ia64_vector
)
irq
;
return
irq_cfg
[
irq
].
vector
;
}
}
/*
/*
...
...
include/asm-ia64/iosapic.h
View file @
f4fbfb0d
...
@@ -47,19 +47,21 @@
...
@@ -47,19 +47,21 @@
#define IOSAPIC_MASK_SHIFT 16
#define IOSAPIC_MASK_SHIFT 16
#define IOSAPIC_MASK (1<<IOSAPIC_MASK_SHIFT)
#define IOSAPIC_MASK (1<<IOSAPIC_MASK_SHIFT)
#define IOSAPIC_VECTOR_MASK 0xffffff00
#ifndef __ASSEMBLY__
#ifndef __ASSEMBLY__
#ifdef CONFIG_IOSAPIC
#ifdef CONFIG_IOSAPIC
#define NR_IOSAPICS 256
#define NR_IOSAPICS 256
static
inline
unsigned
int
iosapic_read
(
char
__iomem
*
iosapic
,
unsigned
int
reg
)
static
inline
unsigned
int
__
iosapic_read
(
char
__iomem
*
iosapic
,
unsigned
int
reg
)
{
{
writel
(
reg
,
iosapic
+
IOSAPIC_REG_SELECT
);
writel
(
reg
,
iosapic
+
IOSAPIC_REG_SELECT
);
return
readl
(
iosapic
+
IOSAPIC_WINDOW
);
return
readl
(
iosapic
+
IOSAPIC_WINDOW
);
}
}
static
inline
void
iosapic_write
(
char
__iomem
*
iosapic
,
unsigned
int
reg
,
u32
val
)
static
inline
void
__
iosapic_write
(
char
__iomem
*
iosapic
,
unsigned
int
reg
,
u32
val
)
{
{
writel
(
reg
,
iosapic
+
IOSAPIC_REG_SELECT
);
writel
(
reg
,
iosapic
+
IOSAPIC_REG_SELECT
);
writel
(
val
,
iosapic
+
IOSAPIC_WINDOW
);
writel
(
val
,
iosapic
+
IOSAPIC_WINDOW
);
...
...
include/asm-ia64/irq.h
View file @
f4fbfb0d
...
@@ -14,8 +14,13 @@
...
@@ -14,8 +14,13 @@
#include <linux/types.h>
#include <linux/types.h>
#include <linux/cpumask.h>
#include <linux/cpumask.h>
#define NR_IRQS 256
#define NR_VECTORS 256
#define NR_IRQ_VECTORS NR_IRQS
#if (NR_VECTORS + 32 * NR_CPUS) < 1024
#define NR_IRQS (NR_VECTORS + 32 * NR_CPUS)
#else
#define NR_IRQS 1024
#endif
static
__inline__
int
static
__inline__
int
irq_canonicalize
(
int
irq
)
irq_canonicalize
(
int
irq
)
...
...
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