Rewrote timer code.

The new code is based on timestamps, rather than delays. This eliminates the
need to update every timer in timer_process(), which cost a non-trivial amount
of CPU time on low-end machines.

This involved changes to every user of the timer code, so this change almost
certainly introduces bugs.
This commit is contained in:
SarahW 2018-08-02 22:06:10 +01:00
commit a7d006b637
79 changed files with 1050 additions and 1033 deletions

View file

@ -4,7 +4,7 @@
#include "scsi.h"
#include "timer.h"
#define IDE_TIME (5 * 100 * (1 << TIMER_SHIFT))
#define IDE_TIME (100 * TIMER_USEC)
#define ATAPI_STATE_IDLE 0
#define ATAPI_STATE_COMMAND 1
@ -35,7 +35,7 @@ void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val)
if (atapi_dev->command_pos >= 12)
{
atapi_dev->state = ATAPI_STATE_GOT_COMMAND;
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
break;
@ -47,7 +47,7 @@ void atapi_data_write(atapi_device_t *atapi_dev, uint16_t val)
{
atapi_dev->bus_state = 0;
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
break;
}
@ -73,7 +73,7 @@ uint16_t atapi_data_read(atapi_device_t *atapi_dev)
if (atapi_dev->data_read_pos >= atapi_dev->data_write_pos)
{
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
idecallback[atapi_dev->board] = 6*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6*IDE_TIME);
}
break;
}
@ -199,7 +199,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
{
// pclog("SEND_COMMAND timed out %x\n", scsi_bus_read(&atapi_dev->bus));
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
break;
}
@ -209,7 +209,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
{
// pclog("SEND_COMMAND - bus state changed %x\n", bus_state);
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
break;
}
@ -261,20 +261,20 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
if (ide_bus_master_write_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_read_pos))
{
atapi_dev->state = ATAPI_STATE_RETRY_WRITE_DMA;
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
else
{
atapi_dev->data_write_pos = atapi_dev->data_read_pos;
atapi_dev->bus_state = 0;
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
}
else
{
atapi_dev->state = ATAPI_STATE_RETRY_WRITE_DMA;
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
}
else
@ -312,7 +312,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
break;
}
}
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
break;
@ -344,7 +344,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
break;
}
}
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
break;
@ -387,7 +387,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
break;
}
}
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
break;
@ -433,18 +433,18 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
if (ide_bus_master_read_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_write_pos))
{
atapi_dev->state = ATAPI_STATE_RETRY_READ_DMA;
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
else
{
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
}
else
{
atapi_dev->state = ATAPI_STATE_RETRY_READ_DMA;
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
}
else
@ -490,7 +490,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
}
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
idecallback[atapi_dev->board] = 1 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1 * IDE_TIME);
}
break;
@ -529,7 +529,7 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
ide_irq_raise(atapi_dev->ide);
}
else
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
break;
@ -537,12 +537,12 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
{
if (ide_bus_master_read_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_write_pos))
{
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
else
{
atapi_dev->state = ATAPI_STATE_NEXT_PHASE;
idecallback[atapi_dev->board] = 6*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6*IDE_TIME);
}
}
break;
@ -551,13 +551,13 @@ void atapi_process_packet(atapi_device_t *atapi_dev)
{
if (ide_bus_master_write_data(atapi_dev->board, atapi_dev->data, atapi_dev->data_read_pos))
{
idecallback[atapi_dev->board] = 1*IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 1*IDE_TIME);
}
else
{
atapi_dev->bus_state = 0;
atapi_dev->state = ATAPI_STATE_WRITE_DATA;
idecallback[atapi_dev->board] = 6 * IDE_TIME;
timer_set_delay_u64(&ide_timer[atapi_dev->board], 6 * IDE_TIME);
}
}
break;