History

habanalabs/gaudi: add razwi notify event

Each time razwi (read-only zero, write ignore) happens, besides capturing its data, also notify the user about it.

Dani Liberman committed 4 years ago

Commit cb5fb661 parent 841cd2d4 files · +31 −18Browse files

Unified · Split

4 files
  1. drivers/misc/habanalabs/common/device.c +8 −0
  2. drivers/misc/habanalabs/common/habanalabs.h +2 −0
  3. drivers/misc/habanalabs/gaudi/gaudi.c +19 −18
  4. include/uapi/misc/habanalabs.h +2 −0
drivers/misc/habanalabs/common/device.c+8−0
@@ -2409,6 +2409,14 @@ void hl_capture_razwi(struct hl_device *hdev, u64 addr, u16 *engine_id, u16 num_ · 2408 unmodified lines
24092409 num_of_engines * sizeof(u16));
24102410 hdev->captured_err_info.razwi.flags = flags;
24112411 }
2412+
2413+void hl_handle_razwi(struct hl_device *hdev, u64 addr, u16 *engine_id, u16 num_of_engines,
2414+ u8 flags, u64 *event_mask)
2415+{
2416+ hl_capture_razwi(hdev, addr, engine_id, num_of_engines, flags);
2417+ *event_mask |= HL_NOTIFIER_EVENT_RAZWI;
2418+}
2419+
24122420 static void hl_capture_user_mappings(struct hl_device *hdev, bool is_pmmu)
24132421 {
24142422 struct page_fault_info *pgf_info = &hdev->captured_err_info.pgf_info;
drivers/misc/habanalabs/common/habanalabs.h+2−0
@@ -3812,6 +3812,8 @@ hl_mmap_mem_buf_alloc(struct hl_mem_mgr *mmg, · 3811 unmodified lines
38123812 __printf(2, 3) void hl_engine_data_sprintf(struct engines_data *e, const char *fmt, ...);
38133813 void hl_capture_razwi(struct hl_device *hdev, u64 addr, u16 *engine_id, u16 num_of_engines,
38143814 u8 flags);
3815+void hl_handle_razwi(struct hl_device *hdev, u64 addr, u16 *engine_id, u16 num_of_engines,
3816+ u8 flags, u64 *event_mask);
38153817 void hl_capture_page_fault(struct hl_device *hdev, u64 addr, u16 eng_id, bool is_pmmu);
38163818
38173819 #ifdef CONFIG_DEBUG_FS
drivers/misc/habanalabs/gaudi/gaudi.c+19−18
@@ -7301,7 +7301,7 @@ static void gaudi_handle_qman_err(struct hl_device *hdev, u16 event_type, u64 *e · 7300 unmodified lines
73017301 }
73027302
73037303 static void gaudi_print_irq_info(struct hl_device *hdev, u16 event_type,
7304− bool razwi)
7304+ bool razwi, u64 *event_mask)
73057305 {
73067306 bool is_read = false, is_write = false;
73077307 u16 engine_id[2], num_of_razwi_eng = 0;
@@ -7337,7 +7337,8 @@ static void gaudi_print_irq_info(struct hl_device *hdev, u16 event_type, · 29 unmodified lines
73377337 num_of_razwi_eng = 1;
73387338 }
73397339
7340− hl_capture_razwi(hdev, razwi_addr, engine_id, num_of_razwi_eng, razwi_flags);
7340+ hl_handle_razwi(hdev, razwi_addr, engine_id, num_of_razwi_eng, razwi_flags,
7341+ event_mask);
73417342 }
73427343 }
73437344
@@ -7675,7 +7676,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 331 unmodified lines
76757676 case GAUDI_EVENT_HBM_0_DERR ... GAUDI_EVENT_HBM_3_DERR:
76767677 case GAUDI_EVENT_MMU_DERR:
76777678 case GAUDI_EVENT_NIC0_CS_DBG_DERR ... GAUDI_EVENT_NIC4_CS_DBG_DERR:
7678− gaudi_print_irq_info(hdev, event_type, true);
7679+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
76797680 gaudi_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);
76807681 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
76817682 fw_fatal_err_flag = HL_DRV_RESET_FW_FATAL_ERR;
@@ -7685,7 +7686,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 3 unmodified lines
76857686 case GAUDI_EVENT_AXI_ECC:
76867687 case GAUDI_EVENT_L2_RAM_ECC:
76877688 case GAUDI_EVENT_PLL0 ... GAUDI_EVENT_PLL17:
7688− gaudi_print_irq_info(hdev, event_type, false);
7689+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
76897690 fw_fatal_err_flag = HL_DRV_RESET_FW_FATAL_ERR;
76907691 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
76917692 goto reset_device;
@@ -7694,7 +7695,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 2 unmodified lines
76947695 case GAUDI_EVENT_HBM1_SPI_0:
76957696 case GAUDI_EVENT_HBM2_SPI_0:
76967697 case GAUDI_EVENT_HBM3_SPI_0:
7697− gaudi_print_irq_info(hdev, event_type, false);
7698+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
76987699 gaudi_hbm_read_interrupts(hdev,
76997700 gaudi_hbm_event_to_dev(event_type),
77007701 &eq_entry->hbm_ecc_data);
@@ -7706,7 +7707,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 5 unmodified lines
77067707 case GAUDI_EVENT_HBM1_SPI_1:
77077708 case GAUDI_EVENT_HBM2_SPI_1:
77087709 case GAUDI_EVENT_HBM3_SPI_1:
7709− gaudi_print_irq_info(hdev, event_type, false);
7710+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
77107711 gaudi_hbm_read_interrupts(hdev,
77117712 gaudi_hbm_event_to_dev(event_type),
77127713 &eq_entry->hbm_ecc_data);
@@ -7728,7 +7729,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 15 unmodified lines
77287729 * if the event is a TPC Assertion or a "real" TPC DEC.
77297730 */
77307731 event_mask |= HL_NOTIFIER_EVENT_TPC_ASSERT;
7731− gaudi_print_irq_info(hdev, event_type, true);
7732+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
77327733 reset_required = gaudi_tpc_read_interrupts(hdev,
77337734 tpc_dec_event_to_tpc_id(event_type),
77347735 "AXI_SLV_DEC_Error");
@@ -7753,7 +7754,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 18 unmodified lines
77537754 case GAUDI_EVENT_TPC5_KRN_ERR:
77547755 case GAUDI_EVENT_TPC6_KRN_ERR:
77557756 case GAUDI_EVENT_TPC7_KRN_ERR:
7756− gaudi_print_irq_info(hdev, event_type, true);
7757+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
77577758 reset_required = gaudi_tpc_read_interrupts(hdev,
77587759 tpc_krn_event_to_tpc_id(event_type),
77597760 "KRN_ERR");
@@ -7792,7 +7793,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 32 unmodified lines
77927793 case GAUDI_EVENT_HBM_0_SERR ... GAUDI_EVENT_HBM_3_SERR:
77937794 fallthrough;
77947795 case GAUDI_EVENT_MMU_SERR:
7795− gaudi_print_irq_info(hdev, event_type, true);
7796+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
77967797 gaudi_handle_ecc_event(hdev, event_type, &eq_entry->ecc_data);
77977798 hl_fw_unmask_irq(hdev, event_type);
77987799 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
@@ -7802,14 +7803,14 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 3 unmodified lines
78027803 case GAUDI_EVENT_CPU_AXI_SPLITTER:
78037804 case GAUDI_EVENT_PSOC_AXI_DEC:
78047805 case GAUDI_EVENT_PSOC_PRSTN_FALL:
7805− gaudi_print_irq_info(hdev, event_type, true);
7806+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
78067807 hl_fw_unmask_irq(hdev, event_type);
78077808 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
78087809 break;
78097810
78107811 case GAUDI_EVENT_MMU_PAGE_FAULT:
78117812 case GAUDI_EVENT_MMU_WR_PERM:
7812− gaudi_print_irq_info(hdev, event_type, true);
7813+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
78137814 hl_fw_unmask_irq(hdev, event_type);
78147815 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
78157816 break;
@@ -7838,14 +7839,14 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 22 unmodified lines
78387839 case GAUDI_EVENT_NIC4_QM1:
78397840 case GAUDI_EVENT_DMA0_CORE ... GAUDI_EVENT_DMA7_CORE:
78407841 case GAUDI_EVENT_TPC0_QM ... GAUDI_EVENT_TPC7_QM:
7841− gaudi_print_irq_info(hdev, event_type, true);
7842+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
78427843 gaudi_handle_qman_err(hdev, event_type, &event_mask);
78437844 hl_fw_unmask_irq(hdev, event_type);
78447845 event_mask |= (HL_NOTIFIER_EVENT_USER_ENGINE_ERR | HL_NOTIFIER_EVENT_DEVICE_RESET);
78457846 break;
78467847
78477848 case GAUDI_EVENT_RAZWI_OR_ADC_SW:
7848− gaudi_print_irq_info(hdev, event_type, true);
7849+ gaudi_print_irq_info(hdev, event_type, true, &event_mask);
78497850 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
78507851 goto reset_device;
78517852
@@ -7858,7 +7859,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 6 unmodified lines
78587859 case GAUDI_EVENT_TPC6_BMON_SPMU:
78597860 case GAUDI_EVENT_TPC7_BMON_SPMU:
78607861 case GAUDI_EVENT_DMA_BM_CH0 ... GAUDI_EVENT_DMA_BM_CH7:
7861− gaudi_print_irq_info(hdev, event_type, false);
7862+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
78627863 hl_fw_unmask_irq(hdev, event_type);
78637864 event_mask |= HL_NOTIFIER_EVENT_USER_ENGINE_ERR;
78647865 break;
@@ -7870,7 +7871,7 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 5 unmodified lines
78707871 break;
78717872
78727873 case GAUDI_EVENT_DMA_IF_SEI_0 ... GAUDI_EVENT_DMA_IF_SEI_3:
7873− gaudi_print_irq_info(hdev, event_type, false);
7874+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
78747875 gaudi_print_sm_sei_info(hdev, event_type,
78757876 &eq_entry->sm_sei_data);
78767877 rc = hl_state_dump(hdev);
@@ -7899,18 +7900,18 @@ static void gaudi_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entr · 22 unmodified lines
78997900 break;
79007901
79017902 case GAUDI_EVENT_DEV_RESET_REQ:
7902− gaudi_print_irq_info(hdev, event_type, false);
7903+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
79037904 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
79047905 goto reset_device;
79057906
79067907 case GAUDI_EVENT_PKT_QUEUE_OUT_SYNC:
7907− gaudi_print_irq_info(hdev, event_type, false);
7908+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
79087909 gaudi_print_out_of_sync_info(hdev, &eq_entry->pkt_sync_err);
79097910 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
79107911 goto reset_device;
79117912
79127913 case GAUDI_EVENT_FW_ALIVE_S:
7913− gaudi_print_irq_info(hdev, event_type, false);
7914+ gaudi_print_irq_info(hdev, event_type, false, &event_mask);
79147915 gaudi_print_fw_alive_info(hdev, &eq_entry->fw_alive);
79157916 event_mask |= HL_NOTIFIER_EVENT_GENERAL_HW_ERR;
79167917 goto reset_device;
include/uapi/misc/habanalabs.h+2−0
@@ -721,6 +721,7 @@ enum hl_server_type { · 720 unmodified lines
721721 * HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE - Indicates device is unavailable
722722 * HL_NOTIFIER_EVENT_USER_ENGINE_ERR - Indicates device engine in error state
723723 * HL_NOTIFIER_EVENT_GENERAL_HW_ERR - Indicates device HW error
724+ * HL_NOTIFIER_EVENT_RAZWI - Indicates razwi happened
724725 */
725726 #define HL_NOTIFIER_EVENT_TPC_ASSERT (1ULL << 0)
726727 #define HL_NOTIFIER_EVENT_UNDEFINED_OPCODE (1ULL << 1)
@@ -729,6 +730,7 @@ enum hl_server_type { · 2 unmodified lines
729730 #define HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE (1ULL << 4)
730731 #define HL_NOTIFIER_EVENT_USER_ENGINE_ERR (1ULL << 5)
731732 #define HL_NOTIFIER_EVENT_GENERAL_HW_ERR (1ULL << 6)
733+#define HL_NOTIFIER_EVENT_RAZWI (1ULL << 7)
732734
733735 /* Opcode for management ioctl
734736 *