1b7019ac5SIlia Mirkin /* SPDX-License-Identifier: MIT */
22799bba6SBen Skeggs #ifndef __NVKM_LTC_H__
32799bba6SBen Skeggs #define __NVKM_LTC_H__
4c39f472eSBen Skeggs #include <core/subdev.h>
570bc7182SBen Skeggs #include <core/mm.h>
6c39f472eSBen Skeggs 
7*21e938d0SBen Skeggs #define NVKM_LTC_MAX_ZBC_COLOR_CNT 32
84500031fSBen Skeggs #define NVKM_LTC_MAX_ZBC_DEPTH_CNT 16
9c39f472eSBen Skeggs 
102799bba6SBen Skeggs struct nvkm_ltc {
1170bc7182SBen Skeggs 	const struct nvkm_ltc_func *func;
12c7750cfbSBen Skeggs 	struct nvkm_subdev subdev;
13c39f472eSBen Skeggs 
1470bc7182SBen Skeggs 	u32 ltc_nr;
1570bc7182SBen Skeggs 	u32 lts_nr;
1670bc7182SBen Skeggs 
17dbffdff7SBen Skeggs 	struct mutex mutex; /* serialises CBC operations */
1870bc7182SBen Skeggs 	u32 num_tags;
1970bc7182SBen Skeggs 	u32 tag_base;
20bd447053SBen Skeggs 	struct nvkm_memory *tag_ram;
21c39f472eSBen Skeggs 
224500031fSBen Skeggs 	int zbc_color_min;
234500031fSBen Skeggs 	int zbc_color_max;
244500031fSBen Skeggs 	u32 zbc_color[NVKM_LTC_MAX_ZBC_COLOR_CNT][4];
254500031fSBen Skeggs 	int zbc_depth_min;
264500031fSBen Skeggs 	int zbc_depth_max;
274500031fSBen Skeggs 	u32 zbc_depth[NVKM_LTC_MAX_ZBC_DEPTH_CNT];
284500031fSBen Skeggs 	u32 zbc_stencil[NVKM_LTC_MAX_ZBC_DEPTH_CNT];
29c39f472eSBen Skeggs };
30c39f472eSBen Skeggs 
31b1e839f3SBen Skeggs void nvkm_ltc_tags_clear(struct nvkm_device *, u32 first, u32 count);
32c39f472eSBen Skeggs 
3370bc7182SBen Skeggs int nvkm_ltc_zbc_color_get(struct nvkm_ltc *, int index, const u32[4]);
3470bc7182SBen Skeggs int nvkm_ltc_zbc_depth_get(struct nvkm_ltc *, int index, const u32);
354b2c71edSBen Skeggs int nvkm_ltc_zbc_stencil_get(struct nvkm_ltc *, int index, const u32);
3670bc7182SBen Skeggs 
3738a8fc78SAlexandre Courbot void nvkm_ltc_invalidate(struct nvkm_ltc *);
3838a8fc78SAlexandre Courbot void nvkm_ltc_flush(struct nvkm_ltc *);
3938a8fc78SAlexandre Courbot 
400afc1c4cSBen Skeggs int gf100_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
410afc1c4cSBen Skeggs int gk104_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
420afc1c4cSBen Skeggs int gm107_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
430afc1c4cSBen Skeggs int gm200_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
440afc1c4cSBen Skeggs int gp100_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
450afc1c4cSBen Skeggs int gp102_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
460afc1c4cSBen Skeggs int gp10b_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
47*21e938d0SBen Skeggs int ga102_ltc_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_ltc **);
48c39f472eSBen Skeggs #endif
49