URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 1372 to Rev 1373
- ↔ Reverse comparison
Rev 1372 → Rev 1373
/trunk/or1ksim/sim-config.h
48,12 → 48,6
} gpios[MAX_GPIOS]; |
|
struct { |
int enabled; /* is MC enabled? */ |
unsigned long baseaddr; /* Naturally aligned base address */ |
unsigned POC; /* power on reset configuration register */ |
} mc; |
|
struct { |
int pattern; /* A user specified memory initialization pattern */ |
int random_seed; /* Initialize the memory with random values, starting with seed */ |
enum { |
/trunk/or1ksim/sim-cmd.c
56,7 → 56,6
#include "sprs.h" |
#include "immu.h" |
#include "dmmu.h" |
#include "mc.h" |
#include "icache_model.h" |
#include "dcache_model.h" |
#include "branch_predict.h" |
419,7 → 418,6
if (config.bpb.enabled) bpb_info(); |
if (config.bpb.btic) btic_info(); |
|
if (config.mc.enabled) mc_status(); |
if (config.ngpios) gpio_status(); |
|
while(cur_stat) { |
/trunk/or1ksim/peripheral/mc.c
45,14 → 45,12
|
extern struct dev_memarea *dev_list; |
|
static struct mc mc; |
|
void set_csc_tms (int cs, unsigned long csc, unsigned long tms) { |
void set_csc_tms (int cs, unsigned long csc, unsigned long tms, struct mc *mc) { |
struct dev_memarea *mem_dev = dev_list; |
|
while (mem_dev) { |
if (mem_dev->chip_select == cs) { |
mem_dev->addr_mask = mc.ba_mask << 22; |
mem_dev->addr_mask = mc->ba_mask << 22; |
mem_dev->addr_compare = ((csc >> MC_CSC_SEL_OFFSET) /* & 0xff*/) << 22; |
mem_dev->valid = (csc >> MC_CSC_EN_OFFSET) & 0x01; |
|
78,36 → 76,37
/* Set a specific MC register with value. */ |
void mc_write_word(oraddr_t addr, uint32_t value, void *dat) |
{ |
struct mc *mc = dat; |
int chipsel; |
|
debug(5, "mc_write_word(%"PRIxADDR",%08"PRIx32")\n", addr, value); |
|
addr -= config.mc.baseaddr; |
addr -= mc->baseaddr; |
|
switch (addr) { |
case MC_CSR: |
mc.csr = value; |
mc->csr = value; |
break; |
case MC_POC: |
fprintf (stderr, "warning: write to MC's POC register!"); |
break; |
case MC_BA_MASK: |
mc.ba_mask = value & MC_BA_MASK_VALID; |
mc->ba_mask = value & MC_BA_MASK_VALID; |
for (chipsel = 0; chipsel < N_CE; chipsel++) |
set_csc_tms (chipsel, mc.csc[chipsel], mc.tms[chipsel]); |
set_csc_tms (chipsel, mc->csc[chipsel], mc->tms[chipsel], mc); |
break; |
default: |
if (addr >= MC_CSC(0) && addr <= MC_TMS(N_CE - 1)) { |
addr -= MC_CSC(0); |
if ((addr >> 2) & 1) |
mc.tms[addr >> 3] = value; |
mc->tms[addr >> 3] = value; |
else |
mc.csc[addr >> 3] = value; |
mc->csc[addr >> 3] = value; |
|
set_csc_tms (addr >> 3, mc.csc[addr >> 3], mc.tms[addr >> 3]); |
set_csc_tms (addr >> 3, mc->csc[addr >> 3], mc->tms[addr >> 3], mc); |
break; |
} else |
debug(1, "write out of range (addr %"PRIxADDR")\n", addr + config.mc.baseaddr); |
debug(1, "write out of range (addr %"PRIxADDR")\n", addr + mc->baseaddr); |
} |
} |
|
114,31 → 113,32
/* Read a specific MC register. */ |
uint32_t mc_read_word(oraddr_t addr, void *dat) |
{ |
struct mc *mc = dat; |
uint32_t value = 0; |
|
debug(5, "mc_read_word(%"PRIxADDR")", addr); |
|
addr -= config.mc.baseaddr; |
addr -= mc->baseaddr; |
|
switch (addr) { |
case MC_CSR: |
value = mc.csr; |
value = mc->csr; |
break; |
case MC_POC: |
value = mc.poc; |
value = mc->poc; |
break; |
case MC_BA_MASK: |
value = mc.ba_mask; |
value = mc->ba_mask; |
break; |
default: |
if (addr >= MC_CSC(0) && addr <= MC_TMS(N_CE - 1)) { |
addr -= MC_CSC(0); |
if ((addr >> 2) & 1) |
value = mc.tms[addr >> 3]; |
value = mc->tms[addr >> 3]; |
else |
value = mc.csc[addr >> 3]; |
value = mc->csc[addr >> 3]; |
} else |
debug(1, " read out of range (addr %"PRIxADDR")\n", addr + config.mc.baseaddr); |
debug(1, " read out of range (addr %"PRIxADDR")\n", addr + mc->baseaddr); |
break; |
} |
debug(5, " value(%"PRIx32")\n", value); |
146,56 → 146,53
} |
|
/* Read POC register and init memory controler regs. */ |
void mc_reset() |
void mc_reset(void *dat) |
{ |
struct mc *mc = dat; |
struct dev_memarea *mem_dev = dev_list; |
|
if (config.mc.enabled) { |
PRINTF("Resetting memory controller.\n"); |
memset(&mc, 0, sizeof(struct mc)); |
PRINTF("Resetting memory controller.\n"); |
|
mc.poc = config.mc.POC; |
memset(mc->csc, 0, sizeof(mc->csc)); |
memset(mc->tms, 0, sizeof(mc->tms)); |
|
/* Set CS0 */ |
mc.csc[0] = (((config.mc.POC & 0x0c) >> 2) << MC_CSC_MEMTYPE_OFFSET) | ((config.mc.POC & 0x03) << MC_CSC_BW_OFFSET) | 1; |
mc->csr = 0; |
mc->ba_mask = 0; |
|
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 CS0 */ |
mc->csc[0] = (((mc->poc & 0x0c) >> 2) << MC_CSC_MEMTYPE_OFFSET) | ((mc->poc & 0x03) << MC_CSC_BW_OFFSET) | 1; |
|
while (mem_dev) { |
mem_dev->valid = 0; |
mem_dev = mem_dev->next; |
} |
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, 1, mc_read_word, mc_write_word, NULL); |
while (mem_dev) { |
mem_dev->valid = 0; |
mem_dev = mem_dev->next; |
} |
} |
|
inline void mc_clock() |
{ |
set_csc_tms (0, mc->csc[0], mc->tms[0], mc); |
} |
|
void mc_status() |
void mc_status(void *dat) |
{ |
struct mc *mc = dat; |
int i; |
|
PRINTF( "\nMemory Controller at 0x%lX:\n", config.mc.baseaddr ); |
PRINTF( "POC: 0x%08lX\n", mc.poc ); |
PRINTF( "BAS: 0x%08lX\n", mc.ba_mask ); |
PRINTF( "CSR: 0x%08lX\n", mc.csr ); |
PRINTF( "\nMemory Controller at 0x%"PRIxADDR":\n", mc->baseaddr ); |
PRINTF( "POC: 0x%08lX\n", mc->poc ); |
PRINTF( "BAS: 0x%08lX\n", mc->ba_mask ); |
PRINTF( "CSR: 0x%08lX\n", mc->csr ); |
|
for (i=0; i<N_CE; i++) { |
PRINTF( "CE %02d - CSC: 0x%08lX TMS: 0x%08lX\n", i, mc.csc[i], |
mc.tms[i]); |
PRINTF( "CE %02d - CSC: 0x%08lX TMS: 0x%08lX\n", i, mc->csc[i], |
mc->tms[i]); |
} |
} |
|
202,22 → 199,50
/*-----------------------------------------------------[ MC configuration }---*/ |
void mc_enabled(union param_val val, void *dat) |
{ |
config.mc.enabled = val.int_val; |
struct mc *mc = dat; |
mc->enabled = val.int_val; |
} |
|
void mc_baseaddr(union param_val val, void *dat) |
{ |
config.mc.baseaddr = val.addr_val; |
struct mc *mc = dat; |
mc->baseaddr = val.addr_val; |
} |
|
void mc_POC(union param_val val, void *dat) |
{ |
config.mc.POC = val.int_val; |
struct mc *mc = dat; |
mc->poc = val.int_val; |
} |
|
void *mc_sec_start(void) |
{ |
struct mc *new = malloc(sizeof(struct mc)); |
|
if(!new) { |
fprintf(stderr, "Peripheral MC: Run out of memory\n"); |
exit(-1); |
} |
|
new->enabled = 0; |
|
return new; |
} |
|
void mc_sec_end(void *dat) |
{ |
struct mc *mc = dat; |
|
if(mc->enabled) { |
register_memoryarea(mc->baseaddr, MC_ADDR_SPACE, 4, 1, mc_read_word, mc_write_word, dat); |
reg_sim_reset(mc_reset, dat); |
reg_sim_stat(mc_status, dat); |
} |
} |
|
void reg_mc_sec(void) |
{ |
struct config_section *sec = reg_config_sec("mc", NULL, NULL); |
struct config_section *sec = reg_config_sec("mc", mc_sec_start, mc_sec_end); |
|
reg_config_param(sec, "enabled", paramt_int, mc_enabled); |
reg_config_param(sec, "baseaddr", paramt_addr, mc_baseaddr); |
/trunk/or1ksim/peripheral/mc.h
22,10 → 22,6
#ifndef __MC_H |
#define __MC_H |
|
void mc_reset(); |
void mc_status(); |
inline void mc_clock(); |
|
#define N_CE (8) |
|
#define MC_CSR (0x00) |
118,6 → 114,8
unsigned long ba_mask; |
unsigned long csc[N_CE]; |
unsigned long tms[N_CE]; |
oraddr_t baseaddr; |
int enabled; |
}; |
|
#endif |
/trunk/or1ksim/toplevel.c
54,7 → 54,6
#include "sched.h" |
#include "profiler.h" |
#include "mprofiler.h" |
#include "mc.h" |
#include "gpio.h" |
#include "pm.h" |
#include "pic.h" |
70,7 → 69,7
#include "cuc.h" |
|
/* CVS revision number. */ |
const char rcsrev[] = "$Revision: 1.113 $"; |
const char rcsrev[] = "$Revision: 1.114 $"; |
|
inline void debug(int level, const char *format, ...) |
{ |
170,7 → 169,6
tick_reset(); |
pm_reset(); |
pic_reset(); |
mc_reset(); |
du_reset (); |
cpu_reset(); |
} |
/trunk/or1ksim/sim-config.c
121,9 → 121,6
config.dc.store_hitdelay = 0; |
config.dc.store_missdelay = 0; |
|
/* Memory Controller */ |
config.mc.enabled = 0; |
|
/* CPU */ |
config.cpu.superscalar = 0; |
config.sim.history = 0; |
901,7 → 898,6
} |
fprintf (f, "},\n"); |
|
fprintf (f, " mc:{enabled:%i, baseaddr:0x%08lx, POC:%i},\n", config.mc.enabled, config.mc.baseaddr, config.mc.POC); |
fprintf (f, " memory:{pattern:%i, random_seed:%i, type:%s, nmemories:%i, table:{", config.memory.pattern, config.memory.random_seed, |
config.memory.type == MT_UNKNOWN ? "MT_UNKNOWN" : config.memory.type == MT_PATTERN ? "MT_PATTERN" : "MT_RANDOM", config.memory.nmemories); |
comma = 0; |