mirror of
https://github.com/torvalds/linux.git
synced 2026-04-22 00:33:58 -04:00
This enables BLCG optimization for kepler1. When using clockgating, nvidia's firmware has a set of registers which are initially programmed by the vbios with various engine delays and other mysterious settings that are safe enough to bring up the GPU. However, the values used by the vbios are more power hungry then they need to be, so the nvidia driver writes it's own more optimized set of BLCG settings before enabling CG_CTRL. This adds support for programming the optimized BLCG values during engine/subdev init, which enables rather significant power savings. This introduces the nvkm_therm_clkgate_init() helper, which we use to program the optimized BLCG settings before enabling clockgating with nvkm_therm_clkgate_enable. As well, this commit shares a lot more code with Fermi since BLCG is mostly the same there as far as we can tell. In the future, it's likely we'll reformat the clkgate_packs for kepler1 so that they share a list of mmio packs with Fermi. Signed-off-by: Lyude Paul <lyude@redhat.com> Reviewed-by: Martin Peres <martin.peres@free.fr> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
72 lines
2.5 KiB
C
72 lines
2.5 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __NVKM_FB_PRIV_H__
|
|
#define __NVKM_FB_PRIV_H__
|
|
#define nvkm_fb(p) container_of((p), struct nvkm_fb, subdev)
|
|
#include <subdev/fb.h>
|
|
#include <subdev/therm.h>
|
|
struct nvkm_bios;
|
|
|
|
struct nvkm_fb_func {
|
|
void *(*dtor)(struct nvkm_fb *);
|
|
u32 (*tags)(struct nvkm_fb *);
|
|
int (*oneinit)(struct nvkm_fb *);
|
|
void (*init)(struct nvkm_fb *);
|
|
int (*init_page)(struct nvkm_fb *);
|
|
void (*init_unkn)(struct nvkm_fb *);
|
|
void (*intr)(struct nvkm_fb *);
|
|
|
|
struct {
|
|
int regions;
|
|
void (*init)(struct nvkm_fb *, int i, u32 addr, u32 size,
|
|
u32 pitch, u32 flags, struct nvkm_fb_tile *);
|
|
void (*comp)(struct nvkm_fb *, int i, u32 size, u32 flags,
|
|
struct nvkm_fb_tile *);
|
|
void (*fini)(struct nvkm_fb *, int i, struct nvkm_fb_tile *);
|
|
void (*prog)(struct nvkm_fb *, int i, struct nvkm_fb_tile *);
|
|
} tile;
|
|
|
|
int (*ram_new)(struct nvkm_fb *, struct nvkm_ram **);
|
|
|
|
u8 default_bigpage;
|
|
const struct nvkm_therm_clkgate_pack *clkgate_pack;
|
|
};
|
|
|
|
void nvkm_fb_ctor(const struct nvkm_fb_func *, struct nvkm_device *device,
|
|
int index, struct nvkm_fb *);
|
|
int nvkm_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *device,
|
|
int index, struct nvkm_fb **);
|
|
int nvkm_fb_bios_memtype(struct nvkm_bios *);
|
|
|
|
void nv10_fb_tile_init(struct nvkm_fb *, int i, u32 addr, u32 size,
|
|
u32 pitch, u32 flags, struct nvkm_fb_tile *);
|
|
void nv10_fb_tile_fini(struct nvkm_fb *, int i, struct nvkm_fb_tile *);
|
|
void nv10_fb_tile_prog(struct nvkm_fb *, int, struct nvkm_fb_tile *);
|
|
|
|
u32 nv20_fb_tags(struct nvkm_fb *);
|
|
void nv20_fb_tile_init(struct nvkm_fb *, int i, u32 addr, u32 size,
|
|
u32 pitch, u32 flags, struct nvkm_fb_tile *);
|
|
void nv20_fb_tile_fini(struct nvkm_fb *, int i, struct nvkm_fb_tile *);
|
|
void nv20_fb_tile_prog(struct nvkm_fb *, int, struct nvkm_fb_tile *);
|
|
|
|
void nv30_fb_init(struct nvkm_fb *);
|
|
void nv30_fb_tile_init(struct nvkm_fb *, int i, u32 addr, u32 size,
|
|
u32 pitch, u32 flags, struct nvkm_fb_tile *);
|
|
|
|
void nv40_fb_tile_comp(struct nvkm_fb *, int i, u32 size, u32 flags,
|
|
struct nvkm_fb_tile *);
|
|
|
|
void nv41_fb_init(struct nvkm_fb *);
|
|
void nv41_fb_tile_prog(struct nvkm_fb *, int, struct nvkm_fb_tile *);
|
|
|
|
void nv44_fb_init(struct nvkm_fb *);
|
|
void nv44_fb_tile_prog(struct nvkm_fb *, int, struct nvkm_fb_tile *);
|
|
|
|
void nv46_fb_tile_init(struct nvkm_fb *, int i, u32 addr, u32 size,
|
|
u32 pitch, u32 flags, struct nvkm_fb_tile *);
|
|
|
|
int gf100_fb_oneinit(struct nvkm_fb *);
|
|
int gf100_fb_init_page(struct nvkm_fb *);
|
|
|
|
int gm200_fb_init_page(struct nvkm_fb *);
|
|
#endif
|