Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci
Commits
62ae144f
Commit
62ae144f
authored
Nov 18, 2005
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'parisc' of master.kernel.org:/pub/scm/linux/kernel/git/kyle/parisc-2.6
parents
bcd039b2
2161558f
Changes
24
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
245 additions
and
649 deletions
+245
-649
CREDITS
CREDITS
+10
-2
arch/parisc/kernel/drivers.c
arch/parisc/kernel/drivers.c
+6
-2
arch/parisc/kernel/entry.S
arch/parisc/kernel/entry.S
+1
-0
arch/parisc/kernel/inventory.c
arch/parisc/kernel/inventory.c
+1
-1
arch/parisc/kernel/ioctl32.c
arch/parisc/kernel/ioctl32.c
+0
-546
arch/parisc/kernel/irq.c
arch/parisc/kernel/irq.c
+92
-18
arch/parisc/kernel/perf.c
arch/parisc/kernel/perf.c
+20
-13
arch/parisc/kernel/ptrace.c
arch/parisc/kernel/ptrace.c
+3
-2
arch/parisc/kernel/signal.c
arch/parisc/kernel/signal.c
+0
-1
arch/parisc/kernel/smp.c
arch/parisc/kernel/smp.c
+18
-6
arch/parisc/kernel/syscall.S
arch/parisc/kernel/syscall.S
+2
-1
drivers/ide/Kconfig
drivers/ide/Kconfig
+1
-1
drivers/isdn/hisax/Kconfig
drivers/isdn/hisax/Kconfig
+6
-6
drivers/isdn/pcbit/Kconfig
drivers/isdn/pcbit/Kconfig
+1
-1
drivers/parisc/iosapic.c
drivers/parisc/iosapic.c
+25
-1
drivers/parisc/superio.c
drivers/parisc/superio.c
+21
-14
drivers/serial/Kconfig
drivers/serial/Kconfig
+1
-1
drivers/serial/mux.c
drivers/serial/mux.c
+11
-8
include/asm-parisc/irq.h
include/asm-parisc/irq.h
+3
-2
include/asm-parisc/smp.h
include/asm-parisc/smp.h
+6
-1
include/asm-parisc/spinlock.h
include/asm-parisc/spinlock.h
+10
-9
include/asm-parisc/tlbflush.h
include/asm-parisc/tlbflush.h
+4
-12
include/linux/mm.h
include/linux/mm.h
+2
-0
mm/mmap.c
mm/mmap.c
+1
-1
No files found.
CREDITS
View file @
62ae144f
...
...
@@ -611,8 +611,7 @@ S: USA
N: Randolph Chung
E: tausq@debian.org
D: Linux/PA-RISC hacker
S: Los Altos, CA 94022
S: USA
S: Hong Kong
N: Juan Jose Ciarlante
W: http://juanjox.kernelnotes.org/
...
...
@@ -3405,6 +3404,15 @@ S: Chudenicka 8
S: 10200 Prague 10, Hostivar
S: Czech Republic
N: Thibaut Varene
E: T-Bone@parisc-linux.org
W: http://www.parisc-linux.org/
P: 1024D/B7D2F063 E67C 0D43 A75E 12A5 BB1C FA2F 1E32 C3DA B7D2 F063
D: PA-RISC port minion, PDC and GSCPS2 drivers, debuglocks and other bits
D: Some bits in an ARM port, S1D13XXX FB driver, random patches here and there
D: AD1889 sound driver
S: Paris, France
N: Heikki Vatiainen
E: hessu@cs.tut.fi
D: Co-author of Multi-Protocol Over ATM (MPOA), some LANE hacks
...
...
arch/parisc/kernel/drivers.c
View file @
62ae144f
...
...
@@ -499,8 +499,12 @@ alloc_pa_dev(unsigned long hpa, struct hardware_path *mod_path)
dev
=
create_parisc_device
(
mod_path
);
if
(
dev
->
id
.
hw_type
!=
HPHW_FAULTY
)
{
printk
(
"Two devices have hardware path %s. Please file a bug with HP.
\n
"
"In the meantime, you could try rearranging your cards.
\n
"
,
parisc_pathname
(
dev
));
printk
(
KERN_ERR
"Two devices have hardware path [%s]. "
"IODC data for second device: "
"%02x%02x%02x%02x%02x%02x
\n
"
"Rearranging GSC cards sometimes helps
\n
"
,
parisc_pathname
(
dev
),
iodc_data
[
0
],
iodc_data
[
1
],
iodc_data
[
3
],
iodc_data
[
4
],
iodc_data
[
5
],
iodc_data
[
6
]);
return
NULL
;
}
...
...
arch/parisc/kernel/entry.S
View file @
62ae144f
...
...
@@ -1846,6 +1846,7 @@ sys_clone_wrapper:
ldo
-
16
(%
r30
),%
r29
/*
Reference
param
save
area
*/
#endif
/
*
WARNING
-
Clobbers
r19
and
r21
,
userspace
must
save
these
!
*/
STREG
%
r2
,
PT_GR19
(%
r1
)
/*
save
for
child
*/
STREG
%
r30
,
PT_GR21
(%
r1
)
BL
sys_clone
,%
r2
...
...
arch/parisc/kernel/inventory.c
View file @
62ae144f
...
...
@@ -188,7 +188,7 @@ pat_query_module(ulong pcell_loc, ulong mod_index)
temp
=
pa_pdc_cell
.
cba
;
dev
=
alloc_pa_dev
(
PAT_GET_CBA
(
temp
),
&
pa_pdc_cell
.
mod_path
);
if
(
!
dev
)
{
return
PDC_
NE_MOD
;
return
PDC_
OK
;
}
/* alloc_pa_dev sets dev->hpa */
...
...
arch/parisc/kernel/ioctl32.c
View file @
62ae144f
...
...
@@ -19,536 +19,6 @@
#define CODE
#include "compat_ioctl.c"
/* Use this to get at 32-bit user passed pointers.
See sys_sparc32.c for description about these. */
#define A(__x) ((unsigned long)(__x))
/* The same for use with copy_from_user() and copy_to_user(). */
#define B(__x) ((void *)(unsigned long)(__x))
#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
/* This really belongs in include/linux/drm.h -DaveM */
#include "../../../drivers/char/drm/drm.h"
typedef
struct
drm32_version
{
int
version_major
;
/* Major version */
int
version_minor
;
/* Minor version */
int
version_patchlevel
;
/* Patch level */
int
name_len
;
/* Length of name buffer */
u32
name
;
/* Name of driver */
int
date_len
;
/* Length of date buffer */
u32
date
;
/* User-space buffer to hold date */
int
desc_len
;
/* Length of desc buffer */
u32
desc
;
/* User-space buffer to hold desc */
}
drm32_version_t
;
#define DRM32_IOCTL_VERSION DRM_IOWR(0x00, drm32_version_t)
static
int
drm32_version
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_version_t
*
uversion
=
(
drm32_version_t
*
)
arg
;
char
*
name_ptr
,
*
date_ptr
,
*
desc_ptr
;
u32
tmp1
,
tmp2
,
tmp3
;
drm_version_t
kversion
;
mm_segment_t
old_fs
;
int
ret
;
memset
(
&
kversion
,
0
,
sizeof
(
kversion
));
if
(
get_user
(
kversion
.
name_len
,
&
uversion
->
name_len
)
||
get_user
(
kversion
.
date_len
,
&
uversion
->
date_len
)
||
get_user
(
kversion
.
desc_len
,
&
uversion
->
desc_len
)
||
get_user
(
tmp1
,
&
uversion
->
name
)
||
get_user
(
tmp2
,
&
uversion
->
date
)
||
get_user
(
tmp3
,
&
uversion
->
desc
))
return
-
EFAULT
;
name_ptr
=
(
char
*
)
A
(
tmp1
);
date_ptr
=
(
char
*
)
A
(
tmp2
);
desc_ptr
=
(
char
*
)
A
(
tmp3
);
ret
=
-
ENOMEM
;
if
(
kversion
.
name_len
&&
name_ptr
)
{
kversion
.
name
=
kmalloc
(
kversion
.
name_len
,
GFP_KERNEL
);
if
(
!
kversion
.
name
)
goto
out
;
}
if
(
kversion
.
date_len
&&
date_ptr
)
{
kversion
.
date
=
kmalloc
(
kversion
.
date_len
,
GFP_KERNEL
);
if
(
!
kversion
.
date
)
goto
out
;
}
if
(
kversion
.
desc_len
&&
desc_ptr
)
{
kversion
.
desc
=
kmalloc
(
kversion
.
desc_len
,
GFP_KERNEL
);
if
(
!
kversion
.
desc
)
goto
out
;
}
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_VERSION
,
(
unsigned
long
)
&
kversion
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
if
((
kversion
.
name
&&
copy_to_user
(
name_ptr
,
kversion
.
name
,
kversion
.
name_len
))
||
(
kversion
.
date
&&
copy_to_user
(
date_ptr
,
kversion
.
date
,
kversion
.
date_len
))
||
(
kversion
.
desc
&&
copy_to_user
(
desc_ptr
,
kversion
.
desc
,
kversion
.
desc_len
)))
ret
=
-
EFAULT
;
if
(
put_user
(
kversion
.
version_major
,
&
uversion
->
version_major
)
||
put_user
(
kversion
.
version_minor
,
&
uversion
->
version_minor
)
||
put_user
(
kversion
.
version_patchlevel
,
&
uversion
->
version_patchlevel
)
||
put_user
(
kversion
.
name_len
,
&
uversion
->
name_len
)
||
put_user
(
kversion
.
date_len
,
&
uversion
->
date_len
)
||
put_user
(
kversion
.
desc_len
,
&
uversion
->
desc_len
))
ret
=
-
EFAULT
;
}
out:
kfree
(
kversion
.
name
);
kfree
(
kversion
.
date
);
kfree
(
kversion
.
desc
);
return
ret
;
}
typedef
struct
drm32_unique
{
int
unique_len
;
/* Length of unique */
u32
unique
;
/* Unique name for driver instantiation */
}
drm32_unique_t
;
#define DRM32_IOCTL_GET_UNIQUE DRM_IOWR(0x01, drm32_unique_t)
#define DRM32_IOCTL_SET_UNIQUE DRM_IOW( 0x10, drm32_unique_t)
static
int
drm32_getsetunique
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_unique_t
*
uarg
=
(
drm32_unique_t
*
)
arg
;
drm_unique_t
karg
;
mm_segment_t
old_fs
;
char
*
uptr
;
u32
tmp
;
int
ret
;
if
(
get_user
(
karg
.
unique_len
,
&
uarg
->
unique_len
))
return
-
EFAULT
;
karg
.
unique
=
NULL
;
if
(
get_user
(
tmp
,
&
uarg
->
unique
))
return
-
EFAULT
;
uptr
=
(
char
*
)
A
(
tmp
);
if
(
uptr
)
{
karg
.
unique
=
kmalloc
(
karg
.
unique_len
,
GFP_KERNEL
);
if
(
!
karg
.
unique
)
return
-
ENOMEM
;
if
(
cmd
==
DRM32_IOCTL_SET_UNIQUE
&&
copy_from_user
(
karg
.
unique
,
uptr
,
karg
.
unique_len
))
{
kfree
(
karg
.
unique
);
return
-
EFAULT
;
}
}
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
if
(
cmd
==
DRM32_IOCTL_GET_UNIQUE
)
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_GET_UNIQUE
,
(
unsigned
long
)
&
karg
);
else
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_SET_UNIQUE
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
if
(
cmd
==
DRM32_IOCTL_GET_UNIQUE
&&
uptr
!=
NULL
&&
copy_to_user
(
uptr
,
karg
.
unique
,
karg
.
unique_len
))
ret
=
-
EFAULT
;
if
(
put_user
(
karg
.
unique_len
,
&
uarg
->
unique_len
))
ret
=
-
EFAULT
;
}
kfree
(
karg
.
unique
);
return
ret
;
}
typedef
struct
drm32_map
{
u32
offset
;
/* Requested physical address (0 for SAREA)*/
u32
size
;
/* Requested physical size (bytes) */
drm_map_type_t
type
;
/* Type of memory to map */
drm_map_flags_t
flags
;
/* Flags */
u32
handle
;
/* User-space: "Handle" to pass to mmap */
/* Kernel-space: kernel-virtual address */
int
mtrr
;
/* MTRR slot used */
/* Private data */
}
drm32_map_t
;
#define DRM32_IOCTL_ADD_MAP DRM_IOWR(0x15, drm32_map_t)
static
int
drm32_addmap
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_map_t
*
uarg
=
(
drm32_map_t
*
)
arg
;
drm_map_t
karg
;
mm_segment_t
old_fs
;
u32
tmp
;
int
ret
;
ret
=
get_user
(
karg
.
offset
,
&
uarg
->
offset
);
ret
|=
get_user
(
karg
.
size
,
&
uarg
->
size
);
ret
|=
get_user
(
karg
.
type
,
&
uarg
->
type
);
ret
|=
get_user
(
karg
.
flags
,
&
uarg
->
flags
);
ret
|=
get_user
(
tmp
,
&
uarg
->
handle
);
ret
|=
get_user
(
karg
.
mtrr
,
&
uarg
->
mtrr
);
if
(
ret
)
return
-
EFAULT
;
karg
.
handle
=
(
void
*
)
A
(
tmp
);
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_ADD_MAP
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
ret
=
put_user
(
karg
.
offset
,
&
uarg
->
offset
);
ret
|=
put_user
(
karg
.
size
,
&
uarg
->
size
);
ret
|=
put_user
(
karg
.
type
,
&
uarg
->
type
);
ret
|=
put_user
(
karg
.
flags
,
&
uarg
->
flags
);
tmp
=
(
u32
)
(
long
)
karg
.
handle
;
ret
|=
put_user
(
tmp
,
&
uarg
->
handle
);
ret
|=
put_user
(
karg
.
mtrr
,
&
uarg
->
mtrr
);
if
(
ret
)
ret
=
-
EFAULT
;
}
return
ret
;
}
typedef
struct
drm32_buf_info
{
int
count
;
/* Entries in list */
u32
list
;
/* (drm_buf_desc_t *) */
}
drm32_buf_info_t
;
#define DRM32_IOCTL_INFO_BUFS DRM_IOWR(0x18, drm32_buf_info_t)
static
int
drm32_info_bufs
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_buf_info_t
*
uarg
=
(
drm32_buf_info_t
*
)
arg
;
drm_buf_desc_t
*
ulist
;
drm_buf_info_t
karg
;
mm_segment_t
old_fs
;
int
orig_count
,
ret
;
u32
tmp
;
if
(
get_user
(
karg
.
count
,
&
uarg
->
count
)
||
get_user
(
tmp
,
&
uarg
->
list
))
return
-
EFAULT
;
ulist
=
(
drm_buf_desc_t
*
)
A
(
tmp
);
orig_count
=
karg
.
count
;
karg
.
list
=
kmalloc
(
karg
.
count
*
sizeof
(
drm_buf_desc_t
),
GFP_KERNEL
);
if
(
!
karg
.
list
)
return
-
EFAULT
;
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_INFO_BUFS
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
if
(
karg
.
count
<=
orig_count
&&
(
copy_to_user
(
ulist
,
karg
.
list
,
karg
.
count
*
sizeof
(
drm_buf_desc_t
))))
ret
=
-
EFAULT
;
if
(
put_user
(
karg
.
count
,
&
uarg
->
count
))
ret
=
-
EFAULT
;
}
kfree
(
karg
.
list
);
return
ret
;
}
typedef
struct
drm32_buf_free
{
int
count
;
u32
list
;
/* (int *) */
}
drm32_buf_free_t
;
#define DRM32_IOCTL_FREE_BUFS DRM_IOW( 0x1a, drm32_buf_free_t)
static
int
drm32_free_bufs
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_buf_free_t
*
uarg
=
(
drm32_buf_free_t
*
)
arg
;
drm_buf_free_t
karg
;
mm_segment_t
old_fs
;
int
*
ulist
;
int
ret
;
u32
tmp
;
if
(
get_user
(
karg
.
count
,
&
uarg
->
count
)
||
get_user
(
tmp
,
&
uarg
->
list
))
return
-
EFAULT
;
ulist
=
(
int
*
)
A
(
tmp
);
karg
.
list
=
kmalloc
(
karg
.
count
*
sizeof
(
int
),
GFP_KERNEL
);
if
(
!
karg
.
list
)
return
-
ENOMEM
;
ret
=
-
EFAULT
;
if
(
copy_from_user
(
karg
.
list
,
ulist
,
(
karg
.
count
*
sizeof
(
int
))))
goto
out
;
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_FREE_BUFS
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
out:
kfree
(
karg
.
list
);
return
ret
;
}
typedef
struct
drm32_buf_pub
{
int
idx
;
/* Index into master buflist */
int
total
;
/* Buffer size */
int
used
;
/* Amount of buffer in use (for DMA) */
u32
address
;
/* Address of buffer (void *) */
}
drm32_buf_pub_t
;
typedef
struct
drm32_buf_map
{
int
count
;
/* Length of buflist */
u32
virtual
;
/* Mmaped area in user-virtual (void *) */
u32
list
;
/* Buffer information (drm_buf_pub_t *) */
}
drm32_buf_map_t
;
#define DRM32_IOCTL_MAP_BUFS DRM_IOWR(0x19, drm32_buf_map_t)
static
int
drm32_map_bufs
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_buf_map_t
*
uarg
=
(
drm32_buf_map_t
*
)
arg
;
drm32_buf_pub_t
*
ulist
;
drm_buf_map_t
karg
;
mm_segment_t
old_fs
;
int
orig_count
,
ret
,
i
;
u32
tmp1
,
tmp2
;
if
(
get_user
(
karg
.
count
,
&
uarg
->
count
)
||
get_user
(
tmp1
,
&
uarg
->
virtual
)
||
get_user
(
tmp2
,
&
uarg
->
list
))
return
-
EFAULT
;
karg
.
virtual
=
(
void
*
)
A
(
tmp1
);
ulist
=
(
drm32_buf_pub_t
*
)
A
(
tmp2
);
orig_count
=
karg
.
count
;
karg
.
list
=
kmalloc
(
karg
.
count
*
sizeof
(
drm_buf_pub_t
),
GFP_KERNEL
);
if
(
!
karg
.
list
)
return
-
ENOMEM
;
ret
=
-
EFAULT
;
for
(
i
=
0
;
i
<
karg
.
count
;
i
++
)
{
if
(
get_user
(
karg
.
list
[
i
].
idx
,
&
ulist
[
i
].
idx
)
||
get_user
(
karg
.
list
[
i
].
total
,
&
ulist
[
i
].
total
)
||
get_user
(
karg
.
list
[
i
].
used
,
&
ulist
[
i
].
used
)
||
get_user
(
tmp1
,
&
ulist
[
i
].
address
))
goto
out
;
karg
.
list
[
i
].
address
=
(
void
*
)
A
(
tmp1
);
}
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_MAP_BUFS
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
for
(
i
=
0
;
i
<
orig_count
;
i
++
)
{
tmp1
=
(
u32
)
(
long
)
karg
.
list
[
i
].
address
;
if
(
put_user
(
karg
.
list
[
i
].
idx
,
&
ulist
[
i
].
idx
)
||
put_user
(
karg
.
list
[
i
].
total
,
&
ulist
[
i
].
total
)
||
put_user
(
karg
.
list
[
i
].
used
,
&
ulist
[
i
].
used
)
||
put_user
(
tmp1
,
&
ulist
[
i
].
address
))
{
ret
=
-
EFAULT
;
goto
out
;
}
}
if
(
put_user
(
karg
.
count
,
&
uarg
->
count
))
ret
=
-
EFAULT
;
}
out:
kfree
(
karg
.
list
);
return
ret
;
}
typedef
struct
drm32_dma
{
/* Indices here refer to the offset into
buflist in drm_buf_get_t. */
int
context
;
/* Context handle */
int
send_count
;
/* Number of buffers to send */
u32
send_indices
;
/* List of handles to buffers (int *) */
u32
send_sizes
;
/* Lengths of data to send (int *) */
drm_dma_flags_t
flags
;
/* Flags */
int
request_count
;
/* Number of buffers requested */
int
request_size
;
/* Desired size for buffers */
u32
request_indices
;
/* Buffer information (int *) */
u32
request_sizes
;
/* (int *) */
int
granted_count
;
/* Number of buffers granted */
}
drm32_dma_t
;
#define DRM32_IOCTL_DMA DRM_IOWR(0x29, drm32_dma_t)
/* RED PEN The DRM layer blindly dereferences the send/request
* indice/size arrays even though they are userland
* pointers. -DaveM
*/
static
int
drm32_dma
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_dma_t
*
uarg
=
(
drm32_dma_t
*
)
arg
;
int
*
u_si
,
*
u_ss
,
*
u_ri
,
*
u_rs
;
drm_dma_t
karg
;
mm_segment_t
old_fs
;
int
ret
;
u32
tmp1
,
tmp2
,
tmp3
,
tmp4
;
karg
.
send_indices
=
karg
.
send_sizes
=
NULL
;
karg
.
request_indices
=
karg
.
request_sizes
=
NULL
;
if
(
get_user
(
karg
.
context
,
&
uarg
->
context
)
||
get_user
(
karg
.
send_count
,
&
uarg
->
send_count
)
||
get_user
(
tmp1
,
&
uarg
->
send_indices
)
||
get_user
(
tmp2
,
&
uarg
->
send_sizes
)
||
get_user
(
karg
.
flags
,
&
uarg
->
flags
)
||
get_user
(
karg
.
request_count
,
&
uarg
->
request_count
)
||
get_user
(
karg
.
request_size
,
&
uarg
->
request_size
)
||
get_user
(
tmp3
,
&
uarg
->
request_indices
)
||
get_user
(
tmp4
,
&
uarg
->
request_sizes
)
||
get_user
(
karg
.
granted_count
,
&
uarg
->
granted_count
))
return
-
EFAULT
;
u_si
=
(
int
*
)
A
(
tmp1
);
u_ss
=
(
int
*
)
A
(
tmp2
);
u_ri
=
(
int
*
)
A
(
tmp3
);
u_rs
=
(
int
*
)
A
(
tmp4
);
if
(
karg
.
send_count
)
{
karg
.
send_indices
=
kmalloc
(
karg
.
send_count
*
sizeof
(
int
),
GFP_KERNEL
);
karg
.
send_sizes
=
kmalloc
(
karg
.
send_count
*
sizeof
(
int
),
GFP_KERNEL
);
ret
=
-
ENOMEM
;
if
(
!
karg
.
send_indices
||
!
karg
.
send_sizes
)
goto
out
;
ret
=
-
EFAULT
;
if
(
copy_from_user
(
karg
.
send_indices
,
u_si
,
(
karg
.
send_count
*
sizeof
(
int
)))
||
copy_from_user
(
karg
.
send_sizes
,
u_ss
,
(
karg
.
send_count
*
sizeof
(
int
))))
goto
out
;
}
if
(
karg
.
request_count
)
{
karg
.
request_indices
=
kmalloc
(
karg
.
request_count
*
sizeof
(
int
),
GFP_KERNEL
);
karg
.
request_sizes
=
kmalloc
(
karg
.
request_count
*
sizeof
(
int
),
GFP_KERNEL
);
ret
=
-
ENOMEM
;
if
(
!
karg
.
request_indices
||
!
karg
.
request_sizes
)
goto
out
;
ret
=
-
EFAULT
;
if
(
copy_from_user
(
karg
.
request_indices
,
u_ri
,
(
karg
.
request_count
*
sizeof
(
int
)))
||
copy_from_user
(
karg
.
request_sizes
,
u_rs
,
(
karg
.
request_count
*
sizeof
(
int
))))
goto
out
;
}
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_DMA
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
if
(
put_user
(
karg
.
context
,
&
uarg
->
context
)
||
put_user
(
karg
.
send_count
,
&
uarg
->
send_count
)
||
put_user
(
karg
.
flags
,
&
uarg
->
flags
)
||
put_user
(
karg
.
request_count
,
&
uarg
->
request_count
)
||
put_user
(
karg
.
request_size
,
&
uarg
->
request_size
)
||
put_user
(
karg
.
granted_count
,
&
uarg
->
granted_count
))
ret
=
-
EFAULT
;
if
(
karg
.
send_count
)
{
if
(
copy_to_user
(
u_si
,
karg
.
send_indices
,
(
karg
.
send_count
*
sizeof
(
int
)))
||
copy_to_user
(
u_ss
,
karg
.
send_sizes
,
(
karg
.
send_count
*
sizeof
(
int
))))
ret
=
-
EFAULT
;
}
if
(
karg
.
request_count
)
{
if
(
copy_to_user
(
u_ri
,
karg
.
request_indices
,
(
karg
.
request_count
*
sizeof
(
int
)))
||
copy_to_user
(
u_rs
,
karg
.
request_sizes
,
(
karg
.
request_count
*
sizeof
(
int
))))
ret
=
-
EFAULT
;
}
}
out:
kfree
(
karg
.
send_indices
);
kfree
(
karg
.
send_sizes
);
kfree
(
karg
.
request_indices
);
kfree
(
karg
.
request_sizes
);
return
ret
;
}
typedef
struct
drm32_ctx_res
{
int
count
;
u32
contexts
;
/* (drm_ctx_t *) */
}
drm32_ctx_res_t
;
#define DRM32_IOCTL_RES_CTX DRM_IOWR(0x26, drm32_ctx_res_t)
static
int
drm32_res_ctx
(
unsigned
int
fd
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm32_ctx_res_t
*
uarg
=
(
drm32_ctx_res_t
*
)
arg
;
drm_ctx_t
*
ulist
;
drm_ctx_res_t
karg
;
mm_segment_t
old_fs
;
int
orig_count
,
ret
;
u32
tmp
;
karg
.
contexts
=
NULL
;
if
(
get_user
(
karg
.
count
,
&
uarg
->
count
)
||
get_user
(
tmp
,
&
uarg
->
contexts
))
return
-
EFAULT
;
ulist
=
(
drm_ctx_t
*
)
A
(
tmp
);
orig_count
=
karg
.
count
;
if
(
karg
.
count
&&
ulist
)
{
karg
.
contexts
=
kmalloc
((
karg
.
count
*
sizeof
(
drm_ctx_t
)),
GFP_KERNEL
);
if
(
!
karg
.
contexts
)
return
-
ENOMEM
;
if
(
copy_from_user
(
karg
.
contexts
,
ulist
,
(
karg
.
count
*
sizeof
(
drm_ctx_t
))))
{
kfree
(
karg
.
contexts
);
return
-
EFAULT
;
}
}
old_fs
=
get_fs
();
set_fs
(
KERNEL_DS
);
ret
=
sys_ioctl
(
fd
,
DRM_IOCTL_RES_CTX
,
(
unsigned
long
)
&
karg
);
set_fs
(
old_fs
);
if
(
!
ret
)
{
if
(
orig_count
)
{
if
(
copy_to_user
(
ulist
,
karg
.
contexts
,
(
orig_count
*
sizeof
(
drm_ctx_t
))))
ret
=
-
EFAULT
;
}
if
(
put_user
(
karg
.
count
,
&
uarg
->
count
))
ret
=
-
EFAULT
;
}
kfree
(
karg
.
contexts
);
return
ret
;
}
#endif
#define HANDLE_IOCTL(cmd, handler) { cmd, (ioctl_trans_handler_t)handler, NULL },
#define COMPATIBLE_IOCTL(cmd) HANDLE_IOCTL(cmd, sys_ioctl)
...
...
@@ -561,11 +31,6 @@ IOCTL_TABLE_START
#define DECLARES
#include "compat_ioctl.c"
/* PA-specific ioctls */
COMPATIBLE_IOCTL
(
PA_PERF_ON
)
COMPATIBLE_IOCTL
(
PA_PERF_OFF
)
COMPATIBLE_IOCTL
(
PA_PERF_VERSION
)
/* And these ioctls need translation */
HANDLE_IOCTL
(
SIOCGPPPSTATS
,
dev_ifsioc
)
HANDLE_IOCTL
(
SIOCGPPPCSTATS
,
dev_ifsioc
)
...
...
@@ -590,17 +55,6 @@ HANDLE_IOCTL(RTC_EPOCH_READ, w_long)
COMPATIBLE_IOCTL
(
RTC_EPOCH_SET
)
#endif
#if defined(CONFIG_DRM) || defined(CONFIG_DRM_MODULE)
HANDLE_IOCTL
(
DRM32_IOCTL_VERSION
,
drm32_version
);
HANDLE_IOCTL
(
DRM32_IOCTL_GET_UNIQUE
,
drm32_getsetunique
);
HANDLE_IOCTL
(
DRM32_IOCTL_SET_UNIQUE
,
drm32_getsetunique
);
HANDLE_IOCTL
(
DRM32_IOCTL_ADD_MAP
,
drm32_addmap
);
HANDLE_IOCTL
(
DRM32_IOCTL_INFO_BUFS
,
drm32_info_bufs
);
HANDLE_IOCTL
(
DRM32_IOCTL_FREE_BUFS
,
drm32_free_bufs
);
HANDLE_IOCTL
(
DRM32_IOCTL_MAP_BUFS
,
drm32_map_bufs
);
HANDLE_IOCTL
(
DRM32_IOCTL_DMA
,
drm32_dma
);
HANDLE_IOCTL
(
DRM32_IOCTL_RES_CTX
,
drm32_res_ctx
);
#endif
/* DRM */
IOCTL_TABLE_END
int
ioctl_table_size
=
ARRAY_SIZE
(
ioctl_start
);
arch/parisc/kernel/irq.c
View file @
62ae144f
...
...
@@ -30,6 +30,9 @@
#include <linux/seq_file.h>
#include <linux/spinlock.h>
#include <linux/types.h>
#include <asm/io.h>
#include <asm/smp.h>
#undef PARISC_IRQ_CR16_COUNTS
...
...
@@ -43,26 +46,34 @@ extern irqreturn_t ipi_interrupt(int, void *, struct pt_regs *);
*/
static
volatile
unsigned
long
cpu_eiem
=
0
;
static
void
cpu_set_eiem
(
void
*
info
)
{
set_eiem
((
unsigned
long
)
info
);
}
static
inline
void
cpu_disable_irq
(
unsigned
int
irq
)
static
void
cpu_disable_irq
(
unsigned
int
irq
)
{
unsigned
long
eirr_bit
=
EIEM_MASK
(
irq
);
cpu_eiem
&=
~
eirr_bit
;
on_each_cpu
(
cpu_set_eiem
,
(
void
*
)
cpu_eiem
,
1
,
1
);
/* Do nothing on the other CPUs. If they get this interrupt,
* The & cpu_eiem in the do_cpu_irq_mask() ensures they won't
* handle it, and the set_eiem() at the bottom will ensure it
* then gets disabled */
}
static
void
cpu_enable_irq
(
unsigned
int
irq
)
{
unsigned
long
eirr_bit
=
EIEM_MASK
(
irq
);
mtctl
(
eirr_bit
,
23
);
/* clear EIRR bit before unmasking */
cpu_eiem
|=
eirr_bit
;
on_each_cpu
(
cpu_set_eiem
,
(
void
*
)
cpu_eiem
,
1
,
1
);
/* FIXME: while our interrupts aren't nested, we cannot reset
* the eiem mask if we're already in an interrupt. Once we
* implement nested interrupts, this can go away
*/
if
(
!
in_interrupt
())
set_eiem
(
cpu_eiem
);
/* This is just a simple NOP IPI. But what it does is cause
* all the other CPUs to do a set_eiem(cpu_eiem) at the end
* of the interrupt handler */
smp_send_all_nop
();
}
static
unsigned
int
cpu_startup_irq
(
unsigned
int
irq
)
...
...
@@ -74,6 +85,35 @@ static unsigned int cpu_startup_irq(unsigned int irq)
void
no_ack_irq
(
unsigned
int
irq
)
{
}
void
no_end_irq
(
unsigned
int
irq
)
{
}
#ifdef CONFIG_SMP
int
cpu_check_affinity
(
unsigned
int
irq
,
cpumask_t
*
dest
)
{
int
cpu_dest
;
/* timer and ipi have to always be received on all CPUs */
if
(
irq
==
TIMER_IRQ
||
irq
==
IPI_IRQ
)
{
/* Bad linux design decision. The mask has already
* been set; we must reset it */
irq_affinity
[
irq
]
=
CPU_MASK_ALL
;
return
-
EINVAL
;
}
/* whatever mask they set, we just allow one CPU */
cpu_dest
=
first_cpu
(
*
dest
);
*
dest
=
cpumask_of_cpu
(
cpu_dest
);
return
0
;
}
static
void
cpu_set_affinity_irq
(
unsigned
int
irq
,
cpumask_t
dest
)
{
if
(
cpu_check_affinity
(
irq
,
&
dest
))
return
;
irq_affinity
[
irq
]
=
dest
;
}
#endif
static
struct
hw_interrupt_type
cpu_interrupt_type
=
{
.
typename
=
"CPU"
,
.
startup
=
cpu_startup_irq
,
...
...
@@ -82,7 +122,9 @@ static struct hw_interrupt_type cpu_interrupt_type = {
.
disable
=
cpu_disable_irq
,
.
ack
=
no_ack_irq
,
.
end
=
no_end_irq
,
// .set_affinity = cpu_set_affinity_irq,
#ifdef CONFIG_SMP
.
set_affinity
=
cpu_set_affinity_irq
,
#endif
};
int
show_interrupts
(
struct
seq_file
*
p
,
void
*
v
)
...
...
@@ -219,6 +261,17 @@ int txn_alloc_irq(unsigned int bits_wide)
return
-
1
;
}
unsigned
long
txn_affinity_addr
(
unsigned
int
irq
,
int
cpu
)
{
#ifdef CONFIG_SMP
irq_affinity
[
irq
]
=
cpumask_of_cpu
(
cpu
);
#endif
return
cpu_data
[
cpu
].
txn_addr
;
}
unsigned
long
txn_alloc_addr
(
unsigned
int
virt_irq
)
{
static
int
next_cpu
=
-
1
;
...
...
@@ -233,7 +286,7 @@ unsigned long txn_alloc_addr(unsigned int virt_irq)
if
(
next_cpu
>=
NR_CPUS
)
next_cpu
=
0
;
/* nothing else, assign monarch */
return
cpu_data
[
next_cpu
].
txn_addr
;
return
txn_affinity_addr
(
virt_irq
,
next_cpu
)
;
}
...
...
@@ -250,10 +303,11 @@ void do_cpu_irq_mask(struct pt_regs *regs)
irq_enter
();
/*
* Only allow interrupt processing to be interrupted by the
* timer tick
* Don't allow TIMER or IPI nested interrupts.
* Allowing any single interrupt to nest can lead to that CPU
* handling interrupts with all enabled interrupts unmasked.
*/
set_eiem
(
EIEM_MASK
(
TIMER_IRQ
)
);
set_eiem
(
0UL
);
/* 1) only process IRQs that are enabled/unmasked (cpu_eiem)
* 2) We loop here on EIRR contents in order to avoid
...
...
@@ -267,23 +321,41 @@ void do_cpu_irq_mask(struct pt_regs *regs)
if
(
!
eirr_val
)
break
;
if
(
eirr_val
&
EIEM_MASK
(
TIMER_IRQ
))
set_eiem
(
0
);
mtctl
(
eirr_val
,
23
);
/* reset bits we are going to process */
/* Work our way from MSb to LSb...same order we alloc EIRs */
for
(
irq
=
TIMER_IRQ
;
eirr_val
&&
bit
;
bit
>>=
1
,
irq
++
)
{
#ifdef CONFIG_SMP
cpumask_t
dest
=
irq_affinity
[
irq
];
#endif
if
(
!
(
bit
&
eirr_val
))
continue
;
/* clear bit in mask - can exit loop sooner */
eirr_val
&=
~
bit
;
#ifdef CONFIG_SMP
/* FIXME: because generic set affinity mucks
* with the affinity before sending it to us
* we can get the situation where the affinity is
* wrong for our CPU type interrupts */
if
(
irq
!=
TIMER_IRQ
&&
irq
!=
IPI_IRQ
&&
!
cpu_isset
(
smp_processor_id
(),
dest
))
{
int
cpu
=
first_cpu
(
dest
);
printk
(
KERN_DEBUG
"redirecting irq %d from CPU %d to %d
\n
"
,
irq
,
smp_processor_id
(),
cpu
);
gsc_writel
(
irq
+
CPU_IRQ_BASE
,
cpu_data
[
cpu
].
hpa
);
continue
;
}
#endif
__do_IRQ
(
irq
,
regs
);
}
}
set_eiem
(
cpu_eiem
);
set_eiem
(
cpu_eiem
);
/* restore original mask */
irq_exit
();
}
...
...
@@ -291,12 +363,14 @@ void do_cpu_irq_mask(struct pt_regs *regs)
static
struct
irqaction
timer_action
=
{
.
handler
=
timer_interrupt
,
.
name
=
"timer"
,
.
flags
=
SA_INTERRUPT
,
};
#ifdef CONFIG_SMP
static
struct
irqaction
ipi_action
=
{
.
handler
=
ipi_interrupt
,
.
name
=
"IPI"
,
.
flags
=
SA_INTERRUPT
,
};
#endif
...
...
arch/parisc/kernel/perf.c
View file @
62ae144f
...
...
@@ -196,8 +196,7 @@ static int perf_open(struct inode *inode, struct file *file);
static
ssize_t
perf_read
(
struct
file
*
file
,
char
__user
*
buf
,
size_t
cnt
,
loff_t
*
ppos
);
static
ssize_t
perf_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
ppos
);
static
int
perf_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
);
static
long
perf_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
);
static
void
perf_start_counters
(
void
);
static
int
perf_stop_counters
(
uint32_t
*
raddr
);
static
struct
rdr_tbl_ent
*
perf_rdr_get_entry
(
uint32_t
rdr_num
);
...
...
@@ -438,48 +437,56 @@ static void perf_patch_images(void)
* must be running on the processor that you wish to change.
*/
static
int
perf_ioctl
(
struct
inode
*
inode
,
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
long
perf_ioctl
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
long
error_start
;
uint32_t
raddr
[
4
];
int
error
=
0
;
lock_kernel
();
switch
(
cmd
)
{
case
PA_PERF_ON
:
/* Start the counters */
perf_start_counters
();
return
0
;
break
;
case
PA_PERF_OFF
:
error_start
=
perf_stop_counters
(
raddr
);
if
(
error_start
!=
0
)
{
printk
(
KERN_ERR
"perf_off: perf_stop_counters = %ld
\n
"
,
error_start
);
return
-
EFAULT
;
error
=
-
EFAULT
;
break
;
}
/* copy out the Counters */
if
(
copy_to_user
((
void
__user
*
)
arg
,
raddr
,
sizeof
(
raddr
))
!=
0
)
{
return
-
EFAULT
;
error
=
-
EFAULT
;
break
;
}
return
0
;
break
;
case
PA_PERF_VERSION
:
/* Return the version # */
return
put_user
(
PERF_VERSION
,
(
int
*
)
arg
);
error
=
put_user
(
PERF_VERSION
,
(
int
*
)
arg
);
break
;
default:
break
;
error
=
-
ENOTTY
;
}
return
-
ENOTTY
;
unlock_kernel
();
return
error
;
}
static
struct
file_operations
perf_fops
=
{
.
llseek
=
no_llseek
,
.
read
=
perf_read
,
.
write
=
perf_write
,
.
ioctl
=
perf_ioctl
,
.
unlocked_ioctl
=
perf_ioctl
,
.
compat_ioctl
=
perf_ioctl
,
.
open
=
perf_open
,
.
release
=
perf_release
};
...
...
arch/parisc/kernel/ptrace.c
View file @
62ae144f
...
...
@@ -264,6 +264,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
* sigkill. perhaps it should be put in the status
* that it wants to exit.
*/
ret
=
0
;
DBG
(
"sys_ptrace(KILL)
\n
"
);
if
(
child
->
exit_state
==
EXIT_ZOMBIE
)
/* already dead */
goto
out_tsk
;
...
...
@@ -344,11 +345,11 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
case
PTRACE_GETEVENTMSG
:
ret
=
put_user
(
child
->
ptrace_message
,
(
unsigned
int
__user
*
)
data
);
goto
out
;
goto
out
_tsk
;
default:
ret
=
ptrace_request
(
child
,
request
,
addr
,
data
);
goto
out
;
goto
out
_tsk
;
}
out_wake_notrap:
...
...
arch/parisc/kernel/signal.c
View file @
62ae144f
...
...
@@ -296,7 +296,6 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
struct
rt_sigframe
__user
*
frame
;
unsigned
long
rp
,
usp
;
unsigned
long
haddr
,
sigframe_size
;
struct
siginfo
si
;
int
err
=
0
;
#ifdef __LP64__
compat_int_t
compat_val
;
...
...
arch/parisc/kernel/smp.c
View file @
62ae144f
...
...
@@ -181,12 +181,19 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
while
(
ops
)
{
unsigned
long
which
=
ffz
(
~
ops
);
ops
&=
~
(
1
<<
which
);
switch
(
which
)
{
case
IPI_NOP
:
#if (kDEBUG>=100)
printk
(
KERN_DEBUG
"CPU%d IPI_NOP
\n
"
,
this_cpu
);
#endif
/* kDEBUG */
break
;
case
IPI_RESCHEDULE
:
#if (kDEBUG>=100)
printk
(
KERN_DEBUG
"CPU%d IPI_RESCHEDULE
\n
"
,
this_cpu
);
#endif
/* kDEBUG */
ops
&=
~
(
1
<<
IPI_RESCHEDULE
);
/*
* Reschedule callback. Everything to be
* done is done by the interrupt return path.
...
...
@@ -197,7 +204,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
#if (kDEBUG>=100)
printk
(
KERN_DEBUG
"CPU%d IPI_CALL_FUNC
\n
"
,
this_cpu
);
#endif
/* kDEBUG */
ops
&=
~
(
1
<<
IPI_CALL_FUNC
);
{
volatile
struct
smp_call_struct
*
data
;
void
(
*
func
)(
void
*
info
);
...
...
@@ -231,7 +237,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
#if (kDEBUG>=100)
printk
(
KERN_DEBUG
"CPU%d IPI_CPU_START
\n
"
,
this_cpu
);
#endif
/* kDEBUG */
ops
&=
~
(
1
<<
IPI_CPU_START
);
#ifdef ENTRY_SYS_CPUS
p
->
state
=
STATE_RUNNING
;
#endif
...
...
@@ -241,7 +246,6 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
#if (kDEBUG>=100)
printk
(
KERN_DEBUG
"CPU%d IPI_CPU_STOP
\n
"
,
this_cpu
);
#endif
/* kDEBUG */
ops
&=
~
(
1
<<
IPI_CPU_STOP
);
#ifdef ENTRY_SYS_CPUS
#else
halt_processor
();
...
...
@@ -252,13 +256,11 @@ ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
#if (kDEBUG>=100)
printk
(
KERN_DEBUG
"CPU%d is alive!
\n
"
,
this_cpu
);
#endif
/* kDEBUG */
ops
&=
~
(
1
<<
IPI_CPU_TEST
);
break
;
default:
printk
(
KERN_CRIT
"Unknown IPI num on CPU%d: %lu
\n
"
,
this_cpu
,
which
);
ops
&=
~
(
1
<<
which
);
return
IRQ_NONE
;
}
/* Switch */
}
/* while (ops) */
...
...
@@ -312,6 +314,12 @@ smp_send_start(void) { send_IPI_allbutself(IPI_CPU_START); }
void
smp_send_reschedule
(
int
cpu
)
{
send_IPI_single
(
cpu
,
IPI_RESCHEDULE
);
}
void
smp_send_all_nop
(
void
)
{
send_IPI_allbutself
(
IPI_NOP
);
}
/**
* Run a function on all other CPUs.
...
...
@@ -339,6 +347,10 @@ smp_call_function (void (*func) (void *info), void *info, int retry, int wait)
/* Can deadlock when called with interrupts disabled */
WARN_ON
(
irqs_disabled
());
/* can also deadlock if IPIs are disabled */
WARN_ON
((
get_eiem
()
&
(
1UL
<<
(
CPU_IRQ_MAX
-
IPI_IRQ
)))
==
0
);
data
.
func
=
func
;
data
.
info
=
info
;
data
.
wait
=
wait
;
...
...
arch/parisc/kernel/syscall.S
View file @
62ae144f
...
...
@@ -164,7 +164,7 @@ linux_gateway_entry:
#endif
STREG
%
r2
,
TASK_PT_GR30
(%
r1
)
/*
...
and
save
it
*/
STREG
%
r20
,
TASK_PT_GR20
(%
r1
)
STREG
%
r20
,
TASK_PT_GR20
(%
r1
)
/*
Syscall
number
*/
STREG
%
r21
,
TASK_PT_GR21
(%
r1
)
STREG
%
r22
,
TASK_PT_GR22
(%
r1
)
STREG
%
r23
,
TASK_PT_GR23
(%
r1
)
/*
4
th
argument
*/
...
...
@@ -527,6 +527,7 @@ lws_compare_and_swap:
We
*
must
*
giveup
this
call
and
fail
.
*/
ldw
4
(%
sr2
,%
r20
),
%
r28
/*
Load
thread
register
*/
/
*
WARNING
:
If
cr27
cycles
to
the
same
value
we
have
problems
*/
mfctl
%
cr27
,
%
r21
/*
Get
current
thread
register
*/
cmpb
,<>,
n
%
r21
,
%
r28
,
cas_lock
/*
Called
recursive
?
*/
b
lws_exit
/*
Return
error
!
*/
...
...
drivers/ide/Kconfig
View file @
62ae144f
...
...
@@ -625,7 +625,7 @@ config BLK_DEV_NS87415
tristate "NS87415 chipset support"
help
This driver adds detection and support for the NS87415 chip
(used
in SPARC64, among other
s).
(used
mainly on SPARC64 and PA-RISC machine
s).
Please read the comments at the top of <file:drivers/ide/pci/ns87415.c>.
...
...
drivers/isdn/hisax/Kconfig
View file @
62ae144f
...
...
@@ -110,7 +110,7 @@ config HISAX_16_3
config HISAX_TELESPCI
bool "Teles PCI"
depends on PCI && (BROKEN || !(SPARC
64 || PPC
))
depends on PCI && (BROKEN || !(SPARC
|| PPC || PARISC || M68K
))
help
This enables HiSax support for the Teles PCI.
See <file:Documentation/isdn/README.HiSax> on how to configure it.
...
...
@@ -238,7 +238,7 @@ config HISAX_MIC
config HISAX_NETJET
bool "NETjet card"
depends on PCI && (BROKEN || !(SPARC
64 || PPC
))
depends on PCI && (BROKEN || !(SPARC
|| PPC || PARISC || M68K
))
help
This enables HiSax support for the NetJet from Traverse
Technologies.
...
...
@@ -249,7 +249,7 @@ config HISAX_NETJET
config HISAX_NETJET_U
bool "NETspider U card"
depends on PCI && (BROKEN || !(SPARC
64 || PPC
))
depends on PCI && (BROKEN || !(SPARC
|| PPC || PARISC || M68K
))
help
This enables HiSax support for the Netspider U interface ISDN card
from Traverse Technologies.
...
...
@@ -317,7 +317,7 @@ config HISAX_GAZEL
config HISAX_HFC_PCI
bool "HFC PCI-Bus cards"
depends on PCI && (BROKEN || !(SPARC
64 || PPC
))
depends on PCI && (BROKEN || !(SPARC
|| PPC || PARISC || M68K
))
help
This enables HiSax support for the HFC-S PCI 2BDS0 based cards.
...
...
@@ -344,14 +344,14 @@ config HISAX_HFC_SX
config HISAX_ENTERNOW_PCI
bool "Formula-n enter:now PCI card"
depends on PCI && (BROKEN || !(SPARC
64 || PPC
))
depends on PCI && (BROKEN || !(SPARC
|| PPC || PARISC || M68K
))
help
This enables HiSax support for the Formula-n enter:now PCI
ISDN card.
config HISAX_AMD7930
bool "Am7930 (EXPERIMENTAL)"
depends on EXPERIMENTAL &&
(SPARC32 || SPARC64)
depends on EXPERIMENTAL &&
SPARC
help
This enables HiSax support for the AMD7930 chips on some SPARCs.
This code is not finished yet.
...
...
drivers/isdn/pcbit/Kconfig
View file @
62ae144f
...
...
@@ -3,7 +3,7 @@
#
config ISDN_DRV_PCBIT
tristate "PCBIT-D support"
depends on ISDN_I4L && ISA && (BROKEN ||
!PPC
)
depends on ISDN_I4L && ISA && (BROKEN ||
X86
)
help
This enables support for the PCBIT ISDN-card. This card is
manufactured in Portugal by Octal. For running this card,
...
...
drivers/parisc/iosapic.c
View file @
62ae144f
...
...
@@ -700,6 +700,28 @@ static unsigned int iosapic_startup_irq(unsigned int irq)
return
0
;
}
#ifdef CONFIG_SMP
static
void
iosapic_set_affinity_irq
(
unsigned
int
irq
,
cpumask_t
dest
)
{
struct
vector_info
*
vi
=
iosapic_get_vector
(
irq
);
u32
d0
,
d1
,
dummy_d0
;
unsigned
long
flags
;
if
(
cpu_check_affinity
(
irq
,
&
dest
))
return
;
vi
->
txn_addr
=
txn_affinity_addr
(
irq
,
first_cpu
(
dest
));
spin_lock_irqsave
(
&
iosapic_lock
,
flags
);
/* d1 contains the destination CPU, so only want to set that
* entry */
iosapic_rd_irt_entry
(
vi
,
&
d0
,
&
d1
);
iosapic_set_irt_data
(
vi
,
&
dummy_d0
,
&
d1
);
iosapic_wr_irt_entry
(
vi
,
d0
,
d1
);
spin_unlock_irqrestore
(
&
iosapic_lock
,
flags
);
}
#endif
static
struct
hw_interrupt_type
iosapic_interrupt_type
=
{
.
typename
=
"IO-SAPIC-level"
,
.
startup
=
iosapic_startup_irq
,
...
...
@@ -708,7 +730,9 @@ static struct hw_interrupt_type iosapic_interrupt_type = {
.
disable
=
iosapic_disable_irq
,
.
ack
=
no_ack_irq
,
.
end
=
iosapic_end_irq
,
// .set_affinity = iosapic_set_affinity_irq,
#ifdef CONFIG_SMP
.
set_affinity
=
iosapic_set_affinity_irq
,
#endif
};
int
iosapic_fixup_irq
(
void
*
isi_obj
,
struct
pci_dev
*
pcidev
)
...
...
drivers/parisc/superio.c
View file @
62ae144f
...
...
@@ -24,6 +24,9 @@
* Major changes to get basic interrupt infrastructure working to
* hopefully be able to support all SuperIO devices. Currently
* works with serial. -- John Marvin <jsm@fc.hp.com>
*
* Converted superio_init() to be a PCI_FIXUP_FINAL callee.
* -- Kyle McMartin <kyle@parisc-linux.org>
*/
...
...
@@ -141,10 +144,10 @@ superio_interrupt(int parent_irq, void *devp, struct pt_regs *regs)
}
/* Initialize Super I/O device */
static
void
__devinit
superio_init
(
struct
superio_device
*
sio
)
static
void
superio_init
(
struct
pci_dev
*
pcidev
)
{
struct
superio_device
*
sio
=
&
sio_dev
;
struct
pci_dev
*
pdev
=
sio
->
lio_pdev
;
u16
word
;
...
...
@@ -160,8 +163,8 @@ superio_init(struct superio_device *sio)
/* ...then properly fixup the USB to point at suckyio PIC */
sio
->
usb_pdev
->
irq
=
superio_fixup_irq
(
sio
->
usb_pdev
);
printk
(
KERN_INFO
"SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i)
\n
"
,
pci_name
(
pdev
),
pdev
->
irq
);
printk
(
KERN_INFO
"SuperIO: Found NS87560 Legacy I/O device at %s (IRQ %i)
\n
"
,
pci_name
(
pdev
),
pdev
->
irq
);
pci_read_config_dword
(
pdev
,
SIO_SP1BAR
,
&
sio
->
sp1_base
);
sio
->
sp1_base
&=
~
1
;
...
...
@@ -274,7 +277,7 @@ superio_init(struct superio_device *sio)
sio
->
suckyio_irq_enabled
=
1
;
}
DECLARE_PCI_FIXUP_FINAL
(
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87560_LIO
,
superio_init
);
static
void
superio_disable_irq
(
unsigned
int
irq
)
{
...
...
@@ -452,8 +455,10 @@ static void superio_fixup_pci(struct pci_dev *pdev)
DECLARE_PCI_FIXUP_EARLY
(
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87415
,
superio_fixup_pci
);
static
int
__devinit
superio_probe
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
static
int
__devinit
superio_probe
(
struct
pci_dev
*
dev
,
const
struct
pci_device_id
*
id
)
{
struct
superio_device
*
sio
=
&
sio_dev
;
/*
** superio_probe(00:0e.0) ven 0x100b dev 0x2 sv 0x0 sd 0x0 class 0x1018a
...
...
@@ -466,7 +471,8 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_
dev
->
subsystem_vendor
,
dev
->
subsystem_device
,
dev
->
class
);
superio_init
(
&
sio_dev
);
if
(
!
sio
->
suckyio_irq_enabled
)
BUG
();
/* Enabled by PCI_FIXUP_FINAL */
if
(
dev
->
device
==
PCI_DEVICE_ID_NS_87560_LIO
)
{
/* Function 1 */
superio_parport_init
();
...
...
@@ -486,7 +492,9 @@ static int __devinit superio_probe(struct pci_dev *dev, const struct pci_device_
}
static
struct
pci_device_id
superio_tbl
[]
=
{
{
PCI_VENDOR_ID_NS
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_ANY_ID
,
0
,
0
,
0
},
{
PCI_DEVICE
(
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87560_LIO
)
},
{
PCI_DEVICE
(
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87560_USB
)
},
{
PCI_DEVICE
(
PCI_VENDOR_ID_NS
,
PCI_DEVICE_ID_NS_87415
)
},
{
0
,
}
};
...
...
@@ -506,6 +514,5 @@ static void __exit superio_exit(void)
pci_unregister_driver
(
&
superio_driver
);
}
module_init
(
superio_modinit
);
module_exit
(
superio_exit
);
drivers/serial/Kconfig
View file @
62ae144f
...
...
@@ -507,7 +507,7 @@ config SERIAL_SUNSU_CONSOLE
config SERIAL_MUX
tristate "Serial MUX support"
depends on
PARI
SC
depends on
G
SC
select SERIAL_CORE
default y
---help---
...
...
drivers/serial/mux.c
View file @
62ae144f
...
...
@@ -65,8 +65,8 @@ static struct uart_driver mux_driver = {
static
struct
timer_list
mux_timer
;
#define UART_PUT_CHAR(p, c) __raw_writel((c), (
unsigned long)(
p)->membase + IO_DATA_REG_OFFSET)
#define UART_GET_FIFO_CNT(p) __raw_readl((
unsigned long)(
p)->membase + IO_DCOUNT_REG_OFFSET)
#define UART_PUT_CHAR(p, c) __raw_writel((c), (p)->membase + IO_DATA_REG_OFFSET)
#define UART_GET_FIFO_CNT(p) __raw_readl((p)->membase + IO_DCOUNT_REG_OFFSET)
#define GET_MUX_PORTS(iodc_data) ((((iodc_data)[4] & 0xf0) >> 4) * 8) + 8
/**
...
...
@@ -79,10 +79,7 @@ static struct timer_list mux_timer;
*/
static
unsigned
int
mux_tx_empty
(
struct
uart_port
*
port
)
{
unsigned
int
cnt
=
__raw_readl
((
unsigned
long
)
port
->
membase
+
IO_DCOUNT_REG_OFFSET
);
return
cnt
?
0
:
TIOCSER_TEMT
;
return
UART_GET_FIFO_CNT
(
port
)
?
0
:
TIOCSER_TEMT
;
}
/**
...
...
@@ -218,8 +215,7 @@ static void mux_read(struct uart_port *port)
__u32
start_count
=
port
->
icount
.
rx
;
while
(
1
)
{
data
=
__raw_readl
((
unsigned
long
)
port
->
membase
+
IO_DATA_REG_OFFSET
);
data
=
__raw_readl
(
port
->
membase
+
IO_DATA_REG_OFFSET
);
if
(
MUX_STATUS
(
data
))
continue
;
...
...
@@ -481,6 +477,13 @@ static int __init mux_probe(struct parisc_device *dev)
port
->
ops
=
&
mux_pops
;
port
->
flags
=
UPF_BOOT_AUTOCONF
;
port
->
line
=
port_cnt
;
/* The port->timeout needs to match what is present in
* uart_wait_until_sent in serial_core.c. Otherwise
* the time spent in msleep_interruptable will be very
* long, causing the appearance of a console hang.
*/
port
->
timeout
=
HZ
/
50
;
spin_lock_init
(
&
port
->
lock
);
status
=
uart_add_one_port
(
&
mux_driver
,
port
);
BUG_ON
(
status
);
...
...
include/asm-parisc/irq.h
View file @
62ae144f
...
...
@@ -8,6 +8,7 @@
#define _ASM_PARISC_IRQ_H
#include <linux/config.h>
#include <linux/cpumask.h>
#include <asm/types.h>
#define NO_IRQ (-1)
...
...
@@ -49,10 +50,10 @@ extern int txn_alloc_irq(unsigned int nbits);
extern
int
txn_claim_irq
(
int
);
extern
unsigned
int
txn_alloc_data
(
unsigned
int
);
extern
unsigned
long
txn_alloc_addr
(
unsigned
int
);
extern
unsigned
long
txn_affinity_addr
(
unsigned
int
irq
,
int
cpu
);
extern
int
cpu_claim_irq
(
unsigned
int
irq
,
struct
hw_interrupt_type
*
,
void
*
);
extern
int
cpu_claim_irq
(
unsigned
int
irq
,
struct
hw_interrupt_type
*
,
void
*
);
extern
int
cpu_check_affinity
(
unsigned
int
irq
,
cpumask_t
*
dest
);
/* soft power switch support (power.c) */
extern
struct
tasklet_struct
power_tasklet
;
...
...
include/asm-parisc/smp.h
View file @
62ae144f
...
...
@@ -29,6 +29,7 @@ extern cpumask_t cpu_online_map;
#define cpu_logical_map(cpu) (cpu)
extern
void
smp_send_reschedule
(
int
cpu
);
extern
void
smp_send_all_nop
(
void
);
#endif
/* !ASSEMBLY */
...
...
@@ -53,7 +54,11 @@ extern unsigned long cpu_present_mask;
#define raw_smp_processor_id() (current_thread_info()->cpu)
#endif
/* CONFIG_SMP */
#else
/* CONFIG_SMP */
static
inline
void
smp_send_all_nop
(
void
)
{
return
;
}
#endif
#define NO_PROC_ID 0xFF
/* No processor magic marker */
#define ANY_PROC_ID 0xFF
/* Any processor magic marker */
...
...
include/asm-parisc/spinlock.h
View file @
62ae144f
...
...
@@ -11,18 +11,25 @@ static inline int __raw_spin_is_locked(raw_spinlock_t *x)
return
*
a
==
0
;
}
#define __raw_spin_lock
_flags(lock, flags) __raw_spin_lock(lock
)
#define __raw_spin_lock
(lock) __raw_spin_lock_flags(lock, 0
)
#define __raw_spin_unlock_wait(x) \
do { cpu_relax(); } while (__raw_spin_is_locked(x))
static
inline
void
__raw_spin_lock
(
raw_spinlock_t
*
x
)
static
inline
void
__raw_spin_lock_flags
(
raw_spinlock_t
*
x
,
unsigned
long
flags
)
{
volatile
unsigned
int
*
a
;
mb
();
a
=
__ldcw_align
(
x
);
while
(
__ldcw
(
a
)
==
0
)
while
(
*
a
==
0
);
while
(
*
a
==
0
)
if
(
flags
&
PSW_SM_I
)
{
local_irq_enable
();
cpu_relax
();
local_irq_disable
();
}
else
cpu_relax
();
mb
();
}
...
...
@@ -60,26 +67,20 @@ static inline int __raw_spin_trylock(raw_spinlock_t *x)
static
__inline__
void
__raw_read_lock
(
raw_rwlock_t
*
rw
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
__raw_spin_lock
(
&
rw
->
lock
);
rw
->
counter
++
;
__raw_spin_unlock
(
&
rw
->
lock
);
local_irq_restore
(
flags
);
}
static
__inline__
void
__raw_read_unlock
(
raw_rwlock_t
*
rw
)
{
unsigned
long
flags
;
local_irq_save
(
flags
);
__raw_spin_lock
(
&
rw
->
lock
);
rw
->
counter
--
;
__raw_spin_unlock
(
&
rw
->
lock
);
local_irq_restore
(
flags
);
}
/* write_lock is less trivial. We optimistically grab the lock and check
...
...
include/asm-parisc/tlbflush.h
View file @
62ae144f
...
...
@@ -12,21 +12,15 @@
* N class systems, only one PxTLB inter processor broadcast can be
* active at any one time on the Merced bus. This tlb purge
* synchronisation is fairly lightweight and harmless so we activate
* it on all SMP systems not just the N class. */
#ifdef CONFIG_SMP
* it on all SMP systems not just the N class. We also need to have
* preemption disabled on uniprocessor machines, and spin_lock does that
* nicely.
*/
extern
spinlock_t
pa_tlb_lock
;
#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
#else
#define purge_tlb_start(x) do { } while(0)
#define purge_tlb_end(x) do { } while (0)
#endif
extern
void
flush_tlb_all
(
void
);
/*
...
...
@@ -88,7 +82,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
if
(
npages
>=
512
)
/* 2MB of space: arbitrary, should be tuned */
flush_tlb_all
();
else
{
preempt_disable
();
mtsp
(
vma
->
vm_mm
->
context
,
1
);
purge_tlb_start
();
if
(
split_tlb
)
{
...
...
@@ -102,7 +95,6 @@ static inline void flush_tlb_range(struct vm_area_struct *vma,
pdtlb
(
start
);
start
+=
PAGE_SIZE
;
}
preempt_enable
();
}
purge_tlb_end
();
}
...
...
include/linux/mm.h
View file @
62ae144f
...
...
@@ -940,7 +940,9 @@ unsigned long max_sane_readahead(unsigned long nr);
/* Do stack extension */
extern
int
expand_stack
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
);
#ifdef CONFIG_IA64
extern
int
expand_upwards
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
);
#endif
/* Look up the first VMA which satisfies addr < vm_end, NULL if none. */
extern
struct
vm_area_struct
*
find_vma
(
struct
mm_struct
*
mm
,
unsigned
long
addr
);
...
...
mm/mmap.c
View file @
62ae144f
...
...
@@ -1501,7 +1501,7 @@ static int acct_stack_growth(struct vm_area_struct * vma, unsigned long size, un
* PA-RISC uses this for its stack; IA64 for its Register Backing Store.
* vma is the last one with address > vma->vm_end. Have to extend vma.
*/
#if
def CONFIG_STACK_GROWSUP
#if
ndef CONFIG_IA64
static
inline
#endif
int
expand_upwards
(
struct
vm_area_struct
*
vma
,
unsigned
long
address
)
...
...
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