@@ -338,7 +338,7 @@ typedef struct virge_t {
338
338
event_t * fifo_not_full_event ;
339
339
340
340
atomic_int virge_busy ;
341
- atomic_uint virge_irq_req ;
341
+ atomic_uint irq_pending ;
342
342
343
343
uint8_t subsys_stat ;
344
344
uint8_t subsys_cntl ;
@@ -374,11 +374,10 @@ typedef struct virge_t {
374
374
uint32_t dma_mmio_addr ;
375
375
uint32_t dma_data_type ;
376
376
377
- pc_timer_t wake_timer ;
378
- pc_timer_t irq_timer ;
379
-
380
377
int pci ;
381
378
int is_agp ;
379
+
380
+ pc_timer_t irq_timer ;
382
381
} virge_t ;
383
382
384
383
static __inline void
@@ -387,28 +386,6 @@ wake_fifo_thread(virge_t *virge) {
387
386
thread_set_event (virge -> wake_fifo_thread );
388
387
}
389
388
390
- void
391
- s3_virge_wake_fifo_timer (void * priv )
392
- {
393
- virge_t * virge = (virge_t * ) priv ;
394
-
395
- thread_set_event (virge -> wake_fifo_thread ); /*Wake up FIFO thread if moving from idle*/
396
- }
397
-
398
- void
399
- s3_virge_wake_fifo_thread (virge_t * virge )
400
- {
401
- if (!timer_is_enabled (& virge -> wake_timer )) {
402
- /*Don't wake FIFO thread immediately - if we do that it will probably
403
- process one word and go back to sleep, requiring it to be woken on
404
- almost every write. Instead, wait a short while so that the CPU
405
- emulation writes more data so we have more batched-up work.*/
406
- timer_on_auto (& virge -> wake_timer , 100.0 );
407
- }
408
- if (!timer_is_enabled (& virge -> irq_timer ))
409
- timer_on_auto (& virge -> irq_timer , 100.0 );
410
- }
411
-
412
389
static virge_t * reset_state = NULL ;
413
390
414
391
static video_timings_t timing_diamond_stealth3d_2000_pci = { .type = VIDEO_PCI , .write_b = 2 , .write_w = 2 , .write_l = 3 , .read_b = 28 , .read_w = 28 , .read_l = 45 };
@@ -497,13 +474,13 @@ s3_virge_update_irqs(virge_t *virge)
497
474
pci_clear_irq (virge -> pci_slot , PCI_INTA , & virge -> irq_state );
498
475
}
499
476
500
- void
477
+ static void
501
478
s3_virge_update_irq_timer (void * priv )
502
479
{
503
480
virge_t * virge = (virge_t * ) priv ;
504
481
505
- if (virge -> virge_irq_req ) {
506
- virge -> virge_irq_req -- ;
482
+ if (virge -> irq_pending ) {
483
+ virge -> irq_pending -- ;
507
484
s3_virge_update_irqs (virge );
508
485
}
509
486
@@ -1140,9 +1117,8 @@ static void
1140
1117
s3_virge_vblank_start (svga_t * svga ) {
1141
1118
virge_t * virge = (virge_t * ) svga -> priv ;
1142
1119
1143
- if (virge -> virge_irq_req )
1144
- virge -> virge_irq_req -- ;
1145
-
1120
+ if (virge -> irq_pending )
1121
+ virge -> irq_pending -- ;
1146
1122
virge -> subsys_stat |= INT_VSY ;
1147
1123
s3_virge_update_irqs (virge );
1148
1124
}
@@ -1826,19 +1802,18 @@ fifo_thread(void *param)
1826
1802
virge -> fifo_read_idx ++ ;
1827
1803
fifo -> addr_type = FIFO_INVALID ;
1828
1804
1829
- if (FIFO_ENTRIES > 0xe000 )
1830
- thread_set_event (virge -> fifo_not_full_event );
1805
+ if (FIFO_ENTRIES > 0xe000 )
1806
+ thread_set_event (virge -> fifo_not_full_event );
1831
1807
1832
- end_time = plat_timer_read ();
1833
- virge_time += end_time - start_time ;
1834
- }
1835
- virge -> virge_busy = 0 ;
1836
- virge -> subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP );
1837
- if (virge -> cmd_dma )
1838
- virge -> subsys_stat |= (INT_HOST_DONE | INT_CMD_DONE );
1808
+ end_time = plat_timer_read ();
1809
+ virge_time += end_time - start_time ;
1810
+ }
1811
+ virge -> virge_busy = 0 ;
1812
+ virge -> subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP );
1813
+ if (virge -> cmd_dma )
1814
+ virge -> subsys_stat |= (INT_HOST_DONE | INT_CMD_DONE );
1839
1815
1840
- //s3_virge_update_irqs(virge);
1841
- virge -> virge_irq_req ++ ;
1816
+ virge -> irq_pending ++ ;
1842
1817
}
1843
1818
}
1844
1819
@@ -1878,8 +1853,10 @@ s3_virge_queue(virge_t *virge, uint32_t addr, uint32_t val, uint32_t type)
1878
1853
1879
1854
virge -> fifo_write_idx ++ ;
1880
1855
1881
- if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 16 )
1882
- s3_virge_wake_fifo_thread (virge );
1856
+ if (FIFO_ENTRIES > 0xe000 )
1857
+ wake_fifo_thread (virge );
1858
+ if (FIFO_ENTRIES > 0xe000 || FIFO_ENTRIES < 8 )
1859
+ wake_fifo_thread (virge );
1883
1860
}
1884
1861
1885
1862
static void
@@ -4445,8 +4422,7 @@ render_thread(void *param)
4445
4422
}
4446
4423
virge -> s3d_busy = 0 ;
4447
4424
virge -> subsys_stat |= INT_S3D_DONE ;
4448
- //s3_virge_update_irqs(virge);
4449
- virge -> virge_irq_req ++ ;
4425
+ virge -> irq_pending ++ ;
4450
4426
}
4451
4427
}
4452
4428
@@ -5104,6 +5080,7 @@ s3_virge_disable_handlers(virge_t *dev)
5104
5080
5105
5081
reset_state -> svga .timer = dev -> svga .timer ;
5106
5082
reset_state -> svga .timer8514 = dev -> svga .timer8514 ;
5083
+ reset_state -> irq_timer = dev -> irq_timer ;
5107
5084
}
5108
5085
5109
5086
static void
@@ -5375,8 +5352,7 @@ s3_virge_init(const device_t *info)
5375
5352
virge -> fifo_not_full_event = thread_create_event ();
5376
5353
virge -> fifo_thread = thread_create (fifo_thread , virge );
5377
5354
5378
- timer_add (& virge -> wake_timer , s3_virge_wake_fifo_timer , virge , 0 );
5379
- timer_add (& virge -> irq_timer , s3_virge_update_irq_timer , virge , 0 );
5355
+ timer_add (& virge -> irq_timer , s3_virge_update_irq_timer , virge , 1 );
5380
5356
5381
5357
virge -> local = info -> local ;
5382
5358
0 commit comments