1 /* $NetBSD: priv.h,v 1.2 2021/12/18 23:45:38 riastradh Exp $ */ 2 3 #ifndef __NVKM_ACR_PRIV_H__ 4 #define __NVKM_ACR_PRIV_H__ 5 #include <subdev/acr.h> 6 struct lsb_header_tail; 7 8 struct nvkm_acr_fwif { 9 int version; 10 int (*load)(struct nvkm_acr *, int version, 11 const struct nvkm_acr_fwif *); 12 const struct nvkm_acr_func *func; 13 }; 14 15 int gm20b_acr_load(struct nvkm_acr *, int, const struct nvkm_acr_fwif *); 16 int gp102_acr_load(struct nvkm_acr *, int, const struct nvkm_acr_fwif *); 17 18 struct nvkm_acr_lsf; 19 struct nvkm_acr_func { 20 const struct nvkm_acr_hsf_fwif *load; 21 const struct nvkm_acr_hsf_fwif *ahesasc; 22 const struct nvkm_acr_hsf_fwif *asb; 23 const struct nvkm_acr_hsf_fwif *unload; 24 int (*wpr_parse)(struct nvkm_acr *); 25 u32 (*wpr_layout)(struct nvkm_acr *); 26 int (*wpr_alloc)(struct nvkm_acr *, u32 wpr_size); 27 int (*wpr_build)(struct nvkm_acr *, struct nvkm_acr_lsf *rtos); 28 void (*wpr_patch)(struct nvkm_acr *, s64 adjust); 29 void (*wpr_check)(struct nvkm_acr *, u64 *start, u64 *limit); 30 int (*init)(struct nvkm_acr *); 31 void (*fini)(struct nvkm_acr *); 32 }; 33 34 int gm200_acr_wpr_parse(struct nvkm_acr *); 35 u32 gm200_acr_wpr_layout(struct nvkm_acr *); 36 int gm200_acr_wpr_build(struct nvkm_acr *, struct nvkm_acr_lsf *); 37 void gm200_acr_wpr_patch(struct nvkm_acr *, s64); 38 void gm200_acr_wpr_check(struct nvkm_acr *, u64 *, u64 *); 39 void gm200_acr_wpr_build_lsb_tail(struct nvkm_acr_lsfw *, 40 struct lsb_header_tail *); 41 int gm200_acr_init(struct nvkm_acr *); 42 43 int gm20b_acr_wpr_alloc(struct nvkm_acr *, u32 wpr_size); 44 45 int gp102_acr_wpr_parse(struct nvkm_acr *); 46 u32 gp102_acr_wpr_layout(struct nvkm_acr *); 47 int gp102_acr_wpr_alloc(struct nvkm_acr *, u32 wpr_size); 48 int gp102_acr_wpr_build(struct nvkm_acr *, struct nvkm_acr_lsf *); 49 int gp102_acr_wpr_build_lsb(struct nvkm_acr *, struct nvkm_acr_lsfw *); 50 void gp102_acr_wpr_patch(struct nvkm_acr *, s64); 51 52 struct nvkm_acr_hsfw { 53 const struct nvkm_acr_hsf_func *func; 54 const char *name; 55 struct list_head head; 56 57 u32 imem_size; 58 u32 imem_tag; 59 u32 *imem; 60 61 u8 *image; 62 u32 image_size; 63 u32 non_sec_addr; 64 u32 non_sec_size; 65 u32 sec_addr; 66 u32 sec_size; 67 u32 data_addr; 68 u32 data_size; 69 70 struct { 71 struct { 72 void *data; 73 u32 size; 74 } prod, dbg; 75 u32 patch_loc; 76 } sig; 77 }; 78 79 struct nvkm_acr_hsf_fwif { 80 int version; 81 int (*load)(struct nvkm_acr *, const char *bl, const char *fw, 82 const char *name, int version, 83 const struct nvkm_acr_hsf_fwif *); 84 const struct nvkm_acr_hsf_func *func; 85 }; 86 87 int nvkm_acr_hsfw_load(struct nvkm_acr *, const char *, const char *, 88 const char *, int, const struct nvkm_acr_hsf_fwif *); 89 void nvkm_acr_hsfw_del_all(struct nvkm_acr *); 90 91 struct nvkm_acr_hsf { 92 const struct nvkm_acr_hsf_func *func; 93 const char *name; 94 struct list_head head; 95 96 u32 imem_size; 97 u32 imem_tag; 98 u32 *imem; 99 100 u32 non_sec_addr; 101 u32 non_sec_size; 102 u32 sec_addr; 103 u32 sec_size; 104 u32 data_addr; 105 u32 data_size; 106 107 struct nvkm_memory *ucode; 108 struct nvkm_vma *vma; 109 struct nvkm_falcon *falcon; 110 }; 111 112 struct nvkm_acr_hsf_func { 113 int (*load)(struct nvkm_acr *, struct nvkm_acr_hsfw *); 114 int (*boot)(struct nvkm_acr *, struct nvkm_acr_hsf *); 115 void (*bld)(struct nvkm_acr *, struct nvkm_acr_hsf *); 116 }; 117 118 int gm200_acr_hsfw_load(struct nvkm_acr *, struct nvkm_acr_hsfw *, 119 struct nvkm_falcon *); 120 int gm200_acr_hsfw_boot(struct nvkm_acr *, struct nvkm_acr_hsf *, 121 u32 clear_intr, u32 mbox0_ok); 122 123 int gm200_acr_load_boot(struct nvkm_acr *, struct nvkm_acr_hsf *); 124 125 extern const struct nvkm_acr_hsf_func gm200_acr_unload_0; 126 int gm200_acr_unload_load(struct nvkm_acr *, struct nvkm_acr_hsfw *); 127 int gm200_acr_unload_boot(struct nvkm_acr *, struct nvkm_acr_hsf *); 128 void gm200_acr_hsfw_bld(struct nvkm_acr *, struct nvkm_acr_hsf *); 129 130 extern const struct nvkm_acr_hsf_func gm20b_acr_load_0; 131 132 int gp102_acr_load_load(struct nvkm_acr *, struct nvkm_acr_hsfw *); 133 134 extern const struct nvkm_acr_hsf_func gp108_acr_unload_0; 135 void gp108_acr_hsfw_bld(struct nvkm_acr *, struct nvkm_acr_hsf *); 136 137 int nvkm_acr_new_(const struct nvkm_acr_fwif *, struct nvkm_device *, int, 138 struct nvkm_acr **); 139 int nvkm_acr_hsf_boot(struct nvkm_acr *, const char *name); 140 141 struct nvkm_acr_lsf { 142 const struct nvkm_acr_lsf_func *func; 143 struct nvkm_falcon *falcon; 144 enum nvkm_acr_lsf_id id; 145 struct list_head head; 146 }; 147 148 struct nvkm_acr_lsfw *nvkm_acr_lsfw_add(const struct nvkm_acr_lsf_func *, 149 struct nvkm_acr *, struct nvkm_falcon *, 150 enum nvkm_acr_lsf_id); 151 void nvkm_acr_lsfw_del(struct nvkm_acr_lsfw *); 152 void nvkm_acr_lsfw_del_all(struct nvkm_acr *); 153 #endif 154