Line 30... |
Line 30... |
|
|
#include "mc.h"
|
#include "mc.h"
|
#include "abstract.h"
|
#include "abstract.h"
|
#include "sim-config.h"
|
#include "sim-config.h"
|
|
|
|
extern struct dev_memarea *dev_list;
|
|
|
static struct mc mc;
|
static struct mc mc;
|
|
|
void set_csc_tms (int i, unsigned long csc, unsigned long tms) {
|
void set_csc_tms (int cs, unsigned long csc, unsigned long tms) {
|
if (1);
|
struct dev_memarea *mem_dev = dev_list;
|
|
|
|
while (mem_dev) {
|
|
if (mem_dev->chip_select == cs) {
|
|
printf("CS0 addr_mask = %.8lx addr_compare = %.8lx\n", mem_dev->addr_mask, mem_dev->addr_compare);
|
|
mem_dev->addr_mask = mc.ba_mask << 21;
|
|
mem_dev->addr_compare = ((csc >> MC_CSC_SEL_OFFSET) & 0xff) << 21;
|
|
|
|
if ((csc >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_ASYNC) {
|
|
mem_dev->delayr = (tms & 0xff) + ((tms >> 8) & 0x0f);
|
|
mem_dev->delayw = ((tms >> 12) & 0x0f) + ((tms >> 16) & 0x0f) + ((tms >> 20) & 0x3f);
|
|
} else if ((csc >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_SDRAM) {
|
|
mem_dev->delayr = 3 + ((tms >> 4) & 0x03);
|
|
mem_dev->delayw = 3 + ((tms >> 4) & 0x03);
|
|
} else if ((csc >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_SSRAM) {
|
|
mem_dev->delayr = 2;
|
|
mem_dev->delayw = 2;
|
|
} else if ((csc >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_SYNC) {
|
|
mem_dev->delayr = 2;
|
|
mem_dev->delayw = 2;
|
|
}
|
|
break;
|
|
}
|
|
mem_dev = mem_dev->next;
|
|
}
|
}
|
}
|
|
|
/* Set a specific MC register with value. */
|
/* Set a specific MC register with value. */
|
void mc_write_word(unsigned long addr, unsigned long value)
|
void mc_write_word(unsigned long addr, unsigned long value)
|
{
|
{
|
Line 53... |
Line 79... |
break;
|
break;
|
case MC_POC:
|
case MC_POC:
|
fprintf (stderr, "warning: write to MC's POC register!");
|
fprintf (stderr, "warning: write to MC's POC register!");
|
break;
|
break;
|
case MC_BA_MASK:
|
case MC_BA_MASK:
|
mc.ba_mask = value;
|
mc.ba_mask = value & MC_BA_MASK_VALID;
|
break;
|
break;
|
default:
|
default:
|
if (addr >= MC_CSC(0) && addr <= MC_TMS(N_CE - 1)) {
|
if (addr >= MC_CSC(0) && addr <= MC_TMS(N_CE - 1)) {
|
addr -= MC_CSC(0);
|
addr -= MC_CSC(0);
|
if ((addr >> 2) & 1)
|
if ((addr >> 2) & 1)
|
Line 112... |
Line 138... |
if (config.mc.enabled) {
|
if (config.mc.enabled) {
|
printf("Resetting memory controller.\n");
|
printf("Resetting memory controller.\n");
|
memset(&mc, 0, sizeof(struct mc));
|
memset(&mc, 0, sizeof(struct mc));
|
|
|
mc.poc = config.mc.POC;
|
mc.poc = config.mc.POC;
|
|
|
|
/* Set CS0 */
|
|
mc.csc[0] = (((config.mc.POC & 0x0c) >> 2) << MC_CSC_MEMTYPE_OFFSET) | ((config.mc.POC & 0x03) << MC_CSC_BW_OFFSET) | 1;
|
|
|
|
if ((mc.csc[0] >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_ASYNC) {
|
|
mc.tms[0] = MC_TMS_ASYNC_VALID;
|
|
} else if ((mc.csc[0] >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_SDRAM) {
|
|
mc.tms[0] = MC_TMS_SDRAM_VALID;
|
|
} else if ((mc.csc[0] >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_SSRAM) {
|
|
mc.tms[0] = MC_TMS_SSRAM_VALID;
|
|
} else if ((mc.csc[0] >> MC_CSC_MEMTYPE_OFFSET) && 0x07 == MC_CSC_MEMTYPE_SYNC) {
|
|
mc.tms[0] = MC_TMS_SYNC_VALID;
|
|
}
|
|
|
|
set_csc_tms (0, mc.csc[0], mc.tms[0]);
|
|
|
register_memoryarea(config.mc.baseaddr, MC_ADDR_SPACE, 4, mc_read_word, mc_write_word);
|
register_memoryarea(config.mc.baseaddr, MC_ADDR_SPACE, 4, mc_read_word, mc_write_word);
|
}
|
}
|
}
|
}
|
|
|
inline void mc_clock()
|
inline void mc_clock()
|