Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Linux-御风守护者
linux
提交
0ad72863
L
linux
项目概览
Linux-御风守护者
/
linux
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
L
linux
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
0ad72863
编写于
8月 10, 2014
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau: port to nvif client/device/objects
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
967e7bde
变更
40
展开全部
隐藏空白更改
内联
并排
Showing
40 changed file
with
522 addition
and
479 deletion
+522
-479
drivers/gpu/drm/nouveau/Makefile
drivers/gpu/drm/nouveau/Makefile
+1
-0
drivers/gpu/drm/nouveau/dispnv04/disp.c
drivers/gpu/drm/nouveau/dispnv04/disp.c
+5
-0
drivers/gpu/drm/nouveau/dispnv04/hw.c
drivers/gpu/drm/nouveau/dispnv04/hw.c
+0
-3
drivers/gpu/drm/nouveau/dispnv04/tvnv04.c
drivers/gpu/drm/nouveau/dispnv04/tvnv04.c
+0
-2
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
+0
-1
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nouveau_abi16.c
+27
-36
drivers/gpu/drm/nouveau/nouveau_abi16.h
drivers/gpu/drm/nouveau/nouveau_abi16.h
+0
-1
drivers/gpu/drm/nouveau/nouveau_bios.c
drivers/gpu/drm/nouveau/nouveau_bios.c
+0
-2
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_bo.c
+9
-13
drivers/gpu/drm/nouveau/nouveau_chan.c
drivers/gpu/drm/nouveau/nouveau_chan.c
+48
-62
drivers/gpu/drm/nouveau/nouveau_chan.h
drivers/gpu/drm/nouveau/nouveau_chan.h
+9
-8
drivers/gpu/drm/nouveau/nouveau_connector.c
drivers/gpu/drm/nouveau/nouveau_connector.c
+0
-4
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.c
+16
-16
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/nouveau/nouveau_display.h
+3
-1
drivers/gpu/drm/nouveau/nouveau_dma.c
drivers/gpu/drm/nouveau/nouveau_dma.c
+2
-1
drivers/gpu/drm/nouveau/nouveau_dp.c
drivers/gpu/drm/nouveau/nouveau_dp.c
+0
-3
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drm.c
+56
-93
drivers/gpu/drm/nouveau/nouveau_drm.h
drivers/gpu/drm/nouveau/nouveau_drm.h
+19
-27
drivers/gpu/drm/nouveau/nouveau_fbcon.c
drivers/gpu/drm/nouveau/nouveau_fbcon.c
+8
-3
drivers/gpu/drm/nouveau/nouveau_fbcon.h
drivers/gpu/drm/nouveau/nouveau_fbcon.h
+7
-0
drivers/gpu/drm/nouveau/nouveau_fence.c
drivers/gpu/drm/nouveau/nouveau_fence.c
+1
-3
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nouveau_gem.c
+1
-3
drivers/gpu/drm/nouveau/nouveau_hwmon.c
drivers/gpu/drm/nouveau/nouveau_hwmon.c
+0
-4
drivers/gpu/drm/nouveau/nouveau_nvif.c
drivers/gpu/drm/nouveau/nouveau_nvif.c
+133
-0
drivers/gpu/drm/nouveau/nouveau_sgdma.c
drivers/gpu/drm/nouveau/nouveau_sgdma.c
+0
-2
drivers/gpu/drm/nouveau/nouveau_sysfs.c
drivers/gpu/drm/nouveau/nouveau_sysfs.c
+12
-10
drivers/gpu/drm/nouveau/nouveau_sysfs.h
drivers/gpu/drm/nouveau/nouveau_sysfs.h
+1
-1
drivers/gpu/drm/nouveau/nouveau_ttm.c
drivers/gpu/drm/nouveau/nouveau_ttm.c
+0
-4
drivers/gpu/drm/nouveau/nv04_fbcon.c
drivers/gpu/drm/nouveau/nv04_fbcon.c
+14
-15
drivers/gpu/drm/nouveau/nv04_fence.c
drivers/gpu/drm/nouveau/nv04_fence.c
+0
-2
drivers/gpu/drm/nouveau/nv10_fence.c
drivers/gpu/drm/nouveau/nv10_fence.c
+4
-0
drivers/gpu/drm/nouveau/nv10_fence.h
drivers/gpu/drm/nouveau/nv10_fence.h
+2
-0
drivers/gpu/drm/nouveau/nv17_fence.c
drivers/gpu/drm/nouveau/nv17_fence.c
+8
-8
drivers/gpu/drm/nouveau/nv50_display.c
drivers/gpu/drm/nouveau/nv50_display.c
+119
-125
drivers/gpu/drm/nouveau/nv50_fbcon.c
drivers/gpu/drm/nouveau/nv50_fbcon.c
+2
-3
drivers/gpu/drm/nouveau/nv50_fence.c
drivers/gpu/drm/nouveau/nv50_fence.c
+10
-11
drivers/gpu/drm/nouveau/nv84_fence.c
drivers/gpu/drm/nouveau/nv84_fence.c
+3
-5
drivers/gpu/drm/nouveau/nvc0_fbcon.c
drivers/gpu/drm/nouveau/nvc0_fbcon.c
+2
-3
drivers/gpu/drm/nouveau/nvc0_fence.c
drivers/gpu/drm/nouveau/nvc0_fence.c
+0
-2
drivers/gpu/drm/nouveau/nvif/client.c
drivers/gpu/drm/nouveau/nvif/client.c
+0
-2
未找到文件。
drivers/gpu/drm/nouveau/Makefile
浏览文件 @
0ad72863
...
...
@@ -338,6 +338,7 @@ nouveau-y += nouveau_drm.o nouveau_chan.o nouveau_dma.o nouveau_fence.o
nouveau-y
+=
nouveau_vga.o nouveau_agp.o
nouveau-y
+=
nouveau_ttm.o nouveau_sgdma.o nouveau_bo.o nouveau_gem.o
nouveau-y
+=
nouveau_prime.o nouveau_abi16.o
nouveau-y
+=
nouveau_nvif.o
nouveau-y
+=
nv04_fence.o nv10_fence.o nv17_fence.o
nouveau-y
+=
nv50_fence.o nv84_fence.o nvc0_fence.o
...
...
drivers/gpu/drm/nouveau/dispnv04/disp.c
浏览文件 @
0ad72863
...
...
@@ -70,6 +70,8 @@ nv04_display_create(struct drm_device *dev)
if
(
!
disp
)
return
-
ENOMEM
;
nvif_object_map
(
nvif_object
(
&
drm
->
device
));
nouveau_display
(
dev
)
->
priv
=
disp
;
nouveau_display
(
dev
)
->
dtor
=
nv04_display_destroy
;
nouveau_display
(
dev
)
->
init
=
nv04_display_init
;
...
...
@@ -144,6 +146,7 @@ void
nv04_display_destroy
(
struct
drm_device
*
dev
)
{
struct
nv04_display
*
disp
=
nv04_display
(
dev
);
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
drm_encoder
*
encoder
;
struct
drm_crtc
*
crtc
;
...
...
@@ -170,6 +173,8 @@ nv04_display_destroy(struct drm_device *dev)
nouveau_display
(
dev
)
->
priv
=
NULL
;
kfree
(
disp
);
nvif_object_unmap
(
nvif_object
(
&
drm
->
device
));
}
int
...
...
drivers/gpu/drm/nouveau/dispnv04/hw.c
浏览文件 @
0ad72863
...
...
@@ -27,9 +27,6 @@
#include "hw.h"
#include <subdev/bios/pll.h>
#include <subdev/fb.h>
#include <subdev/clock.h>
#include <subdev/timer.h>
#define CHIPSET_NFORCE 0x01a0
#define CHIPSET_NFORCE2 0x01f0
...
...
drivers/gpu/drm/nouveau/dispnv04/tvnv04.c
浏览文件 @
0ad72863
...
...
@@ -35,8 +35,6 @@
#include <drm/i2c/ch7006.h>
#include <subdev/i2c.h>
static
struct
nouveau_i2c_board_info
nv04_tv_encoder_info
[]
=
{
{
{
...
...
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
浏览文件 @
0ad72863
...
...
@@ -37,7 +37,6 @@
#include <core/device.h>
#include <subdev/bios/gpio.h>
#include <subdev/gpio.h>
MODULE_PARM_DESC
(
tv_norm
,
"Default TV norm.
\n
"
"
\t\t
Supported: PAL, PAL-M, PAL-N, PAL-Nc, NTSC-M, NTSC-J,
\n
"
...
...
drivers/gpu/drm/nouveau/nouveau_abi16.c
浏览文件 @
0ad72863
...
...
@@ -27,47 +27,34 @@
#include <core/class.h>
#include <core/mm.h>
#include <subdev/fb.h>
#include <subdev/timer.h>
#include <subdev/instmem.h>
#include <engine/graph.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_gem.h"
#include "nouveau_chan.h"
#include "nouveau_abi16.h"
void
nouveau_drm_hack_device
(
struct
nouveau_drm
*
,
struct
nvif_device
*
);
struct
nouveau_abi16
*
nouveau_abi16_get
(
struct
drm_file
*
file_priv
,
struct
drm_device
*
dev
)
{
struct
nouveau_cli
*
cli
=
nouveau_cli
(
file_priv
);
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
mutex_lock
(
&
cli
->
mutex
);
if
(
!
cli
->
abi16
)
{
struct
nouveau_abi16
*
abi16
;
cli
->
abi16
=
abi16
=
kzalloc
(
sizeof
(
*
abi16
),
GFP_KERNEL
);
if
(
cli
->
abi16
)
{
INIT_LIST_HEAD
(
&
abi16
->
channels
);
abi16
->
client
=
nv_object
(
cli
);
/* allocate device object targeting client's default
* device (ie. the one that belongs to the fd it
* opened)
*/
if
(
n
ouveau_object_new
(
abi16
->
client
,
NVDRM_CLIENT
,
NVDRM_DEVICE
,
0x0080
,
&
(
struct
nv_device_class
)
{
if
(
n
vif_device_init
(
&
cli
->
base
.
base
,
NULL
,
NVDRM_DEVICE
,
NV_DEVICE_CLASS
,
&
(
struct
nv_device_class
)
{
.
device
=
~
0ULL
,
},
sizeof
(
struct
nv_device_class
),
(
struct
nouveau_object
**
)
&
abi16
->
device
.
object
)
==
0
)
{
nouveau_drm_hack_device
(
drm
,
&
abi16
->
device
);
},
sizeof
(
struct
nv_device_class
),
&
abi16
->
device
)
==
0
)
return
cli
->
abi16
;
}
kfree
(
cli
->
abi16
);
cli
->
abi16
=
NULL
;
...
...
@@ -81,7 +68,7 @@ nouveau_abi16_get(struct drm_file *file_priv, struct drm_device *dev)
int
nouveau_abi16_put
(
struct
nouveau_abi16
*
abi16
,
int
ret
)
{
struct
nouveau_cli
*
cli
=
(
void
*
)
abi16
->
client
;
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
abi16
->
device
.
base
)
;
mutex_unlock
(
&
cli
->
mutex
);
return
ret
;
}
...
...
@@ -144,7 +131,7 @@ nouveau_abi16_chan_fini(struct nouveau_abi16 *abi16,
/* destroy channel object, all children will be killed too */
if
(
chan
->
chan
)
{
abi16
->
handles
&=
~
(
1ULL
<<
(
chan
->
chan
->
handle
&
0xffff
));
abi16
->
handles
&=
~
(
1ULL
<<
(
chan
->
chan
->
object
->
handle
&
0xffff
));
nouveau_channel_del
(
&
chan
->
chan
);
}
...
...
@@ -155,7 +142,7 @@ nouveau_abi16_chan_fini(struct nouveau_abi16 *abi16,
void
nouveau_abi16_fini
(
struct
nouveau_abi16
*
abi16
)
{
struct
nouveau_cli
*
cli
=
(
void
*
)
abi16
->
client
;
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
abi16
->
device
.
base
)
;
struct
nouveau_abi16_chan
*
chan
,
*
temp
;
/* cleanup channels */
...
...
@@ -164,7 +151,7 @@ nouveau_abi16_fini(struct nouveau_abi16 *abi16)
}
/* destroy the device object */
n
ouveau_object_del
(
abi16
->
client
,
NVDRM_CLIENT
,
NVDRM_DEVICE
);
n
vif_device_fini
(
&
abi16
->
device
);
kfree
(
cli
->
abi16
);
cli
->
abi16
=
NULL
;
...
...
@@ -251,7 +238,6 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_abi16
*
abi16
=
nouveau_abi16_get
(
file_priv
,
dev
);
struct
nouveau_abi16_chan
*
chan
;
struct
nouveau_client
*
client
;
struct
nvif_device
*
device
;
struct
nouveau_instmem
*
imem
;
struct
nouveau_fb
*
pfb
;
...
...
@@ -263,7 +249,6 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
if
(
!
drm
->
channel
)
return
nouveau_abi16_put
(
abi16
,
-
ENODEV
);
client
=
nv_client
(
abi16
->
client
);
device
=
&
abi16
->
device
;
imem
=
nvkm_instmem
(
device
);
pfb
=
nvkm_fb
(
device
);
...
...
@@ -298,8 +283,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
,
cli
,
NVDRM_DEVICE
,
NVDRM_CHAN
|
init
->
channel
,
init
->
fb_ctxdma_handle
,
ret
=
nouveau_channel_new
(
drm
,
device
,
NVDRM_CHAN
|
init
->
channel
,
init
->
fb_ctxdma_handle
,
init
->
tt_ctxdma_handle
,
&
chan
->
chan
);
if
(
ret
)
goto
done
;
...
...
@@ -330,7 +315,7 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
goto
done
;
if
(
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
ret
=
nouveau_bo_vma_add
(
chan
->
ntfy
,
cli
ent
->
vm
,
ret
=
nouveau_bo_vma_add
(
chan
->
ntfy
,
cli
->
vm
,
&
chan
->
ntfy_vma
);
if
(
ret
)
goto
done
;
...
...
@@ -361,7 +346,7 @@ nouveau_abi16_ioctl_channel_free(ABI16_IOCTL_ARGS)
return
-
ENOMEM
;
list_for_each_entry
(
chan
,
&
abi16
->
channels
,
head
)
{
if
(
chan
->
chan
->
handle
==
(
NVDRM_CHAN
|
req
->
channel
))
{
if
(
chan
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
req
->
channel
))
{
nouveau_abi16_chan_fini
(
abi16
,
chan
);
return
nouveau_abi16_put
(
abi16
,
0
);
}
...
...
@@ -392,8 +377,10 @@ nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS)
return
nouveau_abi16_put
(
abi16
,
0
);
}
ret
=
nouveau_object_new
(
abi16
->
client
,
NVDRM_CHAN
|
init
->
channel
,
init
->
handle
,
init
->
class
,
NULL
,
0
,
&
object
);
/*XXX*/
ret
=
nouveau_object_new
(
nv_object
(
nvkm_client
(
&
abi16
->
device
.
base
)),
NVDRM_CHAN
|
init
->
channel
,
init
->
handle
,
init
->
class
,
NULL
,
0
,
&
object
);
return
nouveau_abi16_put
(
abi16
,
ret
);
}
...
...
@@ -418,7 +405,7 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
return
nouveau_abi16_put
(
abi16
,
-
EINVAL
);
list_for_each_entry
(
temp
,
&
abi16
->
channels
,
head
)
{
if
(
temp
->
chan
->
handle
==
(
NVDRM_CHAN
|
info
->
channel
))
{
if
(
temp
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
info
->
channel
))
{
chan
=
temp
;
break
;
}
...
...
@@ -456,9 +443,11 @@ nouveau_abi16_ioctl_notifierobj_alloc(ABI16_IOCTL_ARGS)
args
.
limit
+=
chan
->
ntfy
->
bo
.
offset
;
}
ret
=
nouveau_object_new
(
abi16
->
client
,
chan
->
chan
->
handle
,
ntfy
->
handle
,
0x003d
,
&
args
,
sizeof
(
args
),
&
object
);
/*XXX*/
ret
=
nouveau_object_new
(
nv_object
(
nvkm_client
(
&
abi16
->
device
.
base
)),
NVDRM_CHAN
|
info
->
channel
,
ntfy
->
handle
,
NV_DMA_IN_MEMORY_CLASS
,
&
args
,
sizeof
(
args
),
&
object
);
if
(
ret
)
goto
done
;
...
...
@@ -483,7 +472,7 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS)
return
-
ENOMEM
;
list_for_each_entry
(
temp
,
&
abi16
->
channels
,
head
)
{
if
(
temp
->
chan
->
handle
==
(
NVDRM_CHAN
|
fini
->
channel
))
{
if
(
temp
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
fini
->
channel
))
{
chan
=
temp
;
break
;
}
...
...
@@ -495,7 +484,9 @@ nouveau_abi16_ioctl_gpuobj_free(ABI16_IOCTL_ARGS)
/* synchronize with the user channel and destroy the gpu object */
nouveau_channel_idle
(
chan
->
chan
);
ret
=
nouveau_object_del
(
abi16
->
client
,
chan
->
chan
->
handle
,
fini
->
handle
);
/*XXX*/
ret
=
nouveau_object_del
(
nv_object
(
nvkm_client
(
&
abi16
->
device
.
base
)),
chan
->
chan
->
object
->
handle
,
fini
->
handle
);
if
(
ret
)
return
nouveau_abi16_put
(
abi16
,
ret
);
...
...
drivers/gpu/drm/nouveau/nouveau_abi16.h
浏览文件 @
0ad72863
...
...
@@ -28,7 +28,6 @@ struct nouveau_abi16_chan {
};
struct
nouveau_abi16
{
struct
nouveau_object
*
client
;
struct
nvif_device
device
;
struct
list_head
channels
;
u64
handles
;
...
...
drivers/gpu/drm/nouveau/nouveau_bios.c
浏览文件 @
0ad72863
...
...
@@ -22,8 +22,6 @@
* SOFTWARE.
*/
#include <subdev/bios.h>
#include <drm/drmP.h>
#include "nouveau_drm.h"
...
...
drivers/gpu/drm/nouveau/nouveau_bo.c
浏览文件 @
0ad72863
...
...
@@ -30,10 +30,6 @@
#include <core/engine.h>
#include <linux/swiotlb.h>
#include <subdev/fb.h>
#include <subdev/vm.h>
#include <subdev/bar.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_fence.h"
...
...
@@ -951,6 +947,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
{
struct
nouveau_drm
*
drm
=
nouveau_bdev
(
bo
->
bdev
);
struct
nouveau_channel
*
chan
=
drm
->
ttm
.
chan
;
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
chan
->
device
->
base
);
struct
nouveau_fence
*
fence
;
int
ret
;
...
...
@@ -964,7 +961,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
return
ret
;
}
mutex_lock_nested
(
&
c
han
->
c
li
->
mutex
,
SINGLE_DEPTH_NESTING
);
mutex_lock_nested
(
&
cli
->
mutex
,
SINGLE_DEPTH_NESTING
);
ret
=
nouveau_fence_sync
(
bo
->
sync_obj
,
chan
);
if
(
ret
==
0
)
{
ret
=
drm
->
ttm
.
move
(
chan
,
bo
,
&
bo
->
mem
,
new_mem
);
...
...
@@ -979,7 +976,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr,
}
}
}
mutex_unlock
(
&
c
han
->
c
li
->
mutex
);
mutex_unlock
(
&
cli
->
mutex
);
return
ret
;
}
...
...
@@ -1011,9 +1008,7 @@ nouveau_bo_move_init(struct nouveau_drm *drm)
int
ret
;
do
{
struct
nouveau_object
*
object
;
struct
nouveau_channel
*
chan
;
u32
handle
=
(
mthd
->
engine
<<
16
)
|
mthd
->
oclass
;
if
(
mthd
->
engine
)
chan
=
drm
->
cechan
;
...
...
@@ -1022,13 +1017,14 @@ nouveau_bo_move_init(struct nouveau_drm *drm)
if
(
chan
==
NULL
)
continue
;
ret
=
nouveau_object_new
(
nv_object
(
drm
),
chan
->
handle
,
handle
,
mthd
->
oclass
,
NULL
,
0
,
&
object
);
ret
=
nvif_object_init
(
chan
->
object
,
NULL
,
mthd
->
oclass
|
(
mthd
->
engine
<<
16
),
mthd
->
oclass
,
NULL
,
0
,
&
drm
->
ttm
.
copy
);
if
(
ret
==
0
)
{
ret
=
mthd
->
init
(
chan
,
handle
);
ret
=
mthd
->
init
(
chan
,
drm
->
ttm
.
copy
.
handle
);
if
(
ret
)
{
nouveau_object_del
(
nv_object
(
drm
),
chan
->
handle
,
handle
);
nvif_object_fini
(
&
drm
->
ttm
.
copy
);
continue
;
}
...
...
drivers/gpu/drm/nouveau/nouveau_chan.c
浏览文件 @
0ad72863
...
...
@@ -27,12 +27,6 @@
#include <core/device.h>
#include <core/class.h>
#include <subdev/fb.h>
#include <subdev/vm.h>
#include <subdev/instmem.h>
#include <engine/software.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_bo.h"
...
...
@@ -47,7 +41,7 @@ module_param_named(vram_pushbuf, nouveau_vram_pushbuf, int, 0400);
int
nouveau_channel_idle
(
struct
nouveau_channel
*
chan
)
{
struct
nouveau_cli
*
cli
=
chan
->
cli
;
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
chan
->
object
)
;
struct
nouveau_fence
*
fence
=
NULL
;
int
ret
;
...
...
@@ -59,7 +53,7 @@ nouveau_channel_idle(struct nouveau_channel *chan)
if
(
ret
)
NV_PRINTK
(
error
,
cli
,
"failed to idle channel 0x%08x [%s]
\n
"
,
chan
->
handle
,
cli
->
base
.
name
);
chan
->
object
->
handle
,
nvkm_client
(
&
cli
->
base
)
->
name
);
return
ret
;
}
...
...
@@ -68,36 +62,36 @@ nouveau_channel_del(struct nouveau_channel **pchan)
{
struct
nouveau_channel
*
chan
=
*
pchan
;
if
(
chan
)
{
struct
nouveau_object
*
client
=
nv_object
(
chan
->
cli
);
if
(
chan
->
fence
)
{
nouveau_channel_idle
(
chan
);
nouveau_fence
(
chan
->
drm
)
->
context_del
(
chan
);
}
nouveau_object_del
(
client
,
NVDRM_DEVICE
,
chan
->
handle
);
nouveau_object_del
(
client
,
NVDRM_DEVICE
,
chan
->
push
.
handle
);
nvif_object_fini
(
&
chan
->
nvsw
);
nvif_object_fini
(
&
chan
->
gart
);
nvif_object_fini
(
&
chan
->
vram
);
nvif_object_ref
(
NULL
,
&
chan
->
object
);
nvif_object_fini
(
&
chan
->
push
.
ctxdma
);
nouveau_bo_vma_del
(
chan
->
push
.
buffer
,
&
chan
->
push
.
vma
);
nouveau_bo_unmap
(
chan
->
push
.
buffer
);
if
(
chan
->
push
.
buffer
&&
chan
->
push
.
buffer
->
pin_refcnt
)
nouveau_bo_unpin
(
chan
->
push
.
buffer
);
nouveau_bo_ref
(
NULL
,
&
chan
->
push
.
buffer
);
nvif_device_ref
(
NULL
,
&
chan
->
device
);
kfree
(
chan
);
}
*
pchan
=
NULL
;
}
static
int
nouveau_channel_prep
(
struct
nouveau_drm
*
drm
,
struct
nouveau_cli
*
cli
,
u32
parent
,
u32
handle
,
u32
size
,
struct
nouveau_channel
**
pchan
)
nouveau_channel_prep
(
struct
nouveau_drm
*
drm
,
struct
nvif_device
*
device
,
u32
handle
,
u32
size
,
struct
nouveau_channel
**
pchan
)
{
struct
n
vif_device
*
device
=
&
drm
->
device
;
struct
n
ouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
device
->
base
)
;
struct
nouveau_instmem
*
imem
=
nvkm_instmem
(
device
);
struct
nouveau_vmmgr
*
vmm
=
nvkm_vmmgr
(
device
);
struct
nouveau_fb
*
pfb
=
nvkm_fb
(
device
);
struct
nouveau_client
*
client
=
&
cli
->
base
;
struct
nv_dma_class
args
=
{};
struct
nouveau_channel
*
chan
;
struct
nouveau_object
*
push
;
u32
target
;
int
ret
;
...
...
@@ -105,9 +99,8 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nouveau_cli *cli,
if
(
!
chan
)
return
-
ENOMEM
;
chan
->
cli
=
cli
;
nvif_device_ref
(
device
,
&
chan
->
device
)
;
chan
->
drm
=
drm
;
chan
->
handle
=
handle
;
/* allocate memory for dma push buffer */
target
=
TTM_PL_FLAG_TT
;
...
...
@@ -132,10 +125,9 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nouveau_cli *cli,
* we be able to call out to other (indirect) push buffers
*/
chan
->
push
.
vma
.
offset
=
chan
->
push
.
buffer
->
bo
.
offset
;
chan
->
push
.
handle
=
NVDRM_PUSH
|
(
handle
&
0xffff
);
if
(
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
ret
=
nouveau_bo_vma_add
(
chan
->
push
.
buffer
,
cli
ent
->
vm
,
ret
=
nouveau_bo_vma_add
(
chan
->
push
.
buffer
,
cli
->
vm
,
&
chan
->
push
.
vma
);
if
(
ret
)
{
nouveau_channel_del
(
pchan
);
...
...
@@ -144,7 +136,7 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nouveau_cli *cli,
args
.
flags
=
NV_DMA_TARGET_VM
|
NV_DMA_ACCESS_VM
;
args
.
start
=
0
;
args
.
limit
=
cli
ent
->
vm
->
vmm
->
limit
-
1
;
args
.
limit
=
cli
->
vm
->
vmm
->
limit
-
1
;
}
else
if
(
chan
->
push
.
buffer
->
bo
.
mem
.
mem_type
==
TTM_PL_VRAM
)
{
u64
limit
=
pfb
->
ram
->
size
-
imem
->
reserved
-
1
;
...
...
@@ -174,9 +166,9 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nouveau_cli *cli,
}
}
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
parent
,
chan
->
push
.
handle
,
0x0002
,
&
args
,
sizeof
(
args
),
&
push
);
ret
=
n
vif_object_init
(
nvif_object
(
device
),
NULL
,
NVDRM_PUSH
|
(
handle
&
0xffff
),
NV_DMA_FROM_MEMORY_CLASS
,
&
args
,
sizeof
(
args
),
&
chan
->
push
.
ctxdma
);
if
(
ret
)
{
nouveau_channel_del
(
pchan
);
return
ret
;
...
...
@@ -186,9 +178,8 @@ nouveau_channel_prep(struct nouveau_drm *drm, struct nouveau_cli *cli,
}
static
int
nouveau_channel_ind
(
struct
nouveau_drm
*
drm
,
struct
nouveau_cli
*
cli
,
u32
parent
,
u32
handle
,
u32
engine
,
struct
nouveau_channel
**
pchan
)
nouveau_channel_ind
(
struct
nouveau_drm
*
drm
,
struct
nvif_device
*
device
,
u32
handle
,
u32
engine
,
struct
nouveau_channel
**
pchan
)
{
static
const
u16
oclasses
[]
=
{
NVE0_CHANNEL_IND_CLASS
,
NVC0_CHANNEL_IND_CLASS
,
...
...
@@ -201,22 +192,20 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nouveau_cli *cli,
int
ret
;
/* allocate dma push buffer */
ret
=
nouveau_channel_prep
(
drm
,
cli
,
parent
,
handle
,
0x12000
,
&
chan
);
ret
=
nouveau_channel_prep
(
drm
,
device
,
handle
,
0x12000
,
&
chan
);
*
pchan
=
chan
;
if
(
ret
)
return
ret
;
/* create channel object */
args
.
pushbuf
=
chan
->
push
.
handle
;
args
.
pushbuf
=
chan
->
push
.
ctxdma
.
handle
;
args
.
ioffset
=
0x10000
+
chan
->
push
.
vma
.
offset
;
args
.
ilength
=
0x02000
;
args
.
engine
=
engine
;
do
{
ret
=
nouveau_object_new
(
nv_object
(
cli
),
parent
,
handle
,
*
oclass
++
,
&
args
,
sizeof
(
args
),
(
struct
nouveau_object
**
)
&
chan
->
object
);
ret
=
nvif_object_new
(
nvif_object
(
device
),
handle
,
*
oclass
++
,
&
args
,
sizeof
(
args
),
&
chan
->
object
);
if
(
ret
==
0
)
return
ret
;
}
while
(
*
oclass
);
...
...
@@ -226,8 +215,8 @@ nouveau_channel_ind(struct nouveau_drm *drm, struct nouveau_cli *cli,
}
static
int
nouveau_channel_dma
(
struct
nouveau_drm
*
drm
,
struct
n
ouveau_cli
*
cli
,
u32
parent
,
u32
handle
,
struct
nouveau_channel
**
pchan
)
nouveau_channel_dma
(
struct
nouveau_drm
*
drm
,
struct
n
vif_device
*
device
,
u32
handle
,
struct
nouveau_channel
**
pchan
)
{
static
const
u16
oclasses
[]
=
{
NV40_CHANNEL_DMA_CLASS
,
NV17_CHANNEL_DMA_CLASS
,
...
...
@@ -240,20 +229,18 @@ nouveau_channel_dma(struct nouveau_drm *drm, struct nouveau_cli *cli,
int
ret
;
/* allocate dma push buffer */
ret
=
nouveau_channel_prep
(
drm
,
cli
,
parent
,
handle
,
0x10000
,
&
chan
);
ret
=
nouveau_channel_prep
(
drm
,
device
,
handle
,
0x10000
,
&
chan
);
*
pchan
=
chan
;
if
(
ret
)
return
ret
;
/* create channel object */
args
.
pushbuf
=
chan
->
push
.
handle
;
args
.
pushbuf
=
chan
->
push
.
ctxdma
.
handle
;
args
.
offset
=
chan
->
push
.
vma
.
offset
;
do
{
ret
=
nouveau_object_new
(
nv_object
(
cli
),
parent
,
handle
,
*
oclass
++
,
&
args
,
sizeof
(
args
),
(
struct
nouveau_object
**
)
&
chan
->
object
);
ret
=
nvif_object_new
(
nvif_object
(
device
),
handle
,
*
oclass
++
,
&
args
,
sizeof
(
args
),
&
chan
->
object
);
if
(
ret
==
0
)
return
ret
;
}
while
(
ret
&&
*
oclass
);
...
...
@@ -265,13 +252,12 @@ nouveau_channel_dma(struct nouveau_drm *drm, struct nouveau_cli *cli,
static
int
nouveau_channel_init
(
struct
nouveau_channel
*
chan
,
u32
vram
,
u32
gart
)
{
struct
n
ouveau_client
*
client
=
nv_client
(
chan
->
cli
)
;
struct
n
vif_device
*
device
=
&
chan
->
drm
->
device
;
struct
n
vif_device
*
device
=
chan
->
device
;
struct
n
ouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
device
->
base
)
;
struct
nouveau_instmem
*
imem
=
nvkm_instmem
(
device
);
struct
nouveau_vmmgr
*
vmm
=
nvkm_vmmgr
(
device
);
struct
nouveau_fb
*
pfb
=
nvkm_fb
(
device
);
struct
nouveau_software_chan
*
swch
;
struct
nouveau_object
*
object
;
struct
nv_dma_class
args
=
{};
int
ret
,
i
;
...
...
@@ -280,22 +266,23 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
if
(
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
args
.
flags
=
NV_DMA_TARGET_VM
|
NV_DMA_ACCESS_VM
;
args
.
start
=
0
;
args
.
limit
=
cli
ent
->
vm
->
vmm
->
limit
-
1
;
args
.
limit
=
cli
->
vm
->
vmm
->
limit
-
1
;
}
else
{
args
.
flags
=
NV_DMA_TARGET_VRAM
|
NV_DMA_ACCESS_RDWR
;
args
.
start
=
0
;
args
.
limit
=
pfb
->
ram
->
size
-
imem
->
reserved
-
1
;
}
ret
=
nouveau_object_new
(
nv_object
(
client
),
chan
->
handle
,
vram
,
0x003d
,
&
args
,
sizeof
(
args
),
&
object
);
ret
=
nvif_object_init
(
chan
->
object
,
NULL
,
vram
,
NV_DMA_IN_MEMORY_CLASS
,
&
args
,
sizeof
(
args
),
&
chan
->
vram
);
if
(
ret
)
return
ret
;
if
(
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
args
.
flags
=
NV_DMA_TARGET_VM
|
NV_DMA_ACCESS_VM
;
args
.
start
=
0
;
args
.
limit
=
cli
ent
->
vm
->
vmm
->
limit
-
1
;
args
.
limit
=
cli
->
vm
->
vmm
->
limit
-
1
;
}
else
if
(
chan
->
drm
->
agp
.
stat
==
ENABLED
)
{
args
.
flags
=
NV_DMA_TARGET_AGP
|
NV_DMA_ACCESS_RDWR
;
...
...
@@ -308,17 +295,15 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
args
.
limit
=
vmm
->
limit
-
1
;
}
ret
=
nouveau_object_new
(
nv_object
(
client
),
chan
->
handle
,
gart
,
0x003d
,
&
args
,
sizeof
(
args
),
&
object
);
ret
=
nvif_object_init
(
chan
->
object
,
NULL
,
gart
,
NV_DMA_IN_MEMORY_CLASS
,
&
args
,
sizeof
(
args
),
&
chan
->
gart
);
if
(
ret
)
return
ret
;
chan
->
vram
=
vram
;
chan
->
gart
=
gart
;
}
/* initialise dma tracking parameters */
switch
(
nv_hclass
(
chan
->
object
)
&
0x00ff
)
{
switch
(
chan
->
object
->
oclass
&
0x00ff
)
{
case
0x006b
:
case
0x006e
:
chan
->
user_put
=
0x40
;
...
...
@@ -350,12 +335,12 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
/* allocate software object class (used for fences on <= nv05) */
if
(
device
->
info
.
family
<
NV_DEVICE_INFO_V0_CELSIUS
)
{
ret
=
n
ouveau_object_new
(
nv_object
(
client
),
chan
->
handl
e
,
NvSw
,
0x006e
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvSw
,
0x006
e
,
NULL
,
0
,
&
chan
->
nvsw
);
if
(
ret
)
return
ret
;
swch
=
(
void
*
)
object
->
parent
;
swch
=
(
void
*
)
nvkm_object
(
&
chan
->
nvsw
)
->
parent
;
swch
->
flip
=
nouveau_flip_complete
;
swch
->
flip_data
=
chan
;
...
...
@@ -373,16 +358,17 @@ nouveau_channel_init(struct nouveau_channel *chan, u32 vram, u32 gart)
}
int
nouveau_channel_new
(
struct
nouveau_drm
*
drm
,
struct
n
ouveau_cli
*
cli
,
u32
parent
,
u32
handle
,
u32
arg0
,
u32
arg1
,
nouveau_channel_new
(
struct
nouveau_drm
*
drm
,
struct
n
vif_device
*
device
,
u32
handle
,
u32
arg0
,
u32
arg1
,
struct
nouveau_channel
**
pchan
)
{
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
device
->
base
);
int
ret
;
ret
=
nouveau_channel_ind
(
drm
,
cli
,
parent
,
handle
,
arg0
,
pchan
);
ret
=
nouveau_channel_ind
(
drm
,
device
,
handle
,
arg0
,
pchan
);
if
(
ret
)
{
NV_PRINTK
(
debug
,
cli
,
"ib channel create, %d
\n
"
,
ret
);
ret
=
nouveau_channel_dma
(
drm
,
cli
,
parent
,
handle
,
pchan
);
ret
=
nouveau_channel_dma
(
drm
,
device
,
handle
,
pchan
);
if
(
ret
)
{
NV_PRINTK
(
debug
,
cli
,
"dma channel create, %d
\n
"
,
ret
);
return
ret
;
...
...
drivers/gpu/drm/nouveau/nouveau_chan.h
浏览文件 @
0ad72863
#ifndef __NOUVEAU_CHAN_H__
#define __NOUVEAU_CHAN_H__
struct
nouveau_cli
;
#include <nvif/object.h>
struct
nvif_device
;
struct
nouveau_channel
{
struct
n
ouveau_cli
*
cli
;
struct
n
vif_device
*
device
;
struct
nouveau_drm
*
drm
;
u32
handle
;
u32
vram
;
u32
gart
;
struct
nvif_object
vram
;
struct
nvif_object
gart
;
struct
nvif_object
nvsw
;
struct
{
struct
nouveau_bo
*
buffer
;
struct
nouveau_vma
vma
;
u32
handle
;
struct
nvif_object
ctxdma
;
}
push
;
/* TODO: this will be reworked in the near future */
...
...
@@ -38,8 +39,8 @@ struct nouveau_channel {
};
int
nouveau_channel_new
(
struct
nouveau_drm
*
,
struct
n
ouveau_cli
*
,
u32
parent
,
u32
handle
,
u32
arg0
,
u32
arg1
,
int
nouveau_channel_new
(
struct
nouveau_drm
*
,
struct
n
vif_device
*
,
u32
handle
,
u32
arg0
,
u32
arg1
,
struct
nouveau_channel
**
);
void
nouveau_channel_del
(
struct
nouveau_channel
**
);
int
nouveau_channel_idle
(
struct
nouveau_channel
*
);
...
...
drivers/gpu/drm/nouveau/nouveau_connector.c
浏览文件 @
0ad72863
...
...
@@ -42,10 +42,6 @@
#include "nouveau_encoder.h"
#include "nouveau_crtc.h"
#include <subdev/i2c.h>
#include <subdev/gpio.h>
#include <engine/disp.h>
#include <nvif/event.h>
MODULE_PARM_DESC
(
tv_disable
,
"Disable TV-out detection"
);
...
...
drivers/gpu/drm/nouveau/nouveau_display.c
浏览文件 @
0ad72863
...
...
@@ -37,8 +37,6 @@
#include "nouveau_fence.h"
#include <engine/disp.h>
#include <core/class.h>
#include <nvif/event.h>
...
...
@@ -102,7 +100,7 @@ nouveau_display_scanoutpos_head(struct drm_crtc *crtc, int *vpos, int *hpos,
int
ret
,
retry
=
1
;
do
{
ret
=
nv
_exec
(
disp
->
core
,
mthd
,
&
args
,
sizeof
(
args
));
ret
=
nv
if_exec
(
&
disp
->
disp
,
mthd
,
&
args
,
sizeof
(
args
));
if
(
ret
!=
0
)
return
0
;
...
...
@@ -399,10 +397,10 @@ nouveau_display_create_properties(struct drm_device *dev)
struct
nouveau_display
*
disp
=
nouveau_display
(
dev
);
int
gen
;
if
(
nv_mclass
(
disp
->
core
)
<
NV50_DISP_CLASS
)
if
(
disp
->
disp
.
oclass
<
NV50_DISP_CLASS
)
gen
=
0
;
else
if
(
nv_mclass
(
disp
->
core
)
<
NVD0_DISP_CLASS
)
if
(
disp
->
disp
.
oclass
<
NVD0_DISP_CLASS
)
gen
=
1
;
else
gen
=
2
;
...
...
@@ -488,14 +486,14 @@ nouveau_display_create(struct drm_device *dev)
int
i
;
for
(
i
=
0
,
ret
=
-
ENODEV
;
ret
&&
i
<
ARRAY_SIZE
(
oclass
);
i
++
)
{
ret
=
n
ouveau_object_new
(
nv_object
(
drm
),
NVDRM_DEVICE
,
NVDRM_DISPLAY
,
oclass
[
i
],
NULL
,
0
,
&
disp
->
core
);
ret
=
n
vif_object_init
(
nvif_object
(
&
drm
->
device
),
NULL
,
NVDRM_DISPLAY
,
oclass
[
i
],
NULL
,
0
,
&
disp
->
disp
);
}
if
(
ret
==
0
)
{
nouveau_display_create_properties
(
dev
);
if
(
nv_mclass
(
disp
->
core
)
<
NV50_DISP_CLASS
)
if
(
disp
->
disp
.
oclass
<
NV50_DISP_CLASS
)
ret
=
nv04_display_create
(
dev
);
else
ret
=
nv50_display_create
(
dev
);
...
...
@@ -528,7 +526,6 @@ void
nouveau_display_destroy
(
struct
drm_device
*
dev
)
{
struct
nouveau_display
*
disp
=
nouveau_display
(
dev
);
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
nouveau_backlight_exit
(
dev
);
nouveau_display_vblank_fini
(
dev
);
...
...
@@ -539,7 +536,7 @@ nouveau_display_destroy(struct drm_device *dev)
if
(
disp
->
dtor
)
disp
->
dtor
(
dev
);
n
ouveau_object_del
(
nv_object
(
drm
),
NVDRM_DEVICE
,
NVDRM_DISPLAY
);
n
vif_object_fini
(
&
disp
->
disp
);
nouveau_drm
(
dev
)
->
display
=
NULL
;
kfree
(
disp
);
...
...
@@ -690,12 +687,15 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
struct
nouveau_bo
*
old_bo
=
nouveau_framebuffer
(
crtc
->
primary
->
fb
)
->
nvbo
;
struct
nouveau_bo
*
new_bo
=
nouveau_framebuffer
(
fb
)
->
nvbo
;
struct
nouveau_page_flip_state
*
s
;
struct
nouveau_channel
*
chan
=
drm
->
channel
;
struct
nouveau_channel
*
chan
;
struct
nouveau_cli
*
cli
;
struct
nouveau_fence
*
fence
;
int
ret
;
if
(
!
drm
->
channel
)
chan
=
drm
->
channel
;
if
(
!
chan
)
return
-
ENODEV
;
cli
=
(
void
*
)
nvif_client
(
&
chan
->
device
->
base
);
s
=
kzalloc
(
sizeof
(
*
s
),
GFP_KERNEL
);
if
(
!
s
)
...
...
@@ -707,7 +707,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
goto
fail_free
;
}
mutex_lock
(
&
c
han
->
c
li
->
mutex
);
mutex_lock
(
&
cli
->
mutex
);
/* synchronise rendering channel with the kernel's channel */
spin_lock
(
&
new_bo
->
bo
.
bdev
->
fence_lock
);
...
...
@@ -761,7 +761,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
ret
=
nouveau_page_flip_emit
(
chan
,
old_bo
,
new_bo
,
s
,
&
fence
);
if
(
ret
)
goto
fail_unreserve
;
mutex_unlock
(
&
c
han
->
c
li
->
mutex
);
mutex_unlock
(
&
cli
->
mutex
);
/* Update the crtc struct and cleanup */
crtc
->
primary
->
fb
=
fb
;
...
...
@@ -777,7 +777,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
drm_vblank_put
(
dev
,
nouveau_crtc
(
crtc
)
->
index
);
ttm_bo_unreserve
(
&
old_bo
->
bo
);
fail_unpin:
mutex_unlock
(
&
c
han
->
c
li
->
mutex
);
mutex_unlock
(
&
cli
->
mutex
);
if
(
old_bo
!=
new_bo
)
nouveau_bo_unpin
(
new_bo
);
fail_free:
...
...
drivers/gpu/drm/nouveau/nouveau_display.h
浏览文件 @
0ad72863
...
...
@@ -12,6 +12,8 @@ struct nouveau_framebuffer {
u32
r_handle
;
u32
r_format
;
u32
r_pitch
;
struct
nvif_object
h_base
[
4
];
struct
nvif_object
h_core
;
};
static
inline
struct
nouveau_framebuffer
*
...
...
@@ -39,7 +41,7 @@ struct nouveau_display {
int
(
*
fb_ctor
)(
struct
drm_framebuffer
*
);
void
(
*
fb_dtor
)(
struct
drm_framebuffer
*
);
struct
n
ouveau_object
*
core
;
struct
n
vif_object
disp
;
struct
drm_property
*
dithering_mode
;
struct
drm_property
*
dithering_depth
;
...
...
drivers/gpu/drm/nouveau/nouveau_dma.c
浏览文件 @
0ad72863
...
...
@@ -84,12 +84,13 @@ void
nv50_dma_push
(
struct
nouveau_channel
*
chan
,
struct
nouveau_bo
*
bo
,
int
delta
,
int
length
)
{
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
chan
->
device
->
base
);
struct
nouveau_bo
*
pb
=
chan
->
push
.
buffer
;
struct
nouveau_vma
*
vma
;
int
ip
=
(
chan
->
dma
.
ib_put
*
2
)
+
chan
->
dma
.
ib_base
;
u64
offset
;
vma
=
nouveau_bo_vma_find
(
bo
,
nv_client
(
chan
->
cli
)
->
vm
);
vma
=
nouveau_bo_vma_find
(
bo
,
cli
->
vm
);
BUG_ON
(
!
vma
);
offset
=
vma
->
offset
+
delta
;
...
...
drivers/gpu/drm/nouveau/nouveau_dp.c
浏览文件 @
0ad72863
...
...
@@ -32,9 +32,6 @@
#include <core/class.h>
#include <subdev/gpio.h>
#include <subdev/i2c.h>
static
void
nouveau_dp_probe_oui
(
struct
drm_device
*
dev
,
struct
nouveau_i2c_port
*
auxch
,
u8
*
dpcd
)
...
...
drivers/gpu/drm/nouveau/nouveau_drm.c
浏览文件 @
0ad72863
...
...
@@ -30,18 +30,10 @@
#include "drmP.h"
#include "drm_crtc_helper.h"
#include <core/device.h>
#include <core/client.h>
#include <core/gpuobj.h>
#include <core/class.h>
#include <core/option.h>
#include <engine/device.h>
#include <engine/disp.h>
#include <engine/fifo.h>
#include <engine/software.h>
#include <subdev/vm.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_ttm.h"
...
...
@@ -109,40 +101,34 @@ static int
nouveau_cli_create
(
u64
name
,
const
char
*
sname
,
int
size
,
void
**
pcli
)
{
struct
nouveau_cli
*
cli
;
int
ret
;
*
pcli
=
NULL
;
ret
=
nouveau_client_create_
(
sname
,
name
,
nouveau_config
,
nouveau_debug
,
size
,
pcli
);
cli
=
*
pcli
;
if
(
ret
)
{
if
(
cli
)
nouveau_client_destroy
(
&
cli
->
base
);
*
pcli
=
NULL
;
struct
nouveau_cli
*
cli
=
*
pcli
=
kzalloc
(
size
,
GFP_KERNEL
);
if
(
cli
)
{
int
ret
=
nvif_client_init
(
NULL
,
NULL
,
sname
,
name
,
nouveau_config
,
nouveau_debug
,
&
cli
->
base
);
if
(
ret
==
0
)
mutex_init
(
&
cli
->
mutex
);
return
ret
;
}
mutex_init
(
&
cli
->
mutex
);
return
0
;
return
-
ENOMEM
;
}
static
void
nouveau_cli_destroy
(
struct
nouveau_cli
*
cli
)
{
struct
nouveau_object
*
client
=
nv_object
(
cli
);
nouveau_vm_ref
(
NULL
,
&
cli
->
base
.
vm
,
NULL
);
nouveau_client_fini
(
&
cli
->
base
,
false
);
atomic_set
(
&
client
->
refcount
,
1
);
nouveau_object_ref
(
NULL
,
&
client
);
nouveau_vm_ref
(
NULL
,
&
nvkm_client
(
&
cli
->
base
)
->
vm
,
NULL
);
nvif_client_fini
(
&
cli
->
base
);
}
static
void
nouveau_accel_fini
(
struct
nouveau_drm
*
drm
)
{
nouveau_gpuobj_ref
(
NULL
,
&
drm
->
notify
);
nouveau_channel_del
(
&
drm
->
channel
);
nvif_object_fini
(
&
drm
->
ntfy
);
nouveau_gpuobj_ref
(
NULL
,
&
drm
->
notify
);
nvif_object_fini
(
&
drm
->
nvsw
);
nouveau_channel_del
(
&
drm
->
cechan
);
nvif_object_fini
(
&
drm
->
ttm
.
copy
);
if
(
drm
->
fence
)
nouveau_fence
(
drm
)
->
dtor
(
drm
);
}
...
...
@@ -151,7 +137,6 @@ static void
nouveau_accel_init
(
struct
nouveau_drm
*
drm
)
{
struct
nvif_device
*
device
=
&
drm
->
device
;
struct
nouveau_object
*
object
;
u32
arg0
,
arg1
;
u32
sclass
[
16
];
int
ret
,
i
;
...
...
@@ -163,8 +148,7 @@ nouveau_accel_init(struct nouveau_drm *drm)
/*XXX: this is crap, but the fence/channel stuff is a little
* backwards in some places. this will be fixed.
*/
ret
=
nouveau_parent_lclass
(
nvkm_object
(
device
),
sclass
,
ARRAY_SIZE
(
sclass
));
ret
=
nvif_object_sclass
(
&
device
->
base
,
sclass
,
ARRAY_SIZE
(
sclass
));
if
(
ret
<
0
)
return
;
...
...
@@ -202,8 +186,7 @@ nouveau_accel_init(struct nouveau_drm *drm)
}
if
(
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_KEPLER
)
{
ret
=
nouveau_channel_new
(
drm
,
&
drm
->
client
,
NVDRM_DEVICE
,
NVDRM_CHAN
+
1
,
ret
=
nouveau_channel_new
(
drm
,
&
drm
->
device
,
NVDRM_CHAN
+
1
,
NVE0_CHANNEL_IND_ENGINE_CE0
|
NVE0_CHANNEL_IND_ENGINE_CE1
,
0
,
&
drm
->
cechan
);
...
...
@@ -216,9 +199,8 @@ nouveau_accel_init(struct nouveau_drm *drm)
if
(
device
->
info
.
chipset
>=
0xa3
&&
device
->
info
.
chipset
!=
0xaa
&&
device
->
info
.
chipset
!=
0xac
)
{
ret
=
nouveau_channel_new
(
drm
,
&
drm
->
client
,
NVDRM_DEVICE
,
NVDRM_CHAN
+
1
,
NvDmaFB
,
NvDmaTT
,
&
drm
->
cechan
);
ret
=
nouveau_channel_new
(
drm
,
&
drm
->
device
,
NVDRM_CHAN
+
1
,
NvDmaFB
,
NvDmaTT
,
&
drm
->
cechan
);
if
(
ret
)
NV_ERROR
(
drm
,
"failed to create ce channel, %d
\n
"
,
ret
);
...
...
@@ -229,18 +211,18 @@ nouveau_accel_init(struct nouveau_drm *drm)
arg1
=
NvDmaTT
;
}
ret
=
nouveau_channel_new
(
drm
,
&
drm
->
client
,
NVDRM_DEVICE
,
NVDRM_CHAN
,
arg0
,
arg1
,
&
drm
->
channel
);
ret
=
nouveau_channel_new
(
drm
,
&
drm
->
device
,
NVDRM_CHAN
,
arg0
,
arg1
,
&
drm
->
channel
);
if
(
ret
)
{
NV_ERROR
(
drm
,
"failed to create kernel channel, %d
\n
"
,
ret
);
nouveau_accel_fini
(
drm
);
return
;
}
ret
=
n
ouveau_object_new
(
nv_object
(
drm
),
NVDRM_CHAN
,
NVDRM_NVSW
,
nouveau_abi16_swclass
(
drm
),
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
drm
->
channel
->
object
,
NULL
,
NVDRM_NVSW
,
nouveau_abi16_swclass
(
drm
),
NULL
,
0
,
&
drm
->
nvsw
);
if
(
ret
==
0
)
{
struct
nouveau_software_chan
*
swch
=
(
void
*
)
object
->
parent
;
struct
nouveau_software_chan
*
swch
;
ret
=
RING_SPACE
(
drm
->
channel
,
2
);
if
(
ret
==
0
)
{
if
(
device
->
info
.
family
<
NV_DEVICE_INFO_V0_FERMI
)
{
...
...
@@ -252,7 +234,7 @@ nouveau_accel_init(struct nouveau_drm *drm)
OUT_RING
(
drm
->
channel
,
0x001f0000
);
}
}
swch
=
(
void
*
)
object
->
parent
;
swch
=
(
void
*
)
nvkm_object
(
&
drm
->
nvsw
)
->
parent
;
swch
->
flip
=
nouveau_flip_complete
;
swch
->
flip_data
=
drm
->
channel
;
}
...
...
@@ -272,15 +254,15 @@ nouveau_accel_init(struct nouveau_drm *drm)
return
;
}
ret
=
n
ouveau_object_new
(
nv_object
(
drm
)
,
drm
->
channel
->
handle
,
NvNotify0
,
0x003d
,
&
(
struct
nv_dma_class
)
{
ret
=
n
vif_object_init
(
drm
->
channel
->
object
,
NULL
,
NvNotify0
,
NV_DMA_IN_MEMORY_CLASS
,
&
(
struct
nv_dma_class
)
{
.
flags
=
NV_DMA_TARGET_VRAM
|
NV_DMA_ACCESS_RDWR
,
.
start
=
drm
->
notify
->
addr
,
.
limit
=
drm
->
notify
->
addr
+
31
},
sizeof
(
struct
nv_dma_class
),
&
object
);
},
sizeof
(
struct
nv_dma_class
),
&
drm
->
ntfy
);
if
(
ret
)
{
nouveau_accel_fini
(
drm
);
return
;
...
...
@@ -373,27 +355,6 @@ nouveau_get_hdmi_dev(struct nouveau_drm *drm)
}
}
void
nouveau_drm_hack_device
(
struct
nouveau_drm
*
drm
,
struct
nvif_device
*
device
)
{
drm
->
device
.
info
.
chipset
=
nvkm_device
(
&
drm
->
device
)
->
chipset
;
switch
(
nvkm_device
(
&
drm
->
device
)
->
card_type
)
{
case
NV_04
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_TNT
;
break
;
case
NV_10
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_CELSIUS
;
break
;
case
NV_11
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_CELSIUS
;
break
;
case
NV_20
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_KELVIN
;
break
;
case
NV_30
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_RANKINE
;
break
;
case
NV_40
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_CURIE
;
break
;
case
NV_50
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_TESLA
;
break
;
case
NV_C0
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_FERMI
;
break
;
case
NV_E0
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_KEPLER
;
break
;
case
GM100
:
device
->
info
.
family
=
NV_DEVICE_INFO_V0_MAXWELL
;
break
;
default:
BUG_ON
(
1
);
break
;
}
}
static
int
nouveau_drm_load
(
struct
drm_device
*
dev
,
unsigned
long
flags
)
{
...
...
@@ -408,7 +369,8 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
dev
->
dev_private
=
drm
;
drm
->
dev
=
dev
;
nouveau_client
(
drm
)
->
debug
=
nouveau_dbgopt
(
nouveau_debug
,
"DRM"
);
nvkm_client
(
&
drm
->
client
.
base
)
->
debug
=
nouveau_dbgopt
(
nouveau_debug
,
"DRM"
);
INIT_LIST_HEAD
(
&
drm
->
clients
);
spin_lock_init
(
&
drm
->
tile
.
lock
);
...
...
@@ -422,39 +384,34 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
/* dummy device object, doesn't init anything, but allows
* agp code access to registers
*/
ret
=
n
ouveau_object_new
(
nv_object
(
drm
),
NVDRM_CLIENT
,
NVDRM_DEVICE
,
0x0080
,
&
(
struct
nv_device_class
)
{
ret
=
n
vif_device_init
(
&
drm
->
client
.
base
.
base
,
NULL
,
NVDRM_DEVICE
,
NV_DEVICE_CLASS
,
&
(
struct
nv_device_class
)
{
.
device
=
~
0
,
.
disable
=
~
(
NV_DEVICE_DISABLE_MMIO
|
NV_DEVICE_DISABLE_IDENTIFY
),
.
debug0
=
~
0
,
},
sizeof
(
struct
nv_device_class
),
(
struct
nouveau_object
**
)
&
drm
->
device
.
object
);
},
sizeof
(
struct
nv_device_class
),
&
drm
->
device
);
if
(
ret
)
goto
fail_device
;
nouveau_drm_hack_device
(
drm
,
&
drm
->
device
);
nouveau_agp_reset
(
drm
);
n
ouveau_object_del
(
nv_object
(
drm
),
NVDRM_CLIENT
,
NVDRM_DEVICE
);
n
vif_device_fini
(
&
drm
->
device
);
}
ret
=
nouveau_object_new
(
nv_object
(
drm
),
NVDRM_CLIENT
,
NVDRM_DEVICE
,
0x0080
,
&
(
struct
nv_device_class
)
{
ret
=
nvif_device_init
(
&
drm
->
client
.
base
.
base
,
NULL
,
NVDRM_DEVICE
,
NV_DEVICE_CLASS
,
&
(
struct
nv_device_class
)
{
.
device
=
~
0
,
.
disable
=
0
,
.
debug0
=
0
,
},
sizeof
(
struct
nv_device_class
),
(
struct
nouveau_object
**
)
&
drm
->
device
.
object
);
},
sizeof
(
struct
nv_device_class
),
&
drm
->
device
);
if
(
ret
)
goto
fail_device
;
nouveau_drm_hack_device
(
drm
,
&
drm
->
device
);
dev
->
irq_enabled
=
true
;
/* workaround an odd issue on nvc1 by disabling the device's
...
...
@@ -473,7 +430,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
if
(
ret
)
goto
fail_device
;
drm
->
client
.
base
.
vm
=
drm
->
client
.
vm
;
nvkm_client
(
&
drm
->
client
.
base
)
->
vm
=
drm
->
client
.
vm
;
}
ret
=
nouveau_ttm_init
(
drm
);
...
...
@@ -519,6 +476,7 @@ nouveau_drm_load(struct drm_device *dev, unsigned long flags)
nouveau_agp_fini
(
drm
);
nouveau_vga_fini
(
drm
);
fail_device:
nvif_device_fini
(
&
drm
->
device
);
nouveau_cli_destroy
(
&
drm
->
client
);
return
ret
;
}
...
...
@@ -544,6 +502,7 @@ nouveau_drm_unload(struct drm_device *dev)
nouveau_agp_fini
(
drm
);
nouveau_vga_fini
(
drm
);
nvif_device_fini
(
&
drm
->
device
);
if
(
drm
->
hdmi_device
)
pci_dev_put
(
drm
->
hdmi_device
);
nouveau_cli_destroy
(
&
drm
->
client
);
...
...
@@ -554,10 +513,12 @@ void
nouveau_drm_device_remove
(
struct
drm_device
*
dev
)
{
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_client
*
client
;
struct
nouveau_object
*
device
;
dev
->
irq_enabled
=
false
;
device
=
drm
->
client
.
base
.
device
;
client
=
nvkm_client
(
&
drm
->
client
.
base
);
device
=
client
->
device
;
drm_put_dev
(
dev
);
nouveau_object_ref
(
NULL
,
&
device
);
...
...
@@ -612,13 +573,13 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
}
list_for_each_entry
(
cli
,
&
drm
->
clients
,
head
)
{
ret
=
n
ouveau_client_fini
(
&
cli
->
base
,
tru
e
);
ret
=
n
vif_client_suspend
(
&
cli
->
bas
e
);
if
(
ret
)
goto
fail_client
;
}
NV_INFO
(
drm
,
"suspending kernel object tree...
\n
"
);
ret
=
n
ouveau_client_fini
(
&
drm
->
client
.
base
,
tru
e
);
ret
=
n
vif_client_suspend
(
&
drm
->
client
.
bas
e
);
if
(
ret
)
goto
fail_client
;
...
...
@@ -627,7 +588,7 @@ nouveau_do_suspend(struct drm_device *dev, bool runtime)
fail_client:
list_for_each_entry_continue_reverse
(
cli
,
&
drm
->
clients
,
head
)
{
n
ouveau_client_init
(
&
cli
->
base
);
n
vif_client_resume
(
&
cli
->
base
);
}
if
(
drm
->
fence
&&
nouveau_fence
(
drm
)
->
resume
)
...
...
@@ -675,7 +636,7 @@ nouveau_do_resume(struct drm_device *dev)
nouveau_agp_reset
(
drm
);
NV_INFO
(
drm
,
"resuming kernel object tree...
\n
"
);
n
ouveau_client_init
(
&
drm
->
client
.
base
);
n
vif_client_resume
(
&
drm
->
client
.
base
);
nouveau_agp_init
(
drm
);
NV_INFO
(
drm
,
"resuming client object trees...
\n
"
);
...
...
@@ -683,7 +644,7 @@ nouveau_do_resume(struct drm_device *dev)
nouveau_fence
(
drm
)
->
resume
(
drm
);
list_for_each_entry
(
cli
,
&
drm
->
clients
,
head
)
{
n
ouveau_client_init
(
&
cli
->
base
);
n
vif_client_resume
(
&
cli
->
base
);
}
nouveau_run_vbios_init
(
dev
);
...
...
@@ -779,6 +740,8 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
if
(
ret
)
goto
out_suspend
;
cli
->
base
.
super
=
false
;
if
(
drm
->
device
.
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
ret
=
nouveau_vm_new
(
nvkm_device
(
&
drm
->
device
),
0
,
(
1ULL
<<
40
),
0x1000
,
&
cli
->
vm
);
...
...
@@ -787,7 +750,7 @@ nouveau_drm_open(struct drm_device *dev, struct drm_file *fpriv)
goto
out_suspend
;
}
cli
->
base
.
vm
=
cli
->
vm
;
nvkm_client
(
&
cli
->
base
)
->
vm
=
cli
->
vm
;
}
fpriv
->
driver_priv
=
cli
;
...
...
drivers/gpu/drm/nouveau/nouveau_drm.h
浏览文件 @
0ad72863
...
...
@@ -28,6 +28,9 @@
#include <core/client.h>
#include <core/event.h>
#include <nvif/client.h>
#include <nvif/device.h>
#include <subdev/vm.h>
#include <drmP.h>
...
...
@@ -53,6 +56,17 @@ struct nouveau_drm_tile {
bool
used
;
};
enum
nouveau_drm_object_route
{
NVDRM_OBJECT_NVIF
=
0
,
NVDRM_OBJECT_USIF
,
NVDRM_OBJECT_ABI16
,
};
enum
nouveau_drm_notify_route
{
NVDRM_NOTIFY_NVIF
=
0
,
NVDRM_NOTIFY_USIF
};
enum
nouveau_drm_handle
{
NVDRM_CLIENT
=
0xffffffff
,
NVDRM_DEVICE
=
0xdddddddd
,
...
...
@@ -64,7 +78,7 @@ enum nouveau_drm_handle {
};
struct
nouveau_cli
{
struct
n
ouveau
_client
base
;
struct
n
vif
_client
base
;
struct
nouveau_vm
*
vm
;
/*XXX*/
struct
list_head
head
;
struct
mutex
mutex
;
...
...
@@ -78,31 +92,6 @@ nouveau_cli(struct drm_file *fpriv)
}
#include <nvif/object.h>
#undef nvif_object
#undef nvif_rd08
#undef nvif_rd16
#undef nvif_rd32
#undef nvif_wr08
#undef nvif_wr16
#undef nvif_wr32
#undef nvif_mask
#undef nvkm_object
#undef nvif_exec
#define nvif_object(a) ({ \
struct nvif_object *_object = (a)->object; \
(struct nouveau_object *)_object; \
})
#define nvif_rd08(a,b) nv_ro08(nvif_object(a), (b))
#define nvif_rd16(a,b) nv_ro16(nvif_object(a), (b))
#define nvif_rd32(a,b) nv_ro32(nvif_object(a), (b))
#define nvif_wr08(a,b,c) nv_wo08(nvif_object(a), (b), (c))
#define nvif_wr16(a,b,c) nv_wo16(nvif_object(a), (b), (c))
#define nvif_wr32(a,b,c) nv_wo32(nvif_object(a), (b), (c))
#define nvif_mask(a,b,c,d) nv_mo32(nvif_object(a), (b), (c), (d))
#define nvkm_object(a) nvif_object(a)
#define nvif_exec(a,b,c,d) nv_exec(nvkm_object(a), (b), (c), (d))
#include <nvif/device.h>
extern
int
nouveau_runtime_pm
;
...
...
@@ -134,6 +123,7 @@ struct nouveau_drm {
struct
ttm_buffer_object
*
,
struct
ttm_mem_reg
*
,
struct
ttm_mem_reg
*
);
struct
nouveau_channel
*
chan
;
struct
nvif_object
copy
;
int
mtrr
;
}
ttm
;
...
...
@@ -151,6 +141,8 @@ struct nouveau_drm {
struct
nouveau_channel
*
channel
;
struct
nouveau_gpuobj
*
notify
;
struct
nouveau_fbdev
*
fbcon
;
struct
nvif_object
nvsw
;
struct
nvif_object
ntfy
;
/* nv10-nv40 tiling regions */
struct
{
...
...
@@ -192,7 +184,7 @@ void nouveau_drm_device_remove(struct drm_device *dev);
#define NV_PRINTK(l,c,f,a...) do { \
struct nouveau_cli *_cli = (c); \
nv_##l(_cli
, f, ##a);
\
nv_##l(_cli
->base.base.priv, f, ##a);
\
} while(0)
#define NV_FATAL(drm,f,a...) NV_PRINTK(fatal, &(drm)->client, f, ##a)
#define NV_ERROR(drm,f,a...) NV_PRINTK(error, &(drm)->client, f, ##a)
...
...
drivers/gpu/drm/nouveau/nouveau_fbcon.c
浏览文件 @
0ad72863
...
...
@@ -54,8 +54,6 @@
#include <core/client.h>
#include <core/device.h>
#include <subdev/fb.h>
MODULE_PARM_DESC
(
nofbaccel
,
"Disable fbcon acceleration"
);
static
int
nouveau_nofbaccel
=
0
;
module_param_named
(
nofbaccel
,
nouveau_nofbaccel
,
int
,
0400
);
...
...
@@ -241,6 +239,13 @@ nouveau_fbcon_accel_fini(struct drm_device *dev)
fbcon
->
helper
.
fbdev
->
flags
|=
FBINFO_HWACCEL_DISABLED
;
console_unlock
();
nouveau_channel_idle
(
drm
->
channel
);
nvif_object_fini
(
&
fbcon
->
twod
);
nvif_object_fini
(
&
fbcon
->
blit
);
nvif_object_fini
(
&
fbcon
->
gdi
);
nvif_object_fini
(
&
fbcon
->
patt
);
nvif_object_fini
(
&
fbcon
->
rop
);
nvif_object_fini
(
&
fbcon
->
clip
);
nvif_object_fini
(
&
fbcon
->
surf2d
);
}
}
...
...
@@ -352,7 +357,7 @@ nouveau_fbcon_create(struct drm_fb_helper *helper,
chan
=
nouveau_nofbaccel
?
NULL
:
drm
->
channel
;
if
(
chan
&&
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_TESLA
)
{
ret
=
nouveau_bo_vma_add
(
nvbo
,
nv_client
(
chan
->
cli
)
->
vm
,
ret
=
nouveau_bo_vma_add
(
nvbo
,
drm
->
client
.
vm
,
&
fbcon
->
nouveau_fb
.
vma
);
if
(
ret
)
{
NV_ERROR
(
drm
,
"failed to map fb into chan: %d
\n
"
,
ret
);
...
...
drivers/gpu/drm/nouveau/nouveau_fbcon.h
浏览文件 @
0ad72863
...
...
@@ -37,6 +37,13 @@ struct nouveau_fbdev {
struct
list_head
fbdev_list
;
struct
drm_device
*
dev
;
unsigned
int
saved_flags
;
struct
nvif_object
surf2d
;
struct
nvif_object
clip
;
struct
nvif_object
rop
;
struct
nvif_object
patt
;
struct
nvif_object
gdi
;
struct
nvif_object
blit
;
struct
nvif_object
twod
;
};
void
nouveau_fbcon_restore
(
void
);
...
...
drivers/gpu/drm/nouveau/nouveau_fence.c
浏览文件 @
0ad72863
...
...
@@ -33,8 +33,6 @@
#include "nouveau_dma.h"
#include "nouveau_fence.h"
#include <engine/fifo.h>
struct
fence_work
{
struct
work_struct
base
;
struct
list_head
head
;
...
...
@@ -184,7 +182,7 @@ nouveau_fence_wait_uevent(struct nouveau_fence *fence, bool intr)
{
struct
nouveau_channel
*
chan
=
fence
->
channel
;
struct
nouveau_fifo
*
pfifo
=
nvkm_fifo
(
&
chan
->
drm
->
device
);
struct
nouveau_fifo
*
pfifo
=
nvkm_fifo
(
chan
->
device
);
struct
nouveau_fence_priv
*
priv
=
chan
->
drm
->
fence
;
struct
nouveau_fence_wait
wait
=
{
.
priv
=
priv
};
int
ret
=
0
;
...
...
drivers/gpu/drm/nouveau/nouveau_gem.c
浏览文件 @
0ad72863
...
...
@@ -24,8 +24,6 @@
*
*/
#include <subdev/fb.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_fence.h"
...
...
@@ -696,7 +694,7 @@ nouveau_gem_ioctl_pushbuf(struct drm_device *dev, void *data,
return
-
ENOMEM
;
list_for_each_entry
(
temp
,
&
abi16
->
channels
,
head
)
{
if
(
temp
->
chan
->
handle
==
(
NVDRM_CHAN
|
req
->
channel
))
{
if
(
temp
->
chan
->
object
->
handle
==
(
NVDRM_CHAN
|
req
->
channel
))
{
chan
=
temp
->
chan
;
break
;
}
...
...
drivers/gpu/drm/nouveau/nouveau_hwmon.c
浏览文件 @
0ad72863
...
...
@@ -34,10 +34,6 @@
#include "nouveau_drm.h"
#include "nouveau_hwmon.h"
#include <subdev/gpio.h>
#include <subdev/timer.h>
#include <subdev/therm.h>
#if defined(CONFIG_HWMON) || (defined(MODULE) && defined(CONFIG_HWMON_MODULE))
static
ssize_t
nouveau_hwmon_show_temp
(
struct
device
*
d
,
struct
device_attribute
*
a
,
char
*
buf
)
...
...
drivers/gpu/drm/nouveau/nouveau_nvif.c
0 → 100644
浏览文件 @
0ad72863
/*
* Copyright 2014 Red Hat Inc.
*
* 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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.
*
* Authors: Ben Skeggs <bskeggs@redhat.com>
*/
/*******************************************************************************
* NVIF client driver - NVKM directly linked
******************************************************************************/
#include <core/client.h>
#include <core/notify.h>
#include <core/ioctl.h>
#include <nvif/client.h>
#include <nvif/driver.h>
#include <nvif/notify.h>
#include <nvif/event.h>
#include <nvif/ioctl.h>
#include "nouveau_drm.h"
static
void
nvkm_client_unmap
(
void
*
priv
,
void
*
ptr
,
u32
size
)
{
iounmap
(
ptr
);
}
static
void
*
nvkm_client_map
(
void
*
priv
,
u64
handle
,
u32
size
)
{
return
ioremap
(
handle
,
size
);
}
static
int
nvkm_client_ioctl
(
void
*
priv
,
bool
super
,
void
*
data
,
u32
size
,
void
**
hack
)
{
return
nvkm_ioctl
(
priv
,
super
,
data
,
size
,
hack
);
}
static
int
nvkm_client_resume
(
void
*
priv
)
{
return
nouveau_client_init
(
priv
);
}
static
int
nvkm_client_suspend
(
void
*
priv
)
{
return
nouveau_client_fini
(
priv
,
true
);
}
static
void
nvkm_client_fini
(
void
*
priv
)
{
struct
nouveau_object
*
client
=
priv
;
nouveau_client_fini
(
nv_client
(
client
),
false
);
atomic_set
(
&
client
->
refcount
,
1
);
nouveau_object_ref
(
NULL
,
&
client
);
}
static
int
nvkm_client_ntfy
(
const
void
*
header
,
u32
length
,
const
void
*
data
,
u32
size
)
{
const
union
{
struct
nvif_notify_req_v0
v0
;
}
*
args
=
header
;
u8
route
;
if
(
length
==
sizeof
(
args
->
v0
)
&&
args
->
v0
.
version
==
0
)
{
route
=
args
->
v0
.
route
;
}
else
{
WARN_ON
(
1
);
return
NVKM_NOTIFY_DROP
;
}
switch
(
route
)
{
case
NVDRM_NOTIFY_NVIF
:
return
nvif_notify
(
header
,
length
,
data
,
size
);
default:
WARN_ON
(
1
);
break
;
}
return
NVKM_NOTIFY_DROP
;
}
static
int
nvkm_client_init
(
const
char
*
name
,
u64
device
,
const
char
*
cfg
,
const
char
*
dbg
,
void
**
ppriv
)
{
struct
nouveau_client
*
client
;
int
ret
;
ret
=
nouveau_client_create
(
name
,
device
,
cfg
,
dbg
,
&
client
);
*
ppriv
=
client
;
if
(
ret
)
return
ret
;
client
->
ntfy
=
nvkm_client_ntfy
;
return
0
;
}
const
struct
nvif_driver
nvif_driver_nvkm
=
{
.
name
=
"nvkm"
,
.
init
=
nvkm_client_init
,
.
fini
=
nvkm_client_fini
,
.
suspend
=
nvkm_client_suspend
,
.
resume
=
nvkm_client_resume
,
.
ioctl
=
nvkm_client_ioctl
,
.
map
=
nvkm_client_map
,
.
unmap
=
nvkm_client_unmap
,
.
keep
=
false
,
};
drivers/gpu/drm/nouveau/nouveau_sgdma.c
浏览文件 @
0ad72863
#include <linux/pagemap.h>
#include <linux/slab.h>
#include <subdev/fb.h>
#include "nouveau_drm.h"
#include "nouveau_ttm.h"
...
...
drivers/gpu/drm/nouveau/nouveau_sysfs.c
浏览文件 @
0ad72863
...
...
@@ -48,7 +48,8 @@ nouveau_sysfs_pstate_get(struct device *d, struct device_attribute *a, char *b)
char
*
buf
=
b
;
int
ret
,
i
;
ret
=
nv_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_INFO
,
&
info
,
sizeof
(
info
));
ret
=
nvif_exec
(
&
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_INFO
,
&
info
,
sizeof
(
info
));
if
(
ret
)
return
ret
;
...
...
@@ -60,8 +61,8 @@ nouveau_sysfs_pstate_get(struct device *d, struct device_attribute *a, char *b)
.
index
=
0
,
};
ret
=
nv
_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_ATTR
,
&
attr
,
sizeof
(
attr
));
ret
=
nv
if_exec
(
&
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_ATTR
,
&
attr
,
sizeof
(
attr
));
if
(
ret
)
return
ret
;
...
...
@@ -75,8 +76,8 @@ nouveau_sysfs_pstate_get(struct device *d, struct device_attribute *a, char *b)
attr
.
index
=
0
;
do
{
attr
.
state
=
state
;
ret
=
nv
_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_ATTR
,
&
attr
,
sizeof
(
attr
));
ret
=
nv
if_exec
(
&
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_ATTR
,
&
attr
,
sizeof
(
attr
));
if
(
ret
)
return
ret
;
...
...
@@ -139,7 +140,8 @@ nouveau_sysfs_pstate_set(struct device *d, struct device_attribute *a,
args
.
ustate
=
value
;
}
ret
=
nv_exec
(
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_USER
,
&
args
,
sizeof
(
args
));
ret
=
nvif_exec
(
&
sysfs
->
ctrl
,
NV_CONTROL_PSTATE_USER
,
&
args
,
sizeof
(
args
));
if
(
ret
<
0
)
return
ret
;
...
...
@@ -156,9 +158,9 @@ nouveau_sysfs_fini(struct drm_device *dev)
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nvif_device
*
device
=
&
drm
->
device
;
if
(
sysfs
->
ctrl
)
{
if
(
sysfs
->
ctrl
.
priv
)
{
device_remove_file
(
nv_device_base
(
nvkm_device
(
device
)),
&
dev_attr_pstate
);
n
ouveau_object_del
(
nv_object
(
drm
),
NVDRM_DEVICE
,
NVDRM_CONTROL
);
n
vif_object_fini
(
&
sysfs
->
ctrl
);
}
drm
->
sysfs
=
NULL
;
...
...
@@ -177,8 +179,8 @@ nouveau_sysfs_init(struct drm_device *dev)
if
(
!
sysfs
)
return
-
ENOMEM
;
ret
=
n
ouveau_object_new
(
nv_object
(
drm
),
NVDRM_DEVICE
,
NVDRM_CONTROL
,
NV_CONTROL_CLASS
,
NULL
,
0
,
&
sysfs
->
ctrl
);
ret
=
n
vif_object_init
(
nvif_object
(
&
drm
->
device
),
NULL
,
NVDRM_CONTROL
,
NV_CONTROL_CLASS
,
NULL
,
0
,
&
sysfs
->
ctrl
);
if
(
ret
==
0
)
device_create_file
(
nv_device_base
(
nvkm_device
(
device
)),
&
dev_attr_pstate
);
...
...
drivers/gpu/drm/nouveau/nouveau_sysfs.h
浏览文件 @
0ad72863
...
...
@@ -4,7 +4,7 @@
#include "nouveau_drm.h"
struct
nouveau_sysfs
{
struct
n
ouveau_object
*
ctrl
;
struct
n
vif_object
ctrl
;
};
static
inline
struct
nouveau_sysfs
*
...
...
drivers/gpu/drm/nouveau/nouveau_ttm.c
浏览文件 @
0ad72863
...
...
@@ -24,10 +24,6 @@
* USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#include <subdev/fb.h>
#include <subdev/vm.h>
#include <subdev/instmem.h>
#include "nouveau_drm.h"
#include "nouveau_ttm.h"
#include "nouveau_gem.h"
...
...
drivers/gpu/drm/nouveau/nv04_fbcon.c
浏览文件 @
0ad72863
...
...
@@ -142,7 +142,6 @@ nv04_fbcon_accel_init(struct fb_info *info)
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_channel
*
chan
=
drm
->
channel
;
struct
nvif_device
*
device
=
&
drm
->
device
;
struct
nouveau_object
*
object
;
int
surface_fmt
,
pattern_fmt
,
rect_fmt
;
int
ret
;
...
...
@@ -174,35 +173,35 @@ nv04_fbcon_accel_init(struct fb_info *info)
return
-
EINVAL
;
}
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
NvCtxSurf2D
,
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_CELSIUS
?
0x0062
:
0x0042
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvCtxSurf2D
,
device
->
info
.
family
>=
NV_DEVICE_INFO_V0_CELSIUS
?
0x0062
:
0x0042
,
NULL
,
0
,
&
nfbdev
->
surf2d
);
if
(
ret
)
return
ret
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
NvClipRect
,
0x0019
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvClipRect
,
0x0019
,
NULL
,
0
,
&
nfbdev
->
clip
);
if
(
ret
)
return
ret
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
NvRop
,
0x0043
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvRop
,
0x0043
,
NULL
,
0
,
&
nfbdev
->
rop
);
if
(
ret
)
return
ret
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
NvImagePatt
,
0x0044
,
NULL
,
0
,
&
objec
t
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvImagePatt
,
0x0044
,
NULL
,
0
,
&
nfbdev
->
pat
t
);
if
(
ret
)
return
ret
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
NvGdiRect
,
0x004a
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvGdiRect
,
0x004a
,
NULL
,
0
,
&
nfbdev
->
gdi
);
if
(
ret
)
return
ret
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
NvImageBlit
,
device
->
info
.
chipset
>=
0x11
?
0x009f
:
0x005f
,
NULL
,
0
,
&
objec
t
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvImageBlit
,
device
->
info
.
chipset
>=
0x11
?
0x009f
:
0x005f
,
NULL
,
0
,
&
nfbdev
->
bli
t
);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/nv04_fence.c
浏览文件 @
0ad72863
...
...
@@ -22,8 +22,6 @@
* Authors: Ben Skeggs
*/
#include <engine/fifo.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_fence.h"
...
...
drivers/gpu/drm/nouveau/nv10_fence.c
浏览文件 @
0ad72863
...
...
@@ -60,7 +60,11 @@ void
nv10_fence_context_del
(
struct
nouveau_channel
*
chan
)
{
struct
nv10_fence_chan
*
fctx
=
chan
->
fence
;
int
i
;
nouveau_fence_context_del
(
&
fctx
->
base
);
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
fctx
->
head
);
i
++
)
nvif_object_fini
(
&
fctx
->
head
[
i
]);
nvif_object_fini
(
&
fctx
->
sema
);
chan
->
fence
=
NULL
;
kfree
(
fctx
);
}
...
...
drivers/gpu/drm/nouveau/nv10_fence.h
浏览文件 @
0ad72863
...
...
@@ -7,6 +7,8 @@
struct
nv10_fence_chan
{
struct
nouveau_fence_chan
base
;
struct
nvif_object
sema
;
struct
nvif_object
head
[
4
];
};
struct
nv10_fence_priv
{
...
...
drivers/gpu/drm/nouveau/nv17_fence.c
浏览文件 @
0ad72863
...
...
@@ -33,11 +33,12 @@ int
nv17_fence_sync
(
struct
nouveau_fence
*
fence
,
struct
nouveau_channel
*
prev
,
struct
nouveau_channel
*
chan
)
{
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
prev
->
device
->
base
);
struct
nv10_fence_priv
*
priv
=
chan
->
drm
->
fence
;
u32
value
;
int
ret
;
if
(
!
mutex_trylock
(
&
prev
->
cli
->
mutex
))
if
(
!
mutex_trylock
(
&
cli
->
mutex
))
return
-
EBUSY
;
spin_lock
(
&
priv
->
lock
);
...
...
@@ -64,7 +65,7 @@ nv17_fence_sync(struct nouveau_fence *fence,
FIRE_RING
(
chan
);
}
mutex_unlock
(
&
prev
->
cli
->
mutex
);
mutex_unlock
(
&
cli
->
mutex
);
return
0
;
}
...
...
@@ -74,7 +75,6 @@ nv17_fence_context_new(struct nouveau_channel *chan)
struct
nv10_fence_priv
*
priv
=
chan
->
drm
->
fence
;
struct
nv10_fence_chan
*
fctx
;
struct
ttm_mem_reg
*
mem
=
&
priv
->
bo
->
bo
.
mem
;
struct
nouveau_object
*
object
;
u32
start
=
mem
->
start
*
PAGE_SIZE
;
u32
limit
=
start
+
mem
->
size
-
1
;
int
ret
=
0
;
...
...
@@ -88,15 +88,15 @@ nv17_fence_context_new(struct nouveau_channel *chan)
fctx
->
base
.
read
=
nv10_fence_read
;
fctx
->
base
.
sync
=
nv17_fence_sync
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
chan
->
handle
,
NvSema
,
0x0002
,
&
(
struct
nv_dma_class
)
{
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvSema
,
NV_DMA_FROM_MEMORY_CLASS
,
&
(
struct
nv_dma_class
)
{
.
flags
=
NV_DMA_TARGET_VRAM
|
NV_DMA_ACCESS_RDWR
,
.
start
=
start
,
.
limit
=
limit
,
},
sizeof
(
struct
nv_dma_class
),
&
object
);
},
sizeof
(
struct
nv_dma_class
),
&
fctx
->
sema
);
if
(
ret
)
nv10_fence_context_del
(
chan
);
return
ret
;
...
...
drivers/gpu/drm/nouveau/nv50_display.c
浏览文件 @
0ad72863
此差异已折叠。
点击以展开。
drivers/gpu/drm/nouveau/nv50_fbcon.c
浏览文件 @
0ad72863
...
...
@@ -154,7 +154,6 @@ nv50_fbcon_accel_init(struct fb_info *info)
struct
drm_device
*
dev
=
nfbdev
->
dev
;
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_channel
*
chan
=
drm
->
channel
;
struct
nouveau_object
*
object
;
int
ret
,
format
;
switch
(
info
->
var
.
bits_per_pixel
)
{
...
...
@@ -184,8 +183,8 @@ nv50_fbcon_accel_init(struct fb_info *info)
return
-
EINVAL
;
}
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
Nv2D
,
0x502d
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
Nv2D
,
0x502d
,
NULL
,
0
,
&
nfbdev
->
twod
);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/nv50_fence.c
浏览文件 @
0ad72863
...
...
@@ -38,7 +38,6 @@ nv50_fence_context_new(struct nouveau_channel *chan)
struct
nv10_fence_priv
*
priv
=
chan
->
drm
->
fence
;
struct
nv10_fence_chan
*
fctx
;
struct
ttm_mem_reg
*
mem
=
&
priv
->
bo
->
bo
.
mem
;
struct
nouveau_object
*
object
;
u32
start
=
mem
->
start
*
PAGE_SIZE
;
u32
limit
=
start
+
mem
->
size
-
1
;
int
ret
,
i
;
...
...
@@ -52,15 +51,15 @@ nv50_fence_context_new(struct nouveau_channel *chan)
fctx
->
base
.
read
=
nv10_fence_read
;
fctx
->
base
.
sync
=
nv17_fence_sync
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
chan
->
handle
,
NvSema
,
0x003d
,
&
(
struct
nv_dma_class
)
{
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvSema
,
NV_DMA_IN_MEMORY_CLASS
,
&
(
struct
nv_dma_class
)
{
.
flags
=
NV_DMA_TARGET_VRAM
|
NV_DMA_ACCESS_RDWR
,
.
start
=
start
,
.
limit
=
limit
,
},
sizeof
(
struct
nv_dma_class
),
&
object
);
},
sizeof
(
struct
nv_dma_class
),
&
fctx
->
sema
);
/* dma objects for display sync channel semaphore blocks */
for
(
i
=
0
;
!
ret
&&
i
<
dev
->
mode_config
.
num_crtc
;
i
++
)
{
...
...
@@ -68,15 +67,15 @@ nv50_fence_context_new(struct nouveau_channel *chan)
u32
start
=
bo
->
bo
.
mem
.
start
*
PAGE_SIZE
;
u32
limit
=
start
+
bo
->
bo
.
mem
.
size
-
1
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
chan
->
handle
,
NvEvoSema0
+
i
,
0x003d
,
&
(
struct
nv_dma_class
)
{
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
NvEvoSema0
+
i
,
NV_DMA_IN_MEMORY_CLASS
,
&
(
struct
nv_dma_class
)
{
.
flags
=
NV_DMA_TARGET_VRAM
|
NV_DMA_ACCESS_RDWR
,
.
start
=
start
,
.
limit
=
limit
,
},
sizeof
(
struct
nv_dma_class
),
&
object
);
},
sizeof
(
struct
nv_dma_class
),
&
fctx
->
head
[
i
]
);
}
if
(
ret
)
...
...
drivers/gpu/drm/nouveau/nv84_fence.c
浏览文件 @
0ad72863
...
...
@@ -26,8 +26,6 @@
#include <core/client.h>
#include <core/class.h>
#include <engine/fifo.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_fence.h"
...
...
@@ -47,7 +45,7 @@ nv84_fence_emit32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
int
ret
=
RING_SPACE
(
chan
,
8
);
if
(
ret
==
0
)
{
BEGIN_NV04
(
chan
,
0
,
NV11_SUBCHAN_DMA_SEMAPHORE
,
1
);
OUT_RING
(
chan
,
chan
->
vram
);
OUT_RING
(
chan
,
chan
->
vram
.
handle
);
BEGIN_NV04
(
chan
,
0
,
NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH
,
5
);
OUT_RING
(
chan
,
upper_32_bits
(
virtual
));
OUT_RING
(
chan
,
lower_32_bits
(
virtual
));
...
...
@@ -65,7 +63,7 @@ nv84_fence_sync32(struct nouveau_channel *chan, u64 virtual, u32 sequence)
int
ret
=
RING_SPACE
(
chan
,
7
);
if
(
ret
==
0
)
{
BEGIN_NV04
(
chan
,
0
,
NV11_SUBCHAN_DMA_SEMAPHORE
,
1
);
OUT_RING
(
chan
,
chan
->
vram
);
OUT_RING
(
chan
,
chan
->
vram
.
handle
);
BEGIN_NV04
(
chan
,
0
,
NV84_SUBCHAN_SEMAPHORE_ADDRESS_HIGH
,
4
);
OUT_RING
(
chan
,
upper_32_bits
(
virtual
));
OUT_RING
(
chan
,
lower_32_bits
(
virtual
));
...
...
@@ -140,7 +138,7 @@ int
nv84_fence_context_new
(
struct
nouveau_channel
*
chan
)
{
struct
nouveau_fifo_chan
*
fifo
=
nvkm_fifo_chan
(
chan
);
struct
nouveau_cli
*
cli
=
chan
->
cli
;
struct
nouveau_cli
*
cli
=
(
void
*
)
nvif_client
(
&
chan
->
device
->
base
)
;
struct
nv84_fence_priv
*
priv
=
chan
->
drm
->
fence
;
struct
nv84_fence_chan
*
fctx
;
int
ret
,
i
;
...
...
drivers/gpu/drm/nouveau/nvc0_fbcon.c
浏览文件 @
0ad72863
...
...
@@ -154,11 +154,10 @@ nvc0_fbcon_accel_init(struct fb_info *info)
struct
nouveau_framebuffer
*
fb
=
&
nfbdev
->
nouveau_fb
;
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_channel
*
chan
=
drm
->
channel
;
struct
nouveau_object
*
object
;
int
ret
,
format
;
ret
=
n
ouveau_object_new
(
nv_object
(
chan
->
cli
),
NVDRM_CHAN
,
Nv2D
,
0x902d
,
NULL
,
0
,
&
object
);
ret
=
n
vif_object_init
(
chan
->
object
,
NULL
,
Nv2D
,
0x902d
,
NULL
,
0
,
&
nfbdev
->
twod
);
if
(
ret
)
return
ret
;
...
...
drivers/gpu/drm/nouveau/nvc0_fence.c
浏览文件 @
0ad72863
...
...
@@ -26,8 +26,6 @@
#include <core/client.h>
#include <core/class.h>
#include <engine/fifo.h>
#include "nouveau_drm.h"
#include "nouveau_dma.h"
#include "nouveau_fence.h"
...
...
drivers/gpu/drm/nouveau/nvif/client.c
浏览文件 @
0ad72863
...
...
@@ -58,9 +58,7 @@ nvif_client_fini(struct nvif_client *client)
const
struct
nvif_driver
*
nvif_drivers
[]
=
{
#ifdef __KERNEL__
#if 0
&
nvif_driver_nvkm
,
#endif
#else
&
nvif_driver_lib
,
#endif
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录