Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
f2cffa22
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 4 年多
通知
15
Star
8
Fork
2
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
kernel_linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
f2cffa22
编写于
7月 04, 2017
作者:
A
Al Viro
浏览文件
操作
浏览文件
下载
差异文件
Merge branch 'work.drm' into work.__copy_in_user
上级
8d1a81a8
aeba0390
变更
12
展开全部
显示空白变更内容
内联
并排
Showing
12 changed file
with
476 addition
and
1045 deletion
+476
-1045
drivers/gpu/drm/drm_bufs.c
drivers/gpu/drm/drm_bufs.c
+65
-51
drivers/gpu/drm/drm_internal.h
drivers/gpu/drm/drm_internal.h
+3
-0
drivers/gpu/drm/drm_ioc32.c
drivers/gpu/drm/drm_ioc32.c
+290
-460
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_ioctl.c
+31
-17
drivers/gpu/drm/drm_legacy.h
drivers/gpu/drm/drm_legacy.h
+7
-0
drivers/gpu/drm/mga/mga_drv.h
drivers/gpu/drm/mga/mga_drv.h
+2
-0
drivers/gpu/drm/mga/mga_ioc32.c
drivers/gpu/drm/mga/mga_ioc32.c
+60
-89
drivers/gpu/drm/mga/mga_state.c
drivers/gpu/drm/mga/mga_state.c
+1
-1
drivers/gpu/drm/radeon/Makefile
drivers/gpu/drm/radeon/Makefile
+0
-1
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_drv.c
+16
-2
drivers/gpu/drm/radeon/radeon_ioc32.c
drivers/gpu/drm/radeon/radeon_ioc32.c
+0
-424
include/drm/drm_ioctl.h
include/drm/drm_ioctl.h
+1
-0
未找到文件。
drivers/gpu/drm/drm_bufs.c
浏览文件 @
f2cffa22
...
...
@@ -1258,11 +1258,11 @@ int drm_legacy_addbufs(struct drm_device *dev, void *data,
* lock, preventing of allocating more buffers after this call. Information
* about each requested buffer is then copied into user space.
*/
int
drm_legacy_infobufs
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
int
__drm_legacy_infobufs
(
struct
drm_device
*
dev
,
void
*
data
,
int
*
p
,
int
(
*
f
)(
void
*
,
int
,
struct
drm_buf_entry
*
))
{
struct
drm_device_dma
*
dma
=
dev
->
dma
;
struct
drm_buf_info
*
request
=
data
;
int
i
;
int
count
;
...
...
@@ -1290,26 +1290,12 @@ int drm_legacy_infobufs(struct drm_device *dev, void *data,
DRM_DEBUG
(
"count = %d
\n
"
,
count
);
if
(
request
->
count
>=
count
)
{
if
(
*
p
>=
count
)
{
for
(
i
=
0
,
count
=
0
;
i
<
DRM_MAX_ORDER
+
1
;
i
++
)
{
if
(
dma
->
bufs
[
i
].
buf_count
)
{
struct
drm_buf_desc
__user
*
to
=
&
request
->
list
[
count
];
struct
drm_buf_entry
*
from
=
&
dma
->
bufs
[
i
];
if
(
copy_to_user
(
&
to
->
count
,
&
from
->
buf_count
,
sizeof
(
from
->
buf_count
))
||
copy_to_user
(
&
to
->
size
,
&
from
->
buf_size
,
sizeof
(
from
->
buf_size
))
||
copy_to_user
(
&
to
->
low_mark
,
&
from
->
low_mark
,
sizeof
(
from
->
low_mark
))
||
copy_to_user
(
&
to
->
high_mark
,
&
from
->
high_mark
,
sizeof
(
from
->
high_mark
)))
if
(
from
->
buf_count
)
{
if
(
f
(
data
,
count
,
from
)
<
0
)
return
-
EFAULT
;
DRM_DEBUG
(
"%d %d %d %d %d
\n
"
,
i
,
dma
->
bufs
[
i
].
buf_count
,
...
...
@@ -1320,11 +1306,29 @@ int drm_legacy_infobufs(struct drm_device *dev, void *data,
}
}
}
request
->
count
=
count
;
*
p
=
count
;
return
0
;
}
static
int
copy_one_buf
(
void
*
data
,
int
count
,
struct
drm_buf_entry
*
from
)
{
struct
drm_buf_info
*
request
=
data
;
struct
drm_buf_desc
__user
*
to
=
&
request
->
list
[
count
];
struct
drm_buf_desc
v
=
{.
count
=
from
->
buf_count
,
.
size
=
from
->
buf_size
,
.
low_mark
=
from
->
low_mark
,
.
high_mark
=
from
->
high_mark
};
return
copy_to_user
(
to
,
&
v
,
offsetof
(
struct
drm_buf_desc
,
flags
));
}
int
drm_legacy_infobufs
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
struct
drm_buf_info
*
request
=
data
;
return
__drm_legacy_infobufs
(
dev
,
data
,
&
request
->
count
,
copy_one_buf
);
}
/**
* Specifies a low and high water mark for buffer allocation
*
...
...
@@ -1439,15 +1443,15 @@ int drm_legacy_freebufs(struct drm_device *dev, void *data,
* offset equal to 0, which drm_mmap() interpretes as PCI buffers and calls
* drm_mmap_dma().
*/
int
drm_legacy_mapbufs
(
struct
drm_device
*
dev
,
void
*
data
,
int
__drm_legacy_mapbufs
(
struct
drm_device
*
dev
,
void
*
data
,
int
*
p
,
void
__user
**
v
,
int
(
*
f
)(
void
*
,
int
,
unsigned
long
,
struct
drm_buf
*
),
struct
drm_file
*
file_priv
)
{
struct
drm_device_dma
*
dma
=
dev
->
dma
;
int
retcode
=
0
;
const
int
zero
=
0
;
unsigned
long
virtual
;
unsigned
long
address
;
struct
drm_buf_map
*
request
=
data
;
int
i
;
if
(
!
drm_core_check_feature
(
dev
,
DRIVER_LEGACY
))
...
...
@@ -1467,7 +1471,7 @@ int drm_legacy_mapbufs(struct drm_device *dev, void *data,
dev
->
buf_use
++
;
/* Can't allocate more after this call */
spin_unlock
(
&
dev
->
buf_lock
);
if
(
request
->
count
>=
dma
->
buf_count
)
{
if
(
*
p
>=
dma
->
buf_count
)
{
if
((
dev
->
agp
&&
(
dma
->
flags
&
_DRM_DMA_USE_AGP
))
||
(
drm_core_check_feature
(
dev
,
DRIVER_SG
)
&&
(
dma
->
flags
&
_DRM_DMA_USE_SG
)))
{
...
...
@@ -1492,41 +1496,51 @@ int drm_legacy_mapbufs(struct drm_device *dev, void *data,
retcode
=
(
signed
long
)
virtual
;
goto
done
;
}
request
->
virtual
=
(
void
__user
*
)
virtual
;
*
v
=
(
void
__user
*
)
virtual
;
for
(
i
=
0
;
i
<
dma
->
buf_count
;
i
++
)
{
if
(
copy_to_user
(
&
request
->
list
[
i
].
idx
,
&
dma
->
buflist
[
i
]
->
idx
,
sizeof
(
request
->
list
[
0
].
idx
)))
{
retcode
=
-
EFAULT
;
goto
done
;
}
if
(
copy_to_user
(
&
request
->
list
[
i
].
total
,
&
dma
->
buflist
[
i
]
->
total
,
sizeof
(
request
->
list
[
0
].
total
)))
{
retcode
=
-
EFAULT
;
goto
done
;
}
if
(
copy_to_user
(
&
request
->
list
[
i
].
used
,
&
zero
,
sizeof
(
zero
)))
{
retcode
=
-
EFAULT
;
goto
done
;
}
address
=
virtual
+
dma
->
buflist
[
i
]
->
offset
;
/* *** */
if
(
copy_to_user
(
&
request
->
list
[
i
].
address
,
&
address
,
sizeof
(
address
)))
{
if
(
f
(
data
,
i
,
virtual
,
dma
->
buflist
[
i
])
<
0
)
{
retcode
=
-
EFAULT
;
goto
done
;
}
}
}
done:
request
->
count
=
dma
->
buf_count
;
DRM_DEBUG
(
"%d buffers, retcode = %d
\n
"
,
request
->
count
,
retcode
);
*
p
=
dma
->
buf_count
;
DRM_DEBUG
(
"%d buffers, retcode = %d
\n
"
,
*
p
,
retcode
);
return
retcode
;
}
static
int
map_one_buf
(
void
*
data
,
int
idx
,
unsigned
long
virtual
,
struct
drm_buf
*
buf
)
{
struct
drm_buf_map
*
request
=
data
;
unsigned
long
address
=
virtual
+
buf
->
offset
;
/* *** */
if
(
copy_to_user
(
&
request
->
list
[
idx
].
idx
,
&
buf
->
idx
,
sizeof
(
request
->
list
[
0
].
idx
)))
return
-
EFAULT
;
if
(
copy_to_user
(
&
request
->
list
[
idx
].
total
,
&
buf
->
total
,
sizeof
(
request
->
list
[
0
].
total
)))
return
-
EFAULT
;
if
(
clear_user
(
&
request
->
list
[
idx
].
used
,
sizeof
(
int
)))
return
-
EFAULT
;
if
(
copy_to_user
(
&
request
->
list
[
idx
].
address
,
&
address
,
sizeof
(
address
)))
return
-
EFAULT
;
return
0
;
}
int
drm_legacy_mapbufs
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
struct
drm_buf_map
*
request
=
data
;
return
__drm_legacy_mapbufs
(
dev
,
data
,
&
request
->
count
,
&
request
->
virtual
,
map_one_buf
,
file_priv
);
}
int
drm_legacy_dma_ioctl
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
...
...
drivers/gpu/drm/drm_internal.h
浏览文件 @
f2cffa22
...
...
@@ -143,3 +143,6 @@ static inline int drm_debugfs_crtc_crc_add(struct drm_crtc *crtc)
return
0
;
}
#endif
drm_ioctl_t
drm_version
;
drm_ioctl_t
drm_getunique
;
drm_ioctl_t
drm_getclient
;
drivers/gpu/drm/drm_ioc32.c
浏览文件 @
f2cffa22
此差异已折叠。
点击以展开。
drivers/gpu/drm/drm_ioctl.c
浏览文件 @
f2cffa22
...
...
@@ -107,7 +107,7 @@
*
* Copies the bus id from drm_device::unique into user space.
*/
static
int
drm_getunique
(
struct
drm_device
*
dev
,
void
*
data
,
int
drm_getunique
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
struct
drm_unique
*
u
=
data
;
...
...
@@ -172,7 +172,7 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
* Searches for the client with the specified index and copies its information
* into userspace
*/
static
int
drm_getclient
(
struct
drm_device
*
dev
,
void
*
data
,
int
drm_getclient
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
struct
drm_client
*
client
=
data
;
...
...
@@ -461,7 +461,7 @@ static int drm_copy_field(char __user *buf, size_t *buf_len, const char *value)
*
* Fills in the version information in \p arg.
*/
static
int
drm_version
(
struct
drm_device
*
dev
,
void
*
data
,
int
drm_version
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
struct
drm_version
*
version
=
data
;
...
...
@@ -694,6 +694,33 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
* structure.
*/
long
drm_ioctl_kernel
(
struct
file
*
file
,
drm_ioctl_t
*
func
,
void
*
kdata
,
u32
flags
)
{
struct
drm_file
*
file_priv
=
file
->
private_data
;
struct
drm_device
*
dev
=
file_priv
->
minor
->
dev
;
int
retcode
;
if
(
drm_device_is_unplugged
(
dev
))
return
-
ENODEV
;
retcode
=
drm_ioctl_permit
(
flags
,
file_priv
);
if
(
unlikely
(
retcode
))
return
retcode
;
/* Enforce sane locking for modern driver ioctls. */
if
(
!
drm_core_check_feature
(
dev
,
DRIVER_LEGACY
)
||
(
flags
&
DRM_UNLOCKED
))
retcode
=
func
(
dev
,
kdata
,
file_priv
);
else
{
mutex_lock
(
&
drm_global_mutex
);
retcode
=
func
(
dev
,
kdata
,
file_priv
);
mutex_unlock
(
&
drm_global_mutex
);
}
return
retcode
;
}
EXPORT_SYMBOL
(
drm_ioctl_kernel
);
/**
* drm_ioctl - ioctl callback implementation for DRM drivers
* @filp: file this ioctl is called on
...
...
@@ -762,10 +789,6 @@ long drm_ioctl(struct file *filp,
goto
err_i1
;
}
retcode
=
drm_ioctl_permit
(
ioctl
->
flags
,
file_priv
);
if
(
unlikely
(
retcode
))
goto
err_i1
;
if
(
ksize
<=
sizeof
(
stack_kdata
))
{
kdata
=
stack_kdata
;
}
else
{
...
...
@@ -784,16 +807,7 @@ long drm_ioctl(struct file *filp,
if
(
ksize
>
in_size
)
memset
(
kdata
+
in_size
,
0
,
ksize
-
in_size
);
/* Enforce sane locking for modern driver ioctls. */
if
(
!
drm_core_check_feature
(
dev
,
DRIVER_LEGACY
)
||
(
ioctl
->
flags
&
DRM_UNLOCKED
))
retcode
=
func
(
dev
,
kdata
,
file_priv
);
else
{
mutex_lock
(
&
drm_global_mutex
);
retcode
=
func
(
dev
,
kdata
,
file_priv
);
mutex_unlock
(
&
drm_global_mutex
);
}
retcode
=
drm_ioctl_kernel
(
filp
,
func
,
kdata
,
ioctl
->
flags
);
if
(
copy_to_user
((
void
__user
*
)
arg
,
kdata
,
out_size
)
!=
0
)
retcode
=
-
EFAULT
;
...
...
drivers/gpu/drm/drm_legacy.h
浏览文件 @
f2cffa22
...
...
@@ -74,6 +74,13 @@ int drm_legacy_freebufs(struct drm_device *d, void *v, struct drm_file *f);
int
drm_legacy_mapbufs
(
struct
drm_device
*
d
,
void
*
v
,
struct
drm_file
*
f
);
int
drm_legacy_dma_ioctl
(
struct
drm_device
*
d
,
void
*
v
,
struct
drm_file
*
f
);
int
__drm_legacy_infobufs
(
struct
drm_device
*
,
void
*
,
int
*
,
int
(
*
)(
void
*
,
int
,
struct
drm_buf_entry
*
));
int
__drm_legacy_mapbufs
(
struct
drm_device
*
,
void
*
,
int
*
,
void
__user
**
,
int
(
*
)(
void
*
,
int
,
unsigned
long
,
struct
drm_buf
*
),
struct
drm_file
*
);
#ifdef CONFIG_DRM_VM
void
drm_legacy_vma_flush
(
struct
drm_device
*
d
);
#else
...
...
drivers/gpu/drm/mga/mga_drv.h
浏览文件 @
f2cffa22
...
...
@@ -159,6 +159,8 @@ extern int mga_dma_bootstrap(struct drm_device *dev, void *data,
struct
drm_file
*
file_priv
);
extern
int
mga_dma_init
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
extern
int
mga_getparam
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
extern
int
mga_dma_flush
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
);
extern
int
mga_dma_reset
(
struct
drm_device
*
dev
,
void
*
data
,
...
...
drivers/gpu/drm/mga/mga_ioc32.c
浏览文件 @
f2cffa22
...
...
@@ -61,46 +61,25 @@ static int compat_mga_init(struct file *file, unsigned int cmd,
unsigned
long
arg
)
{
drm_mga_init32_t
init32
;
drm_mga_init_t
__user
*
init
;
int
err
=
0
,
i
;
drm_mga_init_t
init
;
if
(
copy_from_user
(
&
init32
,
(
void
__user
*
)
arg
,
sizeof
(
init32
)))
return
-
EFAULT
;
init
=
compat_alloc_user_space
(
sizeof
(
*
init
));
if
(
!
access_ok
(
VERIFY_WRITE
,
init
,
sizeof
(
*
init
))
||
__put_user
(
init32
.
func
,
&
init
->
func
)
||
__put_user
(
init32
.
sarea_priv_offset
,
&
init
->
sarea_priv_offset
)
||
__put_user
(
init32
.
chipset
,
&
init
->
chipset
)
||
__put_user
(
init32
.
sgram
,
&
init
->
sgram
)
||
__put_user
(
init32
.
maccess
,
&
init
->
maccess
)
||
__put_user
(
init32
.
fb_cpp
,
&
init
->
fb_cpp
)
||
__put_user
(
init32
.
front_offset
,
&
init
->
front_offset
)
||
__put_user
(
init32
.
front_pitch
,
&
init
->
front_pitch
)
||
__put_user
(
init32
.
back_offset
,
&
init
->
back_offset
)
||
__put_user
(
init32
.
back_pitch
,
&
init
->
back_pitch
)
||
__put_user
(
init32
.
depth_cpp
,
&
init
->
depth_cpp
)
||
__put_user
(
init32
.
depth_offset
,
&
init
->
depth_offset
)
||
__put_user
(
init32
.
depth_pitch
,
&
init
->
depth_pitch
)
||
__put_user
(
init32
.
fb_offset
,
&
init
->
fb_offset
)
||
__put_user
(
init32
.
mmio_offset
,
&
init
->
mmio_offset
)
||
__put_user
(
init32
.
status_offset
,
&
init
->
status_offset
)
||
__put_user
(
init32
.
warp_offset
,
&
init
->
warp_offset
)
||
__put_user
(
init32
.
primary_offset
,
&
init
->
primary_offset
)
||
__put_user
(
init32
.
buffers_offset
,
&
init
->
buffers_offset
))
return
-
EFAULT
;
for
(
i
=
0
;
i
<
MGA_NR_TEX_HEAPS
;
i
++
)
{
err
|=
__put_user
(
init32
.
texture_offset
[
i
],
&
init
->
texture_offset
[
i
]);
err
|=
__put_user
(
init32
.
texture_size
[
i
],
&
init
->
texture_size
[
i
]);
}
if
(
err
)
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_MGA_INIT
,
(
unsigned
long
)
init
);
init
.
func
=
init32
.
func
;
init
.
sarea_priv_offset
=
init32
.
sarea_priv_offset
;
memcpy
(
&
init
.
chipset
,
&
init32
.
chipset
,
offsetof
(
drm_mga_init_t
,
fb_offset
)
-
offsetof
(
drm_mga_init_t
,
chipset
));
init
.
fb_offset
=
init32
.
fb_offset
;
init
.
mmio_offset
=
init32
.
mmio_offset
;
init
.
status_offset
=
init32
.
status_offset
;
init
.
warp_offset
=
init32
.
warp_offset
;
init
.
primary_offset
=
init32
.
primary_offset
;
init
.
buffers_offset
=
init32
.
buffers_offset
;
return
drm_ioctl_kernel
(
file
,
mga_dma_init
,
&
init
,
DRM_AUTH
|
DRM_MASTER
|
DRM_ROOT_ONLY
);
}
typedef
struct
drm_mga_getparam32
{
...
...
@@ -112,19 +91,14 @@ static int compat_mga_getparam(struct file *file, unsigned int cmd,
unsigned
long
arg
)
{
drm_mga_getparam32_t
getparam32
;
drm_mga_getparam_t
__user
*
getparam
;
drm_mga_getparam_t
getparam
;
if
(
copy_from_user
(
&
getparam32
,
(
void
__user
*
)
arg
,
sizeof
(
getparam32
)))
return
-
EFAULT
;
getparam
=
compat_alloc_user_space
(
sizeof
(
*
getparam
));
if
(
!
access_ok
(
VERIFY_WRITE
,
getparam
,
sizeof
(
*
getparam
))
||
__put_user
(
getparam32
.
param
,
&
getparam
->
param
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
getparam32
.
value
,
&
getparam
->
value
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_MGA_GETPARAM
,
(
unsigned
long
)
getparam
);
getparam
.
param
=
getparam32
.
param
;
getparam
.
value
=
compat_ptr
(
getparam32
.
value
);
return
drm_ioctl_kernel
(
file
,
mga_getparam
,
&
getparam
,
DRM_AUTH
);
}
typedef
struct
drm_mga_drm_bootstrap32
{
...
...
@@ -141,48 +115,33 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
unsigned
long
arg
)
{
drm_mga_dma_bootstrap32_t
dma_bootstrap32
;
drm_mga_dma_bootstrap_t
__user
*
dma_bootstrap
;
drm_mga_dma_bootstrap_t
__user
dma_bootstrap
;
int
err
;
if
(
copy_from_user
(
&
dma_bootstrap32
,
(
void
__user
*
)
arg
,
sizeof
(
dma_bootstrap32
)))
return
-
EFAULT
;
dma_bootstrap
=
compat_alloc_user_space
(
sizeof
(
*
dma_bootstrap
));
if
(
!
access_ok
(
VERIFY_WRITE
,
dma_bootstrap
,
sizeof
(
*
dma_bootstrap
))
||
__put_user
(
dma_bootstrap32
.
texture_handle
,
&
dma_bootstrap
->
texture_handle
)
||
__put_user
(
dma_bootstrap32
.
texture_size
,
&
dma_bootstrap
->
texture_size
)
||
__put_user
(
dma_bootstrap32
.
primary_size
,
&
dma_bootstrap
->
primary_size
)
||
__put_user
(
dma_bootstrap32
.
secondary_bin_count
,
&
dma_bootstrap
->
secondary_bin_count
)
||
__put_user
(
dma_bootstrap32
.
secondary_bin_size
,
&
dma_bootstrap
->
secondary_bin_size
)
||
__put_user
(
dma_bootstrap32
.
agp_mode
,
&
dma_bootstrap
->
agp_mode
)
||
__put_user
(
dma_bootstrap32
.
agp_size
,
&
dma_bootstrap
->
agp_size
))
return
-
EFAULT
;
dma_bootstrap
.
texture_handle
=
dma_bootstrap32
.
texture_handle
;
dma_bootstrap
.
texture_size
=
dma_bootstrap32
.
texture_size
;
dma_bootstrap
.
primary_size
=
dma_bootstrap32
.
primary_size
;
dma_bootstrap
.
secondary_bin_count
=
dma_bootstrap32
.
secondary_bin_count
;
dma_bootstrap
.
secondary_bin_size
=
dma_bootstrap32
.
secondary_bin_size
;
dma_bootstrap
.
agp_mode
=
dma_bootstrap32
.
agp_mode
;
dma_bootstrap
.
agp_size
=
dma_bootstrap32
.
agp_size
;
err
=
drm_ioctl
(
file
,
DRM_IOCTL_MGA_DMA_BOOTSTRAP
,
(
unsigned
long
)
dma_bootstrap
);
err
=
drm_ioctl
_kernel
(
file
,
mga_dma_bootstrap
,
&
dma_bootstrap
,
DRM_AUTH
|
DRM_MASTER
|
DRM_ROOT_ONLY
);
if
(
err
)
return
err
;
if
(
__get_user
(
dma_bootstrap32
.
texture_handle
,
&
dma_bootstrap
->
texture_handle
)
||
__get_user
(
dma_bootstrap32
.
texture_size
,
&
dma_bootstrap
->
texture_size
)
||
__get_user
(
dma_bootstrap32
.
primary_size
,
&
dma_bootstrap
->
primary_size
)
||
__get_user
(
dma_bootstrap32
.
secondary_bin_count
,
&
dma_bootstrap
->
secondary_bin_count
)
||
__get_user
(
dma_bootstrap32
.
secondary_bin_size
,
&
dma_bootstrap
->
secondary_bin_size
)
||
__get_user
(
dma_bootstrap32
.
agp_mode
,
&
dma_bootstrap
->
agp_mode
)
||
__get_user
(
dma_bootstrap32
.
agp_size
,
&
dma_bootstrap
->
agp_size
))
return
-
EFAULT
;
dma_bootstrap32
.
texture_handle
=
dma_bootstrap
.
texture_handle
;
dma_bootstrap32
.
texture_size
=
dma_bootstrap
.
texture_size
;
dma_bootstrap32
.
primary_size
=
dma_bootstrap
.
primary_size
;
dma_bootstrap32
.
secondary_bin_count
=
dma_bootstrap
.
secondary_bin_count
;
dma_bootstrap32
.
secondary_bin_size
=
dma_bootstrap
.
secondary_bin_size
;
dma_bootstrap32
.
agp_mode
=
dma_bootstrap
.
agp_mode
;
dma_bootstrap32
.
agp_size
=
dma_bootstrap
.
agp_size
;
if
(
copy_to_user
((
void
__user
*
)
arg
,
&
dma_bootstrap32
,
sizeof
(
dma_bootstrap32
)))
return
-
EFAULT
;
...
...
@@ -190,10 +149,14 @@ static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
return
0
;
}
drm_ioctl_compat_t
*
mga_compat_ioctls
[]
=
{
[
DRM_MGA_INIT
]
=
compat_mga_init
,
[
DRM_MGA_GETPARAM
]
=
compat_mga_getparam
,
[
DRM_MGA_DMA_BOOTSTRAP
]
=
compat_mga_dma_bootstrap
,
static
struct
{
drm_ioctl_compat_t
*
fn
;
char
*
name
;
}
mga_compat_ioctls
[]
=
{
#define DRM_IOCTL32_DEF(n, f)[DRM_##n] = {.fn = f, .name = #n}
DRM_IOCTL32_DEF
(
MGA_INIT
,
compat_mga_init
),
DRM_IOCTL32_DEF
(
MGA_GETPARAM
,
compat_mga_getparam
),
DRM_IOCTL32_DEF
(
MGA_DMA_BOOTSTRAP
,
compat_mga_dma_bootstrap
),
};
/**
...
...
@@ -208,19 +171,27 @@ drm_ioctl_compat_t *mga_compat_ioctls[] = {
long
mga_compat_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
unsigned
int
nr
=
DRM_IOCTL_NR
(
cmd
);
struct
drm_file
*
file_priv
=
filp
->
private_data
;
drm_ioctl_compat_t
*
fn
=
NULL
;
int
ret
;
if
(
nr
<
DRM_COMMAND_BASE
)
return
drm_compat_ioctl
(
filp
,
cmd
,
arg
);
if
(
nr
<
DRM_COMMAND_BASE
+
ARRAY_SIZE
(
mga_compat_ioctls
))
fn
=
mga_compat_ioctls
[
nr
-
DRM_COMMAND_BASE
]
;
if
(
nr
>=
DRM_COMMAND_BASE
+
ARRAY_SIZE
(
mga_compat_ioctls
))
return
drm_ioctl
(
filp
,
cmd
,
arg
)
;
if
(
fn
!=
NULL
)
ret
=
(
*
fn
)
(
filp
,
cmd
,
arg
);
else
ret
=
drm_ioctl
(
filp
,
cmd
,
arg
);
fn
=
mga_compat_ioctls
[
nr
-
DRM_COMMAND_BASE
].
fn
;
if
(
!
fn
)
return
drm_ioctl
(
filp
,
cmd
,
arg
);
DRM_DEBUG
(
"pid=%d, dev=0x%lx, auth=%d, %s
\n
"
,
task_pid_nr
(
current
),
(
long
)
old_encode_dev
(
file_priv
->
minor
->
kdev
->
devt
),
file_priv
->
authenticated
,
mga_compat_ioctls
[
nr
-
DRM_COMMAND_BASE
].
name
);
ret
=
(
*
fn
)
(
filp
,
cmd
,
arg
);
if
(
ret
)
DRM_DEBUG
(
"ret = %d
\n
"
,
ret
);
return
ret
;
}
drivers/gpu/drm/mga/mga_state.c
浏览文件 @
f2cffa22
...
...
@@ -1005,7 +1005,7 @@ static int mga_dma_blit(struct drm_device *dev, void *data, struct drm_file *fil
return
0
;
}
static
int
mga_getparam
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
int
mga_getparam
(
struct
drm_device
*
dev
,
void
*
data
,
struct
drm_file
*
file_priv
)
{
drm_mga_private_t
*
dev_priv
=
dev
->
dev_private
;
drm_mga_getparam_t
*
param
=
data
;
...
...
drivers/gpu/drm/radeon/Makefile
浏览文件 @
f2cffa22
...
...
@@ -105,7 +105,6 @@ radeon-y += \
vce_v2_0.o
\
radeon_kfd.o
radeon-$(CONFIG_COMPAT)
+=
radeon_ioc32.o
radeon-$(CONFIG_VGA_SWITCHEROO)
+=
radeon_atpx_handler.o
radeon-$(CONFIG_ACPI)
+=
radeon_acpi.o
...
...
drivers/gpu/drm/radeon/radeon_drv.c
浏览文件 @
f2cffa22
...
...
@@ -38,6 +38,7 @@
#include <linux/module.h>
#include <linux/pm_runtime.h>
#include <linux/vga_switcheroo.h>
#include <linux/compat.h>
#include <drm/drm_gem.h>
#include <drm/drm_fb_helper.h>
...
...
@@ -154,8 +155,6 @@ void radeon_gem_prime_unpin(struct drm_gem_object *obj);
struct
reservation_object
*
radeon_gem_prime_res_obj
(
struct
drm_gem_object
*
);
void
*
radeon_gem_prime_vmap
(
struct
drm_gem_object
*
obj
);
void
radeon_gem_prime_vunmap
(
struct
drm_gem_object
*
obj
,
void
*
vaddr
);
extern
long
radeon_kms_compat_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
/* atpx handler */
#if defined(CONFIG_VGA_SWITCHEROO)
...
...
@@ -505,6 +504,21 @@ long radeon_drm_ioctl(struct file *filp,
return
ret
;
}
#ifdef CONFIG_COMPAT
static
long
radeon_kms_compat_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
unsigned
int
nr
=
DRM_IOCTL_NR
(
cmd
);
int
ret
;
if
(
nr
<
DRM_COMMAND_BASE
)
return
drm_compat_ioctl
(
filp
,
cmd
,
arg
);
ret
=
radeon_drm_ioctl
(
filp
,
cmd
,
arg
);
return
ret
;
}
#endif
static
const
struct
dev_pm_ops
radeon_pm_ops
=
{
.
suspend
=
radeon_pmops_suspend
,
.
resume
=
radeon_pmops_resume
,
...
...
drivers/gpu/drm/radeon/radeon_ioc32.c
已删除
100644 → 0
浏览文件 @
8d1a81a8
/**
* \file radeon_ioc32.c
*
* 32-bit ioctl compatibility routines for the Radeon DRM.
*
* \author Paul Mackerras <paulus@samba.org>
*
* Copyright (C) Paul Mackerras 2005
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*/
#include <linux/compat.h>
#include <drm/drmP.h>
#include <drm/radeon_drm.h>
#include "radeon_drv.h"
typedef
struct
drm_radeon_init32
{
int
func
;
u32
sarea_priv_offset
;
int
is_pci
;
int
cp_mode
;
int
gart_size
;
int
ring_size
;
int
usec_timeout
;
unsigned
int
fb_bpp
;
unsigned
int
front_offset
,
front_pitch
;
unsigned
int
back_offset
,
back_pitch
;
unsigned
int
depth_bpp
;
unsigned
int
depth_offset
,
depth_pitch
;
u32
fb_offset
;
u32
mmio_offset
;
u32
ring_offset
;
u32
ring_rptr_offset
;
u32
buffers_offset
;
u32
gart_textures_offset
;
}
drm_radeon_init32_t
;
static
int
compat_radeon_cp_init
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_init32_t
init32
;
drm_radeon_init_t
__user
*
init
;
if
(
copy_from_user
(
&
init32
,
(
void
__user
*
)
arg
,
sizeof
(
init32
)))
return
-
EFAULT
;
init
=
compat_alloc_user_space
(
sizeof
(
*
init
));
if
(
!
access_ok
(
VERIFY_WRITE
,
init
,
sizeof
(
*
init
))
||
__put_user
(
init32
.
func
,
&
init
->
func
)
||
__put_user
(
init32
.
sarea_priv_offset
,
&
init
->
sarea_priv_offset
)
||
__put_user
(
init32
.
is_pci
,
&
init
->
is_pci
)
||
__put_user
(
init32
.
cp_mode
,
&
init
->
cp_mode
)
||
__put_user
(
init32
.
gart_size
,
&
init
->
gart_size
)
||
__put_user
(
init32
.
ring_size
,
&
init
->
ring_size
)
||
__put_user
(
init32
.
usec_timeout
,
&
init
->
usec_timeout
)
||
__put_user
(
init32
.
fb_bpp
,
&
init
->
fb_bpp
)
||
__put_user
(
init32
.
front_offset
,
&
init
->
front_offset
)
||
__put_user
(
init32
.
front_pitch
,
&
init
->
front_pitch
)
||
__put_user
(
init32
.
back_offset
,
&
init
->
back_offset
)
||
__put_user
(
init32
.
back_pitch
,
&
init
->
back_pitch
)
||
__put_user
(
init32
.
depth_bpp
,
&
init
->
depth_bpp
)
||
__put_user
(
init32
.
depth_offset
,
&
init
->
depth_offset
)
||
__put_user
(
init32
.
depth_pitch
,
&
init
->
depth_pitch
)
||
__put_user
(
init32
.
fb_offset
,
&
init
->
fb_offset
)
||
__put_user
(
init32
.
mmio_offset
,
&
init
->
mmio_offset
)
||
__put_user
(
init32
.
ring_offset
,
&
init
->
ring_offset
)
||
__put_user
(
init32
.
ring_rptr_offset
,
&
init
->
ring_rptr_offset
)
||
__put_user
(
init32
.
buffers_offset
,
&
init
->
buffers_offset
)
||
__put_user
(
init32
.
gart_textures_offset
,
&
init
->
gart_textures_offset
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_CP_INIT
,
(
unsigned
long
)
init
);
}
typedef
struct
drm_radeon_clear32
{
unsigned
int
flags
;
unsigned
int
clear_color
;
unsigned
int
clear_depth
;
unsigned
int
color_mask
;
unsigned
int
depth_mask
;
/* misnamed field: should be stencil */
u32
depth_boxes
;
}
drm_radeon_clear32_t
;
static
int
compat_radeon_cp_clear
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_clear32_t
clr32
;
drm_radeon_clear_t
__user
*
clr
;
if
(
copy_from_user
(
&
clr32
,
(
void
__user
*
)
arg
,
sizeof
(
clr32
)))
return
-
EFAULT
;
clr
=
compat_alloc_user_space
(
sizeof
(
*
clr
));
if
(
!
access_ok
(
VERIFY_WRITE
,
clr
,
sizeof
(
*
clr
))
||
__put_user
(
clr32
.
flags
,
&
clr
->
flags
)
||
__put_user
(
clr32
.
clear_color
,
&
clr
->
clear_color
)
||
__put_user
(
clr32
.
clear_depth
,
&
clr
->
clear_depth
)
||
__put_user
(
clr32
.
color_mask
,
&
clr
->
color_mask
)
||
__put_user
(
clr32
.
depth_mask
,
&
clr
->
depth_mask
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
clr32
.
depth_boxes
,
&
clr
->
depth_boxes
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_CLEAR
,
(
unsigned
long
)
clr
);
}
typedef
struct
drm_radeon_stipple32
{
u32
mask
;
}
drm_radeon_stipple32_t
;
static
int
compat_radeon_cp_stipple
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_stipple32_t
__user
*
argp
=
(
void
__user
*
)
arg
;
drm_radeon_stipple_t
__user
*
request
;
u32
mask
;
if
(
get_user
(
mask
,
&
argp
->
mask
))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
((
unsigned
int
__user
*
)(
unsigned
long
)
mask
,
&
request
->
mask
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_STIPPLE
,
(
unsigned
long
)
request
);
}
typedef
struct
drm_radeon_tex_image32
{
unsigned
int
x
,
y
;
/* Blit coordinates */
unsigned
int
width
,
height
;
u32
data
;
}
drm_radeon_tex_image32_t
;
typedef
struct
drm_radeon_texture32
{
unsigned
int
offset
;
int
pitch
;
int
format
;
int
width
;
/* Texture image coordinates */
int
height
;
u32
image
;
}
drm_radeon_texture32_t
;
static
int
compat_radeon_cp_texture
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_texture32_t
req32
;
drm_radeon_texture_t
__user
*
request
;
drm_radeon_tex_image32_t
img32
;
drm_radeon_tex_image_t
__user
*
image
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
if
(
req32
.
image
==
0
)
return
-
EINVAL
;
if
(
copy_from_user
(
&
img32
,
(
void
__user
*
)(
unsigned
long
)
req32
.
image
,
sizeof
(
img32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
)
+
sizeof
(
*
image
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
)
+
sizeof
(
*
image
)))
return
-
EFAULT
;
image
=
(
drm_radeon_tex_image_t
__user
*
)
(
request
+
1
);
if
(
__put_user
(
req32
.
offset
,
&
request
->
offset
)
||
__put_user
(
req32
.
pitch
,
&
request
->
pitch
)
||
__put_user
(
req32
.
format
,
&
request
->
format
)
||
__put_user
(
req32
.
width
,
&
request
->
width
)
||
__put_user
(
req32
.
height
,
&
request
->
height
)
||
__put_user
(
image
,
&
request
->
image
)
||
__put_user
(
img32
.
x
,
&
image
->
x
)
||
__put_user
(
img32
.
y
,
&
image
->
y
)
||
__put_user
(
img32
.
width
,
&
image
->
width
)
||
__put_user
(
img32
.
height
,
&
image
->
height
)
||
__put_user
((
const
void
__user
*
)(
unsigned
long
)
img32
.
data
,
&
image
->
data
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_TEXTURE
,
(
unsigned
long
)
request
);
}
typedef
struct
drm_radeon_vertex2_32
{
int
idx
;
/* Index of vertex buffer */
int
discard
;
/* Client finished with buffer? */
int
nr_states
;
u32
state
;
int
nr_prims
;
u32
prim
;
}
drm_radeon_vertex2_32_t
;
static
int
compat_radeon_cp_vertex2
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_vertex2_32_t
req32
;
drm_radeon_vertex2_t
__user
*
request
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
(
req32
.
idx
,
&
request
->
idx
)
||
__put_user
(
req32
.
discard
,
&
request
->
discard
)
||
__put_user
(
req32
.
nr_states
,
&
request
->
nr_states
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
req32
.
state
,
&
request
->
state
)
||
__put_user
(
req32
.
nr_prims
,
&
request
->
nr_prims
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
req32
.
prim
,
&
request
->
prim
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_VERTEX2
,
(
unsigned
long
)
request
);
}
typedef
struct
drm_radeon_cmd_buffer32
{
int
bufsz
;
u32
buf
;
int
nbox
;
u32
boxes
;
}
drm_radeon_cmd_buffer32_t
;
static
int
compat_radeon_cp_cmdbuf
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_cmd_buffer32_t
req32
;
drm_radeon_cmd_buffer_t
__user
*
request
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
(
req32
.
bufsz
,
&
request
->
bufsz
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
req32
.
buf
,
&
request
->
buf
)
||
__put_user
(
req32
.
nbox
,
&
request
->
nbox
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
req32
.
boxes
,
&
request
->
boxes
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_CMDBUF
,
(
unsigned
long
)
request
);
}
typedef
struct
drm_radeon_getparam32
{
int
param
;
u32
value
;
}
drm_radeon_getparam32_t
;
static
int
compat_radeon_cp_getparam
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_getparam32_t
req32
;
drm_radeon_getparam_t
__user
*
request
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
(
req32
.
param
,
&
request
->
param
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
req32
.
value
,
&
request
->
value
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_GETPARAM
,
(
unsigned
long
)
request
);
}
typedef
struct
drm_radeon_mem_alloc32
{
int
region
;
int
alignment
;
int
size
;
u32
region_offset
;
/* offset from start of fb or GART */
}
drm_radeon_mem_alloc32_t
;
static
int
compat_radeon_mem_alloc
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_mem_alloc32_t
req32
;
drm_radeon_mem_alloc_t
__user
*
request
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
(
req32
.
region
,
&
request
->
region
)
||
__put_user
(
req32
.
alignment
,
&
request
->
alignment
)
||
__put_user
(
req32
.
size
,
&
request
->
size
)
||
__put_user
((
int
__user
*
)(
unsigned
long
)
req32
.
region_offset
,
&
request
->
region_offset
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_ALLOC
,
(
unsigned
long
)
request
);
}
typedef
struct
drm_radeon_irq_emit32
{
u32
irq_seq
;
}
drm_radeon_irq_emit32_t
;
static
int
compat_radeon_irq_emit
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_irq_emit32_t
req32
;
drm_radeon_irq_emit_t
__user
*
request
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
((
int
__user
*
)(
unsigned
long
)
req32
.
irq_seq
,
&
request
->
irq_seq
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_IRQ_EMIT
,
(
unsigned
long
)
request
);
}
/* The two 64-bit arches where alignof(u64)==4 in 32-bit code */
#if defined (CONFIG_X86_64) || defined(CONFIG_IA64)
typedef
struct
drm_radeon_setparam32
{
int
param
;
u64
value
;
}
__attribute__
((
packed
))
drm_radeon_setparam32_t
;
static
int
compat_radeon_cp_setparam
(
struct
file
*
file
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
drm_radeon_setparam32_t
req32
;
drm_radeon_setparam_t
__user
*
request
;
if
(
copy_from_user
(
&
req32
,
(
void
__user
*
)
arg
,
sizeof
(
req32
)))
return
-
EFAULT
;
request
=
compat_alloc_user_space
(
sizeof
(
*
request
));
if
(
!
access_ok
(
VERIFY_WRITE
,
request
,
sizeof
(
*
request
))
||
__put_user
(
req32
.
param
,
&
request
->
param
)
||
__put_user
((
void
__user
*
)(
unsigned
long
)
req32
.
value
,
&
request
->
value
))
return
-
EFAULT
;
return
drm_ioctl
(
file
,
DRM_IOCTL_RADEON_SETPARAM
,
(
unsigned
long
)
request
);
}
#else
#define compat_radeon_cp_setparam NULL
#endif
/* X86_64 || IA64 */
static
drm_ioctl_compat_t
*
radeon_compat_ioctls
[]
=
{
[
DRM_RADEON_CP_INIT
]
=
compat_radeon_cp_init
,
[
DRM_RADEON_CLEAR
]
=
compat_radeon_cp_clear
,
[
DRM_RADEON_STIPPLE
]
=
compat_radeon_cp_stipple
,
[
DRM_RADEON_TEXTURE
]
=
compat_radeon_cp_texture
,
[
DRM_RADEON_VERTEX2
]
=
compat_radeon_cp_vertex2
,
[
DRM_RADEON_CMDBUF
]
=
compat_radeon_cp_cmdbuf
,
[
DRM_RADEON_GETPARAM
]
=
compat_radeon_cp_getparam
,
[
DRM_RADEON_SETPARAM
]
=
compat_radeon_cp_setparam
,
[
DRM_RADEON_ALLOC
]
=
compat_radeon_mem_alloc
,
[
DRM_RADEON_IRQ_EMIT
]
=
compat_radeon_irq_emit
,
};
/**
* Called whenever a 32-bit process running under a 64-bit kernel
* performs an ioctl on /dev/dri/card<n>.
*
* \param filp file pointer.
* \param cmd command.
* \param arg user argument.
* \return zero on success or negative number on failure.
*/
long
radeon_compat_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
unsigned
int
nr
=
DRM_IOCTL_NR
(
cmd
);
drm_ioctl_compat_t
*
fn
=
NULL
;
int
ret
;
if
(
nr
<
DRM_COMMAND_BASE
)
return
drm_compat_ioctl
(
filp
,
cmd
,
arg
);
if
(
nr
<
DRM_COMMAND_BASE
+
ARRAY_SIZE
(
radeon_compat_ioctls
))
fn
=
radeon_compat_ioctls
[
nr
-
DRM_COMMAND_BASE
];
if
(
fn
!=
NULL
)
ret
=
(
*
fn
)
(
filp
,
cmd
,
arg
);
else
ret
=
drm_ioctl
(
filp
,
cmd
,
arg
);
return
ret
;
}
long
radeon_kms_compat_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
)
{
unsigned
int
nr
=
DRM_IOCTL_NR
(
cmd
);
int
ret
;
if
(
nr
<
DRM_COMMAND_BASE
)
return
drm_compat_ioctl
(
filp
,
cmd
,
arg
);
ret
=
radeon_drm_ioctl
(
filp
,
cmd
,
arg
);
return
ret
;
}
include/drm/drm_ioctl.h
浏览文件 @
f2cffa22
...
...
@@ -172,6 +172,7 @@ struct drm_ioctl_desc {
int
drm_ioctl_permit
(
u32
flags
,
struct
drm_file
*
file_priv
);
long
drm_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
long
drm_ioctl_kernel
(
struct
file
*
,
drm_ioctl_t
,
void
*
,
u32
);
#ifdef CONFIG_COMPAT
long
drm_compat_ioctl
(
struct
file
*
filp
,
unsigned
int
cmd
,
unsigned
long
arg
);
#else
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录