/*----------------------------------------------------------------------- */ void flash_reset (void) { unsigned long msr; DWORD cmd_reset = 0x00F000F000F000F0LL; if (flash_info[0].flash_id != FLASH_UNKNOWN) { msr = get_msr (); set_msr (msr | MSR_FP); write_via_fpu ((DWORD*)flash_info[0].start[0], &cmd_reset ); set_msr (msr); } }
/* returns flag if MSR_EE was set before */ int disable_interrupts (void) { ulong msr = get_msr (); set_msr (msr & ~MSR_EE); return ((msr & MSR_EE) != 0); }
int interrupt_init(void) { int ret; /* call cpu specific function from $(CPU)/interrupts.c */ ret = interrupt_init_cpu(&decrementer_count); if (ret) return ret; decrementer_count = get_tbclk() / CFG_HZ; debug("interrupt init: tbclk() = %d MHz, decrementer_count = %d\n", (get_tbclk() / 1000000), decrementer_count); set_dec(decrementer_count); set_msr(get_msr() | MSR_EE); debug("MSR = 0x%08lx, Decrementer reg = 0x%08lx\n", get_msr(), get_dec()); return 0; }
void init_mmu(void) { uint32_t msr; int n; /* switch to ts == 1 if ts == 0 else bail*/ msr = get_msr(); if (msr & (MSR_IS|MSR_DS)) { return ; } /* setup a valid ts1 entry and switch ts*/ write_tlb1_entry(TMP_ENTRY, TS1, 0x00000000, SIZE_256MB, FULL_SUPER, 0); write_tlb1_entry(TMP_ENTRY+1, TS1, 0x40000000, SIZE_256KB, FULL_SUPER, 0); sync(); set_msr(msr | MSR_IS | MSR_DS); isync(); for (n = 0; tlb[n].base != LAST_ENTRY; n++) { write_tlb1_entry(n, TS0, tlb[n].base, tlb[n].size, tlb[n].prot, tlb[n].wimge); } /* invalidate the rest of the entries */ for (; n < 16; n++) { if (n != TMP_ENTRY) { invalidate_tlb1_entry(n); } } /* switch back to ts == 0 */ sync(); set_msr(msr); isync(); invalidate_tlb1_entry(TMP_ENTRY); invalidate_tlb1_entry(TMP_ENTRY+1); sync(); /* invalidate cache */ set_l1csr0(L1CSRX_CFI); while (get_l1csr0() & L1CSRX_CFI) { ; } /* enable */ set_l1csr0(L1CSRX_CE); }
int interrupt_init (void) { int ret; /* call cpu specific function from $(CPU)/interrupts.c */ ret = interrupt_init_cpu (&decrementer_count); if (ret) return ret; set_dec (decrementer_count); set_msr (get_msr () | MSR_EE); return (0); }
/*----------------------------------------------------------------------- */ ulong flash_get_size (ulong baseaddr, flash_info_t * info) { int i; unsigned long msr; DWORD flashtest; DWORD cmd_select[3] = { 0x00AA00AA00AA00AALL, 0x0055005500550055LL, 0x0090009000900090LL }; /* Enable FPU */ msr = get_msr (); set_msr (msr | MSR_FP); /* Write auto-select command sequence */ write_via_fpu ((DWORD*)(baseaddr + (0x0555 << 3)), &cmd_select[0] ); write_via_fpu ((DWORD*)(baseaddr + (0x02AA << 3)), &cmd_select[1] ); write_via_fpu ((DWORD*)(baseaddr + (0x0555 << 3)), &cmd_select[2] ); /* Restore FPU */ set_msr (msr); /* Read manufacturer ID */ flashtest = *(volatile DWORD*)baseaddr; switch ((int)flashtest) { case AMD_MANUFACT: info->flash_id = FLASH_MAN_AMD; break; case FUJ_MANUFACT: info->flash_id = FLASH_MAN_FUJ; break; default: /* No, faulty or unknown flash */ info->flash_id = FLASH_UNKNOWN; info->sector_count = 0; info->size = 0; return (0); } /* Read device ID */ flashtest = *(volatile DWORD*)(baseaddr + 8); switch ((long)flashtest) { case AMD_ID_LV800T: info->flash_id += FLASH_AM800T; info->sector_count = 19; info->size = 0x00400000; break; case AMD_ID_LV800B: info->flash_id += FLASH_AM800B; info->sector_count = 19; info->size = 0x00400000; break; case AMD_ID_LV160T: info->flash_id += FLASH_AM160T; info->sector_count = 35; info->size = 0x00800000; break; case AMD_ID_LV160B: info->flash_id += FLASH_AM160B; info->sector_count = 35; info->size = 0x00800000; break; case AMD_ID_DL322T: info->flash_id += FLASH_AMDL322T; info->sector_count = 71; info->size = 0x01000000; break; case AMD_ID_DL322B: info->flash_id += FLASH_AMDL322B; info->sector_count = 71; info->size = 0x01000000; break; case AMD_ID_DL323T: info->flash_id += FLASH_AMDL323T; info->sector_count = 71; info->size = 0x01000000; break; case AMD_ID_DL323B: info->flash_id += FLASH_AMDL323B; info->sector_count = 71; info->size = 0x01000000; break; case AMD_ID_LV640U: info->flash_id += FLASH_AM640U; info->sector_count = 128; info->size = 0x02000000; break; default: /* Unknown flash type */ info->flash_id = FLASH_UNKNOWN; return (0); } if ((long)flashtest == AMD_ID_LV640U) { /* set up sector start adress table (uniform sector type) */ for (i = 0; i < info->sector_count; i++) info->start[i] = baseaddr + (i * 0x00040000); } else if (info->flash_id & FLASH_BTYPE) { /* set up sector start adress table (bottom sector type) */ info->start[0] = baseaddr + 0x00000000; info->start[1] = baseaddr + 0x00010000; info->start[2] = baseaddr + 0x00018000; info->start[3] = baseaddr + 0x00020000; for (i = 4; i < info->sector_count; i++) { info->start[i] = baseaddr + (i * 0x00040000) - 0x000C0000; } } else { /* set up sector start adress table (top sector type) */ i = info->sector_count - 1; info->start[i--] = baseaddr + info->size - 0x00010000; info->start[i--] = baseaddr + info->size - 0x00018000; info->start[i--] = baseaddr + info->size - 0x00020000; for (; i >= 0; i--) { info->start[i] = baseaddr + i * 0x00040000; } } /* check for protected sectors */ for (i = 0; i < info->sector_count; i++) { /* read sector protection at sector address, (A7 .. A0) = 0x02 */ if (*(volatile DWORD*)(info->start[i] + 16) & 0x0001000100010001LL) { info->protect[i] = 1; /* D0 = 1 if protected */ } else { info->protect[i] = 0; } } flash_reset (); return (info->size); }
void enable_interrupts (void) { set_msr (get_msr () | MSR_EE); }