]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
drm/nouveau/pmu/gm200-: use alternate falcon reset sequence
authorBen Skeggs <bskeggs@redhat.com>
Thu, 25 Feb 2021 04:54:59 +0000 (14:54 +1000)
committerPaolo Pisati <paolo.pisati@canonical.com>
Mon, 7 Mar 2022 10:43:59 +0000 (11:43 +0100)
BugLink: https://bugs.launchpad.net/bugs/1963890
commit 4cdd2450bf739bada353e82d27b00db9af8c3001 upstream.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Karol Herbst <kherbst@redhat.com>
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Link: https://gitlab.freedesktop.org/drm/nouveau/-/merge_requests/10
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Paolo Pisati <paolo.pisati@canonical.com>
drivers/gpu/drm/nouveau/nvkm/falcon/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm200.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp10b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/priv.h

index 262641a014b066ff346f888f889006f83aa0ecce..c91130a6be2a1f9fc8890a28c8c945514452a854 100644 (file)
@@ -117,8 +117,12 @@ nvkm_falcon_disable(struct nvkm_falcon *falcon)
 int
 nvkm_falcon_reset(struct nvkm_falcon *falcon)
 {
-       nvkm_falcon_disable(falcon);
-       return nvkm_falcon_enable(falcon);
+       if (!falcon->func->reset) {
+               nvkm_falcon_disable(falcon);
+               return nvkm_falcon_enable(falcon);
+       }
+
+       return falcon->func->reset(falcon);
 }
 
 int
index 5968c7696596c328ebe355b54a2acd139c813bfe..40439e329aa9f7518a79dc7f368e52f0031d8a7f 100644 (file)
  */
 #include "priv.h"
 
+static int
+gm200_pmu_flcn_reset(struct nvkm_falcon *falcon)
+{
+       struct nvkm_pmu *pmu = container_of(falcon, typeof(*pmu), falcon);
+
+       nvkm_falcon_wr32(falcon, 0x014, 0x0000ffff);
+       pmu->func->reset(pmu);
+       return nvkm_falcon_enable(falcon);
+}
+
+const struct nvkm_falcon_func
+gm200_pmu_flcn = {
+       .debug = 0xc08,
+       .fbif = 0xe00,
+       .load_imem = nvkm_falcon_v1_load_imem,
+       .load_dmem = nvkm_falcon_v1_load_dmem,
+       .read_dmem = nvkm_falcon_v1_read_dmem,
+       .bind_context = nvkm_falcon_v1_bind_context,
+       .wait_for_halt = nvkm_falcon_v1_wait_for_halt,
+       .clear_interrupt = nvkm_falcon_v1_clear_interrupt,
+       .set_start_addr = nvkm_falcon_v1_set_start_addr,
+       .start = nvkm_falcon_v1_start,
+       .enable = nvkm_falcon_v1_enable,
+       .disable = nvkm_falcon_v1_disable,
+       .reset = gm200_pmu_flcn_reset,
+       .cmdq = { 0x4a0, 0x4b0, 4 },
+       .msgq = { 0x4c8, 0x4cc, 0 },
+};
+
 static const struct nvkm_pmu_func
 gm200_pmu = {
-       .flcn = &gt215_pmu_flcn,
+       .flcn = &gm200_pmu_flcn,
        .enabled = gf100_pmu_enabled,
        .reset = gf100_pmu_reset,
 };
index 148706977eec740824943bbcb6007f24c7ebc375..e1772211b0a4b1567456e0eea30f5db88155f739 100644 (file)
@@ -211,7 +211,7 @@ gm20b_pmu_recv(struct nvkm_pmu *pmu)
 
 static const struct nvkm_pmu_func
 gm20b_pmu = {
-       .flcn = &gt215_pmu_flcn,
+       .flcn = &gm200_pmu_flcn,
        .enabled = gf100_pmu_enabled,
        .intr = gt215_pmu_intr,
        .recv = gm20b_pmu_recv,
index 00da1b873ce81c858a4ed556a59aa05a19e80ad6..6bf7fc1bd1e3b1deb1808286b748eaef39b301f5 100644 (file)
@@ -39,7 +39,7 @@ gp102_pmu_enabled(struct nvkm_pmu *pmu)
 
 static const struct nvkm_pmu_func
 gp102_pmu = {
-       .flcn = &gt215_pmu_flcn,
+       .flcn = &gm200_pmu_flcn,
        .enabled = gp102_pmu_enabled,
        .reset = gp102_pmu_reset,
 };
index 461f722656e242b45e34a7d05688eb8713ba39d1..ba1583bb618b2ef8379dcf5cfa99b0ccfdbd264e 100644 (file)
@@ -78,7 +78,7 @@ gp10b_pmu_acr = {
 
 static const struct nvkm_pmu_func
 gp10b_pmu = {
-       .flcn = &gt215_pmu_flcn,
+       .flcn = &gm200_pmu_flcn,
        .enabled = gf100_pmu_enabled,
        .intr = gt215_pmu_intr,
        .recv = gm20b_pmu_recv,
index e7860d17735398ba5b3d6efef7135db627fb3914..bcaade758ff728bd528fafb262fb608f0b08a09a 100644 (file)
@@ -44,6 +44,8 @@ void gf100_pmu_reset(struct nvkm_pmu *);
 
 void gk110_pmu_pgob(struct nvkm_pmu *, bool);
 
+extern const struct nvkm_falcon_func gm200_pmu_flcn;
+
 void gm20b_pmu_acr_bld_patch(struct nvkm_acr *, u32, s64);
 void gm20b_pmu_acr_bld_write(struct nvkm_acr *, u32, struct nvkm_acr_lsfw *);
 int gm20b_pmu_acr_boot(struct nvkm_falcon *);