Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
218f978d
Commit
218f978d
authored
Aug 20, 2015
by
Ben Skeggs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
drm/nouveau/mpeg: convert user classes to new-style nvkm_object
Signed-off-by:
Ben Skeggs
<
bskeggs@redhat.com
>
parent
27f3d6cf
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
249 additions
and
333 deletions
+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
No files found.
drivers/gpu/drm/nouveau/include/nvif/class.h
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
View file @
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
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment