11ce46689SBen Skeggs #ifndef __NVKM_FAULT_H__
21ce46689SBen Skeggs #define __NVKM_FAULT_H__
31ce46689SBen Skeggs #include <core/subdev.h>
40196cc65SBen Skeggs #include <core/event.h>
51ce46689SBen Skeggs 
61ce46689SBen Skeggs struct nvkm_fault {
736780d7eSBen Skeggs 	const struct nvkm_fault_func *func;
81ce46689SBen Skeggs 	struct nvkm_subdev subdev;
936780d7eSBen Skeggs 
10*b59d810aSBen Skeggs 	struct nvkm_inth info_fault;
11*b59d810aSBen Skeggs 
128b811951SBen Skeggs 	struct nvkm_fault_buffer *buffer[2];
1336780d7eSBen Skeggs 	int buffer_nr;
1436780d7eSBen Skeggs 
1555520832SBen Skeggs #define NVKM_FAULT_BUFFER_EVENT_PENDING BIT(0)
1636780d7eSBen Skeggs 	struct nvkm_event event;
178b811951SBen Skeggs 
1855520832SBen Skeggs 	struct nvkm_event_ntfy nrpfb;
1955520832SBen Skeggs 	struct work_struct nrpfb_work;
2013e95729SBen Skeggs 
2113e95729SBen Skeggs 	struct nvkm_device_oclass user;
221ce46689SBen Skeggs };
23d0e9351eSBen Skeggs 
24ddc669e2SBen Skeggs struct nvkm_fault_data {
25ddc669e2SBen Skeggs 	u64  addr;
26ddc669e2SBen Skeggs 	u64  inst;
27ddc669e2SBen Skeggs 	u64  time;
28ddc669e2SBen Skeggs 	u8 engine;
29ddc669e2SBen Skeggs 	u8  valid;
30ddc669e2SBen Skeggs 	u8    gpc;
31ddc669e2SBen Skeggs 	u8    hub;
32ddc669e2SBen Skeggs 	u8 access;
33ddc669e2SBen Skeggs 	u8 client;
34ddc669e2SBen Skeggs 	u8 reason;
35ddc669e2SBen Skeggs };
36ddc669e2SBen Skeggs 
3777689f1bSBen Skeggs int gp100_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
3877689f1bSBen Skeggs int gp10b_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
3977689f1bSBen Skeggs int gv100_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
4077689f1bSBen Skeggs int tu102_fault_new(struct nvkm_device *, enum nvkm_subdev_type, int inst, struct nvkm_fault **);
411ce46689SBen Skeggs #endif
42