1 /* SPDX-License-Identifier: MIT */ 2 #ifndef __NVKM_ACR_H__ 3 #define __NVKM_ACR_H__ 4 #define nvkm_acr(p) container_of((p), struct nvkm_acr, subdev) 5 #include <core/subdev.h> 6 struct nvkm_falcon; 7 8 enum nvkm_acr_lsf_id { 9 NVKM_ACR_LSF_PMU = 0, 10 NVKM_ACR_LSF_GSPLITE = 1, 11 NVKM_ACR_LSF_FECS = 2, 12 NVKM_ACR_LSF_GPCCS = 3, 13 NVKM_ACR_LSF_NVDEC = 4, 14 NVKM_ACR_LSF_SEC2 = 7, 15 NVKM_ACR_LSF_MINION = 10, 16 NVKM_ACR_LSF_NUM 17 }; 18 19 static inline const char * 20 nvkm_acr_lsf_id(enum nvkm_acr_lsf_id id) 21 { 22 switch (id) { 23 case NVKM_ACR_LSF_PMU : return "pmu"; 24 case NVKM_ACR_LSF_GSPLITE: return "gsplite"; 25 case NVKM_ACR_LSF_FECS : return "fecs"; 26 case NVKM_ACR_LSF_GPCCS : return "gpccs"; 27 case NVKM_ACR_LSF_NVDEC : return "nvdec"; 28 case NVKM_ACR_LSF_SEC2 : return "sec2"; 29 case NVKM_ACR_LSF_MINION : return "minion"; 30 default: 31 return "unknown"; 32 } 33 } 34 35 struct nvkm_acr { 36 const struct nvkm_acr_func *func; 37 struct nvkm_subdev subdev; 38 39 struct list_head lsfw, lsf; 40 }; 41 42 int nvkm_acr_bootstrap_falcons(struct nvkm_device *, unsigned long mask); 43 44 int gm200_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 45 int gm20b_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 46 int gp102_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 47 int gp108_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 48 int gp10b_acr_new(struct nvkm_device *, int, struct nvkm_acr **); 49 50 struct nvkm_acr_lsfw { 51 const struct nvkm_acr_lsf_func *func; 52 struct nvkm_falcon *falcon; 53 enum nvkm_acr_lsf_id id; 54 55 struct list_head head; 56 57 struct nvkm_blob img; 58 59 const struct firmware *sig; 60 61 u32 bootloader_size; 62 u32 bootloader_imem_offset; 63 64 u32 app_size; 65 u32 app_start_offset; 66 u32 app_imem_entry; 67 u32 app_resident_code_offset; 68 u32 app_resident_code_size; 69 u32 app_resident_data_offset; 70 u32 app_resident_data_size; 71 72 u32 ucode_size; 73 u32 data_size; 74 }; 75 76 struct nvkm_acr_lsf_func { 77 int (*boot)(struct nvkm_falcon *); 78 int (*bootstrap_falcon)(struct nvkm_falcon *, enum nvkm_acr_lsf_id); 79 int (*bootstrap_multiple_falcons)(struct nvkm_falcon *, u32 mask); 80 }; 81 82 int 83 nvkm_acr_lsfw_load_sig_image_desc(struct nvkm_subdev *, struct nvkm_falcon *, 84 enum nvkm_acr_lsf_id, const char *path, 85 int ver, const struct nvkm_acr_lsf_func *); 86 int 87 nvkm_acr_lsfw_load_sig_image_desc_v1(struct nvkm_subdev *, struct nvkm_falcon *, 88 enum nvkm_acr_lsf_id, const char *path, 89 int ver, const struct nvkm_acr_lsf_func *); 90 int 91 nvkm_acr_lsfw_load_bl_inst_data_sig(struct nvkm_subdev *, struct nvkm_falcon *, 92 enum nvkm_acr_lsf_id, const char *path, 93 int ver, const struct nvkm_acr_lsf_func *); 94 #endif 95