Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: MIT */
0002 #ifndef __NVKM_FB_H__
0003 #define __NVKM_FB_H__
0004 #include <core/subdev.h>
0005 #include <core/mm.h>
0006 
0007 /* memory type/access flags, do not match hardware values */
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; /* protects mm and nvkm_memory::tags */
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