Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
fcd6f048
K
Kernel
项目概览
openeuler
/
Kernel
接近 2 年 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
fcd6f048
编写于
2月 12, 2019
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/kms/nv04-nv4x: move a bunch of pre-nv50 page flip code to dispnv04
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
ba801ef0
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
235 addition
and
246 deletion
+235
-246
drivers/gpu/drm/nouveau/dispnv04/crtc.c
drivers/gpu/drm/nouveau/dispnv04/crtc.c
+213
-1
drivers/gpu/drm/nouveau/dispnv04/disp.c
drivers/gpu/drm/nouveau/dispnv04/disp.c
+19
-0
drivers/gpu/drm/nouveau/dispnv04/disp.h
drivers/gpu/drm/nouveau/dispnv04/disp.h
+2
-0
drivers/gpu/drm/nouveau/nouveau_display.c
drivers/gpu/drm/nouveau/nouveau_display.c
+1
-214
drivers/gpu/drm/nouveau/nouveau_display.h
drivers/gpu/drm/nouveau/nouveau_display.h
+0
-15
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_drm.c
+0
-13
drivers/gpu/drm/nouveau/nouveau_drv.h
drivers/gpu/drm/nouveau/nouveau_drv.h
+0
-1
drivers/gpu/drm/nouveau/nouveau_fence.h
drivers/gpu/drm/nouveau/nouveau_fence.h
+0
-2
未找到文件。
drivers/gpu/drm/nouveau/dispnv04/crtc.c
浏览文件 @
fcd6f048
...
...
@@ -40,6 +40,7 @@
#include "nvreg.h"
#include "nouveau_fbcon.h"
#include "disp.h"
#include "nouveau_dma.h"
#include <subdev/bios/pll.h>
#include <subdev/clk.h>
...
...
@@ -1077,12 +1078,223 @@ nouveau_crtc_set_config(struct drm_mode_set *set,
return
ret
;
}
struct
nv04_page_flip_state
{
struct
list_head
head
;
struct
drm_pending_vblank_event
*
event
;
struct
drm_crtc
*
crtc
;
int
bpp
,
pitch
;
u64
offset
;
};
static
int
nv04_finish_page_flip
(
struct
nouveau_channel
*
chan
,
struct
nv04_page_flip_state
*
ps
)
{
struct
nouveau_fence_chan
*
fctx
=
chan
->
fence
;
struct
nouveau_drm
*
drm
=
chan
->
drm
;
struct
drm_device
*
dev
=
drm
->
dev
;
struct
nv04_page_flip_state
*
s
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
if
(
list_empty
(
&
fctx
->
flip
))
{
NV_ERROR
(
drm
,
"unexpected pageflip
\n
"
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
-
EINVAL
;
}
s
=
list_first_entry
(
&
fctx
->
flip
,
struct
nv04_page_flip_state
,
head
);
if
(
s
->
event
)
{
drm_crtc_arm_vblank_event
(
s
->
crtc
,
s
->
event
);
}
else
{
/* Give up ownership of vblank for page-flipped crtc */
drm_crtc_vblank_put
(
s
->
crtc
);
}
list_del
(
&
s
->
head
);
if
(
ps
)
*
ps
=
*
s
;
kfree
(
s
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
0
;
}
int
nv04_flip_complete
(
struct
nvif_notify
*
notify
)
{
struct
nouveau_cli
*
cli
=
(
void
*
)
notify
->
object
->
client
;
struct
nouveau_drm
*
drm
=
cli
->
drm
;
struct
nouveau_channel
*
chan
=
drm
->
channel
;
struct
nv04_page_flip_state
state
;
if
(
!
nv04_finish_page_flip
(
chan
,
&
state
))
{
nv_set_crtc_base
(
drm
->
dev
,
drm_crtc_index
(
state
.
crtc
),
state
.
offset
+
state
.
crtc
->
y
*
state
.
pitch
+
state
.
crtc
->
x
*
state
.
bpp
/
8
);
}
return
NVIF_NOTIFY_KEEP
;
}
static
int
nv04_page_flip_emit
(
struct
nouveau_channel
*
chan
,
struct
nouveau_bo
*
old_bo
,
struct
nouveau_bo
*
new_bo
,
struct
nv04_page_flip_state
*
s
,
struct
nouveau_fence
**
pfence
)
{
struct
nouveau_fence_chan
*
fctx
=
chan
->
fence
;
struct
nouveau_drm
*
drm
=
chan
->
drm
;
struct
drm_device
*
dev
=
drm
->
dev
;
unsigned
long
flags
;
int
ret
;
/* Queue it to the pending list */
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
list_add_tail
(
&
s
->
head
,
&
fctx
->
flip
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
/* Synchronize with the old framebuffer */
ret
=
nouveau_fence_sync
(
old_bo
,
chan
,
false
,
false
);
if
(
ret
)
goto
fail
;
/* Emit the pageflip */
ret
=
RING_SPACE
(
chan
,
2
);
if
(
ret
)
goto
fail
;
BEGIN_NV04
(
chan
,
NvSubSw
,
NV_SW_PAGE_FLIP
,
1
);
OUT_RING
(
chan
,
0x00000000
);
FIRE_RING
(
chan
);
ret
=
nouveau_fence_new
(
chan
,
false
,
pfence
);
if
(
ret
)
goto
fail
;
return
0
;
fail:
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
list_del
(
&
s
->
head
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
ret
;
}
static
int
nv04_crtc_page_flip
(
struct
drm_crtc
*
crtc
,
struct
drm_framebuffer
*
fb
,
struct
drm_pending_vblank_event
*
event
,
u32
flags
,
struct
drm_modeset_acquire_ctx
*
ctx
)
{
const
int
swap_interval
=
(
flags
&
DRM_MODE_PAGE_FLIP_ASYNC
)
?
0
:
1
;
struct
drm_device
*
dev
=
crtc
->
dev
;
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
nouveau_bo
*
old_bo
=
nouveau_framebuffer
(
crtc
->
primary
->
fb
)
->
nvbo
;
struct
nouveau_bo
*
new_bo
=
nouveau_framebuffer
(
fb
)
->
nvbo
;
struct
nv04_page_flip_state
*
s
;
struct
nouveau_channel
*
chan
;
struct
nouveau_cli
*
cli
;
struct
nouveau_fence
*
fence
;
struct
nv04_display
*
dispnv04
=
nv04_display
(
dev
);
int
head
=
nouveau_crtc
(
crtc
)
->
index
;
int
ret
;
chan
=
drm
->
channel
;
if
(
!
chan
)
return
-
ENODEV
;
cli
=
(
void
*
)
chan
->
user
.
client
;
s
=
kzalloc
(
sizeof
(
*
s
),
GFP_KERNEL
);
if
(
!
s
)
return
-
ENOMEM
;
if
(
new_bo
!=
old_bo
)
{
ret
=
nouveau_bo_pin
(
new_bo
,
TTM_PL_FLAG_VRAM
,
true
);
if
(
ret
)
goto
fail_free
;
}
mutex_lock
(
&
cli
->
mutex
);
ret
=
ttm_bo_reserve
(
&
new_bo
->
bo
,
true
,
false
,
NULL
);
if
(
ret
)
goto
fail_unpin
;
/* synchronise rendering channel with the kernel's channel */
ret
=
nouveau_fence_sync
(
new_bo
,
chan
,
false
,
true
);
if
(
ret
)
{
ttm_bo_unreserve
(
&
new_bo
->
bo
);
goto
fail_unpin
;
}
if
(
new_bo
!=
old_bo
)
{
ttm_bo_unreserve
(
&
new_bo
->
bo
);
ret
=
ttm_bo_reserve
(
&
old_bo
->
bo
,
true
,
false
,
NULL
);
if
(
ret
)
goto
fail_unpin
;
}
/* Initialize a page flip struct */
*
s
=
(
struct
nv04_page_flip_state
)
{
{
},
event
,
crtc
,
fb
->
format
->
cpp
[
0
]
*
8
,
fb
->
pitches
[
0
],
new_bo
->
bo
.
offset
};
/* Keep vblanks on during flip, for the target crtc of this flip */
drm_crtc_vblank_get
(
crtc
);
/* Emit a page flip */
if
(
swap_interval
)
{
ret
=
RING_SPACE
(
chan
,
8
);
if
(
ret
)
goto
fail_unreserve
;
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x012c
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x0134
,
1
);
OUT_RING
(
chan
,
head
);
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x0100
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x0130
,
1
);
OUT_RING
(
chan
,
0
);
}
nouveau_bo_ref
(
new_bo
,
&
dispnv04
->
image
[
head
]);
ret
=
nv04_page_flip_emit
(
chan
,
old_bo
,
new_bo
,
s
,
&
fence
);
if
(
ret
)
goto
fail_unreserve
;
mutex_unlock
(
&
cli
->
mutex
);
/* Update the crtc struct and cleanup */
crtc
->
primary
->
fb
=
fb
;
nouveau_bo_fence
(
old_bo
,
fence
,
false
);
ttm_bo_unreserve
(
&
old_bo
->
bo
);
if
(
old_bo
!=
new_bo
)
nouveau_bo_unpin
(
old_bo
);
nouveau_fence_unref
(
&
fence
);
return
0
;
fail_unreserve:
drm_crtc_vblank_put
(
crtc
);
ttm_bo_unreserve
(
&
old_bo
->
bo
);
fail_unpin:
mutex_unlock
(
&
cli
->
mutex
);
if
(
old_bo
!=
new_bo
)
nouveau_bo_unpin
(
new_bo
);
fail_free:
kfree
(
s
);
return
ret
;
}
static
const
struct
drm_crtc_funcs
nv04_crtc_funcs
=
{
.
cursor_set
=
nv04_crtc_cursor_set
,
.
cursor_move
=
nv04_crtc_cursor_move
,
.
gamma_set
=
nv_crtc_gamma_set
,
.
set_config
=
nouveau_crtc_set_config
,
.
page_flip
=
n
ouveau
_crtc_page_flip
,
.
page_flip
=
n
v04
_crtc_page_flip
,
.
destroy
=
nv_crtc_destroy
,
};
...
...
drivers/gpu/drm/nouveau/dispnv04/disp.c
浏览文件 @
fcd6f048
...
...
@@ -31,9 +31,16 @@
#include "nouveau_encoder.h"
#include "nouveau_connector.h"
#include <nvif/if0004.h>
static
void
nv04_display_fini
(
struct
drm_device
*
dev
)
{
struct
nv04_display
*
disp
=
nv04_display
(
dev
);
/* Disable flip completion events. */
nvif_notify_put
(
&
disp
->
flip
);
/* Disable vblank interrupts. */
NVWriteCRTC
(
dev
,
0
,
NV_PCRTC_INTR_EN_0
,
0
);
if
(
nv_two_heads
(
dev
))
...
...
@@ -43,6 +50,7 @@ nv04_display_fini(struct drm_device *dev)
static
int
nv04_display_init
(
struct
drm_device
*
dev
)
{
struct
nv04_display
*
disp
=
nv04_display
(
dev
);
struct
nouveau_encoder
*
encoder
;
struct
nouveau_crtc
*
crtc
;
...
...
@@ -60,6 +68,8 @@ nv04_display_init(struct drm_device *dev)
list_for_each_entry
(
encoder
,
&
dev
->
mode_config
.
encoder_list
,
base
.
base
.
head
)
encoder
->
enc_save
(
&
encoder
->
base
.
base
);
/* Enable flip completion events. */
nvif_notify_get
(
&
disp
->
flip
);
return
0
;
}
...
...
@@ -80,6 +90,8 @@ nv04_display_destroy(struct drm_device *dev)
nouveau_hw_save_vga_fonts
(
dev
,
0
);
nvif_notify_fini
(
&
disp
->
flip
);
nouveau_display
(
dev
)
->
priv
=
NULL
;
kfree
(
disp
);
...
...
@@ -113,6 +125,13 @@ nv04_display_create(struct drm_device *dev)
/* Pre-nv50 doesn't support atomic, so don't expose the ioctls */
dev
->
driver
->
driver_features
&=
~
DRIVER_ATOMIC
;
/* Request page flip completion event. */
if
(
drm
->
nvsw
.
client
)
{
nvif_notify_init
(
&
drm
->
nvsw
,
nv04_flip_complete
,
false
,
NV04_NVSW_NTFY_UEVENT
,
NULL
,
0
,
0
,
&
disp
->
flip
);
}
nouveau_hw_save_vga_fonts
(
dev
,
1
);
nv04_crtc_create
(
dev
,
0
);
...
...
drivers/gpu/drm/nouveau/dispnv04/disp.h
浏览文件 @
fcd6f048
...
...
@@ -82,6 +82,7 @@ struct nv04_display {
uint32_t
saved_vga_font
[
4
][
16384
];
uint32_t
dac_users
[
4
];
struct
nouveau_bo
*
image
[
2
];
struct
nvif_notify
flip
;
};
static
inline
struct
nv04_display
*
...
...
@@ -173,4 +174,5 @@ nouveau_bios_run_init_table(struct drm_device *dev, u16 table,
);
}
int
nv04_flip_complete
(
struct
nvif_notify
*
);
#endif
drivers/gpu/drm/nouveau/nouveau_display.c
浏览文件 @
fcd6f048
...
...
@@ -32,18 +32,13 @@
#include <drm/drm_fb_helper.h>
#include <drm/drm_probe_helper.h>
#include <nvif/class.h>
#include "nouveau_fbcon.h"
#include "dispnv04/hw.h"
#include "nouveau_crtc.h"
#include "nouveau_dma.h"
#include "nouveau_gem.h"
#include "nouveau_connector.h"
#include "nv50_display.h"
#include "nouveau_fence.h"
#include <nvif/class.h>
#include <nvif/cl0046.h>
#include <nvif/event.h>
...
...
@@ -415,7 +410,6 @@ int
nouveau_display_init
(
struct
drm_device
*
dev
)
{
struct
nouveau_display
*
disp
=
nouveau_display
(
dev
);
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
struct
drm_connector
*
connector
;
struct
drm_connector_list_iter
conn_iter
;
int
ret
;
...
...
@@ -437,8 +431,6 @@ nouveau_display_init(struct drm_device *dev)
}
drm_connector_list_iter_end
(
&
conn_iter
);
/* enable flip completion events */
nvif_notify_get
(
&
drm
->
flip
);
return
ret
;
}
...
...
@@ -457,9 +449,6 @@ nouveau_display_fini(struct drm_device *dev, bool suspend, bool runtime)
drm_helper_force_disable_all
(
dev
);
}
/* disable flip completion events */
nvif_notify_put
(
&
drm
->
flip
);
/* disable hotplug interrupts */
drm_connector_list_iter_begin
(
dev
,
&
conn_iter
);
nouveau_for_each_non_mst_connector_iter
(
connector
,
&
conn_iter
)
{
...
...
@@ -738,208 +727,6 @@ nouveau_display_resume(struct drm_device *dev, bool runtime)
}
}
static
int
nouveau_page_flip_emit
(
struct
nouveau_channel
*
chan
,
struct
nouveau_bo
*
old_bo
,
struct
nouveau_bo
*
new_bo
,
struct
nouveau_page_flip_state
*
s
,
struct
nouveau_fence
**
pfence
)
{
struct
nouveau_fence_chan
*
fctx
=
chan
->
fence
;
struct
nouveau_drm
*
drm
=
chan
->
drm
;
struct
drm_device
*
dev
=
drm
->
dev
;
unsigned
long
flags
;
int
ret
;
/* Queue it to the pending list */
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
list_add_tail
(
&
s
->
head
,
&
fctx
->
flip
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
/* Synchronize with the old framebuffer */
ret
=
nouveau_fence_sync
(
old_bo
,
chan
,
false
,
false
);
if
(
ret
)
goto
fail
;
/* Emit the pageflip */
ret
=
RING_SPACE
(
chan
,
2
);
if
(
ret
)
goto
fail
;
BEGIN_NV04
(
chan
,
NvSubSw
,
NV_SW_PAGE_FLIP
,
1
);
OUT_RING
(
chan
,
0x00000000
);
FIRE_RING
(
chan
);
ret
=
nouveau_fence_new
(
chan
,
false
,
pfence
);
if
(
ret
)
goto
fail
;
return
0
;
fail:
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
list_del
(
&
s
->
head
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
ret
;
}
int
nouveau_crtc_page_flip
(
struct
drm_crtc
*
crtc
,
struct
drm_framebuffer
*
fb
,
struct
drm_pending_vblank_event
*
event
,
u32
flags
,
struct
drm_modeset_acquire_ctx
*
ctx
)
{
const
int
swap_interval
=
(
flags
&
DRM_MODE_PAGE_FLIP_ASYNC
)
?
0
:
1
;
struct
drm_device
*
dev
=
crtc
->
dev
;
struct
nouveau_drm
*
drm
=
nouveau_drm
(
dev
);
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
;
struct
nouveau_cli
*
cli
;
struct
nouveau_fence
*
fence
;
struct
nv04_display
*
dispnv04
=
nv04_display
(
dev
);
int
head
=
nouveau_crtc
(
crtc
)
->
index
;
int
ret
;
chan
=
drm
->
channel
;
if
(
!
chan
)
return
-
ENODEV
;
cli
=
(
void
*
)
chan
->
user
.
client
;
s
=
kzalloc
(
sizeof
(
*
s
),
GFP_KERNEL
);
if
(
!
s
)
return
-
ENOMEM
;
if
(
new_bo
!=
old_bo
)
{
ret
=
nouveau_bo_pin
(
new_bo
,
TTM_PL_FLAG_VRAM
,
true
);
if
(
ret
)
goto
fail_free
;
}
mutex_lock
(
&
cli
->
mutex
);
ret
=
ttm_bo_reserve
(
&
new_bo
->
bo
,
true
,
false
,
NULL
);
if
(
ret
)
goto
fail_unpin
;
/* synchronise rendering channel with the kernel's channel */
ret
=
nouveau_fence_sync
(
new_bo
,
chan
,
false
,
true
);
if
(
ret
)
{
ttm_bo_unreserve
(
&
new_bo
->
bo
);
goto
fail_unpin
;
}
if
(
new_bo
!=
old_bo
)
{
ttm_bo_unreserve
(
&
new_bo
->
bo
);
ret
=
ttm_bo_reserve
(
&
old_bo
->
bo
,
true
,
false
,
NULL
);
if
(
ret
)
goto
fail_unpin
;
}
/* Initialize a page flip struct */
*
s
=
(
struct
nouveau_page_flip_state
)
{
{
},
event
,
crtc
,
fb
->
format
->
cpp
[
0
]
*
8
,
fb
->
pitches
[
0
],
new_bo
->
bo
.
offset
};
/* Keep vblanks on during flip, for the target crtc of this flip */
drm_crtc_vblank_get
(
crtc
);
/* Emit a page flip */
if
(
swap_interval
)
{
ret
=
RING_SPACE
(
chan
,
8
);
if
(
ret
)
goto
fail_unreserve
;
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x012c
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x0134
,
1
);
OUT_RING
(
chan
,
head
);
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x0100
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NV04
(
chan
,
NvSubImageBlit
,
0x0130
,
1
);
OUT_RING
(
chan
,
0
);
}
nouveau_bo_ref
(
new_bo
,
&
dispnv04
->
image
[
head
]);
ret
=
nouveau_page_flip_emit
(
chan
,
old_bo
,
new_bo
,
s
,
&
fence
);
if
(
ret
)
goto
fail_unreserve
;
mutex_unlock
(
&
cli
->
mutex
);
/* Update the crtc struct and cleanup */
crtc
->
primary
->
fb
=
fb
;
nouveau_bo_fence
(
old_bo
,
fence
,
false
);
ttm_bo_unreserve
(
&
old_bo
->
bo
);
if
(
old_bo
!=
new_bo
)
nouveau_bo_unpin
(
old_bo
);
nouveau_fence_unref
(
&
fence
);
return
0
;
fail_unreserve:
drm_crtc_vblank_put
(
crtc
);
ttm_bo_unreserve
(
&
old_bo
->
bo
);
fail_unpin:
mutex_unlock
(
&
cli
->
mutex
);
if
(
old_bo
!=
new_bo
)
nouveau_bo_unpin
(
new_bo
);
fail_free:
kfree
(
s
);
return
ret
;
}
int
nouveau_finish_page_flip
(
struct
nouveau_channel
*
chan
,
struct
nouveau_page_flip_state
*
ps
)
{
struct
nouveau_fence_chan
*
fctx
=
chan
->
fence
;
struct
nouveau_drm
*
drm
=
chan
->
drm
;
struct
drm_device
*
dev
=
drm
->
dev
;
struct
nouveau_page_flip_state
*
s
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
dev
->
event_lock
,
flags
);
if
(
list_empty
(
&
fctx
->
flip
))
{
NV_ERROR
(
drm
,
"unexpected pageflip
\n
"
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
-
EINVAL
;
}
s
=
list_first_entry
(
&
fctx
->
flip
,
struct
nouveau_page_flip_state
,
head
);
if
(
s
->
event
)
{
drm_crtc_arm_vblank_event
(
s
->
crtc
,
s
->
event
);
}
else
{
/* Give up ownership of vblank for page-flipped crtc */
drm_crtc_vblank_put
(
s
->
crtc
);
}
list_del
(
&
s
->
head
);
if
(
ps
)
*
ps
=
*
s
;
kfree
(
s
);
spin_unlock_irqrestore
(
&
dev
->
event_lock
,
flags
);
return
0
;
}
int
nouveau_flip_complete
(
struct
nvif_notify
*
notify
)
{
struct
nouveau_drm
*
drm
=
container_of
(
notify
,
typeof
(
*
drm
),
flip
);
struct
nouveau_channel
*
chan
=
drm
->
channel
;
struct
nouveau_page_flip_state
state
;
if
(
!
nouveau_finish_page_flip
(
chan
,
&
state
))
{
nv_set_crtc_base
(
drm
->
dev
,
drm_crtc_index
(
state
.
crtc
),
state
.
offset
+
state
.
crtc
->
y
*
state
.
pitch
+
state
.
crtc
->
x
*
state
.
bpp
/
8
);
}
return
NVIF_NOTIFY_KEEP
;
}
int
nouveau_display_dumb_create
(
struct
drm_file
*
file_priv
,
struct
drm_device
*
dev
,
struct
drm_mode_create_dumb
*
args
)
...
...
drivers/gpu/drm/nouveau/nouveau_display.h
浏览文件 @
fcd6f048
...
...
@@ -25,14 +25,6 @@ int nouveau_framebuffer_new(struct drm_device *,
const
struct
drm_mode_fb_cmd2
*
,
struct
nouveau_bo
*
,
struct
nouveau_framebuffer
**
);
struct
nouveau_page_flip_state
{
struct
list_head
head
;
struct
drm_pending_vblank_event
*
event
;
struct
drm_crtc
*
crtc
;
int
bpp
,
pitch
;
u64
offset
;
};
struct
nouveau_display
{
void
*
priv
;
void
(
*
dtor
)(
struct
drm_device
*
);
...
...
@@ -71,13 +63,6 @@ bool nouveau_display_scanoutpos(struct drm_device *, unsigned int,
bool
,
int
*
,
int
*
,
ktime_t
*
,
ktime_t
*
,
const
struct
drm_display_mode
*
);
int
nouveau_crtc_page_flip
(
struct
drm_crtc
*
crtc
,
struct
drm_framebuffer
*
fb
,
struct
drm_pending_vblank_event
*
event
,
uint32_t
page_flip_flags
,
struct
drm_modeset_acquire_ctx
*
ctx
);
int
nouveau_finish_page_flip
(
struct
nouveau_channel
*
,
struct
nouveau_page_flip_state
*
);
int
nouveau_display_dumb_create
(
struct
drm_file
*
,
struct
drm_device
*
,
struct
drm_mode_create_dumb
*
args
);
int
nouveau_display_dumb_map_offset
(
struct
drm_file
*
,
struct
drm_device
*
,
...
...
drivers/gpu/drm/nouveau/nouveau_drm.c
浏览文件 @
fcd6f048
...
...
@@ -44,7 +44,6 @@
#include <nvif/class.h>
#include <nvif/cl0002.h>
#include <nvif/cla06f.h>
#include <nvif/if0004.h>
#include "nouveau_drv.h"
#include "nouveau_dma.h"
...
...
@@ -288,7 +287,6 @@ nouveau_accel_fini(struct nouveau_drm *drm)
nouveau_channel_idle
(
drm
->
channel
);
nvif_object_fini
(
&
drm
->
ntfy
);
nvkm_gpuobj_del
(
&
drm
->
notify
);
nvif_notify_fini
(
&
drm
->
flip
);
nvif_object_fini
(
&
drm
->
nvsw
);
nouveau_channel_del
(
&
drm
->
channel
);
...
...
@@ -412,17 +410,6 @@ nouveau_accel_init(struct nouveau_drm *drm)
BEGIN_NV04
(
drm
->
channel
,
NvSubSw
,
0
,
1
);
OUT_RING
(
drm
->
channel
,
drm
->
nvsw
.
handle
);
}
ret
=
nvif_notify_init
(
&
drm
->
nvsw
,
nouveau_flip_complete
,
false
,
NV04_NVSW_NTFY_UEVENT
,
NULL
,
0
,
0
,
&
drm
->
flip
);
if
(
ret
==
0
)
ret
=
nvif_notify_get
(
&
drm
->
flip
);
if
(
ret
)
{
nouveau_accel_fini
(
drm
);
return
;
}
}
if
(
ret
)
{
...
...
drivers/gpu/drm/nouveau/nouveau_drv.h
浏览文件 @
fcd6f048
...
...
@@ -181,7 +181,6 @@ struct nouveau_drm {
struct
nouveau_fbdev
*
fbcon
;
struct
nvif_object
nvsw
;
struct
nvif_object
ntfy
;
struct
nvif_notify
flip
;
/* nv10-nv40 tiling regions */
struct
{
...
...
drivers/gpu/drm/nouveau/nouveau_fence.h
浏览文件 @
fcd6f048
...
...
@@ -82,8 +82,6 @@ int nv50_fence_create(struct nouveau_drm *);
int
nv84_fence_create
(
struct
nouveau_drm
*
);
int
nvc0_fence_create
(
struct
nouveau_drm
*
);
int
nouveau_flip_complete
(
struct
nvif_notify
*
);
struct
nv84_fence_chan
{
struct
nouveau_fence_chan
base
;
struct
nouveau_vma
*
vma
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录