Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
cloud-kernel
提交
218f978d
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看板
提交
218f978d
编写于
8月 20, 2015
作者:
B
Ben Skeggs
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/nouveau/mpeg: convert user classes to new-style nvkm_object
Signed-off-by:
N
Ben Skeggs
<
bskeggs@redhat.com
>
上级
27f3d6cf
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
249 addition
and
333 deletion
+249
-333
drivers/gpu/drm/nouveau/include/nvif/class.h
drivers/gpu/drm/nouveau/include/nvif/class.h
+3
-0
drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h
drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h
+0
-24
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c
+11
-35
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
+96
-110
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h
+13
-6
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv40.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv40.c
+12
-15
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
+77
-61
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.c
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.c
+28
-82
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/priv.h
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/priv.h
+9
-0
未找到文件。
drivers/gpu/drm/nouveau/include/nvif/class.h
浏览文件 @
218f978d
...
...
@@ -45,6 +45,9 @@
#define GM107_DISP 0x00009470
#define GM204_DISP 0x00009570
#define NV31_MPEG 0x00003174
#define G82_MPEG 0x00008274
#define NV74_VP2 0x00007476
#define NV50_DISP_CURSOR 0x0000507a
...
...
drivers/gpu/drm/nouveau/include/nvkm/engine/mpeg.h
浏览文件 @
218f978d
#ifndef __NVKM_MPEG_H__
#define __NVKM_MPEG_H__
#include <core/engctx.h>
struct
nvkm_mpeg_chan
{
struct
nvkm_engctx
base
;
};
#define nvkm_mpeg_context_create(p,e,c,g,s,a,f,d) \
nvkm_engctx_create((p), (e), (c), (g), (s), (a), (f), (d))
#define nvkm_mpeg_context_destroy(d) \
nvkm_engctx_destroy(&(d)->base)
#define nvkm_mpeg_context_init(d) \
nvkm_engctx_init(&(d)->base)
#define nvkm_mpeg_context_fini(d,s) \
nvkm_engctx_fini(&(d)->base, (s))
#define _nvkm_mpeg_context_dtor _nvkm_engctx_dtor
#define _nvkm_mpeg_context_init _nvkm_engctx_init
#define _nvkm_mpeg_context_fini _nvkm_engctx_fini
#define _nvkm_mpeg_context_rd32 _nvkm_engctx_rd32
#define _nvkm_mpeg_context_wr32 _nvkm_engctx_wr32
#include <core/engine.h>
struct
nvkm_mpeg
{
...
...
@@ -45,9 +24,6 @@ extern struct nvkm_oclass nv40_mpeg_oclass;
extern
struct
nvkm_oclass
nv44_mpeg_oclass
;
extern
struct
nvkm_oclass
nv50_mpeg_oclass
;
extern
struct
nvkm_oclass
g84_mpeg_oclass
;
extern
struct
nvkm_ofuncs
nv31_mpeg_ofuncs
;
extern
struct
nvkm_oclass
nv31_mpeg_cclass
;
extern
struct
nvkm_oclass
nv31_mpeg_sclass
[];
extern
struct
nvkm_oclass
nv40_mpeg_sclass
[];
void
nv31_mpeg_intr
(
struct
nvkm_subdev
*
);
void
nv31_mpeg_tile_prog
(
struct
nvkm_engine
*
,
int
);
...
...
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/g84.c
浏览文件 @
218f978d
...
...
@@ -21,43 +21,19 @@
*
* Authors: Ben Skeggs
*/
#include
<engine/mpeg.h>
#include
"priv.h"
struct
g84_mpeg_chan
{
struct
nvkm_mpeg_chan
base
;
};
/*******************************************************************************
* MPEG object classes
******************************************************************************/
#include <nvif/class.h>
static
struct
nvkm_oclass
g84_mpeg_sclass
[]
=
{
{
0x8274
,
&
nv50_mpeg_ofuncs
},
{}
static
const
struct
nvkm_engine_func
g84_mpeg
=
{
.
cclass
=
&
nv50_mpeg_cclass
,
.
sclass
=
{
{
-
1
,
-
1
,
G82_MPEG
,
&
nv31_mpeg_object
},
{}
}
};
/*******************************************************************************
* PMPEG context
******************************************************************************/
static
struct
nvkm_oclass
g84_mpeg_cclass
=
{
.
handle
=
NV_ENGCTX
(
MPEG
,
0x84
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv50_mpeg_context_ctor
,
.
dtor
=
_nvkm_mpeg_context_dtor
,
.
init
=
_nvkm_mpeg_context_init
,
.
fini
=
_nvkm_mpeg_context_fini
,
.
rd32
=
_nvkm_mpeg_context_rd32
,
.
wr32
=
_nvkm_mpeg_context_wr32
,
},
};
/*******************************************************************************
* PMPEG engine/subdev functions
******************************************************************************/
static
int
g84_mpeg_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -71,10 +47,10 @@ g84_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
mpeg
->
engine
.
func
=
&
g84_mpeg
;
nv_subdev
(
mpeg
)
->
unit
=
0x00000002
;
nv_subdev
(
mpeg
)
->
intr
=
nv50_mpeg_intr
;
nv_engine
(
mpeg
)
->
cclass
=
&
g84_mpeg_cclass
;
nv_engine
(
mpeg
)
->
sclass
=
g84_mpeg_sclass
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.c
浏览文件 @
218f978d
...
...
@@ -26,33 +26,99 @@
#include <core/client.h>
#include <subdev/fb.h>
#include <subdev/timer.h>
#include <engine/fifo.h>
#include <nvif/class.h>
/*******************************************************************************
* MPEG object classes
******************************************************************************/
static
int
nv31_mpeg_object_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
nv31_mpeg_object_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
{
struct
nvkm_gpuobj
*
obj
;
int
ret
;
int
ret
=
nvkm_gpuobj_new
(
object
->
engine
->
subdev
.
device
,
16
,
align
,
false
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
nvkm_kmap
(
*
pgpuobj
);
nvkm_wo32
(
*
pgpuobj
,
0x00
,
object
->
oclass_name
);
nvkm_wo32
(
*
pgpuobj
,
0x04
,
0x00000000
);
nvkm_wo32
(
*
pgpuobj
,
0x08
,
0x00000000
);
nvkm_wo32
(
*
pgpuobj
,
0x0c
,
0x00000000
);
nvkm_done
(
*
pgpuobj
);
}
return
ret
;
}
ret
=
nvkm_gpuobj_create
(
parent
,
engine
,
oclass
,
0
,
parent
,
20
,
16
,
0
,
&
obj
);
*
pobject
=
nv_object
(
obj
);
if
(
ret
)
return
ret
;
const
struct
nvkm_object_func
nv31_mpeg_object
=
{
.
bind
=
nv31_mpeg_object_bind
,
};
nvkm_kmap
(
obj
);
nvkm_wo32
(
obj
,
0x00
,
nv_mclass
(
obj
));
nvkm_wo32
(
obj
,
0x04
,
0x00000000
);
nvkm_wo32
(
obj
,
0x08
,
0x00000000
);
nvkm_wo32
(
obj
,
0x0c
,
0x00000000
);
nvkm_done
(
obj
);
return
0
;
/*******************************************************************************
* PMPEG context
******************************************************************************/
static
void
*
nv31_mpeg_chan_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv31_mpeg_chan
*
chan
=
nv31_mpeg_chan
(
object
);
struct
nv31_mpeg
*
mpeg
=
chan
->
mpeg
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
if
(
mpeg
->
chan
==
chan
)
mpeg
->
chan
=
NULL
;
spin_unlock_irqrestore
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
return
chan
;
}
static
const
struct
nvkm_object_func
nv31_mpeg_chan
=
{
.
dtor
=
nv31_mpeg_chan_dtor
,
};
int
nv31_mpeg_chan_new
(
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv31_mpeg
*
mpeg
=
nv31_mpeg
(
oclass
->
engine
);
struct
nv31_mpeg_chan
*
chan
;
unsigned
long
flags
;
int
ret
=
-
EBUSY
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_object_ctor
(
&
nv31_mpeg_chan
,
oclass
,
&
chan
->
object
);
chan
->
mpeg
=
mpeg
;
chan
->
fifo
=
fifoch
;
*
pobject
=
&
chan
->
object
;
spin_lock_irqsave
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
if
(
!
mpeg
->
chan
)
{
mpeg
->
chan
=
chan
;
ret
=
0
;
}
spin_unlock_irqrestore
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
return
ret
;
}
/*******************************************************************************
* PMPEG engine/subdev functions
******************************************************************************/
void
nv31_mpeg_tile_prog
(
struct
nvkm_engine
*
engine
,
int
i
)
{
struct
nv31_mpeg
*
mpeg
=
(
void
*
)
engine
;
struct
nvkm_device
*
device
=
mpeg
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_fb_tile
*
tile
=
&
device
->
fb
->
tile
.
region
[
i
];
nvkm_wr32
(
device
,
0x00b008
+
(
i
*
0x10
),
tile
->
pitch
);
nvkm_wr32
(
device
,
0x00b004
+
(
i
*
0x10
),
tile
->
limit
);
nvkm_wr32
(
device
,
0x00b000
+
(
i
*
0x10
),
tile
->
addr
);
}
static
bool
...
...
@@ -109,95 +175,6 @@ nv31_mpeg_mthd(struct nv31_mpeg *mpeg, u32 mthd, u32 data)
return
false
;
}
struct
nvkm_ofuncs
nv31_mpeg_ofuncs
=
{
.
ctor
=
nv31_mpeg_object_ctor
,
.
dtor
=
_nvkm_gpuobj_dtor
,
.
init
=
_nvkm_gpuobj_init
,
.
fini
=
_nvkm_gpuobj_fini
,
.
rd32
=
_nvkm_gpuobj_rd32
,
.
wr32
=
_nvkm_gpuobj_wr32
,
};
struct
nvkm_oclass
nv31_mpeg_sclass
[]
=
{
{
0x3174
,
&
nv31_mpeg_ofuncs
},
{}
};
/*******************************************************************************
* PMPEG context
******************************************************************************/
static
int
nv31_mpeg_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nv31_mpeg
*
mpeg
=
(
void
*
)
engine
;
struct
nv31_mpeg_chan
*
chan
;
unsigned
long
flags
;
int
ret
;
ret
=
nvkm_object_create
(
parent
,
engine
,
oclass
,
0
,
&
chan
);
*
pobject
=
nv_object
(
chan
);
if
(
ret
)
return
ret
;
spin_lock_irqsave
(
&
nv_engine
(
mpeg
)
->
lock
,
flags
);
if
(
mpeg
->
chan
)
{
spin_unlock_irqrestore
(
&
nv_engine
(
mpeg
)
->
lock
,
flags
);
nvkm_object_destroy
(
&
chan
->
base
);
*
pobject
=
NULL
;
return
-
EBUSY
;
}
chan
->
fifo
=
nvkm_fifo_chan
(
parent
);
mpeg
->
chan
=
chan
;
spin_unlock_irqrestore
(
&
nv_engine
(
mpeg
)
->
lock
,
flags
);
return
0
;
}
static
void
nv31_mpeg_context_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv31_mpeg
*
mpeg
=
(
void
*
)
object
->
engine
;
struct
nv31_mpeg_chan
*
chan
=
(
void
*
)
object
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
nv_engine
(
mpeg
)
->
lock
,
flags
);
mpeg
->
chan
=
NULL
;
spin_unlock_irqrestore
(
&
nv_engine
(
mpeg
)
->
lock
,
flags
);
nvkm_object_destroy
(
&
chan
->
base
);
}
struct
nvkm_oclass
nv31_mpeg_cclass
=
{
.
handle
=
NV_ENGCTX
(
MPEG
,
0x31
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv31_mpeg_context_ctor
,
.
dtor
=
nv31_mpeg_context_dtor
,
.
init
=
_nvkm_object_init
,
.
fini
=
_nvkm_object_fini
,
},
};
/*******************************************************************************
* PMPEG engine/subdev functions
******************************************************************************/
void
nv31_mpeg_tile_prog
(
struct
nvkm_engine
*
engine
,
int
i
)
{
struct
nv31_mpeg
*
mpeg
=
(
void
*
)
engine
;
struct
nvkm_device
*
device
=
mpeg
->
base
.
engine
.
subdev
.
device
;
struct
nvkm_fb_tile
*
tile
=
&
device
->
fb
->
tile
.
region
[
i
];
nvkm_wr32
(
device
,
0x00b008
+
(
i
*
0x10
),
tile
->
pitch
);
nvkm_wr32
(
device
,
0x00b004
+
(
i
*
0x10
),
tile
->
limit
);
nvkm_wr32
(
device
,
0x00b000
+
(
i
*
0x10
),
tile
->
addr
);
}
void
nv31_mpeg_intr
(
struct
nvkm_subdev
*
subdev
)
{
...
...
@@ -231,13 +208,22 @@ nv31_mpeg_intr(struct nvkm_subdev *subdev)
if
(
show
)
{
nvkm_error
(
subdev
,
"ch %d [%s] %08x %08x %08x %08x
\n
"
,
mpeg
->
chan
?
mpeg
->
chan
->
fifo
->
chid
:
-
1
,
mpeg
->
chan
?
mpeg
->
chan
->
fifo
->
object
.
client
->
name
:
mpeg
->
chan
?
mpeg
->
chan
->
object
.
client
->
name
:
"unknown"
,
stat
,
type
,
mthd
,
data
);
}
spin_unlock_irqrestore
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
}
static
const
struct
nvkm_engine_func
nv31_mpeg
=
{
.
fifo
.
cclass
=
nv31_mpeg_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
NV31_MPEG
,
&
nv31_mpeg_object
},
{}
}
};
static
int
nv31_mpeg_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -251,11 +237,11 @@ nv31_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
mpeg
->
base
.
engine
.
func
=
&
nv31_mpeg
;
mpeg
->
mthd_dma
=
nv31_mpeg_mthd_dma
;
nv_subdev
(
mpeg
)
->
unit
=
0x00000002
;
nv_subdev
(
mpeg
)
->
intr
=
nv31_mpeg_intr
;
nv_engine
(
mpeg
)
->
cclass
=
&
nv31_mpeg_cclass
;
nv_engine
(
mpeg
)
->
sclass
=
nv31_mpeg_sclass
;
nv_engine
(
mpeg
)
->
tile_prog
=
nv31_mpeg_tile_prog
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv31.h
浏览文件 @
218f978d
#ifndef __NV31_MPEG_H__
#define __NV31_MPEG_H__
#define nv31_mpeg(p) container_of((p), struct nv31_mpeg, base.engine)
#include "priv.h"
#include <engine/mpeg.h>
#include <engine/fifo.h>
struct
nv31_mpeg_chan
{
struct
nvkm_object
base
;
struct
nvkm_fifo_chan
*
fifo
;
};
struct
nv31_mpeg
{
struct
nvkm_mpeg
base
;
struct
nv31_mpeg_chan
*
chan
;
bool
(
*
mthd_dma
)(
struct
nvkm_device
*
,
u32
mthd
,
u32
data
);
};
#define nv31_mpeg_chan(p) container_of((p), struct nv31_mpeg_chan, object)
struct
nv31_mpeg_chan
{
struct
nvkm_object
object
;
struct
nv31_mpeg
*
mpeg
;
struct
nvkm_fifo_chan
*
fifo
;
};
int
nv31_mpeg_chan_new
(
struct
nvkm_fifo_chan
*
,
const
struct
nvkm_oclass
*
,
struct
nvkm_object
**
);
#endif
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv40.c
浏览文件 @
218f978d
...
...
@@ -25,9 +25,7 @@
#include <subdev/instmem.h>
/*******************************************************************************
* MPEG object classes
******************************************************************************/
#include <nvif/class.h>
bool
nv40_mpeg_mthd_dma
(
struct
nvkm_device
*
device
,
u32
mthd
,
u32
data
)
...
...
@@ -67,16 +65,6 @@ nv40_mpeg_mthd_dma(struct nvkm_device *device, u32 mthd, u32 data)
return
true
;
}
struct
nvkm_oclass
nv40_mpeg_sclass
[]
=
{
{
0x3174
,
&
nv31_mpeg_ofuncs
},
{}
};
/*******************************************************************************
* PMPEG engine/subdev functions
******************************************************************************/
static
void
nv40_mpeg_intr
(
struct
nvkm_subdev
*
subdev
)
{
...
...
@@ -93,6 +81,15 @@ nv40_mpeg_intr(struct nvkm_subdev *subdev)
}
}
static
const
struct
nvkm_engine_func
nv40_mpeg
=
{
.
fifo
.
cclass
=
nv31_mpeg_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
NV31_MPEG
,
&
nv31_mpeg_object
},
{}
}
};
static
int
nv40_mpeg_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -106,11 +103,11 @@ nv40_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
mpeg
->
base
.
engine
.
func
=
&
nv40_mpeg
;
mpeg
->
mthd_dma
=
nv40_mpeg_mthd_dma
;
nv_subdev
(
mpeg
)
->
unit
=
0x00000002
;
nv_subdev
(
mpeg
)
->
intr
=
nv40_mpeg_intr
;
nv_engine
(
mpeg
)
->
cclass
=
&
nv31_mpeg_cclass
;
nv_engine
(
mpeg
)
->
sclass
=
nv40_mpeg_sclass
;
nv_engine
(
mpeg
)
->
tile_prog
=
nv31_mpeg_tile_prog
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv44.c
浏览文件 @
218f978d
...
...
@@ -21,99 +21,107 @@
*
* Authors: Ben Skeggs
*/
#include <engine/mpeg.h>
#define nv44_mpeg(p) container_of((p), struct nv44_mpeg, base.engine)
#include "priv.h"
#include <core/client.h>
#include <engine/fifo.h>
#include <nvif/class.h>
struct
nv44_mpeg
{
struct
nvkm_mpeg
base
;
struct
list_head
chan
;
};
bool
nv40_mpeg_mthd_dma
(
struct
nvkm_device
*
,
u32
,
u32
);
/*******************************************************************************
* PMPEG context
******************************************************************************/
#define nv44_mpeg_chan(p) container_of((p), struct nv44_mpeg_chan, object)
struct
nv44_mpeg_chan
{
struct
nvkm_mpeg_chan
base
;
struct
nvkm_object
object
;
struct
nv44_mpeg
*
mpeg
;
struct
nvkm_fifo_chan
*
fifo
;
u32
inst
;
struct
list_head
head
;
u32
inst
;
};
bool
nv40_mpeg_mthd_dma
(
struct
nvkm_device
*
,
u32
,
u32
);
static
int
nv44_mpeg_chan_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
{
struct
nv44_mpeg_chan
*
chan
=
nv44_mpeg_chan
(
object
);
int
ret
=
nvkm_gpuobj_new
(
chan
->
object
.
engine
->
subdev
.
device
,
264
*
4
,
align
,
true
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
chan
->
inst
=
(
*
pgpuobj
)
->
addr
;
nvkm_kmap
(
*
pgpuobj
);
nvkm_wo32
(
*
pgpuobj
,
0x78
,
0x02001ec1
);
nvkm_done
(
*
pgpuobj
);
}
return
ret
;
}
/*******************************************************************************
* PMPEG context
******************************************************************************/
static
int
nv44_mpeg_chan_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
static
void
nv44_mpeg_context_dtor
(
struct
nvkm_object
*
object
)
struct
nv44_mpeg_chan
*
chan
=
nv44_mpeg_chan
(
object
);
struct
nv44_mpeg
*
mpeg
=
chan
->
mpeg
;
struct
nvkm_device
*
device
=
mpeg
->
base
.
engine
.
subdev
.
device
;
u32
inst
=
0x80000000
|
(
chan
->
inst
>>
4
);
nvkm_mask
(
device
,
0x00b32c
,
0x00000001
,
0x00000000
);
if
(
nvkm_rd32
(
device
,
0x00b318
)
==
inst
)
nvkm_mask
(
device
,
0x00b318
,
0x80000000
,
0x00000000
);
nvkm_mask
(
device
,
0x00b32c
,
0x00000001
,
0x00000001
);
return
0
;
}
static
void
*
nv44_mpeg_chan_dtor
(
struct
nvkm_object
*
object
)
{
struct
nv44_mpeg_chan
*
chan
=
(
void
*
)
object
;
struct
nv44_mpeg
*
mpeg
=
(
void
*
)
object
->
engine
;
struct
nv44_mpeg_chan
*
chan
=
nv44_mpeg_chan
(
object
)
;
struct
nv44_mpeg
*
mpeg
=
chan
->
mpeg
;
unsigned
long
flags
;
spin_lock_irqsave
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
list_del
(
&
chan
->
head
);
spin_unlock_irqrestore
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
nvkm_mpeg_context_destroy
(
&
chan
->
base
)
;
return
chan
;
}
static
const
struct
nvkm_object_func
nv44_mpeg_chan
=
{
.
dtor
=
nv44_mpeg_chan_dtor
,
.
fini
=
nv44_mpeg_chan_fini
,
.
bind
=
nv44_mpeg_chan_bind
,
};
static
int
nv44_mpeg_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
nv44_mpeg_chan_new
(
struct
nvkm_fifo_chan
*
fifoch
,
const
struct
nvkm_oclass
*
oclass
,
struct
nvkm_object
**
pobject
)
{
struct
nv44_mpeg
*
mpeg
=
(
void
*
)
engine
;
struct
nv44_mpeg
*
mpeg
=
nv44_mpeg
(
oclass
->
engine
)
;
struct
nv44_mpeg_chan
*
chan
;
unsigned
long
flags
;
int
ret
;
ret
=
nvkm_mpeg_context_create
(
parent
,
engine
,
oclass
,
NULL
,
264
*
4
,
16
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
*
pobject
=
nv_object
(
chan
);
if
(
ret
)
return
ret
;
if
(
!
(
chan
=
kzalloc
(
sizeof
(
*
chan
),
GFP_KERNEL
)))
return
-
ENOMEM
;
nvkm_object_ctor
(
&
nv44_mpeg_chan
,
oclass
,
&
chan
->
object
);
chan
->
mpeg
=
mpeg
;
chan
->
fifo
=
fifoch
;
*
pobject
=
&
chan
->
object
;
spin_lock_irqsave
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
chan
->
fifo
=
nvkm_fifo_chan
(
parent
);
chan
->
inst
=
chan
->
base
.
base
.
gpuobj
.
addr
;
list_add
(
&
chan
->
head
,
&
mpeg
->
chan
);
spin_unlock_irqrestore
(
&
mpeg
->
base
.
engine
.
lock
,
flags
);
nvkm_kmap
(
&
chan
->
base
.
base
.
gpuobj
);
nvkm_wo32
(
&
chan
->
base
.
base
.
gpuobj
,
0x78
,
0x02001ec1
);
nvkm_done
(
&
chan
->
base
.
base
.
gpuobj
);
return
0
;
}
static
int
nv44_mpeg_context_fini
(
struct
nvkm_object
*
object
,
bool
suspend
)
{
struct
nvkm_mpeg
*
mpeg
=
(
void
*
)
object
->
engine
;
struct
nv44_mpeg_chan
*
chan
=
(
void
*
)
object
;
struct
nvkm_device
*
device
=
mpeg
->
engine
.
subdev
.
device
;
u32
inst
=
0x80000000
|
nv_gpuobj
(
chan
)
->
addr
>>
4
;
nvkm_mask
(
device
,
0x00b32c
,
0x00000001
,
0x00000000
);
if
(
nvkm_rd32
(
device
,
0x00b318
)
==
inst
)
nvkm_mask
(
device
,
0x00b318
,
0x80000000
,
0x00000000
);
nvkm_mask
(
device
,
0x00b32c
,
0x00000001
,
0x00000001
);
return
0
;
}
static
struct
nvkm_oclass
nv44_mpeg_cclass
=
{
.
handle
=
NV_ENGCTX
(
MPEG
,
0x44
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv44_mpeg_context_ctor
,
.
dtor
=
nv44_mpeg_context_dtor
,
.
init
=
_nvkm_mpeg_context_init
,
.
fini
=
nv44_mpeg_context_fini
,
.
rd32
=
_nvkm_mpeg_context_rd32
,
.
wr32
=
_nvkm_mpeg_context_wr32
,
},
};
/*******************************************************************************
* PMPEG engine/subdev functions
******************************************************************************/
...
...
@@ -175,7 +183,7 @@ nv44_mpeg_intr(struct nvkm_subdev *subdev)
if
(
show
)
{
nvkm_error
(
subdev
,
"ch %d [%08x %s] %08x %08x %08x %08x
\n
"
,
chan
?
chan
->
fifo
->
chid
:
-
1
,
inst
<<
4
,
chan
?
chan
->
fifo
->
object
.
client
->
name
:
"unknown"
,
chan
?
chan
->
object
.
client
->
name
:
"unknown"
,
stat
,
type
,
mthd
,
data
);
}
...
...
@@ -198,6 +206,15 @@ nv44_mpeg_me_intr(struct nvkm_subdev *subdev)
}
}
static
const
struct
nvkm_engine_func
nv44_mpeg
=
{
.
fifo
.
cclass
=
nv44_mpeg_chan_new
,
.
sclass
=
{
{
-
1
,
-
1
,
NV31_MPEG
,
&
nv31_mpeg_object
},
{}
}
};
static
int
nv44_mpeg_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -212,11 +229,10 @@ nv44_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
return
ret
;
INIT_LIST_HEAD
(
&
mpeg
->
chan
);
mpeg
->
base
.
engine
.
func
=
&
nv44_mpeg
;
nv_subdev
(
mpeg
)
->
unit
=
0x00000002
;
nv_subdev
(
mpeg
)
->
intr
=
nv44_mpeg_me_intr
;
nv_engine
(
mpeg
)
->
cclass
=
&
nv44_mpeg_cclass
;
nv_engine
(
mpeg
)
->
sclass
=
nv40_mpeg_sclass
;
nv_engine
(
mpeg
)
->
tile_prog
=
nv31_mpeg_tile_prog
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/nv50.c
浏览文件 @
218f978d
...
...
@@ -21,98 +21,35 @@
*
* Authors: Ben Skeggs
*/
#include
<engine/mpeg.h>
#include
"priv.h"
#include <core/gpuobj.h>
#include <subdev/timer.h>
struct
nv50_mpeg_chan
{
struct
nvkm_mpeg_chan
base
;
};
/*******************************************************************************
* MPEG object classes
******************************************************************************/
static
int
nv50_mpeg_object_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
{
struct
nvkm_gpuobj
*
obj
;
int
ret
;
ret
=
nvkm_gpuobj_create
(
parent
,
engine
,
oclass
,
0
,
parent
,
16
,
16
,
0
,
&
obj
);
*
pobject
=
nv_object
(
obj
);
if
(
ret
)
return
ret
;
nvkm_kmap
(
obj
);
nvkm_wo32
(
obj
,
0x00
,
nv_mclass
(
obj
));
nvkm_wo32
(
obj
,
0x04
,
0x00000000
);
nvkm_wo32
(
obj
,
0x08
,
0x00000000
);
nvkm_wo32
(
obj
,
0x0c
,
0x00000000
);
nvkm_done
(
obj
);
return
0
;
}
struct
nvkm_ofuncs
nv50_mpeg_ofuncs
=
{
.
ctor
=
nv50_mpeg_object_ctor
,
.
dtor
=
_nvkm_gpuobj_dtor
,
.
init
=
_nvkm_gpuobj_init
,
.
fini
=
_nvkm_gpuobj_fini
,
.
rd32
=
_nvkm_gpuobj_rd32
,
.
wr32
=
_nvkm_gpuobj_wr32
,
};
static
struct
nvkm_oclass
nv50_mpeg_sclass
[]
=
{
{
0x3174
,
&
nv50_mpeg_ofuncs
},
{}
};
#include <nvif/class.h>
/*******************************************************************************
* PMPEG context
******************************************************************************/
int
nv50_mpeg_context_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
struct
nvkm_object
**
pobject
)
static
int
nv50_mpeg_cclass_bind
(
struct
nvkm_object
*
object
,
struct
nvkm_gpuobj
*
parent
,
int
align
,
struct
nvkm_gpuobj
**
pgpuobj
)
{
struct
nv50_mpeg_chan
*
chan
;
struct
nvkm_gpuobj
*
image
;
int
ret
;
ret
=
nvkm_mpeg_context_create
(
parent
,
engine
,
oclass
,
NULL
,
128
*
4
,
0
,
NVOBJ_FLAG_ZERO_ALLOC
,
&
chan
);
*
pobject
=
nv_object
(
chan
);
if
(
ret
)
return
ret
;
image
=
&
chan
->
base
.
base
.
gpuobj
;
nvkm_kmap
(
image
);
nvkm_wo32
(
image
,
0x0070
,
0x00801ec1
);
nvkm_wo32
(
image
,
0x007c
,
0x0000037c
);
nvkm_done
(
image
);
return
0
;
int
ret
=
nvkm_gpuobj_new
(
object
->
engine
->
subdev
.
device
,
128
*
4
,
align
,
true
,
parent
,
pgpuobj
);
if
(
ret
==
0
)
{
nvkm_kmap
(
*
pgpuobj
);
nvkm_wo32
(
*
pgpuobj
,
0x70
,
0x00801ec1
);
nvkm_wo32
(
*
pgpuobj
,
0x7c
,
0x0000037c
);
nvkm_done
(
*
pgpuobj
);
}
return
ret
;
}
static
struct
nvkm_oclass
const
struct
nvkm_object_func
nv50_mpeg_cclass
=
{
.
handle
=
NV_ENGCTX
(
MPEG
,
0x50
),
.
ofuncs
=
&
(
struct
nvkm_ofuncs
)
{
.
ctor
=
nv50_mpeg_context_ctor
,
.
dtor
=
_nvkm_mpeg_context_dtor
,
.
init
=
_nvkm_mpeg_context_init
,
.
fini
=
_nvkm_mpeg_context_fini
,
.
rd32
=
_nvkm_mpeg_context_rd32
,
.
wr32
=
_nvkm_mpeg_context_wr32
,
},
.
bind
=
nv50_mpeg_cclass_bind
,
};
/*******************************************************************************
...
...
@@ -162,6 +99,15 @@ nv50_vpe_intr(struct nvkm_subdev *subdev)
}
}
static
const
struct
nvkm_engine_func
nv50_mpeg
=
{
.
cclass
=
&
nv50_mpeg_cclass
,
.
sclass
=
{
{
-
1
,
-
1
,
NV31_MPEG
,
&
nv31_mpeg_object
},
{}
}
};
static
int
nv50_mpeg_ctor
(
struct
nvkm_object
*
parent
,
struct
nvkm_object
*
engine
,
struct
nvkm_oclass
*
oclass
,
void
*
data
,
u32
size
,
...
...
@@ -175,10 +121,10 @@ nv50_mpeg_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
if
(
ret
)
return
ret
;
mpeg
->
engine
.
func
=
&
nv50_mpeg
;
nv_subdev
(
mpeg
)
->
unit
=
0x00400002
;
nv_subdev
(
mpeg
)
->
intr
=
nv50_vpe_intr
;
nv_engine
(
mpeg
)
->
cclass
=
&
nv50_mpeg_cclass
;
nv_engine
(
mpeg
)
->
sclass
=
nv50_mpeg_sclass
;
return
0
;
}
...
...
drivers/gpu/drm/nouveau/nvkm/engine/mpeg/priv.h
0 → 100644
浏览文件 @
218f978d
#ifndef __NVKM_MPEG_PRIV_H__
#define __NVKM_MPEG_PRIV_H__
#include <engine/mpeg.h>
struct
nvkm_fifo_chan
;
extern
const
struct
nvkm_object_func
nv31_mpeg_object
;
extern
const
struct
nvkm_object_func
nv50_mpeg_cclass
;
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录