Only retain the newer IRQ updating code
This commit is contained in:
@@ -338,6 +338,7 @@ typedef struct virge_t {
|
|||||||
event_t * fifo_not_full_event;
|
event_t * fifo_not_full_event;
|
||||||
|
|
||||||
atomic_int virge_busy;
|
atomic_int virge_busy;
|
||||||
|
atomic_uint irq_pending;
|
||||||
|
|
||||||
uint8_t subsys_stat;
|
uint8_t subsys_stat;
|
||||||
uint8_t subsys_cntl;
|
uint8_t subsys_cntl;
|
||||||
@@ -375,6 +376,8 @@ typedef struct virge_t {
|
|||||||
|
|
||||||
int pci;
|
int pci;
|
||||||
int is_agp;
|
int is_agp;
|
||||||
|
|
||||||
|
pc_timer_t irq_timer;
|
||||||
} virge_t;
|
} virge_t;
|
||||||
|
|
||||||
static __inline void
|
static __inline void
|
||||||
@@ -471,6 +474,19 @@ s3_virge_update_irqs(virge_t *virge)
|
|||||||
pci_clear_irq(virge->pci_slot, PCI_INTA, &virge->irq_state);
|
pci_clear_irq(virge->pci_slot, PCI_INTA, &virge->irq_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
s3_virge_update_irq_timer(void* priv)
|
||||||
|
{
|
||||||
|
virge_t *virge = (virge_t *) priv;
|
||||||
|
|
||||||
|
if (virge->irq_pending) {
|
||||||
|
virge->irq_pending--;
|
||||||
|
s3_virge_update_irqs(virge);
|
||||||
|
}
|
||||||
|
|
||||||
|
timer_on_auto(&virge->irq_timer, 100.);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
s3_virge_out(uint16_t addr, uint8_t val, void *priv)
|
s3_virge_out(uint16_t addr, uint8_t val, void *priv)
|
||||||
{
|
{
|
||||||
@@ -1101,6 +1117,8 @@ static void
|
|||||||
s3_virge_vblank_start(svga_t *svga) {
|
s3_virge_vblank_start(svga_t *svga) {
|
||||||
virge_t *virge = (virge_t *) svga->priv;
|
virge_t *virge = (virge_t *) svga->priv;
|
||||||
|
|
||||||
|
if (virge->irq_pending)
|
||||||
|
virge->irq_pending--;
|
||||||
virge->subsys_stat |= INT_VSY;
|
virge->subsys_stat |= INT_VSY;
|
||||||
s3_virge_update_irqs(virge);
|
s3_virge_update_irqs(virge);
|
||||||
}
|
}
|
||||||
@@ -1784,18 +1802,18 @@ fifo_thread(void *param)
|
|||||||
virge->fifo_read_idx++;
|
virge->fifo_read_idx++;
|
||||||
fifo->addr_type = FIFO_INVALID;
|
fifo->addr_type = FIFO_INVALID;
|
||||||
|
|
||||||
if (FIFO_ENTRIES > 0xe000)
|
if (FIFO_ENTRIES > 0xe000)
|
||||||
thread_set_event(virge->fifo_not_full_event);
|
thread_set_event(virge->fifo_not_full_event);
|
||||||
|
|
||||||
end_time = plat_timer_read();
|
end_time = plat_timer_read();
|
||||||
virge_time += end_time - start_time;
|
virge_time += end_time - start_time;
|
||||||
}
|
}
|
||||||
virge->virge_busy = 0;
|
virge->virge_busy = 0;
|
||||||
virge->subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP);
|
virge->subsys_stat |= (INT_FIFO_EMP | INT_3DF_EMP);
|
||||||
if (virge->cmd_dma)
|
if (virge->cmd_dma)
|
||||||
virge->subsys_stat |= (INT_HOST_DONE | INT_CMD_DONE);
|
virge->subsys_stat |= (INT_HOST_DONE | INT_CMD_DONE);
|
||||||
|
|
||||||
s3_virge_update_irqs(virge);
|
virge->irq_pending++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4404,7 +4422,7 @@ render_thread(void *param)
|
|||||||
}
|
}
|
||||||
virge->s3d_busy = 0;
|
virge->s3d_busy = 0;
|
||||||
virge->subsys_stat |= INT_S3D_DONE;
|
virge->subsys_stat |= INT_S3D_DONE;
|
||||||
s3_virge_update_irqs(virge);
|
virge->irq_pending++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -5062,6 +5080,7 @@ s3_virge_disable_handlers(virge_t *dev)
|
|||||||
|
|
||||||
reset_state->svga.timer = dev->svga.timer;
|
reset_state->svga.timer = dev->svga.timer;
|
||||||
reset_state->svga.timer8514 = dev->svga.timer8514;
|
reset_state->svga.timer8514 = dev->svga.timer8514;
|
||||||
|
reset_state->irq_timer = dev->irq_timer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -5333,6 +5352,8 @@ s3_virge_init(const device_t *info)
|
|||||||
virge->fifo_not_full_event = thread_create_event();
|
virge->fifo_not_full_event = thread_create_event();
|
||||||
virge->fifo_thread = thread_create(fifo_thread, virge);
|
virge->fifo_thread = thread_create(fifo_thread, virge);
|
||||||
|
|
||||||
|
timer_add(&virge->irq_timer, s3_virge_update_irq_timer, virge, 1);
|
||||||
|
|
||||||
virge->local = info->local;
|
virge->local = info->local;
|
||||||
|
|
||||||
*reset_state = *virge;
|
*reset_state = *virge;
|
||||||
|
|||||||
Reference in New Issue
Block a user