0001
0002 #ifndef __NVKM_FB_H__
0003 #define __NVKM_FB_H__
0004 #include <core/subdev.h>
0005 #include <core/mm.h>
0006
0007
0008 #define NV_MEM_ACCESS_RO 1
0009 #define NV_MEM_ACCESS_WO 2
0010 #define NV_MEM_ACCESS_RW (NV_MEM_ACCESS_RO | NV_MEM_ACCESS_WO)
0011 #define NV_MEM_ACCESS_SYS 4
0012 #define NV_MEM_ACCESS_VM 8
0013 #define NV_MEM_ACCESS_NOSNOOP 16
0014
0015 #define NV_MEM_TARGET_VRAM 0
0016 #define NV_MEM_TARGET_PCI 1
0017 #define NV_MEM_TARGET_PCI_NOSNOOP 2
0018 #define NV_MEM_TARGET_VM 3
0019 #define NV_MEM_TARGET_GART 4
0020
0021 #define NVKM_RAM_TYPE_VM 0x7f
0022 #define NV_MEM_COMP_VM 0x03
0023
0024 struct nvkm_fb_tile {
0025 struct nvkm_mm_node *tag;
0026 u32 addr;
0027 u32 limit;
0028 u32 pitch;
0029 u32 zcomp;
0030 };
0031
0032 struct nvkm_fb {
0033 const struct nvkm_fb_func *func;
0034 struct nvkm_subdev subdev;
0035
0036 struct nvkm_blob vpr_scrubber;
0037
0038 struct nvkm_ram *ram;
0039
0040 struct {
0041 struct mutex mutex;
0042 struct nvkm_mm mm;
0043 } tags;
0044
0045 struct {
0046 struct nvkm_fb_tile region[16];
0047 int regions;
0048 } tile;
0049
0050 u8 page;
0051
0052 struct nvkm_memory *mmu_rd;
0053 struct nvkm_memory *mmu_wr;
0054 };
0055
0056 void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size,
0057 u32 pitch, u32 flags, struct nvkm_fb_tile *);
0058 void nvkm_fb_tile_fini(struct nvkm_fb *, int region, struct nvkm_fb_tile *);
0059 void nvkm_fb_tile_prog(struct nvkm_fb *, int region, struct nvkm_fb_tile *);
0060
0061 int nv04_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0062 int nv10_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0063 int nv1a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0064 int nv20_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0065 int nv25_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0066 int nv30_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0067 int nv35_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0068 int nv36_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0069 int nv40_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0070 int nv41_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0071 int nv44_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0072 int nv46_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0073 int nv47_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0074 int nv49_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0075 int nv4e_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0076 int nv50_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0077 int g84_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0078 int gt215_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0079 int mcp77_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0080 int mcp89_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0081 int gf100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0082 int gf108_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0083 int gk104_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0084 int gk110_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0085 int gk20a_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0086 int gm107_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0087 int gm200_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0088 int gm20b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0089 int gp100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0090 int gp102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0091 int gp10b_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0092 int gv100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0093 int ga100_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0094 int ga102_fb_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fb **);
0095
0096 #include <subdev/bios.h>
0097 #include <subdev/bios/ramcfg.h>
0098
0099 struct nvkm_ram_data {
0100 struct list_head head;
0101 struct nvbios_ramcfg bios;
0102 u32 freq;
0103 };
0104
0105 enum nvkm_ram_type {
0106 NVKM_RAM_TYPE_UNKNOWN = 0,
0107 NVKM_RAM_TYPE_STOLEN,
0108 NVKM_RAM_TYPE_SGRAM,
0109 NVKM_RAM_TYPE_SDRAM,
0110 NVKM_RAM_TYPE_DDR1,
0111 NVKM_RAM_TYPE_DDR2,
0112 NVKM_RAM_TYPE_DDR3,
0113 NVKM_RAM_TYPE_GDDR2,
0114 NVKM_RAM_TYPE_GDDR3,
0115 NVKM_RAM_TYPE_GDDR4,
0116 NVKM_RAM_TYPE_GDDR5,
0117 NVKM_RAM_TYPE_GDDR5X,
0118 NVKM_RAM_TYPE_GDDR6,
0119 NVKM_RAM_TYPE_HBM2,
0120 };
0121
0122 struct nvkm_ram {
0123 const struct nvkm_ram_func *func;
0124 struct nvkm_fb *fb;
0125 enum nvkm_ram_type type;
0126 u64 size;
0127
0128 #define NVKM_RAM_MM_SHIFT 12
0129 #define NVKM_RAM_MM_ANY (NVKM_MM_HEAP_ANY + 0)
0130 #define NVKM_RAM_MM_NORMAL (NVKM_MM_HEAP_ANY + 1)
0131 #define NVKM_RAM_MM_NOMAP (NVKM_MM_HEAP_ANY + 2)
0132 #define NVKM_RAM_MM_MIXED (NVKM_MM_HEAP_ANY + 3)
0133 struct nvkm_mm vram;
0134 u64 stolen;
0135 struct mutex mutex;
0136
0137 int ranks;
0138 int parts;
0139 int part_mask;
0140
0141 u32 freq;
0142 u32 mr[16];
0143 u32 mr1_nuts;
0144
0145 struct nvkm_ram_data *next;
0146 struct nvkm_ram_data former;
0147 struct nvkm_ram_data xition;
0148 struct nvkm_ram_data target;
0149 };
0150
0151 int
0152 nvkm_ram_get(struct nvkm_device *, u8 heap, u8 type, u8 page, u64 size,
0153 bool contig, bool back, struct nvkm_memory **);
0154
0155 struct nvkm_ram_func {
0156 u64 upper;
0157 u32 (*probe_fbp)(const struct nvkm_ram_func *, struct nvkm_device *,
0158 int fbp, int *pltcs);
0159 u32 (*probe_fbp_amount)(const struct nvkm_ram_func *, u32 fbpao,
0160 struct nvkm_device *, int fbp, int *pltcs);
0161 u32 (*probe_fbpa_amount)(struct nvkm_device *, int fbpa);
0162 void *(*dtor)(struct nvkm_ram *);
0163 int (*init)(struct nvkm_ram *);
0164
0165 int (*calc)(struct nvkm_ram *, u32 freq);
0166 int (*prog)(struct nvkm_ram *);
0167 void (*tidy)(struct nvkm_ram *);
0168 };
0169 #endif