Commit d4a312dc authored by Samuel Pitoiset's avatar Samuel Pitoiset Committed by Ben Skeggs

drm/nouveau/pm: some fixes related to sources

Signed-off-by: default avatarSamuel Pitoiset <samuel.pitoiset@gmail.com>
Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
parent eb94345a
...@@ -154,6 +154,8 @@ nvkm_perfsrc_enable(struct nvkm_pm *ppm, struct nvkm_perfctr *ctr) ...@@ -154,6 +154,8 @@ nvkm_perfsrc_enable(struct nvkm_pm *ppm, struct nvkm_perfctr *ctr)
/* enable the source */ /* enable the source */
nv_mask(ppm, src->addr, mask, value); nv_mask(ppm, src->addr, mask, value);
nv_debug(ppm, "enabled source 0x%08x 0x%08x 0x%08x\n",
src->addr, mask, value);
} }
} }
return 0; return 0;
...@@ -165,6 +167,7 @@ nvkm_perfsrc_disable(struct nvkm_pm *ppm, struct nvkm_perfctr *ctr) ...@@ -165,6 +167,7 @@ nvkm_perfsrc_disable(struct nvkm_pm *ppm, struct nvkm_perfctr *ctr)
struct nvkm_perfdom *dom = NULL; struct nvkm_perfdom *dom = NULL;
struct nvkm_perfsig *sig; struct nvkm_perfsig *sig;
struct nvkm_perfsrc *src; struct nvkm_perfsrc *src;
u32 mask;
int i, j; int i, j;
for (i = 0; i < 4 && ctr->signal[i]; i++) { for (i = 0; i < 4 && ctr->signal[i]; i++) {
...@@ -178,8 +181,16 @@ nvkm_perfsrc_disable(struct nvkm_pm *ppm, struct nvkm_perfctr *ctr) ...@@ -178,8 +181,16 @@ nvkm_perfsrc_disable(struct nvkm_pm *ppm, struct nvkm_perfctr *ctr)
if (!src) if (!src)
return -EINVAL; return -EINVAL;
/* unset enable bit if needed */
mask = 0x00000000;
if (src->enable)
mask = 0x80000000;
mask |= (src->mask << src->shift);
/* disable the source */ /* disable the source */
nv_mask(ppm, src->addr, src->mask << src->shift, 0); nv_mask(ppm, src->addr, mask, 0);
nv_debug(ppm, "disabled source 0x%08x 0x%08x\n",
src->addr, mask);
} }
} }
return 0; return 0;
...@@ -309,7 +320,7 @@ nvkm_perfdom_dtor(struct nvkm_object *object) ...@@ -309,7 +320,7 @@ nvkm_perfdom_dtor(struct nvkm_object *object)
} }
static int static int
nvkm_perfctr_new(struct nvkm_perfdom *dom, int slot, nvkm_perfctr_new(struct nvkm_perfdom *dom, int slot, uint8_t domain,
struct nvkm_perfsig *signal[4], uint64_t source[4][8], struct nvkm_perfsig *signal[4], uint64_t source[4][8],
uint16_t logic_op, struct nvkm_perfctr **pctr) uint16_t logic_op, struct nvkm_perfctr **pctr)
{ {
...@@ -323,6 +334,7 @@ nvkm_perfctr_new(struct nvkm_perfdom *dom, int slot, ...@@ -323,6 +334,7 @@ nvkm_perfctr_new(struct nvkm_perfdom *dom, int slot,
if (!ctr) if (!ctr)
return -ENOMEM; return -ENOMEM;
ctr->domain = domain;
ctr->logic_op = logic_op; ctr->logic_op = logic_op;
ctr->slot = slot; ctr->slot = slot;
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
...@@ -361,7 +373,7 @@ nvkm_perfdom_ctor(struct nvkm_object *parent, struct nvkm_object *engine, ...@@ -361,7 +373,7 @@ nvkm_perfdom_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
for (c = 0; c < ARRAY_SIZE(args->v0.ctr); c++) { for (c = 0; c < ARRAY_SIZE(args->v0.ctr); c++) {
struct nvkm_perfsig *sig[4] = {}; struct nvkm_perfsig *sig[4] = {};
u64 src[4][8]; u64 src[4][8] = {};
for (s = 0; s < ARRAY_SIZE(args->v0.ctr[c].signal); s++) { for (s = 0; s < ARRAY_SIZE(args->v0.ctr[c].signal); s++) {
sig[s] = nvkm_perfsig_find(ppm, args->v0.domain, sig[s] = nvkm_perfsig_find(ppm, args->v0.domain,
...@@ -378,11 +390,10 @@ nvkm_perfdom_ctor(struct nvkm_object *parent, struct nvkm_object *engine, ...@@ -378,11 +390,10 @@ nvkm_perfdom_ctor(struct nvkm_object *parent, struct nvkm_object *engine,
} }
} }
ret = nvkm_perfctr_new(sdom, c, sig, src, ret = nvkm_perfctr_new(sdom, c, args->v0.domain, sig, src,
args->v0.ctr[c].logic_op, &ctr[c]); args->v0.ctr[c].logic_op, &ctr[c]);
if (ret) if (ret)
return ret; return ret;
ctr[c]->domain = args->v0.domain;
} }
if (!sdom) if (!sdom)
......
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