]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/nouveau/mc: use split type+inst in device reset APIs
authorBen Skeggs <bskeggs@redhat.com>
Sat, 6 Feb 2021 00:44:15 +0000 (10:44 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 11 Feb 2021 01:49:54 +0000 (11:49 +1000)
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/subdev/mc.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/top.h
drivers/gpu/drm/nouveau/nvkm/core/subdev.c
drivers/gpu/drm/nouveau/nvkm/engine/falcon.c
drivers/gpu/drm/nouveau/nvkm/engine/fifo/base.c
drivers/gpu/drm/nouveau/nvkm/falcon/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/mc/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/top/base.c

index 2d84b1bfc1197a067a894d94399cb5b39256d132..88970a737601ad61bfeaf3b05b726a3f0ebf8d85 100644 (file)
@@ -8,10 +8,10 @@ struct nvkm_mc {
        struct nvkm_subdev subdev;
 };
 
-void nvkm_mc_enable(struct nvkm_device *, enum nvkm_devidx);
-void nvkm_mc_disable(struct nvkm_device *, enum nvkm_devidx);
-bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_devidx);
-void nvkm_mc_reset(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_subdev_type, int);
+bool nvkm_mc_enabled(struct nvkm_device *, enum nvkm_subdev_type, int);
+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_unarm(struct nvkm_device *);
 void nvkm_mc_intr_rearm(struct nvkm_device *);
index cf3c4fd8942d261fe76d7f0e04b51d6b623b447d..f94cb24eb919838840fc31b64a10e4f2970c68cc 100644 (file)
@@ -23,7 +23,7 @@ struct nvkm_top_device {
 };
 
 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_mask(struct nvkm_device *, enum nvkm_devidx);
 int nvkm_top_fault_id(struct nvkm_device *, enum nvkm_devidx);
index fca876b6bc91a4b1ec93f28cfc1838a0ef6ae128..06f81c96b0aea5fe60b6dc0ebbc372f1114c6744 100644 (file)
@@ -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;
        nvkm_trace(subdev, "%s completed in %lldus\n", action, time);
index 8675613e142b64a54ac6a2acf8dd0afb934dc7e5..11937eb78fc9cea09b213e3691490fcdf429a993 100644 (file)
@@ -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_wr32(device, base + 0x014, 0xffffffff);
        }
index d473c636e47e5897effd3b2dc4b2a20bc4d046b4..8ab4937ea193ac69647b15980e10451f9e16a25f 100644 (file)
@@ -313,7 +313,7 @@ nvkm_fifo_oneinit(struct nvkm_engine *engine)
 static void
 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
index adc7f4aa7e62bda124a0bb985b5cf542ecbf1832..212e224ddda8ace58338f6defa99e3c22386c029 100644 (file)
@@ -88,13 +88,12 @@ int
 nvkm_falcon_enable(struct nvkm_falcon *falcon)
 {
        struct nvkm_device *device = falcon->owner->device;
-       enum nvkm_devidx id = falcon->owner->index;
        int ret;
 
-       nvkm_mc_enable(device, id);
+       nvkm_mc_enable(device, falcon->owner->type, falcon->owner->inst);
        ret = falcon->func->enable(falcon);
        if (ret) {
-               nvkm_mc_disable(device, id);
+               nvkm_mc_disable(device, falcon->owner->type, falcon->owner->inst);
                return ret;
        }
 
@@ -105,15 +104,14 @@ void
 nvkm_falcon_disable(struct nvkm_falcon *falcon)
 {
        struct nvkm_device *device = falcon->owner->device;
-       enum nvkm_devidx id = falcon->owner->index;
 
        /* 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;
 
        falcon->func->disable(falcon);
 
-       nvkm_mc_disable(device, id);
+       nvkm_mc_disable(device, falcon->owner->type, falcon->owner->inst);
 }
 
 int
index a9e7d09c3fbb29f98c64500923fc0702b7a31f61..7bd92d0f03371b5a02dca668c1d7d6ccfec4edde 100644 (file)
@@ -111,17 +111,16 @@ nvkm_mc_intr(struct nvkm_device *device, bool *handled)
 }
 
 static u32
-nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto,
-                  enum nvkm_devidx devidx)
+nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto, enum nvkm_subdev_type type, int inst)
 {
        struct nvkm_mc *mc = device->mc;
        const struct nvkm_mc_map *map;
        u64 pmc_enable = 0;
        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++) {
                                if (!isauto || !map->noauto) {
-                                       if (map->type + map->inst == devidx) {
+                                       if (map->type == type && map->inst == inst) {
                                                pmc_enable = map->stat;
                                                break;
                                        }
@@ -133,9 +132,9 @@ nvkm_mc_reset_mask(struct nvkm_device *device, bool isauto,
 }
 
 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) {
                nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
                nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
@@ -144,17 +143,17 @@ nvkm_mc_reset(struct nvkm_device *device, enum nvkm_devidx devidx)
 }
 
 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)
                nvkm_mask(device, 0x000200, pmc_enable, 0x00000000);
 }
 
 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) {
                nvkm_mask(device, 0x000200, pmc_enable, pmc_enable);
                nvkm_rd32(device, 0x000200);
@@ -162,9 +161,9 @@ nvkm_mc_enable(struct nvkm_device *device, enum nvkm_devidx devidx)
 }
 
 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) &&
               ((nvkm_rd32(device, 0x000200) & pmc_enable) == pmc_enable);
index 3ecb3d9cbcf234674a42c22d313f10c779cbf1df..589c375a677f263f41f44895eae11d398a16d0e5 100644 (file)
@@ -30,14 +30,14 @@ void
 gf100_pmu_reset(struct nvkm_pmu *pmu)
 {
        struct nvkm_device *device = pmu->subdev.device;
-       nvkm_mc_disable(device, NVKM_SUBDEV_PMU);
-       nvkm_mc_enable(device, NVKM_SUBDEV_PMU);
+       nvkm_mc_disable(device, NVKM_SUBDEV_PMU, 0);
+       nvkm_mc_enable(device, NVKM_SUBDEV_PMU, 0);
 }
 
 bool
 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
index 7c56d4860978d41052eb628ccc9e7a4a609e21fe..1e556e88ecbb9d2e64a1d820936efc1e8f70eb9f 100644 (file)
@@ -59,14 +59,14 @@ nvkm_top_addr(struct nvkm_device *device, enum nvkm_devidx index)
 }
 
 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_device *info;
 
        if (top) {
                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);
                }
        }