Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
8eaa9669
cloud-kernel
项目概览
openanolis
/
cloud-kernel
1 年多 前同步成功
通知
160
Star
36
Fork
7
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
10
列表
看板
标记
里程碑
合并请求
2
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
cloud-kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
10
Issue
10
列表
看板
标记
里程碑
合并请求
2
合并请求
2
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
8eaa9669
编写于
7月 06, 2011
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nvd0/disp: dac encoder module
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
a36f04c0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
137 addition
and
0 deletion
+137
-0
drivers/gpu/drm/nouveau/nvd0_display.c
drivers/gpu/drm/nouveau/nvd0_display.c
+137
-0
未找到文件。
drivers/gpu/drm/nouveau/nvd0_display.c
浏览文件 @
8eaa9669
...
...
@@ -546,6 +546,140 @@ nvd0_crtc_create(struct drm_device *dev, int index)
/******************************************************************************
* DAC
*****************************************************************************/
static
void
nvd0_dac_dpms
(
struct
drm_encoder
*
encoder
,
int
mode
)
{
struct
nouveau_encoder
*
nv_encoder
=
nouveau_encoder
(
encoder
);
struct
drm_device
*
dev
=
encoder
->
dev
;
int
or
=
nv_encoder
->
or
;
u32
dpms_ctrl
;
dpms_ctrl
=
0x80000000
;
if
(
mode
==
DRM_MODE_DPMS_STANDBY
||
mode
==
DRM_MODE_DPMS_OFF
)
dpms_ctrl
|=
0x00000001
;
if
(
mode
==
DRM_MODE_DPMS_SUSPEND
||
mode
==
DRM_MODE_DPMS_OFF
)
dpms_ctrl
|=
0x00000004
;
nv_wait
(
dev
,
0x61a004
+
(
or
*
0x0800
),
0x80000000
,
0x00000000
);
nv_mask
(
dev
,
0x61a004
+
(
or
*
0x0800
),
0xc000007f
,
dpms_ctrl
);
nv_wait
(
dev
,
0x61a004
+
(
or
*
0x0800
),
0x80000000
,
0x00000000
);
}
static
bool
nvd0_dac_mode_fixup
(
struct
drm_encoder
*
encoder
,
struct
drm_display_mode
*
mode
,
struct
drm_display_mode
*
adjusted_mode
)
{
struct
nouveau_encoder
*
nv_encoder
=
nouveau_encoder
(
encoder
);
struct
nouveau_connector
*
nv_connector
;
nv_connector
=
nouveau_encoder_connector_get
(
nv_encoder
);
if
(
nv_connector
&&
nv_connector
->
native_mode
)
{
if
(
nv_connector
->
scaling_mode
!=
DRM_MODE_SCALE_NONE
)
{
int
id
=
adjusted_mode
->
base
.
id
;
*
adjusted_mode
=
*
nv_connector
->
native_mode
;
adjusted_mode
->
base
.
id
=
id
;
}
}
return
true
;
}
static
void
nvd0_dac_prepare
(
struct
drm_encoder
*
encoder
)
{
}
static
void
nvd0_dac_commit
(
struct
drm_encoder
*
encoder
)
{
}
static
void
nvd0_dac_mode_set
(
struct
drm_encoder
*
encoder
,
struct
drm_display_mode
*
mode
,
struct
drm_display_mode
*
adjusted_mode
)
{
struct
nouveau_encoder
*
nv_encoder
=
nouveau_encoder
(
encoder
);
struct
nouveau_crtc
*
nv_crtc
=
nouveau_crtc
(
encoder
->
crtc
);
u32
*
push
;
nvd0_dac_dpms
(
encoder
,
DRM_MODE_DPMS_ON
);
push
=
evo_wait
(
encoder
->
dev
,
0
,
2
);
if
(
push
)
{
evo_mthd
(
push
,
0x0180
+
(
nv_encoder
->
or
*
0x20
),
1
);
evo_data
(
push
,
1
<<
nv_crtc
->
index
);
evo_kick
(
push
,
encoder
->
dev
,
0
);
}
nv_encoder
->
crtc
=
encoder
->
crtc
;
}
static
void
nvd0_dac_disconnect
(
struct
drm_encoder
*
encoder
)
{
struct
nouveau_encoder
*
nv_encoder
=
nouveau_encoder
(
encoder
);
struct
drm_device
*
dev
=
encoder
->
dev
;
u32
*
push
;
if
(
nv_encoder
->
crtc
)
{
nvd0_crtc_prepare
(
nv_encoder
->
crtc
);
push
=
evo_wait
(
dev
,
0
,
4
);
if
(
push
)
{
evo_mthd
(
push
,
0x0180
+
(
nv_encoder
->
or
*
0x20
),
1
);
evo_data
(
push
,
0x00000000
);
evo_mthd
(
push
,
0x0080
,
1
);
evo_data
(
push
,
0x00000000
);
evo_kick
(
push
,
dev
,
0
);
}
nv_encoder
->
crtc
=
NULL
;
}
}
static
void
nvd0_dac_destroy
(
struct
drm_encoder
*
encoder
)
{
drm_encoder_cleanup
(
encoder
);
kfree
(
encoder
);
}
static
const
struct
drm_encoder_helper_funcs
nvd0_dac_hfunc
=
{
.
dpms
=
nvd0_dac_dpms
,
.
mode_fixup
=
nvd0_dac_mode_fixup
,
.
prepare
=
nvd0_dac_prepare
,
.
commit
=
nvd0_dac_commit
,
.
mode_set
=
nvd0_dac_mode_set
,
.
disable
=
nvd0_dac_disconnect
,
.
get_crtc
=
nvd0_display_crtc_get
,
};
static
const
struct
drm_encoder_funcs
nvd0_dac_func
=
{
.
destroy
=
nvd0_dac_destroy
,
};
static
int
nvd0_dac_create
(
struct
drm_connector
*
connector
,
struct
dcb_entry
*
dcbe
)
{
struct
drm_device
*
dev
=
connector
->
dev
;
struct
nouveau_encoder
*
nv_encoder
;
struct
drm_encoder
*
encoder
;
nv_encoder
=
kzalloc
(
sizeof
(
*
nv_encoder
),
GFP_KERNEL
);
if
(
!
nv_encoder
)
return
-
ENOMEM
;
nv_encoder
->
dcb
=
dcbe
;
nv_encoder
->
or
=
ffs
(
dcbe
->
or
)
-
1
;
encoder
=
to_drm_encoder
(
nv_encoder
);
encoder
->
possible_crtcs
=
dcbe
->
heads
;
encoder
->
possible_clones
=
0
;
drm_encoder_init
(
dev
,
encoder
,
&
nvd0_dac_func
,
DRM_MODE_ENCODER_DAC
);
drm_encoder_helper_add
(
encoder
,
&
nvd0_dac_hfunc
);
drm_mode_connector_attach_encoder
(
connector
,
encoder
);
return
0
;
}
/******************************************************************************
* SOR
...
...
@@ -983,6 +1117,9 @@ nvd0_display_create(struct drm_device *dev)
case
OUTPUT_TMDS
:
nvd0_sor_create
(
connector
,
dcbe
);
break
;
case
OUTPUT_ANALOG
:
nvd0_dac_create
(
connector
,
dcbe
);
break
;
default:
NV_WARN
(
dev
,
"skipping unsupported encoder %d/%d
\n
"
,
dcbe
->
type
,
ffs
(
dcbe
->
or
)
-
1
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录