Home | History | Annotate | Line # | Download | only in acr
      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