aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorIlia Mirkin <imirkin@alum.mit.edu>2013-07-28 22:30:06 -0400
committerBen Skeggs <bskeggs@redhat.com>2013-09-03 23:46:15 -0400
commitef7d64e5c27bc2587b4a20c9ae04413ce679bd8c (patch)
tree775522e08719e62fd1aac7695e9fbfb7380a7261 /drivers/gpu/drm
parent57be046e5af098ab2ff972269799ef495a7f8a2b (diff)
drm/nouveau/vdec: implement support for VP3 engines
For NV98+, BSP/VP/PPP are all FUC-based engines. Hook them all up in the same way as NVC0, but with a couple of different values. Also make sure that the PPP engine is handled in the fifo/mc/vm. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/bsp/nv98.c52
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c2
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/ppp/nv98.c52
-rw-r--r--drivers/gpu/drm/nouveau/core/engine/vp/nv98.c47
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c3
-rw-r--r--drivers/gpu/drm/nouveau/core/subdev/vm/nv50.c1
6 files changed, 104 insertions, 53 deletions
diff --git a/drivers/gpu/drm/nouveau/core/engine/bsp/nv98.c b/drivers/gpu/drm/nouveau/core/engine/bsp/nv98.c
index 8bf92b0e6d82..6b089e022fd2 100644
--- a/drivers/gpu/drm/nouveau/core/engine/bsp/nv98.c
+++ b/drivers/gpu/drm/nouveau/core/engine/bsp/nv98.c
@@ -19,16 +19,14 @@
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE. 20 * OTHER DEALINGS IN THE SOFTWARE.
21 * 21 *
22 * Authors: Ben Skeggs 22 * Authors: Ben Skeggs, Maarten Lankhorst, Ilia Mirkin
23 */ 23 */
24 24
25#include <core/engctx.h> 25#include <engine/falcon.h>
26#include <core/class.h>
27
28#include <engine/bsp.h> 26#include <engine/bsp.h>
29 27
30struct nv98_bsp_priv { 28struct nv98_bsp_priv {
31 struct nouveau_engine base; 29 struct nouveau_falcon base;
32}; 30};
33 31
34/******************************************************************************* 32/*******************************************************************************
@@ -37,31 +35,49 @@ struct nv98_bsp_priv {
37 35
38static struct nouveau_oclass 36static struct nouveau_oclass
39nv98_bsp_sclass[] = { 37nv98_bsp_sclass[] = {
38 { 0x88b1, &nouveau_object_ofuncs },
39 { 0x85b1, &nouveau_object_ofuncs },
40 { 0x86b1, &nouveau_object_ofuncs },
40 {}, 41 {},
41}; 42};
42 43
43/******************************************************************************* 44/*******************************************************************************
44 * BSP context 45 * PBSP context
45 ******************************************************************************/ 46 ******************************************************************************/
46 47
47static struct nouveau_oclass 48static struct nouveau_oclass
48nv98_bsp_cclass = { 49nv98_bsp_cclass = {
49 .handle = NV_ENGCTX(BSP, 0x98), 50 .handle = NV_ENGCTX(BSP, 0x98),
50 .ofuncs = &(struct nouveau_ofuncs) { 51 .ofuncs = &(struct nouveau_ofuncs) {
51 .ctor = _nouveau_engctx_ctor, 52 .ctor = _nouveau_falcon_context_ctor,
52 .dtor = _nouveau_engctx_dtor, 53 .dtor = _nouveau_falcon_context_dtor,
53 .init = _nouveau_engctx_init, 54 .init = _nouveau_falcon_context_init,
54 .fini = _nouveau_engctx_fini, 55 .fini = _nouveau_falcon_context_fini,
55 .rd32 = _nouveau_engctx_rd32, 56 .rd32 = _nouveau_falcon_context_rd32,
56 .wr32 = _nouveau_engctx_wr32, 57 .wr32 = _nouveau_falcon_context_wr32,
57 }, 58 },
58}; 59};
59 60
60/******************************************************************************* 61/*******************************************************************************
61 * BSP engine/subdev functions 62 * PBSP engine/subdev functions
62 ******************************************************************************/ 63 ******************************************************************************/
63 64
64static int 65static int
66nv98_bsp_init(struct nouveau_object *object)
67{
68 struct nv98_bsp_priv *priv = (void *)object;
69 int ret;
70
71 ret = nouveau_falcon_init(&priv->base);
72 if (ret)
73 return ret;
74
75 nv_wr32(priv, 0x084010, 0x0000ffd2);
76 nv_wr32(priv, 0x08401c, 0x0000fff2);
77 return 0;
78}
79
80static int
65nv98_bsp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, 81nv98_bsp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
66 struct nouveau_oclass *oclass, void *data, u32 size, 82 struct nouveau_oclass *oclass, void *data, u32 size,
67 struct nouveau_object **pobject) 83 struct nouveau_object **pobject)
@@ -69,7 +85,7 @@ nv98_bsp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
69 struct nv98_bsp_priv *priv; 85 struct nv98_bsp_priv *priv;
70 int ret; 86 int ret;
71 87
72 ret = nouveau_engine_create(parent, engine, oclass, true, 88 ret = nouveau_falcon_create(parent, engine, oclass, 0x084000, true,
73 "PBSP", "bsp", &priv); 89 "PBSP", "bsp", &priv);
74 *pobject = nv_object(priv); 90 *pobject = nv_object(priv);
75 if (ret) 91 if (ret)
@@ -86,8 +102,10 @@ nv98_bsp_oclass = {
86 .handle = NV_ENGINE(BSP, 0x98), 102 .handle = NV_ENGINE(BSP, 0x98),
87 .ofuncs = &(struct nouveau_ofuncs) { 103 .ofuncs = &(struct nouveau_ofuncs) {
88 .ctor = nv98_bsp_ctor, 104 .ctor = nv98_bsp_ctor,
89 .dtor = _nouveau_engine_dtor, 105 .dtor = _nouveau_falcon_dtor,
90 .init = _nouveau_engine_init, 106 .init = nv98_bsp_init,
91 .fini = _nouveau_engine_fini, 107 .fini = _nouveau_falcon_fini,
108 .rd32 = _nouveau_falcon_rd32,
109 .wr32 = _nouveau_falcon_wr32,
92 }, 110 },
93}; 111};
diff --git a/drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c b/drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c
index 433b2d8b73b2..91a87cd7195a 100644
--- a/drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c
+++ b/drivers/gpu/drm/nouveau/core/engine/fifo/nv84.c
@@ -56,6 +56,7 @@ nv84_fifo_context_attach(struct nouveau_object *parent,
56 case NVDEV_ENGINE_SW : return 0; 56 case NVDEV_ENGINE_SW : return 0;
57 case NVDEV_ENGINE_GR : addr = 0x0020; break; 57 case NVDEV_ENGINE_GR : addr = 0x0020; break;
58 case NVDEV_ENGINE_VP : addr = 0x0040; break; 58 case NVDEV_ENGINE_VP : addr = 0x0040; break;
59 case NVDEV_ENGINE_PPP :
59 case NVDEV_ENGINE_MPEG : addr = 0x0060; break; 60 case NVDEV_ENGINE_MPEG : addr = 0x0060; break;
60 case NVDEV_ENGINE_BSP : addr = 0x0080; break; 61 case NVDEV_ENGINE_BSP : addr = 0x0080; break;
61 case NVDEV_ENGINE_CRYPT: addr = 0x00a0; break; 62 case NVDEV_ENGINE_CRYPT: addr = 0x00a0; break;
@@ -91,6 +92,7 @@ nv84_fifo_context_detach(struct nouveau_object *parent, bool suspend,
91 case NVDEV_ENGINE_SW : return 0; 92 case NVDEV_ENGINE_SW : return 0;
92 case NVDEV_ENGINE_GR : engn = 0; addr = 0x0020; break; 93 case NVDEV_ENGINE_GR : engn = 0; addr = 0x0020; break;
93 case NVDEV_ENGINE_VP : engn = 3; addr = 0x0040; break; 94 case NVDEV_ENGINE_VP : engn = 3; addr = 0x0040; break;
95 case NVDEV_ENGINE_PPP :
94 case NVDEV_ENGINE_MPEG : engn = 1; addr = 0x0060; break; 96 case NVDEV_ENGINE_MPEG : engn = 1; addr = 0x0060; break;
95 case NVDEV_ENGINE_BSP : engn = 5; addr = 0x0080; break; 97 case NVDEV_ENGINE_BSP : engn = 5; addr = 0x0080; break;
96 case NVDEV_ENGINE_CRYPT: engn = 4; addr = 0x00a0; break; 98 case NVDEV_ENGINE_CRYPT: engn = 4; addr = 0x00a0; break;
diff --git a/drivers/gpu/drm/nouveau/core/engine/ppp/nv98.c b/drivers/gpu/drm/nouveau/core/engine/ppp/nv98.c
index 5a5b2a773ed7..13bf31c40aa1 100644
--- a/drivers/gpu/drm/nouveau/core/engine/ppp/nv98.c
+++ b/drivers/gpu/drm/nouveau/core/engine/ppp/nv98.c
@@ -19,21 +19,14 @@
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE. 20 * OTHER DEALINGS IN THE SOFTWARE.
21 * 21 *
22 * Authors: Ben Skeggs 22 * Authors: Ben Skeggs, Maarten Lankhorst, Ilia Mirkin
23 */ 23 */
24 24
25#include <core/engine.h> 25#include <engine/falcon.h>
26#include <core/engctx.h>
27#include <core/class.h>
28
29#include <engine/ppp.h> 26#include <engine/ppp.h>
30 27
31struct nv98_ppp_priv { 28struct nv98_ppp_priv {
32 struct nouveau_engine base; 29 struct nouveau_falcon base;
33};
34
35struct nv98_ppp_chan {
36 struct nouveau_engctx base;
37}; 30};
38 31
39/******************************************************************************* 32/*******************************************************************************
@@ -42,6 +35,8 @@ struct nv98_ppp_chan {
42 35
43static struct nouveau_oclass 36static struct nouveau_oclass
44nv98_ppp_sclass[] = { 37nv98_ppp_sclass[] = {
38 { 0x88b3, &nouveau_object_ofuncs },
39 { 0x85b3, &nouveau_object_ofuncs },
45 {}, 40 {},
46}; 41};
47 42
@@ -53,12 +48,12 @@ static struct nouveau_oclass
53nv98_ppp_cclass = { 48nv98_ppp_cclass = {
54 .handle = NV_ENGCTX(PPP, 0x98), 49 .handle = NV_ENGCTX(PPP, 0x98),
55 .ofuncs = &(struct nouveau_ofuncs) { 50 .ofuncs = &(struct nouveau_ofuncs) {
56 .ctor = _nouveau_engctx_ctor, 51 .ctor = _nouveau_falcon_context_ctor,
57 .dtor = _nouveau_engctx_dtor, 52 .dtor = _nouveau_falcon_context_dtor,
58 .init = _nouveau_engctx_init, 53 .init = _nouveau_falcon_context_init,
59 .fini = _nouveau_engctx_fini, 54 .fini = _nouveau_falcon_context_fini,
60 .rd32 = _nouveau_engctx_rd32, 55 .rd32 = _nouveau_falcon_context_rd32,
61 .wr32 = _nouveau_engctx_wr32, 56 .wr32 = _nouveau_falcon_context_wr32,
62 }, 57 },
63}; 58};
64 59
@@ -67,6 +62,21 @@ nv98_ppp_cclass = {
67 ******************************************************************************/ 62 ******************************************************************************/
68 63
69static int 64static int
65nv98_ppp_init(struct nouveau_object *object)
66{
67 struct nv98_ppp_priv *priv = (void *)object;
68 int ret;
69
70 ret = nouveau_falcon_init(&priv->base);
71 if (ret)
72 return ret;
73
74 nv_wr32(priv, 0x086010, 0x0000ffd2);
75 nv_wr32(priv, 0x08601c, 0x0000fff2);
76 return 0;
77}
78
79static int
70nv98_ppp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, 80nv98_ppp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
71 struct nouveau_oclass *oclass, void *data, u32 size, 81 struct nouveau_oclass *oclass, void *data, u32 size,
72 struct nouveau_object **pobject) 82 struct nouveau_object **pobject)
@@ -74,7 +84,7 @@ nv98_ppp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
74 struct nv98_ppp_priv *priv; 84 struct nv98_ppp_priv *priv;
75 int ret; 85 int ret;
76 86
77 ret = nouveau_engine_create(parent, engine, oclass, true, 87 ret = nouveau_falcon_create(parent, engine, oclass, 0x086000, true,
78 "PPPP", "ppp", &priv); 88 "PPPP", "ppp", &priv);
79 *pobject = nv_object(priv); 89 *pobject = nv_object(priv);
80 if (ret) 90 if (ret)
@@ -91,8 +101,10 @@ nv98_ppp_oclass = {
91 .handle = NV_ENGINE(PPP, 0x98), 101 .handle = NV_ENGINE(PPP, 0x98),
92 .ofuncs = &(struct nouveau_ofuncs) { 102 .ofuncs = &(struct nouveau_ofuncs) {
93 .ctor = nv98_ppp_ctor, 103 .ctor = nv98_ppp_ctor,
94 .dtor = _nouveau_engine_dtor, 104 .dtor = _nouveau_falcon_dtor,
95 .init = _nouveau_engine_init, 105 .init = nv98_ppp_init,
96 .fini = _nouveau_engine_fini, 106 .fini = _nouveau_falcon_fini,
107 .rd32 = _nouveau_falcon_rd32,
108 .wr32 = _nouveau_falcon_wr32,
97 }, 109 },
98}; 110};
diff --git a/drivers/gpu/drm/nouveau/core/engine/vp/nv98.c b/drivers/gpu/drm/nouveau/core/engine/vp/nv98.c
index 8a8236bc84de..fc9ae0ff1ef5 100644
--- a/drivers/gpu/drm/nouveau/core/engine/vp/nv98.c
+++ b/drivers/gpu/drm/nouveau/core/engine/vp/nv98.c
@@ -19,16 +19,14 @@
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE. 20 * OTHER DEALINGS IN THE SOFTWARE.
21 * 21 *
22 * Authors: Ben Skeggs 22 * Authors: Ben Skeggs, Maarten Lankhorst, Ilia Mirkin
23 */ 23 */
24 24
25#include <core/engctx.h> 25#include <engine/falcon.h>
26#include <core/class.h>
27
28#include <engine/vp.h> 26#include <engine/vp.h>
29 27
30struct nv98_vp_priv { 28struct nv98_vp_priv {
31 struct nouveau_engine base; 29 struct nouveau_falcon base;
32}; 30};
33 31
34/******************************************************************************* 32/*******************************************************************************
@@ -37,6 +35,8 @@ struct nv98_vp_priv {
37 35
38static struct nouveau_oclass 36static struct nouveau_oclass
39nv98_vp_sclass[] = { 37nv98_vp_sclass[] = {
38 { 0x88b2, &nouveau_object_ofuncs },
39 { 0x85b2, &nouveau_object_ofuncs },
40 {}, 40 {},
41}; 41};
42 42
@@ -48,12 +48,12 @@ static struct nouveau_oclass
48nv98_vp_cclass = { 48nv98_vp_cclass = {
49 .handle = NV_ENGCTX(VP, 0x98), 49 .handle = NV_ENGCTX(VP, 0x98),
50 .ofuncs = &(struct nouveau_ofuncs) { 50 .ofuncs = &(struct nouveau_ofuncs) {
51 .ctor = _nouveau_engctx_ctor, 51 .ctor = _nouveau_falcon_context_ctor,
52 .dtor = _nouveau_engctx_dtor, 52 .dtor = _nouveau_falcon_context_dtor,
53 .init = _nouveau_engctx_init, 53 .init = _nouveau_falcon_context_init,
54 .fini = _nouveau_engctx_fini, 54 .fini = _nouveau_falcon_context_fini,
55 .rd32 = _nouveau_engctx_rd32, 55 .rd32 = _nouveau_falcon_context_rd32,
56 .wr32 = _nouveau_engctx_wr32, 56 .wr32 = _nouveau_falcon_context_wr32,
57 }, 57 },
58}; 58};
59 59
@@ -62,6 +62,21 @@ nv98_vp_cclass = {
62 ******************************************************************************/ 62 ******************************************************************************/
63 63
64static int 64static int
65nv98_vp_init(struct nouveau_object *object)
66{
67 struct nv98_vp_priv *priv = (void *)object;
68 int ret;
69
70 ret = nouveau_falcon_init(&priv->base);
71 if (ret)
72 return ret;
73
74 nv_wr32(priv, 0x085010, 0x0000ffd2);
75 nv_wr32(priv, 0x08501c, 0x0000fff2);
76 return 0;
77}
78
79static int
65nv98_vp_ctor(struct nouveau_object *parent, struct nouveau_object *engine, 80nv98_vp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
66 struct nouveau_oclass *oclass, void *data, u32 size, 81 struct nouveau_oclass *oclass, void *data, u32 size,
67 struct nouveau_object **pobject) 82 struct nouveau_object **pobject)
@@ -69,7 +84,7 @@ nv98_vp_ctor(struct nouveau_object *parent, struct nouveau_object *engine,
69 struct nv98_vp_priv *priv; 84 struct nv98_vp_priv *priv;
70 int ret; 85 int ret;
71 86
72 ret = nouveau_engine_create(parent, engine, oclass, true, 87 ret = nouveau_falcon_create(parent, engine, oclass, 0x085000, true,
73 "PVP", "vp", &priv); 88 "PVP", "vp", &priv);
74 *pobject = nv_object(priv); 89 *pobject = nv_object(priv);
75 if (ret) 90 if (ret)
@@ -86,8 +101,10 @@ nv98_vp_oclass = {
86 .handle = NV_ENGINE(VP, 0x98), 101 .handle = NV_ENGINE(VP, 0x98),
87 .ofuncs = &(struct nouveau_ofuncs) { 102 .ofuncs = &(struct nouveau_ofuncs) {
88 .ctor = nv98_vp_ctor, 103 .ctor = nv98_vp_ctor,
89 .dtor = _nouveau_engine_dtor, 104 .dtor = _nouveau_falcon_dtor,
90 .init = _nouveau_engine_init, 105 .init = nv98_vp_init,
91 .fini = _nouveau_engine_fini, 106 .fini = _nouveau_falcon_fini,
107 .rd32 = _nouveau_falcon_rd32,
108 .wr32 = _nouveau_falcon_wr32,
92 }, 109 },
93}; 110};
diff --git a/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c b/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c
index 0d57b4d3e001..06710419a59b 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/mc/nv98.c
@@ -35,6 +35,7 @@ nv98_mc_intr[] = {
35 { 0x00001000, NVDEV_ENGINE_GR }, 35 { 0x00001000, NVDEV_ENGINE_GR },
36 { 0x00004000, NVDEV_ENGINE_CRYPT }, /* NV84:NVA3 */ 36 { 0x00004000, NVDEV_ENGINE_CRYPT }, /* NV84:NVA3 */
37 { 0x00008000, NVDEV_ENGINE_BSP }, 37 { 0x00008000, NVDEV_ENGINE_BSP },
38 { 0x00020000, NVDEV_ENGINE_VP },
38 { 0x00080000, NVDEV_SUBDEV_THERM }, /* NVA3:NVC0 */ 39 { 0x00080000, NVDEV_SUBDEV_THERM }, /* NVA3:NVC0 */
39 { 0x00100000, NVDEV_SUBDEV_TIMER }, 40 { 0x00100000, NVDEV_SUBDEV_TIMER },
40 { 0x00200000, NVDEV_SUBDEV_GPIO }, 41 { 0x00200000, NVDEV_SUBDEV_GPIO },
@@ -42,7 +43,7 @@ nv98_mc_intr[] = {
42 { 0x04000000, NVDEV_ENGINE_DISP }, 43 { 0x04000000, NVDEV_ENGINE_DISP },
43 { 0x10000000, NVDEV_SUBDEV_BUS }, 44 { 0x10000000, NVDEV_SUBDEV_BUS },
44 { 0x80000000, NVDEV_ENGINE_SW }, 45 { 0x80000000, NVDEV_ENGINE_SW },
45 { 0x0040d101, NVDEV_SUBDEV_FB }, 46 { 0x0042d101, NVDEV_SUBDEV_FB },
46 {}, 47 {},
47}; 48};
48 49
diff --git a/drivers/gpu/drm/nouveau/core/subdev/vm/nv50.c b/drivers/gpu/drm/nouveau/core/subdev/vm/nv50.c
index 07dd1fe2d6fb..a4aa81a2173b 100644
--- a/drivers/gpu/drm/nouveau/core/subdev/vm/nv50.c
+++ b/drivers/gpu/drm/nouveau/core/subdev/vm/nv50.c
@@ -174,6 +174,7 @@ nv50_vm_flush(struct nouveau_vm *vm)
174 case NVDEV_ENGINE_GR : vme = 0x00; break; 174 case NVDEV_ENGINE_GR : vme = 0x00; break;
175 case NVDEV_ENGINE_VP : vme = 0x01; break; 175 case NVDEV_ENGINE_VP : vme = 0x01; break;
176 case NVDEV_SUBDEV_BAR : vme = 0x06; break; 176 case NVDEV_SUBDEV_BAR : vme = 0x06; break;
177 case NVDEV_ENGINE_PPP :
177 case NVDEV_ENGINE_MPEG : vme = 0x08; break; 178 case NVDEV_ENGINE_MPEG : vme = 0x08; break;
178 case NVDEV_ENGINE_BSP : vme = 0x09; break; 179 case NVDEV_ENGINE_BSP : vme = 0x09; break;
179 case NVDEV_ENGINE_CRYPT: vme = 0x0a; break; 180 case NVDEV_ENGINE_CRYPT: vme = 0x0a; break;