[Nouveau] [PATCH 2/3] ltc/gf100: add flush/invalidate functions

Ben Skeggs skeggsb at gmail.com
Thu Sep 3 00:09:17 PDT 2015


On 3 September 2015 at 16:42, Alexandre Courbot <acourbot at nvidia.com> wrote:
> Allow clients to manually flush and invalidate L2. This will be useful
> for Tegra systems for which we want to write instmem using the CPU.
>
> Signed-off-by: Alexandre Courbot <acourbot at nvidia.com>
> ---
>  drm/nouveau/include/nvkm/subdev/ltc.h |  1 +
>  drm/nouveau/nvkm/subdev/ltc/gf100.c   | 36 +++++++++++++++++++++++++++++++++++
>  drm/nouveau/nvkm/subdev/ltc/gk104.c   |  2 ++
>  drm/nouveau/nvkm/subdev/ltc/gm107.c   |  2 ++
>  drm/nouveau/nvkm/subdev/ltc/priv.h    |  2 ++
>  5 files changed, 43 insertions(+)
>
> diff --git a/drm/nouveau/include/nvkm/subdev/ltc.h b/drm/nouveau/include/nvkm/subdev/ltc.h
> index 5464fcf482f1..3d4dbbf9aab3 100644
> --- a/drm/nouveau/include/nvkm/subdev/ltc.h
> +++ b/drm/nouveau/include/nvkm/subdev/ltc.h
> @@ -35,5 +35,6 @@ void nvkm_ltc_flush(struct nvkm_ltc *);
>
>  int gf100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
>  int gk104_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
> +int gk20a_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
>  int gm107_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
>  #endif
> diff --git a/drm/nouveau/nvkm/subdev/ltc/gf100.c b/drm/nouveau/nvkm/subdev/ltc/gf100.c
> index 45ac765b753e..42ae77533865 100644
> --- a/drm/nouveau/nvkm/subdev/ltc/gf100.c
> +++ b/drm/nouveau/nvkm/subdev/ltc/gf100.c
> @@ -122,6 +122,40 @@ gf100_ltc_intr(struct nvkm_ltc *ltc)
>         }
>  }
>
> +void
> +gf100_ltc_invalidate(struct nvkm_ltc *ltc)
> +{
> +       struct nvkm_device *device = ltc->subdev.device;
> +       s64 taken;
> +
> +       nvkm_wr32(device, 0x70004, 0x00000001);
> +       if ((taken = nvkm_msec(device, 2000,
I don't suppose you have access to information on more realistic
timeouts?  I'd like to improve all the potential 2s timeout values
across the driver in general, to avoid things hanging for a long time
when the GPU craps itself :)

> +               if ((nvkm_rd32(device, 0x70004) & 0x00000003) == 0x00000000)
> +                       break;
> +       )) < 0)
> +               nvkm_warn(&ltc->subdev, "L2 invalidate timeout\n");
> +
> +       if (taken > 0)
> +               nvkm_debug(&ltc->subdev, "LTC invalidate took %lld ns\n", taken);
> +}
> +
> +void
> +gf100_ltc_flush(struct nvkm_ltc *ltc)
> +{
> +       struct nvkm_device *device = ltc->subdev.device;
> +       s64 taken;
> +
> +       nvkm_wr32(device, 0x70010, 0x00000001);
> +       if ((taken = nvkm_msec(device, 2000,
> +               if ((nvkm_rd32(device, 0x70010) & 0x00000003) == 0x00000000)
> +                       break;
> +       )) < 0)
> +               nvkm_warn(&ltc->subdev, "L2 flush timeout\n");
> +
> +       if (taken > 0)
> +               nvkm_debug(&ltc->subdev, "LTC flush took %lld ns\n", taken);
> +}
> +
>  /* TODO: Figure out tag memory details and drop the over-cautious allocation.
>   */
>  int
> @@ -215,6 +249,8 @@ gf100_ltc = {
>         .zbc = 16,
>         .zbc_clear_color = gf100_ltc_zbc_clear_color,
>         .zbc_clear_depth = gf100_ltc_zbc_clear_depth,
> +       .invalidate = gf100_ltc_invalidate,
> +       .flush = gf100_ltc_flush,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/ltc/gk104.c b/drm/nouveau/nvkm/subdev/ltc/gk104.c
> index 839e6b4c597b..b4f6e0034d58 100644
> --- a/drm/nouveau/nvkm/subdev/ltc/gk104.c
> +++ b/drm/nouveau/nvkm/subdev/ltc/gk104.c
> @@ -45,6 +45,8 @@ gk104_ltc = {
>         .zbc = 16,
>         .zbc_clear_color = gf100_ltc_zbc_clear_color,
>         .zbc_clear_depth = gf100_ltc_zbc_clear_depth,
> +       .invalidate = gf100_ltc_invalidate,
> +       .flush = gf100_ltc_flush,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/ltc/gm107.c b/drm/nouveau/nvkm/subdev/ltc/gm107.c
> index 389331bb63ba..3043bbfd7384 100644
> --- a/drm/nouveau/nvkm/subdev/ltc/gm107.c
> +++ b/drm/nouveau/nvkm/subdev/ltc/gm107.c
> @@ -138,6 +138,8 @@ gm107_ltc = {
>         .zbc = 16,
>         .zbc_clear_color = gm107_ltc_zbc_clear_color,
>         .zbc_clear_depth = gm107_ltc_zbc_clear_depth,
> +       .invalidate = gf100_ltc_invalidate,
> +       .flush = gf100_ltc_flush,
>  };
>
>  int
> diff --git a/drm/nouveau/nvkm/subdev/ltc/priv.h b/drm/nouveau/nvkm/subdev/ltc/priv.h
> index 6f66bd03f829..4e3755b82769 100644
> --- a/drm/nouveau/nvkm/subdev/ltc/priv.h
> +++ b/drm/nouveau/nvkm/subdev/ltc/priv.h
> @@ -29,4 +29,6 @@ void gf100_ltc_cbc_clear(struct nvkm_ltc *, u32, u32);
>  void gf100_ltc_cbc_wait(struct nvkm_ltc *);
>  void gf100_ltc_zbc_clear_color(struct nvkm_ltc *, int, const u32[4]);
>  void gf100_ltc_zbc_clear_depth(struct nvkm_ltc *, int, const u32);
> +void gf100_ltc_invalidate(struct nvkm_ltc *);
> +void gf100_ltc_flush(struct nvkm_ltc *);
>  #endif
> --
> 2.5.1
>
> _______________________________________________
> Nouveau mailing list
> Nouveau at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/nouveau


More information about the Nouveau mailing list