Commit 7d155dac authored by Ben Skeggs's avatar Ben Skeggs

drm/gk208-/gr: stop touching 0x260 inappropriately

As a side note.. It's a bit hard to figure out how to name this commit..
GK20A is NVEA, which is before NV108 (GK208).. Confusing.
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent 579b7f3f
...@@ -161,6 +161,7 @@ nouveau-y += core/subdev/mc/nv94.o ...@@ -161,6 +161,7 @@ nouveau-y += core/subdev/mc/nv94.o
nouveau-y += core/subdev/mc/nv98.o nouveau-y += core/subdev/mc/nv98.o
nouveau-y += core/subdev/mc/nvc0.o nouveau-y += core/subdev/mc/nvc0.o
nouveau-y += core/subdev/mc/nvc3.o nouveau-y += core/subdev/mc/nvc3.o
nouveau-y += core/subdev/mc/gk20a.o
nouveau-y += core/subdev/mxm/base.o nouveau-y += core/subdev/mxm/base.o
nouveau-y += core/subdev/mxm/mxms.o nouveau-y += core/subdev/mxm/mxms.o
nouveau-y += core/subdev/mxm/nv50.o nouveau-y += core/subdev/mxm/nv50.o
......
...@@ -68,7 +68,7 @@ gm100_identify(struct nouveau_device *device) ...@@ -68,7 +68,7 @@ gm100_identify(struct nouveau_device *device)
#endif #endif
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass; device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
device->oclass[NVDEV_SUBDEV_DEVINIT] = gm107_devinit_oclass; device->oclass[NVDEV_SUBDEV_DEVINIT] = gm107_devinit_oclass;
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass; device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass;
device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass; device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass;
device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass; device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass;
device->oclass[NVDEV_SUBDEV_FB ] = gm107_fb_oclass; device->oclass[NVDEV_SUBDEV_FB ] = gm107_fb_oclass;
......
...@@ -158,7 +158,7 @@ nve0_identify(struct nouveau_device *device) ...@@ -158,7 +158,7 @@ nve0_identify(struct nouveau_device *device)
break; break;
case 0xea: case 0xea:
device->cname = "GK20A"; device->cname = "GK20A";
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass; device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass;
device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass; device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass;
device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass; device->oclass[NVDEV_SUBDEV_TIMER ] = &gk20a_timer_oclass;
device->oclass[NVDEV_SUBDEV_FB ] = gk20a_fb_oclass; device->oclass[NVDEV_SUBDEV_FB ] = gk20a_fb_oclass;
...@@ -248,7 +248,7 @@ nve0_identify(struct nouveau_device *device) ...@@ -248,7 +248,7 @@ nve0_identify(struct nouveau_device *device)
device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass; device->oclass[NVDEV_SUBDEV_THERM ] = &nvd0_therm_oclass;
device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass; device->oclass[NVDEV_SUBDEV_MXM ] = &nv50_mxm_oclass;
device->oclass[NVDEV_SUBDEV_DEVINIT] = nvc0_devinit_oclass; device->oclass[NVDEV_SUBDEV_DEVINIT] = nvc0_devinit_oclass;
device->oclass[NVDEV_SUBDEV_MC ] = nvc3_mc_oclass; device->oclass[NVDEV_SUBDEV_MC ] = gk20a_mc_oclass;
device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass; device->oclass[NVDEV_SUBDEV_BUS ] = nvc0_bus_oclass;
device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass; device->oclass[NVDEV_SUBDEV_TIMER ] = &nv04_timer_oclass;
device->oclass[NVDEV_SUBDEV_FB ] = nve0_fb_oclass; device->oclass[NVDEV_SUBDEV_FB ] = nve0_fb_oclass;
......
...@@ -1170,7 +1170,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -1170,7 +1170,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
{ {
struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass; struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass;
nv_mask(priv, 0x000260, 0x00000001, 0x00000000); nouveau_mc(priv)->unk260(nouveau_mc(priv), 0);
nvc0_graph_mmio(priv, oclass->hub); nvc0_graph_mmio(priv, oclass->hub);
nvc0_graph_mmio(priv, oclass->gpc); nvc0_graph_mmio(priv, oclass->gpc);
...@@ -1192,7 +1192,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -1192,7 +1192,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
nvc0_graph_icmd(priv, oclass->icmd); nvc0_graph_icmd(priv, oclass->icmd);
nv_wr32(priv, 0x404154, 0x00000400); nv_wr32(priv, 0x404154, 0x00000400);
nvc0_graph_mthd(priv, oclass->mthd); nvc0_graph_mthd(priv, oclass->mthd);
nv_mask(priv, 0x000260, 0x00000001, 0x00000001); nouveau_mc(priv)->unk260(nouveau_mc(priv), 1);
} }
int int
......
...@@ -223,7 +223,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -223,7 +223,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass; struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass;
int i; int i;
nv_mask(priv, 0x000260, 0x00000001, 0x00000000); nouveau_mc(priv)->unk260(nouveau_mc(priv), 0);
nvc0_graph_mmio(priv, oclass->hub); nvc0_graph_mmio(priv, oclass->hub);
nvc0_graph_mmio(priv, oclass->gpc); nvc0_graph_mmio(priv, oclass->gpc);
...@@ -248,7 +248,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -248,7 +248,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
nvc0_graph_icmd(priv, oclass->icmd); nvc0_graph_icmd(priv, oclass->icmd);
nv_wr32(priv, 0x404154, 0x00000400); nv_wr32(priv, 0x404154, 0x00000400);
nvc0_graph_mthd(priv, oclass->mthd); nvc0_graph_mthd(priv, oclass->mthd);
nv_mask(priv, 0x000260, 0x00000001, 0x00000001); nouveau_mc(priv)->unk260(nouveau_mc(priv), 1);
} }
struct nouveau_oclass * struct nouveau_oclass *
......
...@@ -957,7 +957,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -957,7 +957,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass; struct nvc0_grctx_oclass *oclass = (void *)nv_engine(priv)->cclass;
int i; int i;
nv_mask(priv, 0x000260, 0x00000001, 0x00000000); nouveau_mc(priv)->unk260(nouveau_mc(priv), 0);
nvc0_graph_mmio(priv, oclass->hub); nvc0_graph_mmio(priv, oclass->hub);
nvc0_graph_mmio(priv, oclass->gpc); nvc0_graph_mmio(priv, oclass->gpc);
...@@ -991,7 +991,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info) ...@@ -991,7 +991,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
nvc0_graph_icmd(priv, oclass->icmd); nvc0_graph_icmd(priv, oclass->icmd);
nv_wr32(priv, 0x404154, 0x00000400); nv_wr32(priv, 0x404154, 0x00000400);
nvc0_graph_mthd(priv, oclass->mthd); nvc0_graph_mthd(priv, oclass->mthd);
nv_mask(priv, 0x000260, 0x00000001, 0x00000001); nouveau_mc(priv)->unk260(nouveau_mc(priv), 1);
nv_mask(priv, 0x418800, 0x00200000, 0x00200000); nv_mask(priv, 0x418800, 0x00200000, 0x00200000);
nv_mask(priv, 0x41be10, 0x00800000, 0x00800000); nv_mask(priv, 0x41be10, 0x00800000, 0x00800000);
......
...@@ -969,17 +969,16 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv) ...@@ -969,17 +969,16 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv)
{ {
struct nvc0_graph_oclass *oclass = (void *)nv_object(priv)->oclass; struct nvc0_graph_oclass *oclass = (void *)nv_object(priv)->oclass;
struct nvc0_grctx_oclass *cclass = (void *)nv_engine(priv)->cclass; struct nvc0_grctx_oclass *cclass = (void *)nv_engine(priv)->cclass;
u32 r000260;
int i; int i;
if (priv->firmware) { if (priv->firmware) {
/* load fuc microcode */ /* load fuc microcode */
r000260 = nv_mask(priv, 0x000260, 0x00000001, 0x00000000); nouveau_mc(priv)->unk260(nouveau_mc(priv), 0);
nvc0_graph_init_fw(priv, 0x409000, &priv->fuc409c, nvc0_graph_init_fw(priv, 0x409000, &priv->fuc409c,
&priv->fuc409d); &priv->fuc409d);
nvc0_graph_init_fw(priv, 0x41a000, &priv->fuc41ac, nvc0_graph_init_fw(priv, 0x41a000, &priv->fuc41ac,
&priv->fuc41ad); &priv->fuc41ad);
nv_wr32(priv, 0x000260, r000260); nouveau_mc(priv)->unk260(nouveau_mc(priv), 1);
/* start both of them running */ /* start both of them running */
nv_wr32(priv, 0x409840, 0xffffffff); nv_wr32(priv, 0x409840, 0xffffffff);
...@@ -1066,7 +1065,7 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv) ...@@ -1066,7 +1065,7 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv)
} }
/* load HUB microcode */ /* load HUB microcode */
r000260 = nv_mask(priv, 0x000260, 0x00000001, 0x00000000); nouveau_mc(priv)->unk260(nouveau_mc(priv), 0);
nv_wr32(priv, 0x4091c0, 0x01000000); nv_wr32(priv, 0x4091c0, 0x01000000);
for (i = 0; i < oclass->fecs.ucode->data.size / 4; i++) for (i = 0; i < oclass->fecs.ucode->data.size / 4; i++)
nv_wr32(priv, 0x4091c4, oclass->fecs.ucode->data.data[i]); nv_wr32(priv, 0x4091c4, oclass->fecs.ucode->data.data[i]);
...@@ -1089,7 +1088,7 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv) ...@@ -1089,7 +1088,7 @@ nvc0_graph_init_ctxctl(struct nvc0_graph_priv *priv)
nv_wr32(priv, 0x41a188, i >> 6); nv_wr32(priv, 0x41a188, i >> 6);
nv_wr32(priv, 0x41a184, oclass->gpccs.ucode->code.data[i]); nv_wr32(priv, 0x41a184, oclass->gpccs.ucode->code.data[i]);
} }
nv_wr32(priv, 0x000260, r000260); nouveau_mc(priv)->unk260(nouveau_mc(priv), 1);
/* load register lists */ /* load register lists */
nvc0_graph_init_csdata(priv, cclass->hub, 0x409000, 0x000, 0x000000); nvc0_graph_init_csdata(priv, cclass->hub, 0x409000, 0x000, 0x000000);
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#include <subdev/vm.h> #include <subdev/vm.h>
#include <subdev/bar.h> #include <subdev/bar.h>
#include <subdev/timer.h> #include <subdev/timer.h>
#include <subdev/mc.h>
#include <engine/fifo.h> #include <engine/fifo.h>
#include <engine/graph.h> #include <engine/graph.h>
......
...@@ -4,15 +4,11 @@ ...@@ -4,15 +4,11 @@
#include <core/subdev.h> #include <core/subdev.h>
#include <core/device.h> #include <core/device.h>
struct nouveau_mc_intr {
u32 stat;
u32 unit;
};
struct nouveau_mc { struct nouveau_mc {
struct nouveau_subdev base; struct nouveau_subdev base;
bool use_msi; bool use_msi;
unsigned int irq; unsigned int irq;
void (*unk260)(struct nouveau_mc *, u32);
}; };
static inline struct nouveau_mc * static inline struct nouveau_mc *
...@@ -21,30 +17,6 @@ nouveau_mc(void *obj) ...@@ -21,30 +17,6 @@ nouveau_mc(void *obj)
return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC]; return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_MC];
} }
#define nouveau_mc_create(p,e,o,d) \
nouveau_mc_create_((p), (e), (o), sizeof(**d), (void **)d)
#define nouveau_mc_destroy(p) ({ \
struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc)); \
})
#define nouveau_mc_init(p) ({ \
struct nouveau_mc *pmc = (p); _nouveau_mc_init(nv_object(pmc)); \
})
#define nouveau_mc_fini(p,s) ({ \
struct nouveau_mc *pmc = (p); _nouveau_mc_fini(nv_object(pmc), (s)); \
})
int nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *,
struct nouveau_oclass *, int, void **);
void _nouveau_mc_dtor(struct nouveau_object *);
int _nouveau_mc_init(struct nouveau_object *);
int _nouveau_mc_fini(struct nouveau_object *, bool);
struct nouveau_mc_oclass {
struct nouveau_oclass base;
const struct nouveau_mc_intr *intr;
void (*msi_rearm)(struct nouveau_mc *);
};
extern struct nouveau_oclass *nv04_mc_oclass; extern struct nouveau_oclass *nv04_mc_oclass;
extern struct nouveau_oclass *nv40_mc_oclass; extern struct nouveau_oclass *nv40_mc_oclass;
extern struct nouveau_oclass *nv44_mc_oclass; extern struct nouveau_oclass *nv44_mc_oclass;
...@@ -54,5 +26,6 @@ extern struct nouveau_oclass *nv94_mc_oclass; ...@@ -54,5 +26,6 @@ extern struct nouveau_oclass *nv94_mc_oclass;
extern struct nouveau_oclass *nv98_mc_oclass; extern struct nouveau_oclass *nv98_mc_oclass;
extern struct nouveau_oclass *nvc0_mc_oclass; extern struct nouveau_oclass *nvc0_mc_oclass;
extern struct nouveau_oclass *nvc3_mc_oclass; extern struct nouveau_oclass *nvc3_mc_oclass;
extern struct nouveau_oclass *gk20a_mc_oclass;
#endif #endif
...@@ -22,9 +22,17 @@ ...@@ -22,9 +22,17 @@
* Authors: Ben Skeggs * Authors: Ben Skeggs
*/ */
#include <subdev/mc.h> #include "priv.h"
#include <core/option.h> #include <core/option.h>
static inline void
nouveau_mc_unk260(struct nouveau_mc *pmc, u32 data)
{
const struct nouveau_mc_oclass *impl = (void *)nv_oclass(pmc);
if (impl->unk260)
impl->unk260(pmc, data);
}
static inline u32 static inline u32
nouveau_mc_intr_mask(struct nouveau_mc *pmc) nouveau_mc_intr_mask(struct nouveau_mc *pmc)
{ {
...@@ -114,6 +122,8 @@ nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine, ...@@ -114,6 +122,8 @@ nouveau_mc_create_(struct nouveau_object *parent, struct nouveau_object *engine,
if (ret) if (ret)
return ret; return ret;
pmc->unk260 = nouveau_mc_unk260;
if (nv_device_is_pci(device)) if (nv_device_is_pci(device))
switch (device->pdev->device & 0x0ff0) { switch (device->pdev->device & 0x0ff0) {
case 0x00f0: case 0x00f0:
......
/*
* Copyright 2012 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
*/
#include "nv04.h"
struct nouveau_oclass *
gk20a_mc_oclass = &(struct nouveau_mc_oclass) {
.base.handle = NV_SUBDEV(MC, 0xea),
.base.ofuncs = &(struct nouveau_ofuncs) {
.ctor = nv04_mc_ctor,
.dtor = _nouveau_mc_dtor,
.init = nv50_mc_init,
.fini = _nouveau_mc_fini,
},
.intr = nvc0_mc_intr,
.msi_rearm = nv40_mc_msi_rearm,
}.base;
#ifndef __NVKM_MC_NV04_H__ #ifndef __NVKM_MC_NV04_H__
#define __NVKM_MC_NV04_H__ #define __NVKM_MC_NV04_H__
#include <subdev/mc.h> #include "priv.h"
struct nv04_mc_priv { struct nv04_mc_priv {
struct nouveau_mc base; struct nouveau_mc base;
......
...@@ -56,6 +56,12 @@ nvc0_mc_msi_rearm(struct nouveau_mc *pmc) ...@@ -56,6 +56,12 @@ nvc0_mc_msi_rearm(struct nouveau_mc *pmc)
nv_wr32(priv, 0x088704, 0x00000000); nv_wr32(priv, 0x088704, 0x00000000);
} }
void
nvc0_mc_unk260(struct nouveau_mc *pmc, u32 data)
{
nv_wr32(pmc, 0x000260, data);
}
struct nouveau_oclass * struct nouveau_oclass *
nvc0_mc_oclass = &(struct nouveau_mc_oclass) { nvc0_mc_oclass = &(struct nouveau_mc_oclass) {
.base.handle = NV_SUBDEV(MC, 0xc0), .base.handle = NV_SUBDEV(MC, 0xc0),
...@@ -67,4 +73,5 @@ nvc0_mc_oclass = &(struct nouveau_mc_oclass) { ...@@ -67,4 +73,5 @@ nvc0_mc_oclass = &(struct nouveau_mc_oclass) {
}, },
.intr = nvc0_mc_intr, .intr = nvc0_mc_intr,
.msi_rearm = nvc0_mc_msi_rearm, .msi_rearm = nvc0_mc_msi_rearm,
.unk260 = nvc0_mc_unk260,
}.base; }.base;
...@@ -35,4 +35,5 @@ nvc3_mc_oclass = &(struct nouveau_mc_oclass) { ...@@ -35,4 +35,5 @@ nvc3_mc_oclass = &(struct nouveau_mc_oclass) {
}, },
.intr = nvc0_mc_intr, .intr = nvc0_mc_intr,
.msi_rearm = nv40_mc_msi_rearm, .msi_rearm = nv40_mc_msi_rearm,
.unk260 = nvc0_mc_unk260,
}.base; }.base;
#ifndef __NVKM_MC_PRIV_H__
#define __NVKM_MC_PRIV_H__
#include <subdev/mc.h>
#define nouveau_mc_create(p,e,o,d) \
nouveau_mc_create_((p), (e), (o), sizeof(**d), (void **)d)
#define nouveau_mc_destroy(p) ({ \
struct nouveau_mc *pmc = (p); _nouveau_mc_dtor(nv_object(pmc)); \
})
#define nouveau_mc_init(p) ({ \
struct nouveau_mc *pmc = (p); _nouveau_mc_init(nv_object(pmc)); \
})
#define nouveau_mc_fini(p,s) ({ \
struct nouveau_mc *pmc = (p); _nouveau_mc_fini(nv_object(pmc), (s)); \
})
int nouveau_mc_create_(struct nouveau_object *, struct nouveau_object *,
struct nouveau_oclass *, int, void **);
void _nouveau_mc_dtor(struct nouveau_object *);
int _nouveau_mc_init(struct nouveau_object *);
int _nouveau_mc_fini(struct nouveau_object *, bool);
struct nouveau_mc_intr {
u32 stat;
u32 unit;
};
struct nouveau_mc_oclass {
struct nouveau_oclass base;
const struct nouveau_mc_intr *intr;
void (*msi_rearm)(struct nouveau_mc *);
void (*unk260)(struct nouveau_mc *, u32);
};
void nvc0_mc_unk260(struct nouveau_mc *, u32);
#endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment