Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
kernel_linux
提交
a4e610b5
K
kernel_linux
项目概览
OpenHarmony
/
kernel_linux
上一次同步 3 年多
通知
13
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看板
提交
a4e610b5
编写于
8月 10, 2014
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau: use ioctl interface for abi16 grobj alloc
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
fdb751ef
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
54 addition
and
34 deletion
+54
-34
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nouveau_abi16.c
+44
-33
drivers/gpu/drm/nouveau/nouveau_drm.h
drivers/gpu/drm/nouveau/nouveau_drm.h
+2
-1
include/uapi/drm/nouveau_drm.h
include/uapi/drm/nouveau_drm.h
+8
-0
未找到文件。
drivers/gpu/drm/nouveau/nouveau_abi16.c
浏览文件 @
a4e610b5
...
...
@@ -21,7 +21,9 @@
*
*/
#include <nvif/os.h>
#include <nvif/client.h>
#include <nvif/driver.h>
#include <nvif/ioctl.h>
#include <nvif/class.h>
#include "nouveau_drm.h"
...
...
@@ -46,7 +48,7 @@ nouveau_abi16_get(struct drm_file *file_priv, struct drm_device *dev)
* opened)
*/
if
(
nvif_device_init
(
&
cli
->
base
.
base
,
NULL
,
N
VDRM_DEVICE
,
NV_DEVICE_CLASS
,
N
OUVEAU_ABI16_DEVICE
,
NV_DEVICE
,
&
(
struct
nv_device_class
)
{
.
device
=
~
0ULL
,
},
sizeof
(
struct
nv_device_class
),
...
...
@@ -280,7 +282,8 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
abi16
->
handles
|=
(
1ULL
<<
init
->
channel
);
/* create channel object and initialise dma and fence management */
ret
=
nouveau_channel_new
(
drm
,
device
,
NVDRM_CHAN
|
init
->
channel
,
ret
=
nouveau_channel_new
(
drm
,
device
,
NOUVEAU_ABI16_CHAN
(
init
->
channel
),
init
->
fb_ctxdma_handle
,
init
->
tt_ctxdma_handle
,
&
chan
->
chan
);
if
(
ret
)
...
...
@@ -330,6 +333,18 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
return
nouveau_abi16_put
(
abi16
,
ret
);
}
static
struct
nouveau_abi16_chan
*
nouveau_abi16_chan
(
struct
nouveau_abi16
*
abi16
,
int
channel
)
{
struct
nouveau_abi16_chan
*
chan
;
list_for_each_entry
(
chan
,
&
abi16
->
channels
,
head
)
{
if
(
chan
->
chan
->
object
->
handle
==
NOUVEAU_ABI16_CHAN
(
channel
))
return
chan
;
}
return
NULL
;
}
int
nouveau_abi16_ioctl_channel_free
(
ABI16_IOCTL_ARGS
)
...
...
@@ -337,28 +352,38 @@ nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS)
struct
drm_nouveau_channel_free
*
req
=
data
;
struct
nouveau_abi16
*
abi16
=
nouveau_abi16_get
(
file_priv
,
dev
);
struct
nouveau_abi16_chan
*
chan
;
int
ret
=
-
ENOENT
;
if
(
unlikely
(
!
abi16
))
return
-
ENOMEM
;
list_for_each_entry
(
chan
,
&
abi16
->
channels
,
head
)
{
if
(
chan
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
req
->
channel
))
{
nouveau_abi16_chan_fini
(
abi16
,
chan
);
return
nouveau_abi16_put
(
abi16
,
0
);
}
}
return
nouveau_abi16_put
(
abi16
,
ret
);
chan
=
nouveau_abi16_chan
(
abi16
,
req
->
channel
);
if
(
!
chan
)
return
nouveau_abi16_put
(
abi16
,
-
ENOENT
);
nouveau_abi16_chan_fini
(
abi16
,
chan
);
return
nouveau_abi16_put
(
abi16
,
0
);
}
int
nouveau_abi16_ioctl_grobj_alloc
(
ABI16_IOCTL_ARGS
)
{
struct
drm_nouveau_grobj_alloc
*
init
=
data
;
struct
{
struct
nvif_ioctl_v0
ioctl
;
struct
nvif_ioctl_new_v0
new
;
}
args
=
{
.
ioctl
.
owner
=
NVIF_IOCTL_V0_OWNER_ANY
,
.
ioctl
.
type
=
NVIF_IOCTL_V0_NEW
,
.
ioctl
.
path_nr
=
3
,
.
ioctl
.
path
[
2
]
=
NOUVEAU_ABI16_CLIENT
,
.
ioctl
.
path
[
1
]
=
NOUVEAU_ABI16_DEVICE
,
.
ioctl
.
path
[
0
]
=
NOUVEAU_ABI16_CHAN
(
init
->
channel
),
.
new
.
route
=
NVDRM_OBJECT_ABI16
,
.
new
.
handle
=
init
->
handle
,
.
new
.
oclass
=
init
->
class
,
};
struct
nouveau_abi16
*
abi16
=
nouveau_abi16_get
(
file_priv
,
dev
);
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
n
ouveau_object
*
objec
t
;
struct
n
vif_client
*
clien
t
;
int
ret
;
if
(
unlikely
(
!
abi16
))
...
...
@@ -366,6 +391,7 @@ nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS)
if
(
init
->
handle
==
~
0
)
return
nouveau_abi16_put
(
abi16
,
-
EINVAL
);
client
=
nvif_client
(
nvif_object
(
&
abi16
->
device
));
/* compatibility with userspace that assumes 506e for all chipsets */
if
(
init
->
class
==
0x506e
)
{
...
...
@@ -374,10 +400,7 @@ nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS)
return
nouveau_abi16_put
(
abi16
,
0
);
}
/*XXX*/
ret
=
nouveau_object_new
(
nv_object
(
nvkm_client
(
&
abi16
->
device
.
base
)),
NVDRM_CHAN
|
init
->
channel
,
init
->
handle
,
init
->
class
,
NULL
,
0
,
&
object
);
ret
=
nvif_client_ioctl
(
client
,
&
args
,
sizeof
(
args
));
return
nouveau_abi16_put
(
abi16
,
ret
);
}
...
...
@@ -387,7 +410,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
struct
drm_nouveau_notifierobj_alloc
*
info
=
data
;
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_abi16
*
abi16
=
nouveau_abi16_get
(
file_priv
,
dev
);
struct
nouveau_abi16_chan
*
chan
=
NULL
,
*
temp
;
struct
nouveau_abi16_chan
*
chan
;
struct
nouveau_abi16_ntfy
*
ntfy
;
struct
nvif_device
*
device
=
&
abi16
->
device
;
struct
nouveau_object
*
object
;
...
...
@@ -401,13 +424,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
if
(
unlikely
(
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_FERMI
))
return
nouveau_abi16_put
(
abi16
,
-
EINVAL
);
list_for_each_entry
(
temp
,
&
abi16
->
channels
,
head
)
{
if
(
temp
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
info
->
channel
))
{
chan
=
temp
;
break
;
}
}
chan
=
nouveau_abi16_chan
(
abi16
,
info
->
channel
);
if
(
!
chan
)
return
nouveau_abi16_put
(
abi16
,
-
ENOENT
);
...
...
@@ -461,20 +478,14 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS)
{
struct
drm_nouveau_gpuobj_free
*
fini
=
data
;
struct
nouveau_abi16
*
abi16
=
nouveau_abi16_get
(
file_priv
,
dev
);
struct
nouveau_abi16_chan
*
chan
=
NULL
,
*
temp
;
struct
nouveau_abi16_chan
*
chan
;
struct
nouveau_abi16_ntfy
*
ntfy
;
int
ret
;
if
(
unlikely
(
!
abi16
))
return
-
ENOMEM
;
list_for_each_entry
(
temp
,
&
abi16
->
channels
,
head
)
{
if
(
temp
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
fini
->
channel
))
{
chan
=
temp
;
break
;
}
}
chan
=
nouveau_abi16_chan
(
abi16
,
fini
->
channel
);
if
(
!
chan
)
return
nouveau_abi16_put
(
abi16
,
-
ENOENT
);
...
...
drivers/gpu/drm/nouveau/nouveau_drm.h
浏览文件 @
a4e610b5
...
...
@@ -31,7 +31,6 @@
#include <core/class.h>
#include <drmP.h>
#include <drm/nouveau_drm.h>
#include <drm/ttm/ttm_bo_api.h>
#include <drm/ttm/ttm_bo_driver.h>
...
...
@@ -40,6 +39,8 @@
#include <drm/ttm/ttm_module.h>
#include <drm/ttm/ttm_page_alloc.h>
#include "uapi/drm/nouveau_drm.h"
struct
nouveau_channel
;
struct
platform_device
;
...
...
include/uapi/drm/nouveau_drm.h
浏览文件 @
a4e610b5
...
...
@@ -25,6 +25,14 @@
#ifndef __NOUVEAU_DRM_H__
#define __NOUVEAU_DRM_H__
/* reserved object handles when using deprecated object APIs - these
* are here so that libdrm can allow interoperability with the new
* object APIs
*/
#define NOUVEAU_ABI16_CLIENT 0xffffffff
#define NOUVEAU_ABI16_DEVICE 0xdddddddd
#define NOUVEAU_ABI16_CHAN(n) (0xcccc0000 | (n))
#define NOUVEAU_GEM_DOMAIN_CPU (1 << 0)
#define NOUVEAU_GEM_DOMAIN_VRAM (1 << 1)
#define NOUVEAU_GEM_DOMAIN_GART (1 << 2)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录