void blackfin_invalidate_entire_dcache(void) { u32 dmem = bfin_read_DMEM_CONTROL(); bfin_write_DMEM_CONTROL(dmem & ~0xc); SSYNC(); bfin_write_DMEM_CONTROL(dmem); SSYNC(); }
static inline void write_dcplb_data(int cpu, int idx, unsigned long data, unsigned long addr) { unsigned long ctrl = bfin_read_DMEM_CONTROL(); bfin_write_DMEM_CONTROL_SSYNC(ctrl & ~ENDCPLB); bfin_write32(DCPLB_DATA0 + idx * 4, data); bfin_write32(DCPLB_ADDR0 + idx * 4, addr); bfin_write_DMEM_CONTROL_SSYNC(ctrl); #ifdef CONFIG_CPLB_INFO dcplb_tbl[cpu][idx].addr = addr; dcplb_tbl[cpu][idx].data = data; #endif }
void bfin_dcache_init(void) { unsigned long *table = dcplb_table; unsigned long ctrl; int i; for (i = 0; i < MAX_CPLBS; i++) { unsigned long addr = *table++; unsigned long data = *table++; if (addr == (unsigned long)-1) break; bfin_write32(DCPLB_ADDR0 + i * 4, addr); bfin_write32(DCPLB_DATA0 + i * 4, data); } ctrl = bfin_read_DMEM_CONTROL(); ctrl |= DMEM_CNTR; bfin_write_DMEM_CONTROL(ctrl); }
int do_dcache_dump(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) { u32 way, bank, subbank, set; u32 status, addr; u32 dmem_ctl = bfin_read_DMEM_CONTROL(); for (bank = 0; bank < 2; ++bank) { if (!(dmem_ctl & (1 << (DMC1_P - bank)))) continue; for (way = 0; way < 2; ++way) for (subbank = 0; subbank < 4; ++subbank) { printf("%i:%i:%i:\t", bank, way, subbank); for (set = 0; set < 64; ++set) { if (ctrlc()) return 1; /* retrieve a cache tag */ bfin_write_DTEST_COMMAND( way << 26 | bank << 23 | subbank << 16 | set << 5 ); CSYNC(); status = bfin_read_DTEST_DATA0(); /* construct the address using the tag */ addr = (status & 0xFFFFC800) | (subbank << 12) | (set << 5); /* show it */ if (set && !(set % 4)) puts("\n\t"); printf("%c%08x%c%08x%c ", (status & 0x1 ? '[' : '{'), status, (status & 0x2 ? 'd' : ' '), addr, (status & 0x1 ? ']' : '}')); } puts("\n"); } } return 0; }
void __cpuinit bfin_dcache_init(struct cplb_entry *dcplb_tbl) { unsigned long ctrl; int i; for (i = 0; i < MAX_CPLBS; i++) { bfin_write32(DCPLB_ADDR0 + i * 4, dcplb_tbl[i].addr); bfin_write32(DCPLB_DATA0 + i * 4, dcplb_tbl[i].data); } ctrl = bfin_read_DMEM_CONTROL(); /* * Anomaly notes: * 05000287 - We implement workaround #2 - Change the DMEM_CONTROL * register, so that the port preferences for DAG0 and DAG1 are set * to port B */ ctrl |= DMEM_CNTR | PORT_PREF0 | (ANOMALY_05000287 ? PORT_PREF1 : 0); /* CSYNC to ensure load store ordering */ CSYNC(); bfin_write_DMEM_CONTROL(ctrl); SSYNC(); }
int dcache_status(void) { return bfin_read_DMEM_CONTROL() & ACACHE_BCACHE; }