Commit 6997ea13 authored by Ben Skeggs's avatar Ben Skeggs

drm/nouveau/mc: use split type+inst in device reset APIs

Signed-off-by: default avatarBen Skeggs <bskeggs@redhat.com>
Reviewed-by: default avatarLyude Paul <lyude@redhat.com>
parent c653ab83
...@@ -8,10 +8,10 @@ struct nvkm_mc { ...@@ -8,10 +8,10 @@ struct nvkm_mc {
struct nvkm_subdev subdev; struct nvkm_subdev subdev;
}; };
void nvkm_mc_enable(struct nvkm_device *, enum nvkm_devidx); void nvkm_mc_enable(struct nvkm_device *, enum nvkm_subdev_type, int);
void nvkm_mc_disable(struct nvkm_device *, enum nvkm_devidx); void nvkm_mc_disable(struct nvkm_device *, enum nvkm_subdev_type, int);
bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_devidx); bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_subdev_type, int);
void nvkm_mc_reset(struct nvkm_device *, enum nvkm_devidx); void nvkm_mc_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
void nvkm_mc_intr(struct nvkm_device *, bool *handled); void nvkm_mc_intr(struct nvkm_device *, bool *handled);
void nvkm_mc_intr_unarm(struct nvkm_device *); void nvkm_mc_intr_unarm(struct nvkm_device *);
void nvkm_mc_intr_rearm(struct nvkm_device *); void nvkm_mc_intr_rearm(struct nvkm_device *);
......
...@@ -23,7 +23,7 @@ struct nvkm_top_device { ...@@ -23,7 +23,7 @@ struct nvkm_top_device {
}; };
u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_devidx); u32 nvkm_top_addr(struct nvkm_device *, enum nvkm_devidx);
u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_devidx); u32 nvkm_top_reset(struct nvkm_device *, enum nvkm_subdev_type, int);
u32 nvkm_top_intr(struct nvkm_device *, u32 intr, u64 *subdevs); u32 nvkm_top_intr(struct nvkm_device *, u32 intr, u64 *subdevs);
u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_devidx); u32 nvkm_top_intr_mask(struct nvkm_device *, enum nvkm_devidx);
int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_devidx); int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_devidx);
......
...@@ -111,7 +111,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend) ...@@ -111,7 +111,7 @@ nvkm_subdev_fini(struct nvkm_subdev *subdev, bool suspend)
} }
} }
nvkm_mc_reset(device, subdev->index); nvkm_mc_reset(device, subdev->type, subdev->inst);
time = ktime_to_us(ktime_get()) - time; time = ktime_to_us(ktime_get()) - time;
nvkm_trace(subdev, "%s completed in %lldus\n", action, time); nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
......
...@@ -108,7 +108,7 @@ nvkm_falcon_fini(struct nvkm_engine *engine, bool suspend) ...@@ -108,7 +108,7 @@ nvkm_falcon_fini(struct nvkm_engine *engine, bool suspend)
} }
} }
if (nvkm_mc_enabled(device, engine->subdev.index)) { if (nvkm_mc_enabled(device, engine->subdev.type, engine->subdev.inst)) {
nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000); nvkm_mask(device, base + 0x048, 0x00000003, 0x00000000);
nvkm_wr32(device, base + 0x014, 0xffffffff); nvkm_wr32(device, base + 0x014, 0xffffffff);
} }
......
...@@ -313,7 +313,7 @@ nvkm_fifo_oneinit(struct nvkm_engine *engine) ...@@ -313,7 +313,7 @@ nvkm_fifo_oneinit(struct nvkm_engine *engine)
static void static void
nvkm_fifo_preinit(struct nvkm_engine *engine) nvkm_fifo_preinit(struct nvkm_engine *engine)
{ {
nvkm_mc_reset(engine->subdev.device, NVKM_ENGINE_FIFO); nvkm_mc_reset(engine->subdev.device, NVKM_ENGINE_FIFO, 0);
} }
static int static int
......
...@@ -88,13 +88,12 @@ int ...@@ -88,13 +88,12 @@ int
nvkm_falcon_enable(struct nvkm_falcon *falcon) nvkm_falcon_enable(struct nvkm_falcon *falcon)
{ {
struct nvkm_device *device = falcon->owner->device; struct nvkm_device *device = falcon->owner->device;
enum nvkm_devidx id = falcon->owner->index;
int ret; int ret;
nvkm_mc_enable(device, id); nvkm_mc_enable(device, falcon->owner->type, falcon->owner->inst);
ret = falcon->func->enable(falcon); ret = falcon->func->enable(falcon);
if (ret) { if (ret) {
nvkm_mc_disable(device, id); nvkm_mc_disable(device, falcon->owner->type, falcon->owner->inst);
return ret; return ret;
} }
...@@ -105,15 +104,14 @@ void ...@@ -105,15 +104,14 @@ void
nvkm_falcon_disable(struct nvkm_falcon *falcon) nvkm_falcon_disable(struct nvkm_falcon *falcon)
{ {
struct nvkm_device *device = falcon->owner->device; struct nvkm_device *device = falcon->owner->device;
enum nvkm_devidx id = falcon->owner->index;
/* already disabled, return or wait_idle will timeout */ /* already disabled, return or wait_idle will timeout */
if (!nvkm_mc_enabled(device, id)) if (!nvkm_mc_enabled(device, falcon->owner->type, falcon->owner->inst))
return; return;
falcon->func->disable(falcon); falcon->func->disable(falcon);
nvkm_mc_disable(device, id); nvkm_mc_disable(device, falcon->owner->type, falcon->owner->inst);
} }
int int
......
...@@ -111,17 +111,16 @@ nvkm_mc_intr(struct nvkm_device *device, bool *handled) ...@@ -111,17 +111,16 @@ nvkm_mc_intr(struct nvkm_device *device, bool *handled)
} }
static u32 static u32
nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto, nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto, enum nvkm_subdev_type type, int inst)
enum nvkm_devidx devidx)
{ {
struct nvkm_mc *mc = device->mc; struct nvkm_mc *mc = device->mc;
const struct nvkm_mc_map *map; const struct nvkm_mc_map *map;
u64 pmc_enable = 0; u64 pmc_enable = 0;
if (likely(mc)) { if (likely(mc)) {
if (!(pmc_enable = nvkm_top_reset(device, devidx))) { if (!(pmc_enable = nvkm_top_reset(device, type, inst))) {
for (map = mc->func->reset; map && map->stat; map++) { for (map = mc->func->reset; map && map->stat; map++) {
if (!isauto || !map->noauto) { if (!isauto || !map->noauto) {
if (map->type + map->inst == devidx) { if (map->type == type && map->inst == inst) {
pmc_enable = map->stat; pmc_enable = map->stat;
break; break;
} }
...@@ -133,9 +132,9 @@ nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto, ...@@ -133,9 +132,9 @@ nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto,
} }
void void
nvkm_mc_reset(struct nvkm_device *device, enum nvkm_devidx devidx) nvkm_mc_reset(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
{ {
u64 pmc_enable = nvkm_mc_reset_mask(device, true, devidx); u64 pmc_enable = nvkm_mc_reset_mask(device, true, type, inst);
if (pmc_enable) { if (pmc_enable) {
nvkm_mask(device, 0x000200, pmc_enable, 0x00000000); nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
nvkm_mask(device, 0x000200, pmc_enable, pmc_enable); nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
...@@ -144,17 +143,17 @@ nvkm_mc_reset(struct nvkm_device *device, enum nvkm_devidx devidx) ...@@ -144,17 +143,17 @@ nvkm_mc_reset(struct nvkm_device *device, enum nvkm_devidx devidx)
} }
void void
nvkm_mc_disable(struct nvkm_device *device, enum nvkm_devidx devidx) nvkm_mc_disable(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
{ {
u64 pmc_enable = nvkm_mc_reset_mask(device, false, devidx); u64 pmc_enable = nvkm_mc_reset_mask(device, false, type, inst);
if (pmc_enable) if (pmc_enable)
nvkm_mask(device, 0x000200, pmc_enable, 0x00000000); nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
} }
void void
nvkm_mc_enable(struct nvkm_device *device, enum nvkm_devidx devidx) nvkm_mc_enable(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
{ {
u64 pmc_enable = nvkm_mc_reset_mask(device, false, devidx); u64 pmc_enable = nvkm_mc_reset_mask(device, false, type, inst);
if (pmc_enable) { if (pmc_enable) {
nvkm_mask(device, 0x000200, pmc_enable, pmc_enable); nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
nvkm_rd32(device, 0x000200); nvkm_rd32(device, 0x000200);
...@@ -162,9 +161,9 @@ nvkm_mc_enable(struct nvkm_device *device, enum nvkm_devidx devidx) ...@@ -162,9 +161,9 @@ nvkm_mc_enable(struct nvkm_device *device, enum nvkm_devidx devidx)
} }
bool bool
nvkm_mc_enabled(struct nvkm_device *device, enum nvkm_devidx devidx) nvkm_mc_enabled(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
{ {
u64 pmc_enable = nvkm_mc_reset_mask(device, false, devidx); u64 pmc_enable = nvkm_mc_reset_mask(device, false, type, inst);
return (pmc_enable != 0) && return (pmc_enable != 0) &&
((nvkm_rd32(device, 0x000200) & pmc_enable) == pmc_enable); ((nvkm_rd32(device, 0x000200) & pmc_enable) == pmc_enable);
......
...@@ -30,14 +30,14 @@ void ...@@ -30,14 +30,14 @@ void
gf100_pmu_reset(struct nvkm_pmu *pmu) gf100_pmu_reset(struct nvkm_pmu *pmu)
{ {
struct nvkm_device *device = pmu->subdev.device; struct nvkm_device *device = pmu->subdev.device;
nvkm_mc_disable(device, NVKM_SUBDEV_PMU); nvkm_mc_disable(device, NVKM_SUBDEV_PMU, 0);
nvkm_mc_enable(device, NVKM_SUBDEV_PMU); nvkm_mc_enable(device, NVKM_SUBDEV_PMU, 0);
} }
bool bool
gf100_pmu_enabled(struct nvkm_pmu *pmu) gf100_pmu_enabled(struct nvkm_pmu *pmu)
{ {
return nvkm_mc_enabled(pmu->subdev.device, NVKM_SUBDEV_PMU); return nvkm_mc_enabled(pmu->subdev.device, NVKM_SUBDEV_PMU, 0);
} }
static const struct nvkm_pmu_func static const struct nvkm_pmu_func
......
...@@ -59,14 +59,14 @@ nvkm_top_addr(struct nvkm_device *device, enum nvkm_devidx index) ...@@ -59,14 +59,14 @@ nvkm_top_addr(struct nvkm_device *device, enum nvkm_devidx index)
} }
u32 u32
nvkm_top_reset(struct nvkm_device *device, enum nvkm_devidx index) nvkm_top_reset(struct nvkm_device *device, enum nvkm_subdev_type type, int inst)
{ {
struct nvkm_top *top = device->top; struct nvkm_top *top = device->top;
struct nvkm_top_device *info; struct nvkm_top_device *info;
if (top) { if (top) {
list_for_each_entry(info, &top->device, head) { list_for_each_entry(info, &top->device, head) {
if (info->index == index && info->reset >= 0) if (info->type == type && info->inst == inst && info->reset >= 0)
return BIT(info->reset); return BIT(info->reset);
} }
} }
......
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