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 
72799bba6SBen Skeggs #define NVKM_LTC_MAX_ZBC_CNT 16
8c39f472eSBen Skeggs 
92799bba6SBen Skeggs struct nvkm_ltc {
1070bc7182SBen Skeggs 	const struct nvkm_ltc_func *func;
11c7750cfbSBen Skeggs 	struct nvkm_subdev subdev;
12c39f472eSBen Skeggs 
1370bc7182SBen Skeggs 	u32 ltc_nr;
1470bc7182SBen Skeggs 	u32 lts_nr;
1570bc7182SBen Skeggs 
16*dbffdff7SBen Skeggs 	struct mutex mutex; /* serialises CBC operations */
1770bc7182SBen Skeggs 	u32 num_tags;
1870bc7182SBen Skeggs 	u32 tag_base;
19bd447053SBen Skeggs 	struct nvkm_memory *tag_ram;
20c39f472eSBen Skeggs 
21c39f472eSBen Skeggs 	int zbc_min;
22c39f472eSBen Skeggs 	int zbc_max;
2370bc7182SBen Skeggs 	u32 zbc_color[NVKM_LTC_MAX_ZBC_CNT][4];
2470bc7182SBen Skeggs 	u32 zbc_depth[NVKM_LTC_MAX_ZBC_CNT];
254b2c71edSBen Skeggs 	u32 zbc_stencil[NVKM_LTC_MAX_ZBC_CNT];
26c39f472eSBen Skeggs };
27c39f472eSBen Skeggs 
28b1e839f3SBen Skeggs void nvkm_ltc_tags_clear(struct nvkm_device *, u32 first, u32 count);
29c39f472eSBen Skeggs 
3070bc7182SBen Skeggs int nvkm_ltc_zbc_color_get(struct nvkm_ltc *, int index, const u32[4]);
3170bc7182SBen Skeggs int nvkm_ltc_zbc_depth_get(struct nvkm_ltc *, int index, const u32);
324b2c71edSBen Skeggs int nvkm_ltc_zbc_stencil_get(struct nvkm_ltc *, int index, const u32);
3370bc7182SBen Skeggs 
3438a8fc78SAlexandre Courbot void nvkm_ltc_invalidate(struct nvkm_ltc *);
3538a8fc78SAlexandre Courbot void nvkm_ltc_flush(struct nvkm_ltc *);
3638a8fc78SAlexandre Courbot 
3770bc7182SBen Skeggs int gf100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
3870bc7182SBen Skeggs int gk104_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
39a0a49bacSAlexandre Courbot int gk20a_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
4070bc7182SBen Skeggs int gm107_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
41db1eb528SBen Skeggs int gm200_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
42a96def39SBen Skeggs int gp100_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
434b2c71edSBen Skeggs int gp102_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
440d0d4982SThierry Reding int gp10b_ltc_new(struct nvkm_device *, int, struct nvkm_ltc **);
45c39f472eSBen Skeggs #endif
46