Line 27... |
Line 27... |
#include <inttypes.h>
|
#include <inttypes.h>
|
#endif
|
#endif
|
|
|
#include "port.h"
|
#include "port.h"
|
#include "arch.h"
|
#include "arch.h"
|
/* get a prototype for 'register_memoryarea()', and 'adjust_rw_delay()' */
|
/* get a prototype for 'reg_mem_area()', and 'adjust_rw_delay()' */
|
#include "abstract.h"
|
#include "abstract.h"
|
#include "sim-config.h"
|
#include "sim-config.h"
|
#include "sched.h"
|
#include "sched.h"
|
|
|
/* all user defineable settings are in 'atahost_define.h' */
|
/* all user defineable settings are in 'atahost_define.h' */
|
Line 53... |
Line 53... |
ata->regs.dtr0 = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
|
ata->regs.dtr0 = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
|
ata->regs.dtr1 = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
|
ata->regs.dtr1 = (DMA_MODE0_TEOC << ATA_TEOC) | (DMA_MODE0_TD << ATA_TD) | (DMA_MODE0_TM << ATA_TM);
|
ata->regs.txb = 0;
|
ata->regs.txb = 0;
|
|
|
// inform simulator about new read/write delay timings
|
// inform simulator about new read/write delay timings
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
|
|
|
/* the reset bit in the control register 'ctrl' is set, reset connect ata-devices */
|
/* the reset bit in the control register 'ctrl' is set, reset connect ata-devices */
|
ata_devices_hw_reset(&ata->devices, 1);
|
ata_devices_hw_reset(&ata->devices, 1);
|
}
|
}
|
/* ========================================================================= */
|
/* ========================================================================= */
|
Line 68... |
Line 68... |
*/
|
*/
|
uint32_t ata_read32( oraddr_t addr, void *dat )
|
uint32_t ata_read32( oraddr_t addr, void *dat )
|
{
|
{
|
ata_host *ata = dat;
|
ata_host *ata = dat;
|
|
|
addr -= ata->baseaddr;
|
|
|
|
/* determine if ata_host or ata_device addressed */
|
/* determine if ata_host or ata_device addressed */
|
if (is_ata_hostadr(addr))
|
if (is_ata_hostadr(addr))
|
{
|
{
|
// Accesses to internal register take 2cycles
|
// Accesses to internal register take 2cycles
|
adjust_rw_delay( ata->baseaddr, 2, 2 );
|
adjust_rw_delay( ata->mem, 2, 2 );
|
|
|
switch( addr ) {
|
switch( addr ) {
|
case ATA_CTRL :
|
case ATA_CTRL :
|
return ata -> regs.ctrl;
|
return ata -> regs.ctrl;
|
|
|
Line 118... |
Line 116... |
// make sure simulator uses correct read/write delay timings
|
// make sure simulator uses correct read/write delay timings
|
#if (DEV_ID > 1)
|
#if (DEV_ID > 1)
|
if ( (addr & 0x7f) == ATA_DR)
|
if ( (addr & 0x7f) == ATA_DR)
|
{
|
{
|
if (ata->devices.dev)
|
if (ata->devices.dev)
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
|
else
|
else
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
|
}
|
}
|
else
|
else
|
#endif
|
#endif
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
|
|
|
return ata_devices_read(&ata->devices, addr & 0x7f);
|
return ata_devices_read(&ata->devices, addr & 0x7f);
|
}
|
}
|
}
|
}
|
/* ========================================================================= */
|
/* ========================================================================= */
|
Line 139... |
Line 137... |
*/
|
*/
|
void ata_write32( oraddr_t addr, uint32_t value, void *dat )
|
void ata_write32( oraddr_t addr, uint32_t value, void *dat )
|
{
|
{
|
ata_host *ata = dat;
|
ata_host *ata = dat;
|
|
|
addr -= ata->baseaddr;
|
|
|
|
/* determine if ata_host or ata_device addressed */
|
/* determine if ata_host or ata_device addressed */
|
if (is_ata_hostadr(addr))
|
if (is_ata_hostadr(addr))
|
{
|
{
|
// Accesses to internal register take 2cycles
|
// Accesses to internal register take 2cycles
|
adjust_rw_delay( ata->baseaddr, 2, 2 );
|
adjust_rw_delay( ata->mem, 2, 2 );
|
|
|
switch( addr ) {
|
switch( addr ) {
|
case ATA_CTRL :
|
case ATA_CTRL :
|
ata -> regs.ctrl = value;
|
ata -> regs.ctrl = value;
|
|
|
Line 207... |
Line 203... |
// make sure simulator uses correct read/write delay timings
|
// make sure simulator uses correct read/write delay timings
|
#if (DEV_ID > 1)
|
#if (DEV_ID > 1)
|
if ( (addr & 0x7f) == ATA_DR)
|
if ( (addr & 0x7f) == ATA_DR)
|
{
|
{
|
if (ata->devices.dev)
|
if (ata->devices.dev)
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr1), ata_pio_delay(ata->regs.ftcr1) );
|
else
|
else
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.ftcr0), ata_pio_delay(ata->regs.ftcr0) );
|
}
|
}
|
else
|
else
|
#endif
|
#endif
|
adjust_rw_delay( ata->baseaddr, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
|
adjust_rw_delay( ata->mem, ata_pio_delay(ata->regs.pctr), ata_pio_delay(ata->regs.pctr) );
|
|
|
ata_devices_write(&ata->devices, addr & 0x7f, value);
|
ata_devices_write(&ata->devices, addr & 0x7f, value);
|
}
|
}
|
}
|
}
|
/* ========================================================================= */
|
/* ========================================================================= */
|
Line 338... |
Line 334... |
}
|
}
|
|
|
void ata_sec_end(void *dat)
|
void ata_sec_end(void *dat)
|
{
|
{
|
ata_host *ata = dat;
|
ata_host *ata = dat;
|
|
struct mem_ops ops;
|
|
|
if(!ata->enabled) {
|
if(!ata->enabled) {
|
free(dat);
|
free(dat);
|
return;
|
return;
|
}
|
}
|
|
|
/* Connect ata_devices. */
|
/* Connect ata_devices. */
|
ata_devices_init(&ata->devices);
|
ata_devices_init(&ata->devices);
|
|
|
register_memoryarea(ata->baseaddr, ATA_ADDR_SPACE, 4, 0, ata_read32, ata_write32, dat);
|
memset(&ops, 0, sizeof(struct mem_ops));
|
|
|
|
ops.readfunc32 = ata_read32;
|
|
ops.read_dat32 = dat;
|
|
ops.writefunc32 = ata_write32;
|
|
ops.write_dat32 = dat;
|
|
|
|
/* Delays will be readjusted later */
|
|
ops.delayr = 2;
|
|
ops.delayw = 2;
|
|
|
|
ata->mem = reg_mem_area(ata->baseaddr, ATA_ADDR_SPACE, 0, &ops);
|
|
|
reg_sim_reset(ata_reset, dat);
|
reg_sim_reset(ata_reset, dat);
|
reg_sim_stat(ata_status, dat);
|
reg_sim_stat(ata_status, dat);
|
}
|
}
|
|
|