1 /* $NetBSD: acr.h,v 1.2 2021/12/18 23:45:33 riastradh Exp $ */ 2 3 /* SPDX-License-Identifier: MIT */ 4 #ifndef __NVKM_ACR_H__ 5 #define __NVKM_ACR_H__ 6 #define nvkm_acr(p) container_of((p), struct nvkm_acr, subdev) 7 #include <core/subdev.h> 8 #include <core/falcon.h> 9 10 enum nvkm_acr_lsf_id { 11 NVKM_ACR_LSF_PMU = 0, 12 NVKM_ACR_LSF_GSPLITE = 1, 13 NVKM_ACR_LSF_FECS = 2, 14 NVKM_ACR_LSF_GPCCS = 3, 15 NVKM_ACR_LSF_NVDEC = 4, 16 NVKM_ACR_LSF_SEC2 = 7, 17 NVKM_ACR_LSF_MINION = 10, 18 NVKM_ACR_LSF_NUM 19 }; 20 21 static inline const char * 22 nvkm_acr_lsf_id(enum nvkm_acr_lsf_id id) 23 { 24 switch (id) { 25 case NVKM_ACR_LSF_PMU : return "pmu"; 26 case NVKM_ACR_LSF_GSPLITE: return "gsplite"; 27 case NVKM_ACR_LSF_FECS : return "fecs"; 28 case NVKM_ACR_LSF_GPCCS : return "gpccs"; 29 case NVKM_ACR_LSF_NVDEC : return "nvdec"; 30 case NVKM_ACR_LSF_SEC2 : return "sec2"; 31 case NVKM_ACR_LSF_MINION : return "minion"; 32 default: 33 return "unknown"; 34 } 35 } 36 37 struct nvkm_acr { 38 const struct nvkm_acr_func *func; 39 struct nvkm_subdev subdev; 40 41 struct list_head hsfw, hsf; 42 struct list_head lsfw, lsf; 43 44 struct nvkm_memory *wpr; 45 u64 wpr_start; 46 u64 wpr_end; 47 u64 shadow_start; 48 49 struct nvkm_memory *inst; 50 struct nvkm_vmm *vmm; 51 52 bool done; 53 54 const struct firmware *wpr_fw; 55 bool wpr_comp; 56 u64 wpr_prev; 57 }; 58 59 bool nvkm_acr_managed_falcon(struct nvkm_device *, enum nvkm_acr_lsf_id); 60 int nvkm_acr_bootstrap_falcons(struct nvkm_device *, unsigned long mask); 61 62 int gm200_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 63 int gm20b_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 64 int gp102_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 65 int gp108_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 66 int gp10b_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 67 int tu102_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 68 69 struct nvkm_acr_lsfw { 70 const struct nvkm_acr_lsf_func *func; 71 struct nvkm_falcon *falcon; 72 enum nvkm_acr_lsf_id id; 73 74 struct list_head head; 75 76 struct nvkm_blob img; 77 78 const struct firmware *sig; 79 80 u32 bootloader_size; 81 u32 bootloader_imem_offset; 82 83 u32 app_size; 84 u32 app_start_offset; 85 u32 app_imem_entry; 86 u32 app_resident_code_offset; 87 u32 app_resident_code_size; 88 u32 app_resident_data_offset; 89 u32 app_resident_data_size; 90 91 u32 ucode_size; 92 u32 data_size; 93 94 struct { 95 u32 lsb; 96 u32 img; 97 u32 bld; 98 } offset; 99 u32 bl_data_size; 100 }; 101 102 struct nvkm_acr_lsf_func { 103 /* The (currently) map directly to LSB header flags. */ 104 #define NVKM_ACR_LSF_LOAD_CODE_AT_0 0x00000001 105 #define NVKM_ACR_LSF_DMACTL_REQ_CTX 0x00000004 106 #define NVKM_ACR_LSF_FORCE_PRIV_LOAD 0x00000008 107 u32 flags; 108 u32 bld_size; 109 void (*bld_write)(struct nvkm_acr *, u32 bld, struct nvkm_acr_lsfw *); 110 void (*bld_patch)(struct nvkm_acr *, u32 bld, s64 adjust); 111 int (*boot)(struct nvkm_falcon *); 112 int (*bootstrap_falcon)(struct nvkm_falcon *, enum nvkm_acr_lsf_id); 113 int (*bootstrap_multiple_falcons)(struct nvkm_falcon *, u32 mask); 114 }; 115 116 int 117 nvkm_acr_lsfw_load_sig_image_desc(struct nvkm_subdev *, struct nvkm_falcon *, 118 enum nvkm_acr_lsf_id, const char *path, 119 int ver, const struct nvkm_acr_lsf_func *); 120 int 121 nvkm_acr_lsfw_load_sig_image_desc_v1(struct nvkm_subdev *, struct nvkm_falcon *, 122 enum nvkm_acr_lsf_id, const char *path, 123 int ver, const struct nvkm_acr_lsf_func *); 124 int 125 nvkm_acr_lsfw_load_bl_inst_data_sig(struct nvkm_subdev *, struct nvkm_falcon *, 126 enum nvkm_acr_lsf_id, const char *path, 127 int ver, const struct nvkm_acr_lsf_func *); 128 #endif 129