コード例 #1
0
ファイル: flash.c プロジェクト: 0s4l/u-boot-xlnx
/*-----------------------------------------------------------------------
 */
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);
	}
}
コード例 #2
0
/* 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);
}
コード例 #3
0
ファイル: interrupts.c プロジェクト: FANCY0047/ubootForOk6410
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;
}
コード例 #4
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);
}
コード例 #5
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;

	set_dec (decrementer_count);

	set_msr (get_msr () | MSR_EE);

	return (0);
}
コード例 #6
0
ファイル: flash.c プロジェクト: 0s4l/u-boot-xlnx
/*-----------------------------------------------------------------------
 */
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);
}
コード例 #7
0
void enable_interrupts (void)
{
	set_msr (get_msr () | MSR_EE);
}