Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
2984506f
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看板
提交
2984506f
编写于
10月 15, 2013
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/bus: add interfaces/helpers for sequencer
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
48ae0b35
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
371 addition
and
15 deletion
+371
-15
drivers/gpu/drm/nouveau/Makefile
drivers/gpu/drm/nouveau/Makefile
+1
-0
drivers/gpu/drm/nouveau/core/engine/device/nv50.c
drivers/gpu/drm/nouveau/core/engine/device/nv50.c
+10
-10
drivers/gpu/drm/nouveau/core/include/subdev/bus.h
drivers/gpu/drm/nouveau/core/include/subdev/bus.h
+12
-0
drivers/gpu/drm/nouveau/core/subdev/bus/hwsq.c
drivers/gpu/drm/nouveau/core/subdev/bus/hwsq.c
+145
-0
drivers/gpu/drm/nouveau/core/subdev/bus/hwsq.h
drivers/gpu/drm/nouveau/core/subdev/bus/hwsq.h
+113
-0
drivers/gpu/drm/nouveau/core/subdev/bus/nv04.c
drivers/gpu/drm/nouveau/core/subdev/bus/nv04.c
+2
-0
drivers/gpu/drm/nouveau/core/subdev/bus/nv04.h
drivers/gpu/drm/nouveau/core/subdev/bus/nv04.h
+7
-3
drivers/gpu/drm/nouveau/core/subdev/bus/nv50.c
drivers/gpu/drm/nouveau/core/subdev/bus/nv50.c
+22
-2
drivers/gpu/drm/nouveau/core/subdev/bus/nv94.c
drivers/gpu/drm/nouveau/core/subdev/bus/nv94.c
+59
-0
未找到文件。
drivers/gpu/drm/nouveau/Makefile
浏览文件 @
2984506f
...
...
@@ -44,6 +44,7 @@ nouveau-y += core/subdev/bios/xpio.o
nouveau-y
+=
core/subdev/bus/nv04.o
nouveau-y
+=
core/subdev/bus/nv31.o
nouveau-y
+=
core/subdev/bus/nv50.o
nouveau-y
+=
core/subdev/bus/nv94.o
nouveau-y
+=
core/subdev/bus/nvc0.o
nouveau-y
+=
core/subdev/clock/nv04.o
nouveau-y
+=
core/subdev/clock/nv40.o
...
...
drivers/gpu/drm/nouveau/core/engine/device/nv50.c
浏览文件 @
2984506f
...
...
@@ -166,7 +166,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nv50_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv94_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nv84_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -192,7 +192,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nv50_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv94_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nv84_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -218,7 +218,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nv50_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nv84_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -244,7 +244,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nv50_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nv84_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -270,7 +270,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nv50_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nvaa_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -296,7 +296,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nv50_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nvaa_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -322,7 +322,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nva3_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nva3_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -350,7 +350,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nva3_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nva3_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -377,7 +377,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nva3_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nva3_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
@@ -404,7 +404,7 @@ nv50_identify(struct nouveau_device *device)
device
->
oclass
[
NVDEV_SUBDEV_MXM
]
=
&
nv50_mxm_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_DEVINIT
]
=
&
nva3_devinit_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_MC
]
=
nv98_mc_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
50
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_BUS
]
=
nv
94
_bus_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_TIMER
]
=
&
nv04_timer_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_FB
]
=
nvaf_fb_oclass
;
device
->
oclass
[
NVDEV_SUBDEV_INSTMEM
]
=
&
nv50_instmem_oclass
;
...
...
drivers/gpu/drm/nouveau/core/include/subdev/bus.h
浏览文件 @
2984506f
...
...
@@ -11,6 +11,8 @@ struct nouveau_bus_intr {
struct
nouveau_bus
{
struct
nouveau_subdev
base
;
int
(
*
hwsq_exec
)(
struct
nouveau_bus
*
,
u32
*
,
u32
);
u32
hwsq_size
;
};
static
inline
struct
nouveau_bus
*
...
...
@@ -36,6 +38,16 @@ nouveau_bus(void *obj)
extern
struct
nouveau_oclass
*
nv04_bus_oclass
;
extern
struct
nouveau_oclass
*
nv31_bus_oclass
;
extern
struct
nouveau_oclass
*
nv50_bus_oclass
;
extern
struct
nouveau_oclass
*
nv94_bus_oclass
;
extern
struct
nouveau_oclass
*
nvc0_bus_oclass
;
/* interface to sequencer */
struct
nouveau_hwsq
;
int
nouveau_hwsq_init
(
struct
nouveau_bus
*
,
struct
nouveau_hwsq
**
);
int
nouveau_hwsq_fini
(
struct
nouveau_hwsq
**
,
bool
exec
);
void
nouveau_hwsq_wr32
(
struct
nouveau_hwsq
*
,
u32
addr
,
u32
data
);
void
nouveau_hwsq_setf
(
struct
nouveau_hwsq
*
,
u8
flag
,
int
data
);
void
nouveau_hwsq_wait
(
struct
nouveau_hwsq
*
,
u8
flag
,
u8
data
);
void
nouveau_hwsq_nsec
(
struct
nouveau_hwsq
*
,
u32
nsec
);
#endif
drivers/gpu/drm/nouveau/core/subdev/bus/hwsq.c
0 → 100644
浏览文件 @
2984506f
/*
* Copyright 2013 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>
*/
#include <subdev/timer.h>
#include <subdev/bus.h>
struct
nouveau_hwsq
{
struct
nouveau_bus
*
pbus
;
u32
addr
;
u32
data
;
struct
{
u8
data
[
512
];
u8
size
;
}
c
;
};
static
void
hwsq_cmd
(
struct
nouveau_hwsq
*
hwsq
,
int
size
,
u8
data
[])
{
memcpy
(
&
hwsq
->
c
.
data
[
hwsq
->
c
.
size
],
data
,
size
*
sizeof
(
data
[
0
]));
hwsq
->
c
.
size
+=
size
;
}
int
nouveau_hwsq_init
(
struct
nouveau_bus
*
pbus
,
struct
nouveau_hwsq
**
phwsq
)
{
struct
nouveau_hwsq
*
hwsq
;
hwsq
=
*
phwsq
=
kmalloc
(
sizeof
(
*
hwsq
),
GFP_KERNEL
);
if
(
hwsq
)
{
hwsq
->
pbus
=
pbus
;
hwsq
->
addr
=
~
0
;
hwsq
->
data
=
~
0
;
memset
(
hwsq
->
c
.
data
,
0x7f
,
sizeof
(
hwsq
->
c
.
data
));
hwsq
->
c
.
size
=
0
;
}
return
hwsq
?
0
:
-
ENOMEM
;
}
int
nouveau_hwsq_fini
(
struct
nouveau_hwsq
**
phwsq
,
bool
exec
)
{
struct
nouveau_hwsq
*
hwsq
=
*
phwsq
;
int
ret
=
0
,
i
;
if
(
hwsq
)
{
struct
nouveau_bus
*
pbus
=
hwsq
->
pbus
;
hwsq
->
c
.
size
=
(
hwsq
->
c
.
size
+
4
)
/
4
;
if
(
hwsq
->
c
.
size
<=
pbus
->
hwsq_size
)
{
if
(
exec
)
ret
=
pbus
->
hwsq_exec
(
pbus
,
(
u32
*
)
hwsq
->
c
.
data
,
hwsq
->
c
.
size
);
if
(
ret
)
nv_error
(
pbus
,
"hwsq exec failed: %d
\n
"
,
ret
);
}
else
{
nv_error
(
pbus
,
"hwsq ucode too large
\n
"
);
ret
=
-
ENOSPC
;
}
for
(
i
=
0
;
ret
&&
i
<
hwsq
->
c
.
size
;
i
++
)
nv_error
(
pbus
,
"
\t
0x%08x
\n
"
,
((
u32
*
)
hwsq
->
c
.
data
)[
i
]);
*
phwsq
=
NULL
;
kfree
(
hwsq
);
}
return
ret
;
}
void
nouveau_hwsq_wr32
(
struct
nouveau_hwsq
*
hwsq
,
u32
addr
,
u32
data
)
{
nv_debug
(
hwsq
->
pbus
,
"R[%06x] = 0x%08x
\n
"
,
addr
,
data
);
if
(
hwsq
->
data
!=
data
)
{
if
((
data
&
0xffff0000
)
!=
(
hwsq
->
data
&
0xffff0000
))
{
hwsq_cmd
(
hwsq
,
5
,
(
u8
[]){
0xe2
,
data
,
data
>>
8
,
data
>>
16
,
data
>>
24
});
}
else
{
hwsq_cmd
(
hwsq
,
3
,
(
u8
[]){
0x42
,
data
,
data
>>
8
});
}
}
if
((
addr
&
0xffff0000
)
!=
(
hwsq
->
addr
&
0xffff0000
))
{
hwsq_cmd
(
hwsq
,
5
,
(
u8
[]){
0xe0
,
addr
,
addr
>>
8
,
addr
>>
16
,
addr
>>
24
});
}
else
{
hwsq_cmd
(
hwsq
,
3
,
(
u8
[]){
0x40
,
addr
,
addr
>>
8
});
}
hwsq
->
addr
=
addr
;
hwsq
->
data
=
data
;
}
void
nouveau_hwsq_setf
(
struct
nouveau_hwsq
*
hwsq
,
u8
flag
,
int
data
)
{
nv_debug
(
hwsq
->
pbus
,
" FLAG[%02x] = %d
\n
"
,
flag
,
data
);
flag
+=
0x80
;
if
(
data
>=
0
)
flag
+=
0x20
;
if
(
data
>=
1
)
flag
+=
0x20
;
hwsq_cmd
(
hwsq
,
1
,
(
u8
[]){
flag
});
}
void
nouveau_hwsq_wait
(
struct
nouveau_hwsq
*
hwsq
,
u8
flag
,
u8
data
)
{
nv_debug
(
hwsq
->
pbus
,
" WAIT[%02x] = %d
\n
"
,
flag
,
data
);
hwsq_cmd
(
hwsq
,
3
,
(
u8
[]){
0x5f
,
flag
,
data
});
}
void
nouveau_hwsq_nsec
(
struct
nouveau_hwsq
*
hwsq
,
u32
nsec
)
{
u8
shift
=
0
,
usec
=
nsec
/
1000
;
while
(
usec
&
~
3
)
{
usec
>>=
2
;
shift
++
;
}
nv_debug
(
hwsq
->
pbus
,
" DELAY = %d ns
\n
"
,
nsec
);
hwsq_cmd
(
hwsq
,
1
,
(
u8
[]){
0x00
|
(
shift
<<
2
)
|
usec
});
}
drivers/gpu/drm/nouveau/core/subdev/bus/hwsq.h
0 → 100644
浏览文件 @
2984506f
#ifndef __NVKM_BUS_HWSQ_H__
#define __NVKM_BUS_HWSQ_H__
#include <subdev/bus.h>
struct
hwsq
{
struct
nouveau_subdev
*
subdev
;
struct
nouveau_hwsq
*
hwsq
;
int
sequence
;
};
struct
hwsq_reg
{
int
sequence
;
bool
force
;
u32
addr
[
2
];
u32
data
;
};
static
inline
struct
hwsq_reg
hwsq_reg2
(
u32
addr1
,
u32
addr2
)
{
return
(
struct
hwsq_reg
)
{
.
sequence
=
0
,
.
force
=
0
,
.
addr
=
{
addr1
,
addr2
},
.
data
=
0xdeadbeef
,
};
}
static
inline
struct
hwsq_reg
hwsq_reg
(
u32
addr
)
{
return
hwsq_reg2
(
addr
,
addr
);
}
static
inline
int
hwsq_init
(
struct
hwsq
*
ram
,
struct
nouveau_subdev
*
subdev
)
{
struct
nouveau_bus
*
pbus
=
nouveau_bus
(
subdev
);
int
ret
;
ret
=
nouveau_hwsq_init
(
pbus
,
&
ram
->
hwsq
);
if
(
ret
)
return
ret
;
ram
->
sequence
++
;
ram
->
subdev
=
subdev
;
return
0
;
}
static
inline
int
hwsq_exec
(
struct
hwsq
*
ram
,
bool
exec
)
{
int
ret
=
0
;
if
(
ram
->
subdev
)
{
ret
=
nouveau_hwsq_fini
(
&
ram
->
hwsq
,
exec
);
ram
->
subdev
=
NULL
;
}
return
ret
;
}
static
inline
u32
hwsq_rd32
(
struct
hwsq
*
ram
,
struct
hwsq_reg
*
reg
)
{
if
(
reg
->
sequence
!=
ram
->
sequence
)
reg
->
data
=
nv_rd32
(
ram
->
subdev
,
reg
->
addr
[
0
]);
return
reg
->
data
;
}
static
inline
void
hwsq_wr32
(
struct
hwsq
*
ram
,
struct
hwsq_reg
*
reg
,
u32
data
)
{
reg
->
sequence
=
ram
->
sequence
;
reg
->
data
=
data
;
if
(
reg
->
addr
[
0
]
!=
reg
->
addr
[
1
])
nouveau_hwsq_wr32
(
ram
->
hwsq
,
reg
->
addr
[
1
],
reg
->
data
);
nouveau_hwsq_wr32
(
ram
->
hwsq
,
reg
->
addr
[
0
],
reg
->
data
);
}
static
inline
void
hwsq_nuke
(
struct
hwsq
*
ram
,
struct
hwsq_reg
*
reg
)
{
reg
->
force
=
true
;
}
static
inline
u32
hwsq_mask
(
struct
hwsq
*
ram
,
struct
hwsq_reg
*
reg
,
u32
mask
,
u32
data
)
{
u32
temp
=
hwsq_rd32
(
ram
,
reg
);
if
(
temp
!=
((
temp
&
~
mask
)
|
data
)
||
reg
->
force
)
hwsq_wr32
(
ram
,
reg
,
(
temp
&
~
mask
)
|
data
);
return
temp
;
}
static
inline
void
hwsq_setf
(
struct
hwsq
*
ram
,
u8
flag
,
int
data
)
{
nouveau_hwsq_setf
(
ram
->
hwsq
,
flag
,
data
);
}
static
inline
void
hwsq_wait
(
struct
hwsq
*
ram
,
u8
flag
,
u8
data
)
{
nouveau_hwsq_wait
(
ram
->
hwsq
,
flag
,
data
);
}
static
inline
void
hwsq_nsec
(
struct
hwsq
*
ram
,
u32
nsec
)
{
nouveau_hwsq_nsec
(
ram
->
hwsq
,
nsec
);
}
#endif
drivers/gpu/drm/nouveau/core/subdev/bus/nv04.c
浏览文件 @
2984506f
...
...
@@ -77,6 +77,8 @@ nv04_bus_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
return
ret
;
nv_subdev
(
priv
)
->
intr
=
impl
->
intr
;
priv
->
base
.
hwsq_exec
=
impl
->
hwsq_exec
;
priv
->
base
.
hwsq_size
=
impl
->
hwsq_size
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/core/subdev/bus/nv04.h
浏览文件 @
2984506f
...
...
@@ -7,13 +7,17 @@ struct nv04_bus_priv {
struct
nouveau_bus
base
;
};
int
nv04_bus_ctor
(
struct
nouveau_object
*
,
struct
nouveau_object
*
,
struct
nouveau_oclass
*
,
void
*
,
u32
,
struct
nouveau_object
**
);
int
nv04_bus_ctor
(
struct
nouveau_object
*
,
struct
nouveau_object
*
,
struct
nouveau_oclass
*
,
void
*
,
u32
,
struct
nouveau_object
**
);
int
nv50_bus_init
(
struct
nouveau_object
*
);
void
nv50_bus_intr
(
struct
nouveau_subdev
*
);
struct
nv04_bus_impl
{
struct
nouveau_oclass
base
;
void
(
*
intr
)(
struct
nouveau_subdev
*
);
int
(
*
hwsq_exec
)(
struct
nouveau_bus
*
,
u32
*
,
u32
);
u32
hwsq_size
;
};
#endif
drivers/gpu/drm/nouveau/core/subdev/bus/nv50.c
浏览文件 @
2984506f
...
...
@@ -23,9 +23,27 @@
* Ben Skeggs
*/
#include <subdev/timer.h>
#include "nv04.h"
static
void
static
int
nv50_bus_hwsq_exec
(
struct
nouveau_bus
*
pbus
,
u32
*
data
,
u32
size
)
{
struct
nv50_bus_priv
*
priv
=
(
void
*
)
pbus
;
int
i
;
nv_mask
(
pbus
,
0x001098
,
0x00000008
,
0x00000000
);
nv_wr32
(
pbus
,
0x001304
,
0x00000000
);
for
(
i
=
0
;
i
<
size
;
i
++
)
nv_wr32
(
priv
,
0x001400
+
(
i
*
4
),
data
[
i
]);
nv_mask
(
pbus
,
0x001098
,
0x00000018
,
0x00000018
);
nv_wr32
(
pbus
,
0x00130c
,
0x00000003
);
return
nv_wait
(
pbus
,
0x001308
,
0x00000100
,
0x00000000
)
?
0
:
-
ETIMEDOUT
;
}
void
nv50_bus_intr
(
struct
nouveau_subdev
*
subdev
)
{
struct
nouveau_bus
*
pbus
=
nouveau_bus
(
subdev
);
...
...
@@ -57,7 +75,7 @@ nv50_bus_intr(struct nouveau_subdev *subdev)
}
}
static
int
int
nv50_bus_init
(
struct
nouveau_object
*
object
)
{
struct
nv04_bus_priv
*
priv
=
(
void
*
)
object
;
...
...
@@ -82,4 +100,6 @@ nv50_bus_oclass = &(struct nv04_bus_impl) {
.
fini
=
_nouveau_bus_fini
,
},
.
intr
=
nv50_bus_intr
,
.
hwsq_exec
=
nv50_bus_hwsq_exec
,
.
hwsq_size
=
64
,
}.
base
;
drivers/gpu/drm/nouveau/core/subdev/bus/nv94.c
0 → 100644
浏览文件 @
2984506f
/*
* Copyright 2012 Nouveau Community
*
* 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: Martin Peres <martin.peres@labri.fr>
* Ben Skeggs
*/
#include <subdev/timer.h>
#include "nv04.h"
static
int
nv94_bus_hwsq_exec
(
struct
nouveau_bus
*
pbus
,
u32
*
data
,
u32
size
)
{
struct
nv50_bus_priv
*
priv
=
(
void
*
)
pbus
;
int
i
;
nv_mask
(
pbus
,
0x001098
,
0x00000008
,
0x00000000
);
nv_wr32
(
pbus
,
0x001304
,
0x00000000
);
nv_wr32
(
pbus
,
0x001318
,
0x00000000
);
for
(
i
=
0
;
i
<
size
;
i
++
)
nv_wr32
(
priv
,
0x080000
+
(
i
*
4
),
data
[
i
]);
nv_mask
(
pbus
,
0x001098
,
0x00000018
,
0x00000018
);
nv_wr32
(
pbus
,
0x00130c
,
0x00000001
);
return
nv_wait
(
pbus
,
0x001308
,
0x00000100
,
0x00000000
)
?
0
:
-
ETIMEDOUT
;
}
struct
nouveau_oclass
*
nv94_bus_oclass
=
&
(
struct
nv04_bus_impl
)
{
.
base
.
handle
=
NV_SUBDEV
(
BUS
,
0x94
),
.
base
.
ofuncs
=
&
(
struct
nouveau_ofuncs
)
{
.
ctor
=
nv04_bus_ctor
,
.
dtor
=
_nouveau_bus_dtor
,
.
init
=
nv50_bus_init
,
.
fini
=
_nouveau_bus_fini
,
},
.
intr
=
nv50_bus_intr
,
.
hwsq_exec
=
nv94_bus_hwsq_exec
,
.
hwsq_size
=
128
,
}.
base
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录