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
903d1fe4
Commit
903d1fe4
authored
May 13, 2003
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Plain Diff
Merge
bk://kernel.bkbits.net/davem/net-2.5
into home.transmeta.com:/home/torvalds/v2.5/linux
parents
fa72effd
40f911f6
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
368 additions
and
323 deletions
+368
-323
arch/i386/lib/usercopy.c
arch/i386/lib/usercopy.c
+15
-13
drivers/char/agp/Makefile
drivers/char/agp/Makefile
+1
-1
drivers/char/agp/agp.h
drivers/char/agp/agp.h
+16
-3
drivers/char/agp/amd-k8-agp.c
drivers/char/agp/amd-k8-agp.c
+30
-4
drivers/char/agp/generic.c
drivers/char/agp/generic.c
+132
-59
drivers/char/agp/isoch.c
drivers/char/agp/isoch.c
+78
-147
drivers/char/drm/Kconfig
drivers/char/drm/Kconfig
+2
-2
include/sound/seq_kernel.h
include/sound/seq_kernel.h
+1
-1
sound/core/seq/oss/seq_oss_device.h
sound/core/seq/oss/seq_oss_device.h
+2
-2
sound/core/seq/oss/seq_oss_ioctl.c
sound/core/seq/oss/seq_oss_ioctl.c
+1
-1
sound/core/seq/oss/seq_oss_rw.c
sound/core/seq/oss/seq_oss_rw.c
+2
-2
sound/core/seq/oss/seq_oss_synth.c
sound/core/seq/oss/seq_oss_synth.c
+1
-1
sound/core/seq/oss/seq_oss_timer.c
sound/core/seq/oss/seq_oss_timer.c
+5
-5
sound/core/seq/oss/seq_oss_timer.h
sound/core/seq/oss/seq_oss_timer.h
+1
-1
sound/core/seq/seq_clientmgr.c
sound/core/seq/seq_clientmgr.c
+81
-81
No files found.
arch/i386/lib/usercopy.c
View file @
903d1fe4
...
...
@@ -12,14 +12,16 @@
#include <asm/uaccess.h>
#include <asm/mmx.h>
static
inline
int
movsl_is_ok
(
const
void
*
a1
,
const
void
*
a2
,
unsigned
long
n
)
static
inline
int
__movsl_is_ok
(
unsigned
long
a1
,
unsigned
long
a2
,
unsigned
long
n
)
{
#ifdef CONFIG_X86_INTEL_USERCOPY
if
(
n
>=
64
&&
((
(
const
long
)
a1
^
(
const
long
)
a2
)
&
movsl_mask
.
mask
))
if
(
n
>=
64
&&
((
a1
^
a2
)
&
movsl_mask
.
mask
))
return
0
;
#endif
return
1
;
}
#define movsl_is_ok(a1,a2,n) \
__movsl_is_ok((unsigned long)(a1),(unsigned long)(a2),(n))
/*
* Copy a null terminated string from userspace.
...
...
@@ -74,7 +76,7 @@ do { \
* and returns @count.
*/
long
__strncpy_from_user
(
char
*
dst
,
const
char
*
src
,
long
count
)
__strncpy_from_user
(
char
*
dst
,
const
char
__user
*
src
,
long
count
)
{
long
res
;
__do_strncpy_from_user
(
dst
,
src
,
count
,
res
);
...
...
@@ -100,7 +102,7 @@ __strncpy_from_user(char *dst, const char *src, long count)
* and returns @count.
*/
long
strncpy_from_user
(
char
*
dst
,
const
char
*
src
,
long
count
)
strncpy_from_user
(
char
*
dst
,
const
char
__user
*
src
,
long
count
)
{
long
res
=
-
EFAULT
;
if
(
access_ok
(
VERIFY_READ
,
src
,
1
))
...
...
@@ -145,7 +147,7 @@ do { \
* On success, this will be zero.
*/
unsigned
long
clear_user
(
void
*
to
,
unsigned
long
n
)
clear_user
(
void
__user
*
to
,
unsigned
long
n
)
{
if
(
access_ok
(
VERIFY_WRITE
,
to
,
n
))
__do_clear_user
(
to
,
n
);
...
...
@@ -164,7 +166,7 @@ clear_user(void *to, unsigned long n)
* On success, this will be zero.
*/
unsigned
long
__clear_user
(
void
*
to
,
unsigned
long
n
)
__clear_user
(
void
__user
*
to
,
unsigned
long
n
)
{
__do_clear_user
(
to
,
n
);
return
n
;
...
...
@@ -181,7 +183,7 @@ __clear_user(void *to, unsigned long n)
* On exception, returns 0.
* If the string is too long, returns a value greater than @n.
*/
long
strnlen_user
(
const
char
*
s
,
long
n
)
long
strnlen_user
(
const
char
__user
*
s
,
long
n
)
{
unsigned
long
mask
=
-
__addr_ok
(
s
);
unsigned
long
res
,
tmp
;
...
...
@@ -484,7 +486,7 @@ do { \
} while (0)
unsigned
long
__copy_to_user_ll
(
void
*
to
,
const
void
*
from
,
unsigned
long
n
)
unsigned
long
__copy_to_user_ll
(
void
__user
*
to
,
const
void
*
from
,
unsigned
long
n
)
{
#ifndef CONFIG_X86_WP_WORKS_OK
if
(
unlikely
(
boot_cpu_data
.
wp_works_ok
==
0
)
&&
...
...
@@ -534,17 +536,17 @@ unsigned long __copy_to_user_ll(void *to, const void *from, unsigned long n)
}
#endif
if
(
movsl_is_ok
(
to
,
from
,
n
))
__copy_user
(
to
,
from
,
n
);
__copy_user
(
(
void
*
)
to
,
from
,
n
);
else
n
=
__copy_user_intel
(
to
,
from
,
n
);
n
=
__copy_user_intel
(
(
void
*
)
to
,
from
,
n
);
return
n
;
}
unsigned
long
__copy_from_user_ll
(
void
*
to
,
const
void
*
from
,
unsigned
long
n
)
unsigned
long
__copy_from_user_ll
(
void
*
to
,
const
void
__user
*
from
,
unsigned
long
n
)
{
if
(
movsl_is_ok
(
to
,
from
,
n
))
__copy_user_zeroing
(
to
,
from
,
n
);
__copy_user_zeroing
(
to
,
(
const
void
*
)
from
,
n
);
else
n
=
__copy_user_zeroing_intel
(
to
,
from
,
n
);
n
=
__copy_user_zeroing_intel
(
to
,
(
const
void
*
)
from
,
n
);
return
n
;
}
drivers/char/agp/Makefile
View file @
903d1fe4
agpgart-y
:=
backend.o frontend.o generic.o
generic-3.0
.o
agpgart-y
:=
backend.o frontend.o generic.o
isoch
.o
obj-$(CONFIG_AGP)
+=
agpgart.o
obj-$(CONFIG_AGP_ALI)
+=
ali-agp.o
...
...
drivers/char/agp/agp.h
View file @
903d1fe4
...
...
@@ -139,6 +139,8 @@ struct agp_bridge_data {
int
max_memory_agp
;
/* in number of pages */
int
aperture_size_idx
;
int
capndx
;
char
major_version
;
char
minor_version
;
};
#define OUTREG64(mmap, addr, val) __raw_writeq((val), (mmap)+(addr))
...
...
@@ -388,27 +390,38 @@ void agp_free_key(int key);
int
agp_num_entries
(
void
);
u32
agp_collect_device_status
(
u32
mode
,
u32
command
);
void
agp_device_command
(
u32
command
,
int
agp_v3
);
int
agp_3_0_node_enable
(
struct
agp_bridge_data
*
bridge
,
u32
mode
,
u32
minor
);
int
agp_3_0_enable
(
struct
agp_bridge_data
*
bridge
,
u32
mode
);
int
agp_3_5_enable
(
struct
agp_bridge_data
*
bridge
,
u32
mode
);
void
global_cache_flush
(
void
);
void
get_agp_version
(
struct
agp_bridge_data
*
bridge
);
/* Standard agp registers */
#define AGPSTAT 0x4
#define AGPCMD 0x8
#define AGPNISTAT 0xc
#define AGPNEPG 0x16
#define AGPNICMD 0x20
#define AGP_MAJOR_VERSION_SHIFT (20)
#define AGP_MINOR_VERSION_SHIFT (16)
#define AGPSTAT_RQ_DEPTH (0xff000000)
#define AGPSTAT_CAL_MASK (1<<12|1<<11|1<<10)
#define AGPSTAT_ARQSZ (1<<15|1<<14|1<<13)
#define AGPSTAT_ARQSZ_SHIFT 13
#define AGPSTAT_AGP_ENABLE (1<<8)
#define AGPSTAT_SBA (1<<9)
#define AGPSTAT_AGP_ENABLE (1<<8)
#define AGPSTAT_FW (1<<4)
#define AGPSTAT_MODE_3_0 (1<<3)
#define AGPSTAT2_1X (1<<0)
#define AGPSTAT2_2X (1<<1)
#define AGPSTAT2_4X (1<<2)
#define AGPSTAT_FW (1<<4)
#define AGPSTAT3_RSVD (1<<2)
#define AGPSTAT3_8X (1<<1)
#define AGPSTAT3_4X (1)
#endif
/* _AGP_BACKEND_PRIV_H */
drivers/char/agp/amd-k8-agp.c
View file @
903d1fe4
...
...
@@ -253,8 +253,10 @@ static int __init agp_amdk8_probe(struct pci_dev *pdev,
{
struct
agp_bridge_data
*
bridge
;
struct
pci_dev
*
loop_dev
;
u8
rev_id
;
u8
cap_ptr
;
int
i
=
0
;
char
*
revstring
=
" "
;
cap_ptr
=
pci_find_capability
(
pdev
,
PCI_CAP_ID_AGP
);
if
(
!
cap_ptr
)
...
...
@@ -266,14 +268,38 @@ static int __init agp_amdk8_probe(struct pci_dev *pdev,
if
(
!
bridge
)
return
-
ENOMEM
;
/* Assume here we have an 8151. (Later this assumption will be fixed). */
pci_read_config_byte
(
pdev
,
PCI_REVISION_ID
,
&
rev_id
);
switch
(
rev_id
)
{
case
0x01
:
revstring
=
"A0"
;
break
;
case
0x02
:
revstring
=
"A1"
;
break
;
case
0x11
:
revstring
=
"B0"
;
break
;
case
0x12
:
revstring
=
"B1"
;
break
;
case
0x13
:
revstring
=
"B2"
;
break
;
default:
revstring
=
"??"
;
break
;
}
printk
(
"Detected AMD 8151 AGP Bridge rev %s"
,
revstring
);
/*
* Work around errata.
* Chips before B2 stepping incorrectly reporting v3.5
*/
if
(
rev_id
<
0x13
)
{
bridge
->
major_version
=
3
;
bridge
->
minor_version
=
0
;
}
bridge
->
driver
=
&
amd_8151_driver
;
bridge
->
dev
=
pdev
;
bridge
->
capndx
=
cap_ptr
;
/* Fill in the mode register */
pci_read_config_dword
(
pdev
,
bridge
->
capndx
+
PCI_AGP_STATUS
,
&
bridge
->
mode
);
pci_read_config_dword
(
pdev
,
bridge
->
capndx
+
PCI_AGP_STATUS
,
&
bridge
->
mode
);
/* cache pci_devs of northbridges. */
pci_for_each_dev
(
loop_dev
)
{
...
...
@@ -290,7 +316,7 @@ static int __init agp_amdk8_probe(struct pci_dev *pdev,
pci_set_drvdata
(
pdev
,
bridge
);
return
agp_add_bridge
(
bridge
);
out_free:
out_free:
agp_put_bridge
(
bridge
);
return
-
ENOMEM
;
}
...
...
drivers/char/agp/generic.c
View file @
903d1fe4
...
...
@@ -270,14 +270,16 @@ EXPORT_SYMBOL_GPL(agp_num_entries);
int
agp_copy_info
(
agp_kern_info
*
info
)
{
memset
(
info
,
0
,
sizeof
(
agp_kern_info
));
if
(
agp_bridge
->
type
==
NOT_SUPPORTED
)
{
info
->
chipset
=
agp_bridge
->
type
;
if
(
!
agp_bridge
||
agp_bridge
->
type
==
NOT_SUPPORTED
||
!
agp_bridge
->
version
)
{
info
->
chipset
=
NOT_SUPPORTED
;
return
-
EIO
;
}
info
->
version
.
major
=
agp_bridge
->
version
->
major
;
info
->
version
.
minor
=
agp_bridge
->
version
->
minor
;
info
->
device
=
agp_bridge
->
dev
;
info
->
chipset
=
agp_bridge
->
type
;
info
->
device
=
agp_bridge
->
dev
;
info
->
mode
=
agp_bridge
->
mode
;
info
->
aper_base
=
agp_bridge
->
gart_bus_addr
;
info
->
aper_size
=
agp_return_size
();
...
...
@@ -366,60 +368,106 @@ EXPORT_SYMBOL(agp_unbind_memory);
/* Generic Agp routines - Start */
static
void
agp_v2_parse_one
(
u32
*
mode
,
u32
*
cmd
,
u32
*
tmp
)
{
/* disable SBA if it's not supported */
if
(
!
((
*
cmd
&
AGPSTAT_SBA
)
&&
(
*
tmp
&
AGPSTAT_SBA
)
&&
(
*
mode
&
AGPSTAT_SBA
)))
*
cmd
&=
~
AGPSTAT_SBA
;
/* disable FW if it's not supported */
if
(
!
((
*
cmd
&
AGPSTAT_FW
)
&&
(
*
tmp
&
AGPSTAT_FW
)
&&
(
*
mode
&
AGPSTAT_FW
)))
*
cmd
&=
~
AGPSTAT_FW
;
/* Set speed */
if
(
!
((
*
cmd
&
AGPSTAT2_4X
)
&&
(
*
tmp
&
AGPSTAT2_4X
)
&&
(
*
mode
&
AGPSTAT2_4X
)))
*
cmd
&=
~
AGPSTAT2_4X
;
if
(
!
((
*
cmd
&
AGPSTAT2_2X
)
&&
(
*
tmp
&
AGPSTAT2_2X
)
&&
(
*
mode
&
AGPSTAT2_2X
)))
*
cmd
&=
~
AGPSTAT2_2X
;
if
(
!
((
*
cmd
&
AGPSTAT2_1X
)
&&
(
*
tmp
&
AGPSTAT2_1X
)
&&
(
*
mode
&
AGPSTAT2_1X
)))
*
cmd
&=
~
AGPSTAT2_1X
;
/* Now we know what mode it should be, clear out the unwanted bits. */
if
(
*
cmd
&
AGPSTAT2_4X
)
*
cmd
&=
~
(
AGPSTAT2_1X
|
AGPSTAT2_2X
);
/* 4X */
if
(
*
cmd
&
AGPSTAT2_2X
)
*
cmd
&=
~
(
AGPSTAT2_1X
|
AGPSTAT2_4X
);
/* 2X */
if
(
*
cmd
&
AGPSTAT2_1X
)
*
cmd
&=
~
(
AGPSTAT2_2X
|
AGPSTAT2_4X
);
/* 1Xf */
}
u32
agp_collect_device_status
(
u32
mode
,
u32
command
)
static
void
agp_v3_parse_one
(
u32
*
mode
,
u32
*
cmd
,
u32
*
tmp
)
{
/* ARQSZ - Set the value to the maximum one.
* Don't allow the mode register to override values. */
*
cmd
=
((
*
cmd
&
~
AGPSTAT_ARQSZ
)
|
max_t
(
u32
,(
*
cmd
&
AGPSTAT_ARQSZ
),(
*
tmp
&
AGPSTAT_ARQSZ
)));
/* Calibration cycle.
* Don't allow the mode register to override values. */
*
cmd
=
((
*
cmd
&
~
AGPSTAT_CAL_MASK
)
|
min_t
(
u32
,(
*
cmd
&
AGPSTAT_CAL_MASK
),(
*
tmp
&
AGPSTAT_CAL_MASK
)));
/* SBA *must* be supported for AGP v3 */
*
cmd
|=
AGPSTAT_SBA
;
/* disable FW if it's not supported */
if
(
!
((
*
cmd
&
AGPSTAT_FW
)
&&
(
*
tmp
&
AGPSTAT_FW
)
&&
(
*
mode
&
AGPSTAT_FW
)))
*
cmd
&=
~
AGPSTAT_FW
;
/* Set speed. */
if
(
!
((
*
cmd
&
AGPSTAT3_8X
)
&&
(
*
tmp
&
AGPSTAT3_8X
)
&&
(
*
mode
&
AGPSTAT3_8X
)))
*
cmd
&=
~
AGPSTAT3_8X
;
if
(
!
((
*
cmd
&
AGPSTAT3_4X
)
&&
(
*
tmp
&
AGPSTAT3_4X
)
&&
(
*
mode
&
AGPSTAT3_4X
)))
*
cmd
&=
~
AGPSTAT3_4X
;
/* Clear out unwanted bits. */
if
(
*
cmd
&
AGPSTAT3_8X
)
*
cmd
*=
~
(
AGPSTAT3_4X
|
AGPSTAT3_RSVD
);
if
(
*
cmd
&
AGPSTAT3_4X
)
*
cmd
*=
~
(
AGPSTAT3_8X
|
AGPSTAT3_RSVD
);
}
//FIXME: This doesn't smell right.
//We need a function we pass an agp_device to.
u32
agp_collect_device_status
(
u32
mode
,
u32
cmd
)
{
struct
pci_dev
*
device
;
u8
agp
;
u32
scratch
;
u8
cap_ptr
;
u32
tmp
;
u32
agp3
;
pci_for_each_dev
(
device
)
{
agp
=
pci_find_capability
(
device
,
PCI_CAP_ID_AGP
);
if
(
!
agp
)
cap_ptr
=
pci_find_capability
(
device
,
PCI_CAP_ID_AGP
);
if
(
!
cap_ptr
)
continue
;
/*
* Ok, here we have a AGP device. Disable impossible
* settings, and adjust the readqueue to the minimum.
*/
pci_read_config_dword
(
device
,
agp
+
PCI_AGP_STATUS
,
&
scratch
);
pci_read_config_dword
(
device
,
cap_ptr
+
PCI_AGP_STATUS
,
&
tmp
);
/* adjust RQ depth */
c
ommand
=
((
comman
d
&
~
AGPSTAT_RQ_DEPTH
)
|
c
md
=
((
cm
d
&
~
AGPSTAT_RQ_DEPTH
)
|
min_t
(
u32
,
(
mode
&
AGPSTAT_RQ_DEPTH
),
min_t
(
u32
,
(
command
&
AGPSTAT_RQ_DEPTH
),
(
scratch
&
AGPSTAT_RQ_DEPTH
))));
/* disable SBA if it's not supported */
if
(
!
((
command
&
AGPSTAT_SBA
)
&&
(
scratch
&
AGPSTAT_SBA
)
&&
(
mode
&
AGPSTAT_SBA
)))
command
&=
~
AGPSTAT_SBA
;
/* disable FW if it's not supported */
if
(
!
((
command
&
AGPSTAT_FW
)
&&
(
scratch
&
AGPSTAT_FW
)
&&
(
mode
&
AGPSTAT_FW
)))
command
&=
~
AGPSTAT_FW
;
/* Set speed */
if
(
!
((
command
&
AGPSTAT2_4X
)
&&
(
scratch
&
AGPSTAT2_4X
)
&&
(
mode
&
AGPSTAT2_4X
)))
command
&=
~
AGPSTAT2_4X
;
min_t
(
u32
,
(
cmd
&
AGPSTAT_RQ_DEPTH
),
(
tmp
&
AGPSTAT_RQ_DEPTH
))));
pci_read_config_dword
(
device
,
cap_ptr
+
AGPSTAT
,
&
agp3
);
if
(
!
((
command
&
AGPSTAT2_2X
)
&&
(
scratch
&
AGPSTAT2_2X
)
&&
(
mode
&
AGPSTAT2_2X
)))
command
&=
~
AGPSTAT2_2X
;
if
(
!
((
command
&
AGPSTAT2_1X
)
&&
(
scratch
&
AGPSTAT2_1X
)
&&
(
mode
&
AGPSTAT2_1X
)))
command
&=
~
AGPSTAT2_1X
;
/* Check to see if we are operating in 3.0 mode */
if
(
agp3
&
AGPSTAT_MODE_3_0
)
{
agp_v3_parse_one
(
&
mode
,
&
cmd
,
&
tmp
);
}
else
{
agp_v2_parse_one
(
&
mode
,
&
cmd
,
&
tmp
);
}
}
/* Now we know what mode it should be, clear out the unwanted bits. */
if
(
command
&
AGPSTAT2_4X
)
command
&=
~
(
AGPSTAT2_1X
|
AGPSTAT2_2X
);
/* 4X */
if
(
command
&
AGPSTAT2_2X
)
command
&=
~
(
AGPSTAT2_1X
|
AGPSTAT2_4X
);
/* 2X */
if
(
command
&
AGPSTAT2_1X
)
command
&=
~
(
AGPSTAT2_2X
|
AGPSTAT2_4X
);
/* 1Xf */
return
command
;
return
cmd
;
}
EXPORT_SYMBOL
(
agp_collect_device_status
);
...
...
@@ -446,29 +494,33 @@ void agp_device_command(u32 command, int agp_v3)
EXPORT_SYMBOL
(
agp_device_command
);
void
agp_generic_enable
(
u32
mod
e
)
void
get_agp_version
(
struct
agp_bridge_data
*
bridg
e
)
{
u32
command
,
ncapid
,
major
,
minor
;
u32
ncapid
;
/* Exit early if already set by errata workarounds. */
if
(
agp_bridge
->
major_version
!=
0
)
return
;
pci_read_config_dword
(
agp_bridge
->
dev
,
agp_bridge
->
capndx
,
&
ncapid
);
major
=
(
ncapid
>>
20
)
&
0xf
;
minor
=
(
ncapid
>>
16
)
&
0xf
;
printk
(
KERN_INFO
PFX
"Found an AGP %d.%d compliant device.
\n
"
,
major
,
minor
);
agp_bridge
->
major_version
=
(
ncapid
>>
AGP_MAJOR_VERSION_SHIFT
)
&
0xf
;
agp_bridge
->
minor_version
=
(
ncapid
>>
AGP_MINOR_VERSION_SHIFT
)
&
0xf
;
}
EXPORT_SYMBOL
(
get_agp_version
);
if
(
major
>=
3
)
{
u32
agp_3_0
;
pci_read_config_dword
(
agp_bridge
->
dev
,
agp_bridge
->
capndx
+
0x4
,
&
agp_3_0
);
/* Check to see if we are operating in 3.0 mode */
if
((
agp_3_0
>>
3
)
&
0x1
)
{
agp_3_0_node_enable
(
agp_bridge
,
mode
,
minor
);
return
;
}
else
{
printk
(
KERN_INFO
PFX
"not in AGP 3.0 mode, falling back to 2.x
\n
"
);
}
}
void
agp_generic_enable
(
u32
mode
)
{
u32
command
;
u32
agp3
;
get_agp_version
(
agp_bridge
);
printk
(
KERN_INFO
PFX
"Found an AGP %d.%d compliant device at %s.
\n
"
,
agp_bridge
->
major_version
,
agp_bridge
->
minor_version
,
agp_bridge
->
dev
->
slot_name
);
/* AGP v<3 */
pci_read_config_dword
(
agp_bridge
->
dev
,
agp_bridge
->
capndx
+
PCI_AGP_STATUS
,
&
command
);
...
...
@@ -477,7 +529,27 @@ void agp_generic_enable(u32 mode)
pci_write_config_dword
(
agp_bridge
->
dev
,
agp_bridge
->
capndx
+
PCI_AGP_COMMAND
,
command
);
agp_device_command
(
command
,
0
);
/* Do AGP version specific frobbing. */
if
(
agp_bridge
->
major_version
>=
3
)
{
pci_read_config_dword
(
agp_bridge
->
dev
,
agp_bridge
->
capndx
+
AGPSTAT
,
&
agp3
);
/* Check to see if we are operating in 3.0 mode */
if
(
agp3
&
AGPSTAT_MODE_3_0
)
{
/* If we have 3.5, we can do the isoch stuff. */
if
(
agp_bridge
->
minor_version
>=
5
)
agp_3_5_enable
(
agp_bridge
,
mode
);
agp_device_command
(
command
,
TRUE
);
return
;
}
else
{
printk
(
KERN_INFO
PFX
"Device is in legacy mode,"
" falling back to 2.x
\n
"
);
}
}
/* AGP v<3 */
agp_device_command
(
command
,
FALSE
);
}
EXPORT_SYMBOL
(
agp_generic_enable
);
...
...
@@ -831,6 +903,7 @@ void agp_enable(u32 mode)
}
EXPORT_SYMBOL
(
agp_enable
);
#ifdef CONFIG_SMP
static
void
ipi_handler
(
void
*
null
)
{
...
...
drivers/char/agp/
generic-3.0
.c
→
drivers/char/agp/
isoch
.c
View file @
903d1fe4
/*
*
Generic routines for AGP 3.0
compliant bridges.
*
Setup routines for AGP 3.5
compliant bridges.
*/
#include <linux/list.h>
...
...
@@ -9,47 +9,47 @@
#include "agp.h"
/* Generic AGP 3.
0
enabling routines */
/* Generic AGP 3.
5
enabling routines */
struct
agp_3_
0
_dev
{
struct
agp_3_
5
_dev
{
struct
list_head
list
;
u8
capndx
;
u32
maxbw
;
struct
pci_dev
*
dev
;
};
static
void
agp_3_
0
_dev_list_insert
(
struct
list_head
*
head
,
struct
list_head
*
new
)
static
void
agp_3_
5
_dev_list_insert
(
struct
list_head
*
head
,
struct
list_head
*
new
)
{
struct
agp_3_
0_dev
*
cur
,
*
n
=
list_entry
(
new
,
struct
agp_3_0
_dev
,
list
);
struct
agp_3_
5_dev
*
cur
,
*
n
=
list_entry
(
new
,
struct
agp_3_5
_dev
,
list
);
struct
list_head
*
pos
;
list_for_each
(
pos
,
head
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
0
_dev
,
list
);
cur
=
list_entry
(
pos
,
struct
agp_3_
5
_dev
,
list
);
if
(
cur
->
maxbw
>
n
->
maxbw
)
break
;
}
list_add_tail
(
new
,
pos
);
}
static
void
agp_3_
0_dev_list_sort
(
struct
agp_3_0
_dev
*
list
,
unsigned
int
ndevs
)
static
void
agp_3_
5_dev_list_sort
(
struct
agp_3_5
_dev
*
list
,
unsigned
int
ndevs
)
{
struct
agp_3_
0
_dev
*
cur
;
struct
agp_3_
5
_dev
*
cur
;
struct
pci_dev
*
dev
;
struct
list_head
*
pos
,
*
tmp
,
*
head
=
&
list
->
list
,
*
start
=
head
->
next
;
u32
nistat
;
INIT_LIST_HEAD
(
head
);
for
(
pos
=
start
;
pos
!=
head
;
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
0
_dev
,
list
);
for
(
pos
=
start
;
pos
!=
head
;
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
5
_dev
,
list
);
dev
=
cur
->
dev
;
pci_read_config_dword
(
dev
,
cur
->
capndx
+
0x0c
,
&
nistat
);
pci_read_config_dword
(
dev
,
cur
->
capndx
+
AGPNISTAT
,
&
nistat
);
cur
->
maxbw
=
(
nistat
>>
16
)
&
0xff
;
tmp
=
pos
;
pos
=
pos
->
next
;
agp_3_
0
_dev_list_insert
(
head
,
tmp
);
agp_3_
5
_dev_list_insert
(
head
,
tmp
);
}
}
...
...
@@ -59,8 +59,8 @@ static void agp_3_0_dev_list_sort(struct agp_3_0_dev *list, unsigned int ndevs)
* lying behind it...)
*/
static
int
agp_3_
0
_isochronous_node_enable
(
struct
agp_bridge_data
*
bridge
,
struct
agp_3_
0
_dev
*
dev_list
,
unsigned
int
ndevs
)
static
int
agp_3_
5
_isochronous_node_enable
(
struct
agp_bridge_data
*
bridge
,
struct
agp_3_
5
_dev
*
dev_list
,
unsigned
int
ndevs
)
{
/*
* Convenience structure to make the calculations clearer
...
...
@@ -72,12 +72,12 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
u32
y
;
u32
l
;
u32
rq
;
struct
agp_3_
0
_dev
*
dev
;
struct
agp_3_
5
_dev
*
dev
;
};
struct
pci_dev
*
td
=
bridge
->
dev
,
*
dev
;
struct
list_head
*
head
=
&
dev_list
->
list
,
*
pos
;
struct
agp_3_
0
_dev
*
cur
;
struct
agp_3_
5
_dev
*
cur
;
struct
isoch_data
*
master
,
target
;
unsigned
int
cdev
=
0
;
u32
mnistat
,
tnistat
,
tstatus
,
mcmd
;
...
...
@@ -91,7 +91,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* We'll work with an array of isoch_data's (one for each
* device in dev_list) throughout this function.
*/
if
((
master
=
kmalloc
(
ndevs
*
sizeof
(
*
master
),
GFP_KERNEL
))
==
NULL
)
{
if
((
master
=
kmalloc
(
ndevs
*
sizeof
(
*
master
),
GFP_KERNEL
))
==
NULL
)
{
ret
=
-
ENOMEM
;
goto
get_out
;
}
...
...
@@ -112,9 +112,9 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* transfers are enabled and consequently whether maxbw will mean
* anything.
*/
agp_3_
0
_dev_list_sort
(
dev_list
,
ndevs
);
agp_3_
5
_dev_list_sort
(
dev_list
,
ndevs
);
pci_read_config_dword
(
td
,
bridge
->
capndx
+
0x0c
,
&
tnistat
);
pci_read_config_dword
(
td
,
bridge
->
capndx
+
AGPNISTAT
,
&
tnistat
);
pci_read_config_dword
(
td
,
bridge
->
capndx
+
AGPSTAT
,
&
tstatus
);
/* Extract power-on defaults from the target */
...
...
@@ -132,12 +132,12 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* by these devices and the largest requested payload size.
*/
list_for_each
(
pos
,
head
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
0
_dev
,
list
);
cur
=
list_entry
(
pos
,
struct
agp_3_
5
_dev
,
list
);
dev
=
cur
->
dev
;
mcapndx
=
cur
->
capndx
;
pci_read_config_dword
(
dev
,
cur
->
capndx
+
0x0c
,
&
mnistat
);
pci_read_config_dword
(
dev
,
cur
->
capndx
+
AGPNISTAT
,
&
mnistat
);
master
[
cdev
].
maxbw
=
(
mnistat
>>
16
)
&
0xff
;
master
[
cdev
].
n
=
(
mnistat
>>
8
)
&
0xff
;
...
...
@@ -151,7 +151,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
}
/* Check if this configuration has any chance of working */
if
(
tot_bw
>
target
.
maxbw
)
{
if
(
tot_bw
>
target
.
maxbw
)
{
printk
(
KERN_ERR
PFX
"isochronous bandwidth required "
"by AGP 3.0 devices exceeds that which is supported by "
"the AGP 3.0 bridge!
\n
"
);
...
...
@@ -167,17 +167,17 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* in the target's NISTAT register, so we need to do this now
* to get an accurate value for ISOCH_N later.
*/
pci_read_config_word
(
td
,
bridge
->
capndx
+
0x20
,
&
tnicmd
);
pci_read_config_word
(
td
,
bridge
->
capndx
+
AGPNICMD
,
&
tnicmd
);
tnicmd
&=
~
(
0x3
<<
6
);
tnicmd
|=
target
.
y
<<
6
;
pci_write_config_word
(
td
,
bridge
->
capndx
+
0x20
,
tnicmd
);
pci_write_config_word
(
td
,
bridge
->
capndx
+
AGPNICMD
,
tnicmd
);
/* Reread the target's ISOCH_N */
pci_read_config_dword
(
td
,
bridge
->
capndx
+
0x0c
,
&
tnistat
);
pci_read_config_dword
(
td
,
bridge
->
capndx
+
AGPNISTAT
,
&
tnistat
);
target
.
n
=
(
tnistat
>>
8
)
&
0xff
;
/* Calculate the minimum ISOCH_N needed by each master */
for
(
cdev
=
0
;
cdev
<
ndevs
;
cdev
++
)
{
for
(
cdev
=
0
;
cdev
<
ndevs
;
cdev
++
)
{
master
[
cdev
].
y
=
target
.
y
;
master
[
cdev
].
n
=
master
[
cdev
].
maxbw
/
(
master
[
cdev
].
y
+
1
);
...
...
@@ -186,7 +186,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
/* Exit if the minimal ISOCH_N allocation among the masters is more
* than the target can handle. */
if
(
tot_n
>
target
.
n
)
{
if
(
tot_n
>
target
.
n
)
{
printk
(
KERN_ERR
PFX
"number of isochronous "
"transactions per period required by AGP 3.0 devices "
"exceeds that which is supported by the AGP 3.0 "
...
...
@@ -204,7 +204,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* Along the way, distribute the extra ISOCH_N capability calculated
* above.
*/
for
(
cdev
=
0
;
cdev
<
ndevs
;
cdev
++
)
{
for
(
cdev
=
0
;
cdev
<
ndevs
;
cdev
++
)
{
/*
* This is a little subtle. If ISOCH_Y > 64B, then ISOCH_Y
* byte isochronous writes will be broken into 64B pieces.
...
...
@@ -213,13 +213,12 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* many writes on the AGP bus).
*/
master
[
cdev
].
rq
=
master
[
cdev
].
n
;
if
(
master
[
cdev
].
y
>
0x1
)
{
if
(
master
[
cdev
].
y
>
0x1
)
master
[
cdev
].
rq
*=
(
1
<<
(
master
[
cdev
].
y
-
1
));
}
tot_rq
+=
master
[
cdev
].
rq
;
if
(
cdev
==
ndevs
-
1
)
if
(
cdev
==
ndevs
-
1
)
master
[
cdev
].
n
+=
rem
;
}
...
...
@@ -230,7 +229,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
/* Exit if the minimal RQ needs of the masters exceeds what the target
* can provide. */
if
(
tot_rq
>
rq_isoch
)
{
if
(
tot_rq
>
rq_isoch
)
{
printk
(
KERN_ERR
PFX
"number of request queue slots "
"required by the isochronous bandwidth requested by "
"AGP 3.0 devices exceeds the number provided by the "
...
...
@@ -247,7 +246,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
/* Distribute the extra RQ slots calculated above and write our
* isochronous settings out to the actual devices. */
for
(
cdev
=
0
;
cdev
<
ndevs
;
cdev
++
)
{
for
(
cdev
=
0
;
cdev
<
ndevs
;
cdev
++
)
{
cur
=
master
[
cdev
].
dev
;
dev
=
cur
->
dev
;
...
...
@@ -256,7 +255,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
master
[
cdev
].
rq
+=
(
cdev
==
ndevs
-
1
)
?
(
rem_async
+
rem_isoch
)
:
step
;
pci_read_config_word
(
dev
,
cur
->
capndx
+
0x20
,
&
mnicmd
);
pci_read_config_word
(
dev
,
cur
->
capndx
+
AGPNICMD
,
&
mnicmd
);
pci_read_config_dword
(
dev
,
cur
->
capndx
+
AGPCMD
,
&
mcmd
);
mnicmd
&=
~
(
0xff
<<
8
);
...
...
@@ -268,7 +267,7 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
mcmd
|=
master
[
cdev
].
rq
<<
24
;
pci_write_config_dword
(
dev
,
cur
->
capndx
+
AGPCMD
,
mcmd
);
pci_write_config_word
(
dev
,
cur
->
capndx
+
0x20
,
mnicmd
);
pci_write_config_word
(
dev
,
cur
->
capndx
+
AGPNICMD
,
mnicmd
);
}
free_and_exit:
...
...
@@ -285,24 +284,24 @@ static int agp_3_0_isochronous_node_enable(struct agp_bridge_data *bridge,
* target by ndevs. Distribute this many slots to each AGP 3.0 device,
* giving any left over slots to the last device in dev_list.
*/
static
void
agp_3_
0
_nonisochronous_node_enable
(
struct
agp_bridge_data
*
bridge
,
struct
agp_3_
0
_dev
*
dev_list
,
unsigned
int
ndevs
)
static
void
agp_3_
5
_nonisochronous_node_enable
(
struct
agp_bridge_data
*
bridge
,
struct
agp_3_
5
_dev
*
dev_list
,
unsigned
int
ndevs
)
{
struct
agp_3_
0
_dev
*
cur
;
struct
agp_3_
5
_dev
*
cur
;
struct
list_head
*
head
=
&
dev_list
->
list
,
*
pos
;
u32
tstatus
,
mcmd
;
u32
trq
,
mrq
,
rem
;
unsigned
int
cdev
=
0
;
pci_read_config_dword
(
bridge
->
dev
,
bridge
->
capndx
+
0x04
,
&
tstatus
);
pci_read_config_dword
(
bridge
->
dev
,
bridge
->
capndx
+
AGPSTAT
,
&
tstatus
);
trq
=
(
tstatus
>>
24
)
&
0xff
;
mrq
=
trq
/
ndevs
;
rem
=
mrq
+
(
trq
%
ndevs
);
for
(
pos
=
head
->
next
;
cdev
<
ndevs
;
cdev
++
,
pos
=
pos
->
next
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
0
_dev
,
list
);
for
(
pos
=
head
->
next
;
cdev
<
ndevs
;
cdev
++
,
pos
=
pos
->
next
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
5
_dev
,
list
);
pci_read_config_dword
(
cur
->
dev
,
cur
->
capndx
+
AGPCMD
,
&
mcmd
);
mcmd
&=
~
(
0xff
<<
24
);
...
...
@@ -315,24 +314,32 @@ static void agp_3_0_nonisochronous_node_enable(struct agp_bridge_data *bridge,
* Fully configure and enable an AGP 3.0 host bridge and all the devices
* lying behind it.
*/
int
agp_3_
0_node_enable
(
struct
agp_bridge_data
*
bridge
,
u32
mode
,
u32
minor
)
int
agp_3_
5_enable
(
struct
agp_bridge_data
*
bridge
,
u32
mode
)
{
struct
pci_dev
*
td
=
bridge
->
dev
,
*
dev
;
u8
mcapndx
;
u32
isoch
,
arqsz
,
cal_cycle
,
tmp
,
rate
;
u32
tstatus
,
tcmd
,
mcmd
,
mstatus
,
ncapid
;
u32
mmajor
,
mminor
;
u32
isoch
,
arqsz
;
u32
tstatus
,
mstatus
,
ncapid
;
u32
mmajor
;
u16
mpstat
;
struct
agp_3_
0
_dev
*
dev_list
,
*
cur
;
struct
agp_3_
5
_dev
*
dev_list
,
*
cur
;
struct
list_head
*
head
,
*
pos
;
unsigned
int
ndevs
=
0
;
int
ret
=
0
;
/* Extract some power-on defaults from the target */
pci_read_config_dword
(
td
,
bridge
->
capndx
+
AGPSTAT
,
&
tstatus
);
isoch
=
(
tstatus
>>
17
)
&
0x1
;
if
(
isoch
==
0
)
/* isoch xfers not available, bail out. */
return
-
ENODEV
;
arqsz
=
(
tstatus
>>
13
)
&
0x7
;
/*
* Allocate a head for our AGP 3.
0 device list (multiple AGP 3.0
* devices are allowed behind a single bridge).
* Allocate a head for our AGP 3.
5 device list
*
(multiple AGP v3
devices are allowed behind a single bridge).
*/
if
((
dev_list
=
kmalloc
(
sizeof
(
*
dev_list
),
GFP_KERNEL
))
==
NULL
)
{
if
((
dev_list
=
kmalloc
(
sizeof
(
*
dev_list
),
GFP_KERNEL
))
==
NULL
)
{
ret
=
-
ENOMEM
;
goto
get_out
;
}
...
...
@@ -342,6 +349,9 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor)
/* Find all AGP devices, and add them to dev_list. */
pci_for_each_dev
(
dev
)
{
mcapndx
=
pci_find_capability
(
dev
,
PCI_CAP_ID_AGP
);
if
(
mcapndx
==
0
)
continue
;
switch
((
dev
->
class
>>
8
)
&
0xff00
)
{
case
0x0600
:
/* Bridge */
/* Skip bridges. We should call this function for each one. */
...
...
@@ -357,9 +367,6 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor)
case
0x0300
:
/* Display controller */
case
0x0400
:
/* Multimedia controller */
if
(
mcapndx
==
0
)
continue
;
if
((
cur
=
kmalloc
(
sizeof
(
*
cur
),
GFP_KERNEL
))
==
NULL
)
{
ret
=
-
ENOMEM
;
goto
free_and_exit
;
...
...
@@ -376,51 +383,41 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor)
}
}
/* Extract some power-on defaults from the target */
pci_read_config_dword
(
td
,
bridge
->
capndx
+
0x04
,
&
tstatus
);
isoch
=
(
tstatus
>>
17
)
&
0x1
;
arqsz
=
(
tstatus
>>
13
)
&
0x7
;
cal_cycle
=
(
tstatus
>>
10
)
&
0x7
;
rate
=
tstatus
&
0x7
;
/*
* Take an initial pass through the devices lying behind our host
* bridge. Make sure each one is actually an AGP 3.0 device, otherwise
* exit with an error message. Along the way store the AGP 3.0
* cap_ptr for each device, the minimum supported cal_cycle, and the
* minimum supported data rate.
* cap_ptr for each device
*/
list_for_each
(
pos
,
head
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
0
_dev
,
list
);
cur
=
list_entry
(
pos
,
struct
agp_3_
5
_dev
,
list
);
dev
=
cur
->
dev
;
pci_read_config_word
(
dev
,
PCI_STATUS
,
&
mpstat
);
if
((
mpstat
&
PCI_STATUS_CAP_LIST
)
==
0
)
if
((
mpstat
&
PCI_STATUS_CAP_LIST
)
==
0
)
continue
;
pci_read_config_byte
(
dev
,
PCI_CAPABILITY_LIST
,
&
mcapndx
);
if
(
mcapndx
!=
0
x00
)
{
if
(
mcapndx
!=
0
)
{
do
{
pci_read_config_dword
(
dev
,
mcapndx
,
&
ncapid
);
if
((
ncapid
&
0xff
)
!=
0x0
2
)
if
((
ncapid
&
0xff
)
!=
2
)
mcapndx
=
(
ncapid
>>
8
)
&
0xff
;
}
while
(((
ncapid
&
0xff
)
!=
0x02
)
&&
(
mcapndx
!=
0x0
0
));
while
(((
ncapid
&
0xff
)
!=
2
)
&&
(
mcapndx
!=
0
));
}
if
(
mcapndx
==
0
)
{
if
(
mcapndx
==
0
)
{
printk
(
KERN_ERR
PFX
"woah! Non-AGP device "
"found on the secondary bus of an AGP 3.
0
bridge!
\n
"
);
"found on the secondary bus of an AGP 3.
5
bridge!
\n
"
);
ret
=
-
ENODEV
;
goto
free_and_exit
;
}
mmajor
=
(
ncapid
>>
AGP_MAJOR_VERSION_SHIFT
)
&
0xf
;
mminor
=
(
ncapid
>>
AGP_MINOR_VERSION_SHIFT
)
&
0xf
;
if
(
mmajor
<
3
)
{
if
(
mmajor
<
3
)
{
printk
(
KERN_ERR
PFX
"woah! AGP 2.0 device "
"found on the secondary bus of an AGP 3.
0
"
"found on the secondary bus of an AGP 3.
5
"
"bridge operating with AGP 3.0 electricals!
\n
"
);
ret
=
-
ENODEV
;
goto
free_and_exit
;
...
...
@@ -428,101 +425,37 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor)
cur
->
capndx
=
mcapndx
;
pci_read_config_dword
(
dev
,
cur
->
capndx
+
0x04
,
&
mstatus
);
pci_read_config_dword
(
dev
,
cur
->
capndx
+
AGPSTAT
,
&
mstatus
);
if
(((
mstatus
>>
3
)
&
0x1
)
==
0
)
{
printk
(
KERN_ERR
PFX
"woah! AGP 3.
0
device "
"not operating in AGP 3.
0
mode found on the "
"secondary bus of an AGP 3.
0
bridge operating "
if
(((
mstatus
>>
3
)
&
0x1
)
==
0
)
{
printk
(
KERN_ERR
PFX
"woah! AGP 3.
x
device "
"not operating in AGP 3.
x
mode found on the "
"secondary bus of an AGP 3.
5
bridge operating "
"with AGP 3.0 electricals!
\n
"
);
ret
=
-
ENODEV
;
goto
free_and_exit
;
}
tmp
=
(
mstatus
>>
10
)
&
0x7
;
cal_cycle
=
min
(
cal_cycle
,
tmp
);
/* figure the lesser rate */
tmp
=
mstatus
&
0x7
;
if
(
tmp
<
rate
)
rate
=
tmp
;
}
/* Turn rate into something we can actually write out to AGPCMD */
switch
(
rate
)
{
case
0x1
:
case
0x2
:
break
;
case
0x3
:
rate
=
0x2
;
break
;
default:
printk
(
KERN_ERR
PFX
"woah! Bogus AGP rate (%d) "
"value found advertised behind an AGP 3.0 bridge!
\n
"
,
rate
);
ret
=
-
ENODEV
;
goto
free_and_exit
;
}
/*
* Call functions to divide target resources amongst the AGP 3.0
* masters. This process is dramatically different depending on
* whether isochronous transfers are supported.
*/
if
(
isoch
)
{
ret
=
agp_3_
0
_isochronous_node_enable
(
bridge
,
dev_list
,
ndevs
);
ret
=
agp_3_
5
_isochronous_node_enable
(
bridge
,
dev_list
,
ndevs
);
if
(
ret
)
{
printk
(
KERN_INFO
PFX
"Something bad happened setting "
"up isochronous xfers. Falling back to "
"non-isochronous xfer mode.
\n
"
);
}
}
agp_3_0_nonisochronous_node_enable
(
bridge
,
dev_list
,
ndevs
);
/*
* Set the calculated minimum supported cal_cycle and minimum
* supported transfer rate in the target's AGPCMD register.
* Also set the AGP_ENABLE bit, effectively 'turning on' the
* target (this has to be done _before_ turning on the masters).
*/
pci_read_config_dword
(
td
,
bridge
->
capndx
+
AGPCMD
,
&
tcmd
);
tcmd
&=
~
(
0x7
<<
10
);
tcmd
&=
~
0x7
;
tcmd
|=
cal_cycle
<<
10
;
tcmd
|=
0x1
<<
8
;
tcmd
|=
rate
;
pci_write_config_dword
(
td
,
bridge
->
capndx
+
AGPCMD
,
tcmd
);
/*
* Set the target's advertised arqsz value, the minimum supported
* transfer rate, and the AGP_ENABLE bit in each master's AGPCMD
* register.
*/
list_for_each
(
pos
,
head
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_0_dev
,
list
);
dev
=
cur
->
dev
;
mcapndx
=
cur
->
capndx
;
pci_read_config_dword
(
dev
,
cur
->
capndx
+
AGPCMD
,
&
mcmd
);
mcmd
&=
~
(
0x7
<<
AGPSTAT_ARQSZ_SHIFT
);
mcmd
&=
~
0x7
;
mcmd
|=
arqsz
<<
13
;
mcmd
|=
AGPSTAT_AGP_ENABLE
;
mcmd
|=
rate
;
pci_write_config_dword
(
dev
,
cur
->
capndx
+
AGPCMD
,
mcmd
);
}
agp_3_5_nonisochronous_node_enable
(
bridge
,
dev_list
,
ndevs
);
free_and_exit:
/* Be sure to free the dev_list */
for
(
pos
=
head
->
next
;
pos
!=
head
;
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
0
_dev
,
list
);
for
(
pos
=
head
->
next
;
pos
!=
head
;
)
{
cur
=
list_entry
(
pos
,
struct
agp_3_
5
_dev
,
list
);
pos
=
pos
->
next
;
kfree
(
cur
);
...
...
@@ -533,5 +466,3 @@ int agp_3_0_node_enable(struct agp_bridge_data *bridge, u32 mode, u32 minor)
return
ret
;
}
EXPORT_SYMBOL_GPL
(
agp_3_0_node_enable
);
drivers/char/drm/Kconfig
View file @
903d1fe4
...
...
@@ -49,7 +49,7 @@ config DRM_RADEON
config DRM_I810
tristate "Intel I810"
depends on DRM && AGP
depends on DRM && AGP
&& AGP_INTEL
help
Choose this option if you have an Intel I810 graphics card. If M is
selected, the module will be called i810. AGP support is required
...
...
@@ -57,7 +57,7 @@ config DRM_I810
config DRM_I830
tristate "Intel 830M, 845G, 852GM, 855GM, 865G"
depends on DRM && AGP
depends on DRM && AGP
&& AGP_INTEL
help
Choose this option if you have a system that has Intel 830M, 845G,
852GM, 855GM or 865G integrated graphics. If M is selected, the
...
...
include/sound/seq_kernel.h
View file @
903d1fe4
...
...
@@ -158,7 +158,7 @@ extern int snd_seq_create_kernel_client(snd_card_t *card, int client_index, snd_
extern
int
snd_seq_delete_kernel_client
(
int
client
);
extern
int
snd_seq_kernel_client_enqueue
(
int
client
,
snd_seq_event_t
*
ev
,
int
atomic
,
int
hop
);
extern
int
snd_seq_kernel_client_dispatch
(
int
client
,
snd_seq_event_t
*
ev
,
int
atomic
,
int
hop
);
extern
int
snd_seq_kernel_client_ctl
(
int
client
,
unsigned
int
cmd
,
void
*
arg
);
extern
int
snd_seq_kernel_client_ctl
(
int
client
,
unsigned
int
cmd
,
void
__user
*
arg
);
#define SNDRV_SEQ_EXT_MASK 0xc0000000
#define SNDRV_SEQ_EXT_USRPTR 0x80000000
...
...
sound/core/seq/oss/seq_oss_device.h
View file @
903d1fe4
...
...
@@ -135,8 +135,8 @@ int snd_seq_oss_delete_client(void);
int
snd_seq_oss_open
(
struct
file
*
file
,
int
level
);
void
snd_seq_oss_release
(
seq_oss_devinfo_t
*
dp
);
int
snd_seq_oss_ioctl
(
seq_oss_devinfo_t
*
dp
,
unsigned
int
cmd
,
unsigned
long
arg
);
int
snd_seq_oss_read
(
seq_oss_devinfo_t
*
dev
,
char
*
buf
,
int
count
);
int
snd_seq_oss_write
(
seq_oss_devinfo_t
*
dp
,
const
char
*
buf
,
int
count
,
struct
file
*
opt
);
int
snd_seq_oss_read
(
seq_oss_devinfo_t
*
dev
,
char
__user
*
buf
,
int
count
);
int
snd_seq_oss_write
(
seq_oss_devinfo_t
*
dp
,
const
char
__user
*
buf
,
int
count
,
struct
file
*
opt
);
unsigned
int
snd_seq_oss_poll
(
seq_oss_devinfo_t
*
dp
,
struct
file
*
file
,
poll_table
*
wait
);
void
snd_seq_oss_reset
(
seq_oss_devinfo_t
*
dp
);
...
...
sound/core/seq/oss/seq_oss_ioctl.c
View file @
903d1fe4
...
...
@@ -35,7 +35,7 @@ snd_seq_oss_ioctl(seq_oss_devinfo_t *dp, unsigned int cmd, unsigned long carg)
struct
synth_info
inf
;
struct
midi_info
minf
;
unsigned
char
ev
[
8
];
void
*
arg
=
(
void
*
)
carg
;
void
__user
*
arg
=
(
void
__user
*
)
carg
;
snd_seq_event_t
tmpev
;
switch
(
cmd
)
{
...
...
sound/core/seq/oss/seq_oss_rw.c
View file @
903d1fe4
...
...
@@ -41,7 +41,7 @@ static int insert_queue(seq_oss_devinfo_t *dp, evrec_t *rec, struct file *opt);
*/
int
snd_seq_oss_read
(
seq_oss_devinfo_t
*
dp
,
char
*
buf
,
int
count
)
snd_seq_oss_read
(
seq_oss_devinfo_t
*
dp
,
char
__user
*
buf
,
int
count
)
{
seq_oss_readq_t
*
readq
=
dp
->
readq
;
int
cnt
,
pos
;
...
...
@@ -81,7 +81,7 @@ snd_seq_oss_read(seq_oss_devinfo_t *dp, char *buf, int count)
*/
int
snd_seq_oss_write
(
seq_oss_devinfo_t
*
dp
,
const
char
*
buf
,
int
count
,
struct
file
*
opt
)
snd_seq_oss_write
(
seq_oss_devinfo_t
*
dp
,
const
char
__user
*
buf
,
int
count
,
struct
file
*
opt
)
{
int
rc
,
c
,
p
,
ev_size
;
evrec_t
rec
;
...
...
sound/core/seq/oss/seq_oss_synth.c
View file @
903d1fe4
...
...
@@ -450,7 +450,7 @@ snd_seq_oss_synth_reset(seq_oss_devinfo_t *dp, int dev)
*/
int
snd_seq_oss_synth_load_patch
(
seq_oss_devinfo_t
*
dp
,
int
dev
,
int
fmt
,
const
char
*
buf
,
int
p
,
int
c
)
const
char
__user
*
buf
,
int
p
,
int
c
)
{
seq_oss_synth_t
*
rec
;
int
rc
;
...
...
sound/core/seq/oss/seq_oss_timer.c
View file @
903d1fe4
...
...
@@ -227,19 +227,19 @@ snd_seq_oss_timer_tempo(seq_oss_timer_t *timer, int value)
* ioctls
*/
int
snd_seq_oss_timer_ioctl
(
seq_oss_timer_t
*
timer
,
unsigned
int
cmd
,
void
*
arg
)
snd_seq_oss_timer_ioctl
(
seq_oss_timer_t
*
timer
,
unsigned
int
cmd
,
int
__user
*
arg
)
{
int
value
;
if
(
cmd
==
SNDCTL_SEQ_CTRLRATE
)
{
debug_printk
((
"ctrl rate
\n
"
));
/* if *arg == 0, just return the current rate */
if
(
get_user
(
value
,
(
int
*
)
arg
))
if
(
get_user
(
value
,
arg
))
return
-
EFAULT
;
if
(
value
)
return
-
EINVAL
;
value
=
((
timer
->
oss_tempo
*
timer
->
oss_timebase
)
+
30
)
/
60
;
return
put_user
(
value
,
(
int
*
)
arg
)
?
-
EFAULT
:
0
;
return
put_user
(
value
,
arg
)
?
-
EFAULT
:
0
;
}
if
(
timer
->
dp
->
seq_mode
==
SNDRV_SEQ_OSS_MODE_SYNTH
)
...
...
@@ -257,12 +257,12 @@ snd_seq_oss_timer_ioctl(seq_oss_timer_t *timer, unsigned int cmd, void *arg)
return
snd_seq_oss_timer_continue
(
timer
);
case
SNDCTL_TMR_TEMPO
:
debug_printk
((
"timer tempo
\n
"
));
if
(
get_user
(
value
,
(
int
*
)
arg
))
if
(
get_user
(
value
,
arg
))
return
-
EFAULT
;
return
snd_seq_oss_timer_tempo
(
timer
,
value
);
case
SNDCTL_TMR_TIMEBASE
:
debug_printk
((
"timer timebase
\n
"
));
if
(
get_user
(
value
,
(
int
*
)
arg
))
if
(
get_user
(
value
,
arg
))
return
-
EFAULT
;
if
(
value
<
MIN_OSS_TIMEBASE
)
value
=
MIN_OSS_TIMEBASE
;
...
...
sound/core/seq/oss/seq_oss_timer.h
View file @
903d1fe4
...
...
@@ -46,7 +46,7 @@ int snd_seq_oss_timer_continue(seq_oss_timer_t *timer);
int
snd_seq_oss_timer_tempo
(
seq_oss_timer_t
*
timer
,
int
value
);
#define snd_seq_oss_timer_reset snd_seq_oss_timer_start
int
snd_seq_oss_timer_ioctl
(
seq_oss_timer_t
*
timer
,
unsigned
int
cmd
,
void
*
arg
);
int
snd_seq_oss_timer_ioctl
(
seq_oss_timer_t
*
timer
,
unsigned
int
cmd
,
int
__user
*
arg
);
/*
* get current processed time
...
...
sound/core/seq/seq_clientmgr.c
View file @
903d1fe4
...
...
@@ -365,7 +365,7 @@ static int snd_seq_release(struct inode *inode, struct file *file)
* -EINVAL no enough user-space buffer to write the whole event
* -EFAULT seg. fault during copy to user space
*/
static
ssize_t
snd_seq_read
(
struct
file
*
file
,
char
*
buf
,
size_t
count
,
loff_t
*
offset
)
static
ssize_t
snd_seq_read
(
struct
file
*
file
,
char
__user
*
buf
,
size_t
count
,
loff_t
*
offset
)
{
client_t
*
client
=
(
client_t
*
)
file
->
private_data
;
fifo_t
*
fifo
;
...
...
@@ -959,7 +959,7 @@ static int check_event_type_and_length(snd_seq_event_t *ev)
* -EMLINK too many hops
* others depends on return value from driver callback
*/
static
ssize_t
snd_seq_write
(
struct
file
*
file
,
const
char
*
buf
,
size_t
count
,
loff_t
*
offset
)
static
ssize_t
snd_seq_write
(
struct
file
*
file
,
const
char
__user
*
buf
,
size_t
count
,
loff_t
*
offset
)
{
client_t
*
client
=
(
client_t
*
)
file
->
private_data
;
int
written
=
0
,
len
;
...
...
@@ -1077,7 +1077,7 @@ static unsigned int snd_seq_poll(struct file *file, poll_table * wait)
/* SYSTEM_INFO ioctl() */
static
int
snd_seq_ioctl_system_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_system_info
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_system_info_t
info
;
...
...
@@ -1090,20 +1090,20 @@ static int snd_seq_ioctl_system_info(client_t *client, unsigned long arg)
info
.
cur_clients
=
client_usage
.
cur
;
info
.
cur_queues
=
snd_seq_queue_get_cur_queues
();
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* RUNNING_MODE ioctl() */
static
int
snd_seq_ioctl_running_mode
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_running_mode
(
client_t
*
client
,
void
__user
*
arg
)
{
struct
sndrv_seq_running_info
info
;
client_t
*
cptr
;
int
err
=
0
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
/* requested client number */
...
...
@@ -1148,12 +1148,12 @@ static void get_client_info(client_t *cptr, snd_seq_client_info_t *info)
memset
(
info
->
reserved
,
0
,
sizeof
(
info
->
reserved
));
}
static
int
snd_seq_ioctl_get_client_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_client_info
(
client_t
*
client
,
void
__user
*
arg
)
{
client_t
*
cptr
;
snd_seq_client_info_t
client_info
;
if
(
copy_from_user
(
&
client_info
,
(
void
*
)
arg
,
sizeof
(
client_info
)))
if
(
copy_from_user
(
&
client_info
,
arg
,
sizeof
(
client_info
)))
return
-
EFAULT
;
/* requested client number */
...
...
@@ -1164,18 +1164,18 @@ static int snd_seq_ioctl_get_client_info(client_t * client, unsigned long arg)
get_client_info
(
cptr
,
&
client_info
);
snd_seq_client_unlock
(
cptr
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
client_info
,
sizeof
(
client_info
)))
if
(
copy_to_user
(
arg
,
&
client_info
,
sizeof
(
client_info
)))
return
-
EFAULT
;
return
0
;
}
/* CLIENT_INFO ioctl() */
static
int
snd_seq_ioctl_set_client_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_client_info
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_client_info_t
client_info
;
if
(
copy_from_user
(
&
client_info
,
(
void
*
)
arg
,
sizeof
(
client_info
)))
if
(
copy_from_user
(
&
client_info
,
arg
,
sizeof
(
client_info
)))
return
-
EFAULT
;
/* it is not allowed to set the info fields for an another client */
...
...
@@ -1201,13 +1201,13 @@ static int snd_seq_ioctl_set_client_info(client_t * client, unsigned long arg)
/*
* CREATE PORT ioctl()
*/
static
int
snd_seq_ioctl_create_port
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_create_port
(
client_t
*
client
,
void
__user
*
arg
)
{
client_port_t
*
port
;
snd_seq_port_info_t
info
;
snd_seq_port_callback_t
*
callback
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
/* it is not allowed to create the port for an another client */
...
...
@@ -1242,7 +1242,7 @@ static int snd_seq_ioctl_create_port(client_t * client, unsigned long arg)
snd_seq_set_port_info
(
port
,
&
info
);
snd_seq_system_client_ev_port_start
(
port
->
addr
.
client
,
port
->
addr
.
port
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
...
...
@@ -1251,13 +1251,13 @@ static int snd_seq_ioctl_create_port(client_t * client, unsigned long arg)
/*
* DELETE PORT ioctl()
*/
static
int
snd_seq_ioctl_delete_port
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_delete_port
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_port_info_t
info
;
int
err
;
/* set passed parameters */
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
/* it is not allowed to remove the port for an another client */
...
...
@@ -1274,13 +1274,13 @@ static int snd_seq_ioctl_delete_port(client_t * client, unsigned long arg)
/*
* GET_PORT_INFO ioctl() (on any client)
*/
static
int
snd_seq_ioctl_get_port_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_port_info
(
client_t
*
client
,
void
__user
*
arg
)
{
client_t
*
cptr
;
client_port_t
*
port
;
snd_seq_port_info_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
cptr
=
snd_seq_client_use_ptr
(
info
.
addr
.
client
);
if
(
cptr
==
NULL
)
...
...
@@ -1297,7 +1297,7 @@ static int snd_seq_ioctl_get_port_info(client_t *client, unsigned long arg)
snd_seq_port_unlock
(
port
);
snd_seq_client_unlock
(
cptr
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
...
...
@@ -1306,12 +1306,12 @@ static int snd_seq_ioctl_get_port_info(client_t *client, unsigned long arg)
/*
* SET_PORT_INFO ioctl() (only ports on this/own client)
*/
static
int
snd_seq_ioctl_set_port_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_port_info
(
client_t
*
client
,
void
__user
*
arg
)
{
client_port_t
*
port
;
snd_seq_port_info_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
if
(
info
.
addr
.
client
!=
client
->
number
)
/* only set our own ports ! */
...
...
@@ -1381,14 +1381,14 @@ int snd_seq_client_notify_subscription(int client, int port,
/*
* add to port's subscription list IOCTL interface
*/
static
int
snd_seq_ioctl_subscribe_port
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_subscribe_port
(
client_t
*
client
,
void
__user
*
arg
)
{
int
result
=
-
EINVAL
;
client_t
*
receiver
=
NULL
,
*
sender
=
NULL
;
client_port_t
*
sport
=
NULL
,
*
dport
=
NULL
;
snd_seq_port_subscribe_t
subs
;
if
(
copy_from_user
(
&
subs
,
(
void
*
)
arg
,
sizeof
(
subs
)))
if
(
copy_from_user
(
&
subs
,
arg
,
sizeof
(
subs
)))
return
-
EFAULT
;
if
((
receiver
=
snd_seq_client_use_ptr
(
subs
.
dest
.
client
))
==
NULL
)
...
...
@@ -1425,14 +1425,14 @@ static int snd_seq_ioctl_subscribe_port(client_t * client, unsigned long arg)
/*
* remove from port's subscription list
*/
static
int
snd_seq_ioctl_unsubscribe_port
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_unsubscribe_port
(
client_t
*
client
,
void
__user
*
arg
)
{
int
result
=
-
ENXIO
;
client_t
*
receiver
=
NULL
,
*
sender
=
NULL
;
client_port_t
*
sport
=
NULL
,
*
dport
=
NULL
;
snd_seq_port_subscribe_t
subs
;
if
(
copy_from_user
(
&
subs
,
(
void
*
)
arg
,
sizeof
(
subs
)))
if
(
copy_from_user
(
&
subs
,
arg
,
sizeof
(
subs
)))
return
-
EFAULT
;
if
((
receiver
=
snd_seq_client_use_ptr
(
subs
.
dest
.
client
))
==
NULL
)
...
...
@@ -1466,13 +1466,13 @@ static int snd_seq_ioctl_unsubscribe_port(client_t * client, unsigned long arg)
/* CREATE_QUEUE ioctl() */
static
int
snd_seq_ioctl_create_queue
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_create_queue
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_info_t
info
;
int
result
;
queue_t
*
q
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
result
=
snd_seq_queue_alloc
(
client
->
number
,
info
.
locked
,
info
.
flags
);
...
...
@@ -1494,30 +1494,30 @@ static int snd_seq_ioctl_create_queue(client_t *client, unsigned long arg)
q
->
name
[
sizeof
(
q
->
name
)
-
1
]
=
0
;
queuefree
(
q
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* DELETE_QUEUE ioctl() */
static
int
snd_seq_ioctl_delete_queue
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_delete_queue
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_info_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
return
snd_seq_queue_delete
(
client
->
number
,
info
.
queue
);
}
/* GET_QUEUE_INFO ioctl() */
static
int
snd_seq_ioctl_get_queue_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_queue_info
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_info_t
info
;
queue_t
*
q
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
q
=
queueptr
(
info
.
queue
);
...
...
@@ -1532,19 +1532,19 @@ static int snd_seq_ioctl_get_queue_info(client_t *client, unsigned long arg)
info
.
name
[
sizeof
(
info
.
name
)
-
1
]
=
0
;
queuefree
(
q
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* SET_QUEUE_INFO ioctl() */
static
int
snd_seq_ioctl_set_queue_info
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_queue_info
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_info_t
info
;
queue_t
*
q
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
if
(
info
.
owner
!=
client
->
number
)
...
...
@@ -1575,12 +1575,12 @@ static int snd_seq_ioctl_set_queue_info(client_t *client, unsigned long arg)
}
/* GET_NAMED_QUEUE ioctl() */
static
int
snd_seq_ioctl_get_named_queue
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_named_queue
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_info_t
info
;
queue_t
*
q
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
q
=
snd_seq_queue_find_name
(
info
.
name
);
...
...
@@ -1591,20 +1591,20 @@ static int snd_seq_ioctl_get_named_queue(client_t *client, unsigned long arg)
info
.
locked
=
q
->
locked
;
queuefree
(
q
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* GET_QUEUE_STATUS ioctl() */
static
int
snd_seq_ioctl_get_queue_status
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_queue_status
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_status_t
status
;
queue_t
*
queue
;
seq_timer_t
*
tmr
;
if
(
copy_from_user
(
&
status
,
(
void
*
)
arg
,
sizeof
(
status
)))
if
(
copy_from_user
(
&
status
,
arg
,
sizeof
(
status
)))
return
-
EFAULT
;
queue
=
queueptr
(
status
.
queue
);
...
...
@@ -1624,20 +1624,20 @@ static int snd_seq_ioctl_get_queue_status(client_t * client, unsigned long arg)
status
.
flags
=
queue
->
flags
;
queuefree
(
queue
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
status
,
sizeof
(
status
)))
if
(
copy_to_user
(
arg
,
&
status
,
sizeof
(
status
)))
return
-
EFAULT
;
return
0
;
}
/* GET_QUEUE_TEMPO ioctl() */
static
int
snd_seq_ioctl_get_queue_tempo
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_queue_tempo
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_tempo_t
tempo
;
queue_t
*
queue
;
seq_timer_t
*
tmr
;
if
(
copy_from_user
(
&
tempo
,
(
void
*
)
arg
,
sizeof
(
tempo
)))
if
(
copy_from_user
(
&
tempo
,
arg
,
sizeof
(
tempo
)))
return
-
EFAULT
;
queue
=
queueptr
(
tempo
.
queue
);
...
...
@@ -1654,19 +1654,19 @@ static int snd_seq_ioctl_get_queue_tempo(client_t * client, unsigned long arg)
tempo
.
skew_base
=
tmr
->
skew_base
;
queuefree
(
queue
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
tempo
,
sizeof
(
tempo
)))
if
(
copy_to_user
(
arg
,
&
tempo
,
sizeof
(
tempo
)))
return
-
EFAULT
;
return
0
;
}
/* SET_QUEUE_TEMPO ioctl() */
static
int
snd_seq_ioctl_set_queue_tempo
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_queue_tempo
(
client_t
*
client
,
void
__user
*
arg
)
{
int
result
;
snd_seq_queue_tempo_t
tempo
;
if
(
copy_from_user
(
&
tempo
,
(
void
*
)
arg
,
sizeof
(
tempo
)))
if
(
copy_from_user
(
&
tempo
,
arg
,
sizeof
(
tempo
)))
return
-
EFAULT
;
if
(
snd_seq_queue_check_access
(
tempo
.
queue
,
client
->
number
))
{
...
...
@@ -1682,13 +1682,13 @@ static int snd_seq_ioctl_set_queue_tempo(client_t * client, unsigned long arg)
/* GET_QUEUE_TIMER ioctl() */
static
int
snd_seq_ioctl_get_queue_timer
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_queue_timer
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_timer_t
timer
;
queue_t
*
queue
;
seq_timer_t
*
tmr
;
if
(
copy_from_user
(
&
timer
,
(
void
*
)
arg
,
sizeof
(
timer
)))
if
(
copy_from_user
(
&
timer
,
arg
,
sizeof
(
timer
)))
return
-
EFAULT
;
queue
=
queueptr
(
timer
.
queue
);
...
...
@@ -1711,19 +1711,19 @@ static int snd_seq_ioctl_get_queue_timer(client_t * client, unsigned long arg)
up
(
&
queue
->
timer_mutex
);
queuefree
(
queue
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
timer
,
sizeof
(
timer
)))
if
(
copy_to_user
(
arg
,
&
timer
,
sizeof
(
timer
)))
return
-
EFAULT
;
return
0
;
}
/* SET_QUEUE_TIMER ioctl() */
static
int
snd_seq_ioctl_set_queue_timer
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_queue_timer
(
client_t
*
client
,
void
__user
*
arg
)
{
int
result
=
0
;
snd_seq_queue_timer_t
timer
;
if
(
copy_from_user
(
&
timer
,
(
void
*
)
arg
,
sizeof
(
timer
)))
if
(
copy_from_user
(
&
timer
,
arg
,
sizeof
(
timer
)))
return
-
EFAULT
;
if
(
timer
.
type
!=
SNDRV_SEQ_TIMER_ALSA
)
...
...
@@ -1759,12 +1759,12 @@ static int snd_seq_ioctl_set_queue_timer(client_t * client, unsigned long arg)
/* GET_QUEUE_CLIENT ioctl() */
static
int
snd_seq_ioctl_get_queue_client
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_queue_client
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_queue_client_t
info
;
int
used
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
used
=
snd_seq_queue_is_used
(
info
.
queue
,
client
->
number
);
...
...
@@ -1773,19 +1773,19 @@ static int snd_seq_ioctl_get_queue_client(client_t * client, unsigned long arg)
info
.
used
=
used
;
info
.
client
=
client
->
number
;
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* SET_QUEUE_CLIENT ioctl() */
static
int
snd_seq_ioctl_set_queue_client
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_queue_client
(
client_t
*
client
,
void
__user
*
arg
)
{
int
err
;
snd_seq_queue_client_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
if
(
info
.
used
>=
0
)
{
...
...
@@ -1799,12 +1799,12 @@ static int snd_seq_ioctl_set_queue_client(client_t * client, unsigned long arg)
/* GET_CLIENT_POOL ioctl() */
static
int
snd_seq_ioctl_get_client_pool
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_client_pool
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_client_pool_t
info
;
client_t
*
cptr
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
cptr
=
snd_seq_client_use_ptr
(
info
.
client
);
...
...
@@ -1827,18 +1827,18 @@ static int snd_seq_ioctl_get_client_pool(client_t * client, unsigned long arg)
}
snd_seq_client_unlock
(
cptr
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
/* SET_CLIENT_POOL ioctl() */
static
int
snd_seq_ioctl_set_client_pool
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_set_client_pool
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_client_pool_t
info
;
int
rc
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
if
(
client
->
number
!=
info
.
client
)
...
...
@@ -1877,11 +1877,11 @@ static int snd_seq_ioctl_set_client_pool(client_t * client, unsigned long arg)
/* REMOVE_EVENTS ioctl() */
static
int
snd_seq_ioctl_remove_events
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_remove_events
(
client_t
*
client
,
void
__user
*
arg
)
{
snd_seq_remove_events_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
/*
...
...
@@ -1906,7 +1906,7 @@ static int snd_seq_ioctl_remove_events(client_t * client, unsigned long arg)
/*
* get subscription info
*/
static
int
snd_seq_ioctl_get_subscription
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_get_subscription
(
client_t
*
client
,
void
__user
*
arg
)
{
int
result
;
client_t
*
sender
=
NULL
;
...
...
@@ -1914,7 +1914,7 @@ static int snd_seq_ioctl_get_subscription(client_t *client, unsigned long arg)
snd_seq_port_subscribe_t
subs
;
subscribers_t
*
p
;
if
(
copy_from_user
(
&
subs
,
(
void
*
)
arg
,
sizeof
(
subs
)))
if
(
copy_from_user
(
&
subs
,
arg
,
sizeof
(
subs
)))
return
-
EFAULT
;
result
=
-
EINVAL
;
...
...
@@ -1935,7 +1935,7 @@ static int snd_seq_ioctl_get_subscription(client_t *client, unsigned long arg)
if
(
sender
)
snd_seq_client_unlock
(
sender
);
if
(
result
>=
0
)
{
if
(
copy_to_user
(
(
void
*
)
arg
,
&
subs
,
sizeof
(
subs
)))
if
(
copy_to_user
(
arg
,
&
subs
,
sizeof
(
subs
)))
return
-
EFAULT
;
}
return
result
;
...
...
@@ -1945,7 +1945,7 @@ static int snd_seq_ioctl_get_subscription(client_t *client, unsigned long arg)
/*
* get subscription info - check only its presence
*/
static
int
snd_seq_ioctl_query_subs
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_query_subs
(
client_t
*
client
,
void
__user
*
arg
)
{
int
result
=
-
ENXIO
;
client_t
*
cptr
=
NULL
;
...
...
@@ -1955,7 +1955,7 @@ static int snd_seq_ioctl_query_subs(client_t *client, unsigned long arg)
struct
list_head
*
p
;
int
i
;
if
(
copy_from_user
(
&
subs
,
(
void
*
)
arg
,
sizeof
(
subs
)))
if
(
copy_from_user
(
&
subs
,
arg
,
sizeof
(
subs
)))
return
-
EFAULT
;
if
((
cptr
=
snd_seq_client_use_ptr
(
subs
.
root
.
client
))
==
NULL
)
...
...
@@ -2004,7 +2004,7 @@ static int snd_seq_ioctl_query_subs(client_t *client, unsigned long arg)
if
(
cptr
)
snd_seq_client_unlock
(
cptr
);
if
(
result
>=
0
)
{
if
(
copy_to_user
(
(
void
*
)
arg
,
&
subs
,
sizeof
(
subs
)))
if
(
copy_to_user
(
arg
,
&
subs
,
sizeof
(
subs
)))
return
-
EFAULT
;
}
return
result
;
...
...
@@ -2014,12 +2014,12 @@ static int snd_seq_ioctl_query_subs(client_t *client, unsigned long arg)
/*
* query next client
*/
static
int
snd_seq_ioctl_query_next_client
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_query_next_client
(
client_t
*
client
,
void
__user
*
arg
)
{
client_t
*
cptr
=
NULL
;
snd_seq_client_info_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
/* search for next client */
...
...
@@ -2037,7 +2037,7 @@ static int snd_seq_ioctl_query_next_client(client_t *client, unsigned long arg)
get_client_info
(
cptr
,
&
info
);
snd_seq_client_unlock
(
cptr
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
...
...
@@ -2045,13 +2045,13 @@ static int snd_seq_ioctl_query_next_client(client_t *client, unsigned long arg)
/*
* query next port
*/
static
int
snd_seq_ioctl_query_next_port
(
client_t
*
client
,
unsigned
long
arg
)
static
int
snd_seq_ioctl_query_next_port
(
client_t
*
client
,
void
__user
*
arg
)
{
client_t
*
cptr
;
client_port_t
*
port
=
NULL
;
snd_seq_port_info_t
info
;
if
(
copy_from_user
(
&
info
,
(
void
*
)
arg
,
sizeof
(
info
)))
if
(
copy_from_user
(
&
info
,
arg
,
sizeof
(
info
)))
return
-
EFAULT
;
cptr
=
snd_seq_client_use_ptr
(
info
.
addr
.
client
);
if
(
cptr
==
NULL
)
...
...
@@ -2071,7 +2071,7 @@ static int snd_seq_ioctl_query_next_port(client_t *client, unsigned long arg)
snd_seq_port_unlock
(
port
);
snd_seq_client_unlock
(
cptr
);
if
(
copy_to_user
(
(
void
*
)
arg
,
&
info
,
sizeof
(
info
)))
if
(
copy_to_user
(
arg
,
&
info
,
sizeof
(
info
)))
return
-
EFAULT
;
return
0
;
}
...
...
@@ -2080,7 +2080,7 @@ static int snd_seq_ioctl_query_next_port(client_t *client, unsigned long arg)
static
struct
seq_ioctl_table
{
unsigned
int
cmd
;
int
(
*
func
)(
client_t
*
client
,
unsigned
long
arg
);
int
(
*
func
)(
client_t
*
client
,
void
__user
*
arg
);
}
ioctl_tables
[]
=
{
{
SNDRV_SEQ_IOCTL_SYSTEM_INFO
,
snd_seq_ioctl_system_info
},
{
SNDRV_SEQ_IOCTL_RUNNING_MODE
,
snd_seq_ioctl_running_mode
},
...
...
@@ -2114,7 +2114,7 @@ static struct seq_ioctl_table {
{
0
,
NULL
},
};
static
int
snd_seq_do_ioctl
(
client_t
*
client
,
unsigned
int
cmd
,
unsigned
long
arg
)
static
int
snd_seq_do_ioctl
(
client_t
*
client
,
unsigned
int
cmd
,
void
__user
*
arg
)
{
struct
seq_ioctl_table
*
p
;
...
...
@@ -2131,7 +2131,7 @@ static int snd_seq_do_ioctl(client_t *client, unsigned int cmd, unsigned long ar
return
-
EFAULT
;
for
(
p
=
ioctl_tables
;
p
->
cmd
;
p
++
)
{
if
(
p
->
cmd
==
cmd
)
return
p
->
func
(
client
,
arg
);
return
p
->
func
(
client
,
(
void
__user
*
)
arg
);
}
snd_printd
(
"seq unknown ioctl() 0x%x (type='%c', number=0x%2x)
\n
"
,
cmd
,
_IOC_TYPE
(
cmd
),
_IOC_NR
(
cmd
));
...
...
@@ -2146,7 +2146,7 @@ static int snd_seq_ioctl(struct inode *inode, struct file *file,
snd_assert
(
client
!=
NULL
,
return
-
ENXIO
);
return
snd_seq_do_ioctl
(
client
,
cmd
,
arg
);
return
snd_seq_do_ioctl
(
client
,
cmd
,
(
void
__user
*
)
arg
);
}
...
...
@@ -2315,7 +2315,7 @@ int snd_seq_kernel_client_dispatch(int client, snd_seq_event_t * ev,
* exported, called by kernel clients to perform same functions as with
* userland ioctl()
*/
int
snd_seq_kernel_client_ctl
(
int
clientid
,
unsigned
int
cmd
,
void
*
arg
)
int
snd_seq_kernel_client_ctl
(
int
clientid
,
unsigned
int
cmd
,
void
__user
*
arg
)
{
client_t
*
client
;
mm_segment_t
fs
;
...
...
@@ -2325,7 +2325,7 @@ int snd_seq_kernel_client_ctl(int clientid, unsigned int cmd, void *arg)
if
(
client
==
NULL
)
return
-
ENXIO
;
fs
=
snd_enter_user
();
result
=
snd_seq_do_ioctl
(
client
,
cmd
,
(
unsigned
long
)
arg
);
result
=
snd_seq_do_ioctl
(
client
,
cmd
,
arg
);
snd_leave_user
(
fs
);
return
result
;
}
...
...
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