@@ -78,6 +78,8 @@ struct mock_event_log {
7878 u16 clear_idx ;
7979 u16 cur_idx ;
8080 u16 nr_events ;
81+ u16 nr_overflow ;
82+ u16 overflow_reset ;
8183 struct cxl_event_record_raw * events [CXL_TEST_EVENT_CNT_MAX ];
8284};
8385
@@ -116,6 +118,7 @@ static void event_reset_log(struct mock_event_log *log)
116118{
117119 log -> cur_idx = 0 ;
118120 log -> clear_idx = 0 ;
121+ log -> nr_overflow = log -> overflow_reset ;
119122}
120123
121124/* Handle can never be 0 use 1 based indexing for handle */
@@ -147,8 +150,12 @@ static void mes_add_event(struct mock_event_store *mes,
147150 return ;
148151
149152 log = & mes -> mock_logs [log_type ];
150- if (WARN_ON (log -> nr_events >= CXL_TEST_EVENT_CNT_MAX ))
153+
154+ if ((log -> nr_events + 1 ) > CXL_TEST_EVENT_CNT_MAX ) {
155+ log -> nr_overflow ++ ;
156+ log -> overflow_reset = log -> nr_overflow ;
151157 return ;
158+ }
152159
153160 log -> events [log -> nr_events ] = event ;
154161 log -> nr_events ++ ;
@@ -159,6 +166,7 @@ static int mock_get_event(struct cxl_dev_state *cxlds,
159166{
160167 struct cxl_get_event_payload * pl ;
161168 struct mock_event_log * log ;
169+ u16 nr_overflow ;
162170 u8 log_type ;
163171 int i ;
164172
@@ -191,6 +199,19 @@ static int mock_get_event(struct cxl_dev_state *cxlds,
191199 if (!event_log_empty (log ))
192200 pl -> flags |= CXL_GET_EVENT_FLAG_MORE_RECORDS ;
193201
202+ if (log -> nr_overflow ) {
203+ u64 ns ;
204+
205+ pl -> flags |= CXL_GET_EVENT_FLAG_OVERFLOW ;
206+ pl -> overflow_err_count = cpu_to_le16 (nr_overflow );
207+ ns = ktime_get_real_ns ();
208+ ns -= 5000000000 ; /* 5s ago */
209+ pl -> first_overflow_timestamp = cpu_to_le64 (ns );
210+ ns = ktime_get_real_ns ();
211+ ns -= 1000000000 ; /* 1s ago */
212+ pl -> last_overflow_timestamp = cpu_to_le64 (ns );
213+ }
214+
194215 return 0 ;
195216}
196217
@@ -231,6 +252,9 @@ static int mock_clear_event(struct cxl_dev_state *cxlds,
231252 }
232253 }
233254
255+ if (log -> nr_overflow )
256+ log -> nr_overflow = 0 ;
257+
234258 /* Clear events */
235259 log -> clear_idx += pl -> nr_recs ;
236260 return 0 ;
@@ -353,6 +377,30 @@ static void cxl_mock_add_event_logs(struct mock_event_store *mes)
353377 (struct cxl_event_record_raw * )& mem_module );
354378 mes -> ev_status |= CXLDEV_EVENT_STATUS_INFO ;
355379
380+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & maint_needed );
381+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
382+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
383+ (struct cxl_event_record_raw * )& dram );
384+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
385+ (struct cxl_event_record_raw * )& gen_media );
386+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
387+ (struct cxl_event_record_raw * )& mem_module );
388+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
389+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL ,
390+ (struct cxl_event_record_raw * )& dram );
391+ /* Overflow this log */
392+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
393+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
394+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
395+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
396+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
397+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
398+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
399+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
400+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
401+ mes_add_event (mes , CXL_EVENT_TYPE_FAIL , & hardware_replace );
402+ mes -> ev_status |= CXLDEV_EVENT_STATUS_FAIL ;
403+
356404 mes_add_event (mes , CXL_EVENT_TYPE_FATAL , & hardware_replace );
357405 mes_add_event (mes , CXL_EVENT_TYPE_FATAL ,
358406 (struct cxl_event_record_raw * )& dram );
0 commit comments