Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
raspberrypi-kernel
提交
ddbaf79a
R
raspberrypi-kernel
项目概览
openeuler
/
raspberrypi-kernel
通知
13
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
raspberrypi-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
ddbaf79a
编写于
11月 24, 2010
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nvc0: implement fbcon acceleration
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
966a5b7d
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
300 addition
and
6 deletion
+300
-6
drivers/gpu/drm/nouveau/Makefile
drivers/gpu/drm/nouveau/Makefile
+3
-2
drivers/gpu/drm/nouveau/nouveau_fbcon.c
drivers/gpu/drm/nouveau/nouveau_fbcon.c
+20
-4
drivers/gpu/drm/nouveau/nouveau_fbcon.h
drivers/gpu/drm/nouveau/nouveau_fbcon.h
+6
-0
drivers/gpu/drm/nouveau/nvc0_fbcon.c
drivers/gpu/drm/nouveau/nvc0_fbcon.c
+271
-0
未找到文件。
drivers/gpu/drm/nouveau/Makefile
浏览文件 @
ddbaf79a
...
...
@@ -22,9 +22,10 @@ nouveau-y := nouveau_drv.o nouveau_state.o nouveau_channel.o nouveau_mem.o \
nv84_crypt.o
\
nv04_instmem.o nv50_instmem.o nvc0_instmem.o
\
nv50_evo.o nv50_crtc.o nv50_dac.o nv50_sor.o
\
nv50_cursor.o nv50_display.o
nv50_fbcon.o
\
nv50_cursor.o nv50_display.o
\
nv04_dac.o nv04_dfp.o nv04_tv.o nv17_tv.o nv17_tv_modes.o
\
nv04_crtc.o nv04_display.o nv04_cursor.o nv04_fbcon.o
\
nv04_crtc.o nv04_display.o nv04_cursor.o
\
nv04_fbcon.o nv50_fbcon.o nvc0_fbcon.o
\
nv10_gpio.o nv50_gpio.o
\
nv50_calc.o
\
nv04_pm.o nv50_pm.o nva3_pm.o
\
...
...
drivers/gpu/drm/nouveau/nouveau_fbcon.c
浏览文件 @
ddbaf79a
...
...
@@ -68,6 +68,8 @@ nouveau_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
else
if
(
dev_priv
->
card_type
<
NV_C0
)
ret
=
nv50_fbcon_fillrect
(
info
,
rect
);
else
ret
=
nvc0_fbcon_fillrect
(
info
,
rect
);
mutex_unlock
(
&
dev_priv
->
channel
->
mutex
);
}
...
...
@@ -98,6 +100,8 @@ nouveau_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *image)
else
if
(
dev_priv
->
card_type
<
NV_C0
)
ret
=
nv50_fbcon_copyarea
(
info
,
image
);
else
ret
=
nvc0_fbcon_copyarea
(
info
,
image
);
mutex_unlock
(
&
dev_priv
->
channel
->
mutex
);
}
...
...
@@ -128,6 +132,8 @@ nouveau_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
else
if
(
dev_priv
->
card_type
<
NV_C0
)
ret
=
nv50_fbcon_imageblit
(
info
,
image
);
else
ret
=
nvc0_fbcon_imageblit
(
info
,
image
);
mutex_unlock
(
&
dev_priv
->
channel
->
mutex
);
}
...
...
@@ -163,10 +169,18 @@ nouveau_fbcon_sync(struct fb_info *info)
return
0
;
}
BEGIN_RING
(
chan
,
0
,
0x0104
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_RING
(
chan
,
0
,
0x0100
,
1
);
OUT_RING
(
chan
,
0
);
if
(
dev_priv
->
card_type
>=
NV_C0
)
{
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x010c
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0100
,
1
);
OUT_RING
(
chan
,
0
);
}
else
{
BEGIN_RING
(
chan
,
0
,
0x0104
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_RING
(
chan
,
0
,
0x0100
,
1
);
OUT_RING
(
chan
,
0
);
}
nouveau_bo_wr32
(
chan
->
notifier_bo
,
chan
->
m2mf_ntfy
+
3
,
0xffffffff
);
FIRE_RING
(
chan
);
mutex_unlock
(
&
chan
->
mutex
);
...
...
@@ -374,6 +388,8 @@ nouveau_fbcon_create(struct nouveau_fbdev *nfbdev,
else
if
(
dev_priv
->
card_type
<
NV_C0
)
ret
=
nv50_fbcon_accel_init
(
info
);
else
ret
=
nvc0_fbcon_accel_init
(
info
);
if
(
ret
==
0
)
info
->
fbops
=
&
nouveau_fbcon_ops
;
...
...
drivers/gpu/drm/nouveau/nouveau_fbcon.h
浏览文件 @
ddbaf79a
...
...
@@ -44,11 +44,17 @@ int nv04_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region);
int
nv04_fbcon_fillrect
(
struct
fb_info
*
info
,
const
struct
fb_fillrect
*
rect
);
int
nv04_fbcon_imageblit
(
struct
fb_info
*
info
,
const
struct
fb_image
*
image
);
int
nv04_fbcon_accel_init
(
struct
fb_info
*
info
);
int
nv50_fbcon_fillrect
(
struct
fb_info
*
info
,
const
struct
fb_fillrect
*
rect
);
int
nv50_fbcon_copyarea
(
struct
fb_info
*
info
,
const
struct
fb_copyarea
*
region
);
int
nv50_fbcon_imageblit
(
struct
fb_info
*
info
,
const
struct
fb_image
*
image
);
int
nv50_fbcon_accel_init
(
struct
fb_info
*
info
);
int
nvc0_fbcon_fillrect
(
struct
fb_info
*
info
,
const
struct
fb_fillrect
*
rect
);
int
nvc0_fbcon_copyarea
(
struct
fb_info
*
info
,
const
struct
fb_copyarea
*
region
);
int
nvc0_fbcon_imageblit
(
struct
fb_info
*
info
,
const
struct
fb_image
*
image
);
int
nvc0_fbcon_accel_init
(
struct
fb_info
*
info
);
void
nouveau_fbcon_gpu_lockup
(
struct
fb_info
*
info
);
int
nouveau_fbcon_init
(
struct
drm_device
*
dev
);
...
...
drivers/gpu/drm/nouveau/nvc0_fbcon.c
0 → 100644
浏览文件 @
ddbaf79a
/*
* Copyright 2010 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
*/
#include "drmP.h"
#include "nouveau_drv.h"
#include "nouveau_dma.h"
#include "nouveau_ramht.h"
#include "nouveau_fbcon.h"
#include "nouveau_mm.h"
int
nvc0_fbcon_fillrect
(
struct
fb_info
*
info
,
const
struct
fb_fillrect
*
rect
)
{
struct
nouveau_fbdev
*
nfbdev
=
info
->
par
;
struct
drm_device
*
dev
=
nfbdev
->
dev
;
struct
drm_nouveau_private
*
dev_priv
=
dev
->
dev_private
;
struct
nouveau_channel
*
chan
=
dev_priv
->
channel
;
int
ret
;
ret
=
RING_SPACE
(
chan
,
rect
->
rop
==
ROP_COPY
?
7
:
11
);
if
(
ret
)
return
ret
;
if
(
rect
->
rop
!=
ROP_COPY
)
{
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x02ac
,
1
);
OUT_RING
(
chan
,
1
);
}
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0588
,
1
);
if
(
info
->
fix
.
visual
==
FB_VISUAL_TRUECOLOR
||
info
->
fix
.
visual
==
FB_VISUAL_DIRECTCOLOR
)
OUT_RING
(
chan
,
((
uint32_t
*
)
info
->
pseudo_palette
)[
rect
->
color
]);
else
OUT_RING
(
chan
,
rect
->
color
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0600
,
4
);
OUT_RING
(
chan
,
rect
->
dx
);
OUT_RING
(
chan
,
rect
->
dy
);
OUT_RING
(
chan
,
rect
->
dx
+
rect
->
width
);
OUT_RING
(
chan
,
rect
->
dy
+
rect
->
height
);
if
(
rect
->
rop
!=
ROP_COPY
)
{
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x02ac
,
1
);
OUT_RING
(
chan
,
3
);
}
FIRE_RING
(
chan
);
return
0
;
}
int
nvc0_fbcon_copyarea
(
struct
fb_info
*
info
,
const
struct
fb_copyarea
*
region
)
{
struct
nouveau_fbdev
*
nfbdev
=
info
->
par
;
struct
drm_device
*
dev
=
nfbdev
->
dev
;
struct
drm_nouveau_private
*
dev_priv
=
dev
->
dev_private
;
struct
nouveau_channel
*
chan
=
dev_priv
->
channel
;
int
ret
;
ret
=
RING_SPACE
(
chan
,
12
);
if
(
ret
)
return
ret
;
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0110
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x08b0
,
4
);
OUT_RING
(
chan
,
region
->
dx
);
OUT_RING
(
chan
,
region
->
dy
);
OUT_RING
(
chan
,
region
->
width
);
OUT_RING
(
chan
,
region
->
height
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x08d0
,
4
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
region
->
sx
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
region
->
sy
);
FIRE_RING
(
chan
);
return
0
;
}
int
nvc0_fbcon_imageblit
(
struct
fb_info
*
info
,
const
struct
fb_image
*
image
)
{
struct
nouveau_fbdev
*
nfbdev
=
info
->
par
;
struct
drm_device
*
dev
=
nfbdev
->
dev
;
struct
drm_nouveau_private
*
dev_priv
=
dev
->
dev_private
;
struct
nouveau_channel
*
chan
=
dev_priv
->
channel
;
uint32_t
width
,
dwords
,
*
data
=
(
uint32_t
*
)
image
->
data
;
uint32_t
mask
=
~
(
~
0
>>
(
32
-
info
->
var
.
bits_per_pixel
));
uint32_t
*
palette
=
info
->
pseudo_palette
;
int
ret
;
if
(
image
->
depth
!=
1
)
return
-
ENODEV
;
ret
=
RING_SPACE
(
chan
,
11
);
if
(
ret
)
return
ret
;
width
=
ALIGN
(
image
->
width
,
32
);
dwords
=
(
width
*
image
->
height
)
>>
5
;
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0814
,
2
);
if
(
info
->
fix
.
visual
==
FB_VISUAL_TRUECOLOR
||
info
->
fix
.
visual
==
FB_VISUAL_DIRECTCOLOR
)
{
OUT_RING
(
chan
,
palette
[
image
->
bg_color
]
|
mask
);
OUT_RING
(
chan
,
palette
[
image
->
fg_color
]
|
mask
);
}
else
{
OUT_RING
(
chan
,
image
->
bg_color
);
OUT_RING
(
chan
,
image
->
fg_color
);
}
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0838
,
2
);
OUT_RING
(
chan
,
image
->
width
);
OUT_RING
(
chan
,
image
->
height
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0850
,
4
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
image
->
dx
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
image
->
dy
);
while
(
dwords
)
{
int
push
=
dwords
>
2047
?
2047
:
dwords
;
ret
=
RING_SPACE
(
chan
,
push
+
1
);
if
(
ret
)
return
ret
;
dwords
-=
push
;
BEGIN_NVC0
(
chan
,
6
,
NvSub2D
,
0x0860
,
push
);
OUT_RINGp
(
chan
,
data
,
push
);
data
+=
push
;
}
FIRE_RING
(
chan
);
return
0
;
}
int
nvc0_fbcon_accel_init
(
struct
fb_info
*
info
)
{
struct
nouveau_fbdev
*
nfbdev
=
info
->
par
;
struct
drm_device
*
dev
=
nfbdev
->
dev
;
struct
drm_nouveau_private
*
dev_priv
=
dev
->
dev_private
;
struct
nouveau_channel
*
chan
=
dev_priv
->
channel
;
struct
nouveau_bo
*
nvbo
=
nfbdev
->
nouveau_fb
.
nvbo
;
int
ret
,
format
;
ret
=
nouveau_gpuobj_gr_new
(
chan
,
0x902d
,
0x902d
);
if
(
ret
)
return
ret
;
switch
(
info
->
var
.
bits_per_pixel
)
{
case
8
:
format
=
0xf3
;
break
;
case
15
:
format
=
0xf8
;
break
;
case
16
:
format
=
0xe8
;
break
;
case
32
:
switch
(
info
->
var
.
transp
.
length
)
{
case
0
:
/* depth 24 */
case
8
:
/* depth 32, just use 24.. */
format
=
0xe6
;
break
;
case
2
:
/* depth 30 */
format
=
0xd1
;
break
;
default:
return
-
EINVAL
;
}
break
;
default:
return
-
EINVAL
;
}
ret
=
RING_SPACE
(
chan
,
60
);
if
(
ret
)
{
WARN_ON
(
1
);
nouveau_fbcon_gpu_lockup
(
info
);
return
ret
;
}
printk
(
KERN_ERR
"fb vma 0x%010llx
\n
"
,
nvbo
->
vma
.
offset
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0000
,
1
);
OUT_RING
(
chan
,
0x0000902d
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0104
,
2
);
OUT_RING
(
chan
,
upper_32_bits
(
chan
->
notifier_bo
->
bo
.
offset
));
OUT_RING
(
chan
,
lower_32_bits
(
chan
->
notifier_bo
->
bo
.
offset
));
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0290
,
1
);
OUT_RING
(
chan
,
0
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0888
,
1
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x02ac
,
1
);
OUT_RING
(
chan
,
3
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x02a0
,
1
);
OUT_RING
(
chan
,
0x55
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x08c0
,
4
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0580
,
2
);
OUT_RING
(
chan
,
4
);
OUT_RING
(
chan
,
format
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x02e8
,
2
);
OUT_RING
(
chan
,
2
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0804
,
1
);
OUT_RING
(
chan
,
format
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0800
,
1
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0808
,
3
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x081c
,
1
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0840
,
4
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0200
,
10
);
OUT_RING
(
chan
,
format
);
OUT_RING
(
chan
,
1
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
info
->
fix
.
line_length
);
OUT_RING
(
chan
,
info
->
var
.
xres_virtual
);
OUT_RING
(
chan
,
info
->
var
.
yres_virtual
);
OUT_RING
(
chan
,
upper_32_bits
(
nvbo
->
vma
.
offset
));
OUT_RING
(
chan
,
lower_32_bits
(
nvbo
->
vma
.
offset
));
BEGIN_NVC0
(
chan
,
2
,
NvSub2D
,
0x0230
,
10
);
OUT_RING
(
chan
,
format
);
OUT_RING
(
chan
,
1
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
1
);
OUT_RING
(
chan
,
0
);
OUT_RING
(
chan
,
info
->
fix
.
line_length
);
OUT_RING
(
chan
,
info
->
var
.
xres_virtual
);
OUT_RING
(
chan
,
info
->
var
.
yres_virtual
);
OUT_RING
(
chan
,
upper_32_bits
(
nvbo
->
vma
.
offset
));
OUT_RING
(
chan
,
lower_32_bits
(
nvbo
->
vma
.
offset
));
FIRE_RING
(
chan
);
return
0
;
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录