mirror of
https://source.denx.de/u-boot/u-boot.git
synced 2026-06-13 15:03:58 +03:00
Compare commits
30 Commits
v2013.07-r
...
v2013.07
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62c175fbb8 | ||
|
|
50ffc3b64a | ||
|
|
8b415f703f | ||
|
|
b899fa3901 | ||
|
|
fdf86c202c | ||
|
|
9a5dad2393 | ||
|
|
9ba30f6bc2 | ||
|
|
971c450a44 | ||
|
|
4ef400b9f8 | ||
|
|
576aacdb91 | ||
|
|
c3e0afca48 | ||
|
|
f78cb2ab1e | ||
|
|
a61da72bda | ||
|
|
ca6d4d0f8f | ||
|
|
b8e5b07225 | ||
|
|
2a6936059a | ||
|
|
b9944a77f9 | ||
|
|
b8eee4354f | ||
|
|
c01939c764 | ||
|
|
b778c1b5de | ||
|
|
be6c1529c1 | ||
|
|
baa8841d6c | ||
|
|
f4eaf88e6d | ||
|
|
f4ea9f86d1 | ||
|
|
04735e9c55 | ||
|
|
0eb33ad253 | ||
|
|
457dd025a2 | ||
|
|
c8605bb4d8 | ||
|
|
4f6aa3468d | ||
|
|
54e458de55 |
@@ -160,8 +160,9 @@ egnite GmbH <info@egnite.de>
|
||||
|
||||
Dirk Eibach <eibach@gdsys.de>
|
||||
|
||||
controlcenterd P1022
|
||||
devconcenter PPC460EX
|
||||
dlvision PPC405EP
|
||||
dlvision PPC405EP
|
||||
dlvision-10g PPC405EP
|
||||
gdppc440etx PPC440EP/GR
|
||||
intip PPC460EX
|
||||
@@ -1133,10 +1134,6 @@ Stefan Roese <sr@denx.de>
|
||||
|
||||
vct_xxx MIPS32 4Kc
|
||||
|
||||
Xiangfu Liu <xiangfu@openmobilefree.net>
|
||||
|
||||
qi_lb60 MIPS32 (XBurst Jz4740 SoC)
|
||||
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Unknown / orphaned boards:
|
||||
|
||||
5
MAKEALL
5
MAKEALL
@@ -435,16 +435,11 @@ LIST_mips=" \
|
||||
## MIPS Systems (little endian)
|
||||
#########################################################################
|
||||
|
||||
LIST_xburst_el=" \
|
||||
qi_lb60 \
|
||||
"
|
||||
|
||||
LIST_au1xx0_el=" \
|
||||
dbau1550_el \
|
||||
pb1000 \
|
||||
"
|
||||
LIST_mips_el=" \
|
||||
${LIST_xburst_el} \
|
||||
${LIST_au1xx0_el} \
|
||||
"
|
||||
#########################################################################
|
||||
|
||||
2
Makefile
2
Makefile
@@ -24,7 +24,7 @@
|
||||
VERSION = 2013
|
||||
PATCHLEVEL = 07
|
||||
SUBLEVEL =
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION =
|
||||
ifneq "$(SUBLEVEL)" ""
|
||||
U_BOOT_VERSION = $(VERSION).$(PATCHLEVEL).$(SUBLEVEL)$(EXTRAVERSION)
|
||||
else
|
||||
|
||||
17
README
17
README
@@ -1238,6 +1238,9 @@ The following options need to be configured:
|
||||
CONFIG_TPM_TIS_I2C_BURST_LIMITATION
|
||||
Define the burst count bytes upper limit
|
||||
|
||||
CONFIG_TPM_ATMEL_TWI
|
||||
Support for Atmel TWI TPM device. Requires I2C support.
|
||||
|
||||
CONFIG_TPM_TIS_LPC
|
||||
Support for generic parallel port TPM devices. Only one device
|
||||
per system is supported at this time.
|
||||
@@ -1247,6 +1250,20 @@ The following options need to be configured:
|
||||
to. Contemporary x86 systems usually map it at
|
||||
0xfed40000.
|
||||
|
||||
CONFIG_CMD_TPM
|
||||
Add tpm monitor functions.
|
||||
Requires CONFIG_TPM. If CONFIG_TPM_AUTH_SESSIONS is set, also
|
||||
provides monitor access to authorized functions.
|
||||
|
||||
CONFIG_TPM
|
||||
Define this to enable the TPM support library which provides
|
||||
functional interfaces to some TPM commands.
|
||||
Requires support for a TPM device.
|
||||
|
||||
CONFIG_TPM_AUTH_SESSIONS
|
||||
Define this to enable authorized functions in the TPM library.
|
||||
Requires CONFIG_TPM and CONFIG_SHA1.
|
||||
|
||||
- USB Support:
|
||||
At the moment only the UHCI host controller is
|
||||
supported (PIP405, MIP405, MPC5200); define
|
||||
|
||||
@@ -141,18 +141,17 @@ static int exynos_get_pll_clk(int pllreg, unsigned int r, unsigned int k)
|
||||
fout = (m + k / div) * (freq / (p * (1 << s)));
|
||||
} else {
|
||||
/*
|
||||
* Exynos4210
|
||||
* Exynos4412 / Exynos5250
|
||||
* FOUT = MDIV * FIN / (PDIV * 2^SDIV)
|
||||
*
|
||||
* Exynos4412 / Exynos5250
|
||||
* Exynos4210
|
||||
* FOUT = MDIV * FIN / (PDIV * 2^(SDIV-1))
|
||||
*/
|
||||
if (proid_is_exynos4210())
|
||||
fout = m * (freq / (p * (1 << s)));
|
||||
else
|
||||
fout = m * (freq / (p * (1 << (s - 1))));
|
||||
else
|
||||
fout = m * (freq / (p * (1 << s)));
|
||||
}
|
||||
|
||||
return fout;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,8 +45,8 @@ COBJS-y += board.o
|
||||
endif
|
||||
COBJS-y += sections.o
|
||||
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_OF_LIBFDT) += bootm-fdt.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o
|
||||
SOBJS-$(CONFIG_USE_ARCH_MEMSET) += memset.o
|
||||
SOBJS-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o
|
||||
|
||||
@@ -30,7 +30,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y += memset.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += interrupts.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += cache.o
|
||||
COBJS-y += interrupts.o
|
||||
COBJS-y += time.o
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += muldi3.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -36,9 +36,9 @@ SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
ifeq ($(CONFIG_QEMU_MIPS),y)
|
||||
COBJS-y += bootm_qemu_mips.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm_qemu_mips.o
|
||||
else
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
endif
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -29,7 +29,8 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(ARCH).o
|
||||
|
||||
OBJS := board.o bootm.o cache.o interrupts.o
|
||||
OBJS := board.o cache.o interrupts.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
|
||||
all: $(LIB)
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y += cache.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += libgcc.o
|
||||
COBJS-y += time.o
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ LIB = $(obj)lib$(ARCH).o
|
||||
SOBJS-y +=
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += timer.o
|
||||
|
||||
SRCS := $(SOBJS-y:.o=.S) $(COBJS-y:.o=.c)
|
||||
|
||||
@@ -180,7 +180,9 @@ void cpu_init_early_f(void)
|
||||
|
||||
invalidate_tlb(1);
|
||||
|
||||
#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && !defined(CONFIG_SPL_BUILD) && !defined(CONFIG_NAND_SPL)
|
||||
#if defined(CONFIG_SYS_PPC_E500_DEBUG_TLB) && \
|
||||
!(defined(CONFIG_SPL_INIT_MINIMAL) && defined(CONFIG_SPL_BUILD)) && \
|
||||
!defined(CONFIG_NAND_SPL)
|
||||
disable_tlb(CONFIG_SYS_PPC_E500_DEBUG_TLB);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -63,7 +63,7 @@ ifndef CONFIG_SYS_GENERIC_BOARD
|
||||
COBJS-y += board.o
|
||||
endif
|
||||
endif
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += cache.o
|
||||
COBJS-y += extable.o
|
||||
COBJS-y += interrupts.o
|
||||
|
||||
@@ -33,7 +33,7 @@ GLSOBJS += lshrdi3.o
|
||||
GLSOBJS += movmem.o
|
||||
|
||||
COBJS-y += board.o
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
ifeq ($(CONFIG_SH2),y)
|
||||
COBJS-y += time_sh2.o
|
||||
else
|
||||
|
||||
@@ -27,7 +27,8 @@ LIB = $(obj)lib$(ARCH).o
|
||||
|
||||
SOBJS =
|
||||
|
||||
COBJS = board.o cache.o interrupts.o time.o bootm.o
|
||||
COBJS = board.o cache.o interrupts.o time.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
|
||||
@@ -25,7 +25,7 @@ include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(ARCH).o
|
||||
|
||||
COBJS-y += bootm.o
|
||||
COBJS-$(CONFIG_CMD_BOOTM) += bootm.o
|
||||
COBJS-y += cmd_boot.o
|
||||
COBJS-y += gcc.o
|
||||
COBJS-y += init_helpers.o
|
||||
|
||||
@@ -59,7 +59,7 @@ static void at91sam9n12ek_nand_hw_init(void)
|
||||
/* Configure databus */
|
||||
csa &= ~AT91_MATRIX_NFD0_ON_D16; /* nandflash connect to D0~D15 */
|
||||
/* Configure IO drive */
|
||||
csa &= ~AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
|
||||
csa |= AT91_MATRIX_EBI_EBI_IOSR_NORMAL;
|
||||
|
||||
writel(csa, &matrix->ebicsa);
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ DATA 4, MX6_IOM_DRAM_RAS, 0x00020030
|
||||
DATA 4, MX6_IOM_DRAM_SDCLK_0, 0x00020030
|
||||
DATA 4, MX6_IOM_DRAM_SDCLK_1, 0x00020030
|
||||
|
||||
DATA 4, MX6_IOM_DRAM_RESET, 0x000e0030
|
||||
DATA 4, MX6_IOM_DRAM_RESET, 0x00020030
|
||||
DATA 4, MX6_IOM_DRAM_SDCKE0, 0x00003000
|
||||
DATA 4, MX6_IOM_DRAM_SDCKE1, 0x00003000
|
||||
|
||||
|
||||
@@ -195,7 +195,11 @@ int mac_read_from_eeprom(void)
|
||||
printf("\nEEPROM @ 0x%02x read FAILED!!!\n",
|
||||
CONFIG_SYS_I2C_EEPROM_ADDR);
|
||||
} else {
|
||||
if (crc32(crc, buf, 24) == *(unsigned int *)&buf[24]) {
|
||||
uint32_t crc_buf;
|
||||
|
||||
memcpy(&crc_buf, &buf[24], sizeof(uint32_t));
|
||||
|
||||
if (crc32(crc, buf, 24) == crc_buf) {
|
||||
printf("Reading MAC from EEPROM\n");
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (memcmp(&buf[i * 6], "\0\0\0\0\0\0", 6)) {
|
||||
|
||||
@@ -33,6 +33,7 @@ COBJS-$(CONFIG_IO) += miiphybb.o
|
||||
COBJS-$(CONFIG_IO64) += miiphybb.o
|
||||
COBJS-$(CONFIG_IOCON) += osd.o
|
||||
COBJS-$(CONFIG_DLVISION_10G) += osd.o
|
||||
COBJS-$(CONFIG_CONTROLCENTERD) += dp501.o
|
||||
|
||||
COBJS := $(COBJS-y)
|
||||
SOBJS =
|
||||
|
||||
107
board/gdsys/common/dp501.c
Normal file
107
board/gdsys/common/dp501.c
Normal file
@@ -0,0 +1,107 @@
|
||||
/*
|
||||
* (C) Copyright 2012
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
/* Parade Technologies Inc. DP501 DisplayPort DVI/HDMI Transmitter */
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <errno.h>
|
||||
#include <i2c.h>
|
||||
|
||||
static void dp501_setbits(u8 addr, u8 reg, u8 mask)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
val = i2c_reg_read(addr, reg);
|
||||
setbits_8(&val, mask);
|
||||
i2c_reg_write(addr, reg, val);
|
||||
}
|
||||
|
||||
static void dp501_clrbits(u8 addr, u8 reg, u8 mask)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
val = i2c_reg_read(addr, reg);
|
||||
clrbits_8(&val, mask);
|
||||
i2c_reg_write(addr, reg, val);
|
||||
}
|
||||
|
||||
static int dp501_detect_cable_adapter(u8 addr)
|
||||
{
|
||||
u8 val = i2c_reg_read(addr, 0x00);
|
||||
|
||||
return !(val & 0x04);
|
||||
}
|
||||
|
||||
static void dp501_link_training(u8 addr)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
val = i2c_reg_read(addr, 0x51);
|
||||
i2c_reg_write(addr, 0x5d, val); /* set link_bw */
|
||||
val = i2c_reg_read(addr, 0x52);
|
||||
i2c_reg_write(addr, 0x5e, val); /* set lane_cnt */
|
||||
val = i2c_reg_read(addr, 0x53);
|
||||
i2c_reg_write(addr, 0x5c, val); /* set downspread_ctl */
|
||||
|
||||
i2c_reg_write(addr, 0x5f, 0x0d); /* start training */
|
||||
}
|
||||
|
||||
void dp501_powerup(u8 addr)
|
||||
{
|
||||
dp501_clrbits(addr, 0x0a, 0x30); /* power on encoder */
|
||||
i2c_reg_write(addr, 0x27, 0x30); /* Hardware auto detect DVO timing */
|
||||
dp501_setbits(addr, 0x72, 0x80); /* DPCD read enable */
|
||||
dp501_setbits(addr, 0x30, 0x20); /* RS polynomial select */
|
||||
i2c_reg_write(addr, 0x71, 0x20); /* Enable Aux burst write */
|
||||
dp501_setbits(addr, 0x78, 0x30); /* Disable HPD2 IRQ */
|
||||
dp501_clrbits(addr, 0x2f, 0x40); /* Link FIFO reset selection */
|
||||
i2c_reg_write(addr, 0x24, 0xc0); /* SDR mode 0, ext. H/VSYNC */
|
||||
i2c_reg_write(addr + 2, 0x24, 0x02); /* clock input single ended */
|
||||
|
||||
if (dp501_detect_cable_adapter(addr)) {
|
||||
printf("DVI/HDMI cable adapter detected\n");
|
||||
i2c_reg_write(addr, 0x5e, 0x04); /* enable 4 channel */
|
||||
dp501_clrbits(addr, 0x00, 0x08); /* DVI/HDMI HDCP operation */
|
||||
} else {
|
||||
printf("no DVI/HDMI cable adapter detected\n");
|
||||
i2c_reg_write(addr + 2, 0x00, 0x18); /* driving strength */
|
||||
i2c_reg_write(addr + 2, 0x03, 0x06); /* driving strength */
|
||||
i2c_reg_write(addr, 0x2c, 0x00); /* configure N value */
|
||||
i2c_reg_write(addr, 0x2d, 0x00); /* configure N value */
|
||||
i2c_reg_write(addr, 0x2e, 0x0c); /* configure N value */
|
||||
i2c_reg_write(addr, 0x76, 0xff); /* clear all interrupt */
|
||||
dp501_setbits(addr, 0x78, 0x03); /* clear all interrupt */
|
||||
i2c_reg_write(addr, 0x75, 0xf8); /* aux channel reset */
|
||||
i2c_reg_write(addr, 0x75, 0x00); /* clear aux channel reset */
|
||||
i2c_reg_write(addr, 0x87, 0x70); /* set retry counter as 7 */
|
||||
dp501_setbits(addr, 0x00, 0x08); /* for DP HDCP operation */
|
||||
|
||||
dp501_link_training(addr);
|
||||
}
|
||||
}
|
||||
|
||||
void dp501_powerdown(u8 addr)
|
||||
{
|
||||
dp501_setbits(addr, 0x0a, 0x30); /* power down encoder, standby mode */
|
||||
}
|
||||
30
board/gdsys/common/dp501.h
Normal file
30
board/gdsys/common/dp501.h
Normal file
@@ -0,0 +1,30 @@
|
||||
/*
|
||||
* (C) Copyright 2012
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef _DP501_H_
|
||||
#define _DP501_H_
|
||||
|
||||
void dp501_powerup(u8 addr);
|
||||
void dp501_powerdown(u8 addr);
|
||||
|
||||
#endif
|
||||
37
board/gdsys/p1022/Makefile
Normal file
37
board/gdsys/p1022/Makefile
Normal file
@@ -0,0 +1,37 @@
|
||||
#
|
||||
# Copyright 2010 Freescale Semiconductor, Inc.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by the Free
|
||||
# Software Foundation; either version 2 of the License, or (at your option)
|
||||
# any later version.
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
# COBJS-y += $(BOARD).o
|
||||
COBJS-y += law.o
|
||||
COBJS-y += ddr.o
|
||||
COBJS-y += tlb.o
|
||||
COBJS-y += sdhc_boot.o
|
||||
COBJS-$(CONFIG_CONTROLCENTERD) += controlcenterd.o controlcenterd-id.o
|
||||
|
||||
COBJS-$(CONFIG_FSL_DIU_FB) += diu.o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(COBJS-y))
|
||||
SOBJS := $(addprefix $(obj),$(SOBJS))
|
||||
|
||||
$(LIB): $(OBJS) $(SOBJS)
|
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
1224
board/gdsys/p1022/controlcenterd-id.c
Normal file
1224
board/gdsys/p1022/controlcenterd-id.c
Normal file
File diff suppressed because it is too large
Load Diff
29
board/gdsys/p1022/controlcenterd-id.h
Normal file
29
board/gdsys/p1022/controlcenterd-id.h
Normal file
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* Reinhard Pfau, Guntermann & Drunck GmbH, reinhard.pfau@gdsys.cc
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301, USA.
|
||||
*/
|
||||
|
||||
#ifndef __CONTROLCENTER_ID_H
|
||||
#define __CONTROLCENTER_ID_H
|
||||
|
||||
int ccdm_compute_self_hash(void);
|
||||
int startup_ccdm_id_module(void);
|
||||
|
||||
int show_self_hash(void);
|
||||
|
||||
#endif /* __CONTROLCENTER_ID_H */
|
||||
425
board/gdsys/p1022/controlcenterd.c
Normal file
425
board/gdsys/p1022/controlcenterd.c
Normal file
@@ -0,0 +1,425 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <pci.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/mmu.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/immap_85xx.h>
|
||||
#include <asm/fsl_pci.h>
|
||||
#include <asm/fsl_ddr_sdram.h>
|
||||
#include <asm/fsl_serdes.h>
|
||||
#include <asm/io.h>
|
||||
#include <libfdt.h>
|
||||
#include <fdt_support.h>
|
||||
#include <fsl_mdio.h>
|
||||
#include <tsec.h>
|
||||
#include <asm/fsl_law.h>
|
||||
#include <netdev.h>
|
||||
#include <i2c.h>
|
||||
#include <pca9698.h>
|
||||
#include <watchdog.h>
|
||||
#include "../common/dp501.h"
|
||||
#include "controlcenterd-id.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
enum {
|
||||
HWVER_100 = 0,
|
||||
HWVER_110 = 1,
|
||||
HWVER_120 = 2,
|
||||
};
|
||||
|
||||
struct ihs_fpga {
|
||||
u32 reflection_low; /* 0x0000 */
|
||||
u32 versions; /* 0x0004 */
|
||||
u32 fpga_version; /* 0x0008 */
|
||||
u32 fpga_features; /* 0x000c */
|
||||
};
|
||||
|
||||
#ifndef CONFIG_TRAILBLAZER
|
||||
static struct pci_device_id hydra_supported[] = {
|
||||
{ 0x6d5e, 0xcdc0 },
|
||||
{}
|
||||
};
|
||||
|
||||
static void hydra_initialize(void);
|
||||
#endif
|
||||
|
||||
int board_early_init_f(void)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
/* Reset eLBC_DIU and SPI_eLBC in case we are booting from SD */
|
||||
clrsetbits_be32(&gur->pmuxcr, 0x00600000, 0x80000000);
|
||||
|
||||
/* Set pmuxcr to allow both i2c1 and i2c2 */
|
||||
setbits_be32(&gur->pmuxcr, 0x00001000);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 3_11-3_13 */
|
||||
setbits_be32(&gur->pmuxcr, 0x00000010);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 2_31,3_9+10 */
|
||||
setbits_be32(&gur->pmuxcr, 0x00000020);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 2_28-2_30 */
|
||||
setbits_be32(&gur->pmuxcr, 0x000000c0);
|
||||
|
||||
/* Set pmuxcr to enable GPIO 3_20-3_22 */
|
||||
setbits_be32(&gur->pmuxcr2, 0x03000000);
|
||||
|
||||
/* Set pmuxcr to enable IRQ0-2 */
|
||||
clrbits_be32(&gur->pmuxcr, 0x00000300);
|
||||
|
||||
/* Set pmuxcr to disable IRQ3-11 */
|
||||
setbits_be32(&gur->pmuxcr, 0x000000F0);
|
||||
|
||||
/* Read back the register to synchronize the write. */
|
||||
in_be32(&gur->pmuxcr);
|
||||
|
||||
/* Set the pin muxing to enable ETSEC2. */
|
||||
clrbits_be32(&gur->pmuxcr2, 0x001F8000);
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
/*
|
||||
* GPIO3_10 SPERRTRIGGER
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00200000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00200000);
|
||||
udelay(100);
|
||||
setbits_be32(&pgpio->gpdat, 0x00200000);
|
||||
udelay(100);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00200000);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* GPIO3_11 CPU-TO-FPGA-RESET#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00100000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00100000);
|
||||
|
||||
/*
|
||||
* GPIO3_21 CPU-STATUS-WATCHDOG-TRIGGER#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00000400);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int checkboard(void)
|
||||
{
|
||||
printf("Board: ControlCenter DIGITAL\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int misc_init_r(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* A list of PCI and SATA slots
|
||||
*/
|
||||
enum slot_id {
|
||||
SLOT_PCIE1 = 1,
|
||||
SLOT_PCIE2,
|
||||
SLOT_PCIE3,
|
||||
SLOT_PCIE4,
|
||||
SLOT_PCIE5,
|
||||
SLOT_SATA1,
|
||||
SLOT_SATA2
|
||||
};
|
||||
|
||||
/*
|
||||
* This array maps the slot identifiers to their names on the P1022DS board.
|
||||
*/
|
||||
static const char * const slot_names[] = {
|
||||
[SLOT_PCIE1] = "Slot 1",
|
||||
[SLOT_PCIE2] = "Slot 2",
|
||||
[SLOT_PCIE3] = "Slot 3",
|
||||
[SLOT_PCIE4] = "Slot 4",
|
||||
[SLOT_PCIE5] = "Mini-PCIe",
|
||||
[SLOT_SATA1] = "SATA 1",
|
||||
[SLOT_SATA2] = "SATA 2",
|
||||
};
|
||||
|
||||
/*
|
||||
* This array maps a given SERDES configuration and SERDES device to the PCI or
|
||||
* SATA slot that it connects to. This mapping is hard-coded in the FPGA.
|
||||
*/
|
||||
static u8 serdes_dev_slot[][SATA2 + 1] = {
|
||||
[0x01] = { [PCIE3] = SLOT_PCIE4, [PCIE2] = SLOT_PCIE5 },
|
||||
[0x02] = { [SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x09] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE4,
|
||||
[PCIE2] = SLOT_PCIE5 },
|
||||
[0x16] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE2,
|
||||
[PCIE2] = SLOT_PCIE3,
|
||||
[SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x17] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE2,
|
||||
[PCIE2] = SLOT_PCIE3 },
|
||||
[0x1a] = { [PCIE1] = SLOT_PCIE1, [PCIE2] = SLOT_PCIE3,
|
||||
[PCIE2] = SLOT_PCIE3,
|
||||
[SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x1c] = { [PCIE1] = SLOT_PCIE1,
|
||||
[SATA1] = SLOT_SATA1, [SATA2] = SLOT_SATA2 },
|
||||
[0x1e] = { [PCIE1] = SLOT_PCIE1, [PCIE3] = SLOT_PCIE3 },
|
||||
[0x1f] = { [PCIE1] = SLOT_PCIE1 },
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Returns the name of the slot to which the PCIe or SATA controller is
|
||||
* connected
|
||||
*/
|
||||
const char *board_serdes_name(enum srds_prtcl device)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)CONFIG_SYS_MPC85xx_GUTS_ADDR;
|
||||
u32 pordevsr = in_be32(&gur->pordevsr);
|
||||
unsigned int srds_cfg = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >>
|
||||
MPC85xx_PORDEVSR_IO_SEL_SHIFT;
|
||||
enum slot_id slot = serdes_dev_slot[srds_cfg][device];
|
||||
const char *name = slot_names[slot];
|
||||
|
||||
if (name)
|
||||
return name;
|
||||
else
|
||||
return "Nothing";
|
||||
}
|
||||
|
||||
void hw_watchdog_reset(void)
|
||||
{
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
clrbits_be32(&pgpio->gpdat, 0x00000400);
|
||||
setbits_be32(&pgpio->gpdat, 0x00000400);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
int do_bootd(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
{
|
||||
int rcode = 0;
|
||||
|
||||
if (run_command(getenv("bootcmd"), flag) < 0)
|
||||
rcode = 1;
|
||||
return rcode;
|
||||
}
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
/*
|
||||
* GPIO3_12 PPC_SYSTEMREADY#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00080000);
|
||||
setbits_be32(&pgpio->gpodr, 0x00080000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00080000);
|
||||
|
||||
return ccdm_compute_self_hash();
|
||||
}
|
||||
|
||||
int last_stage_init(void)
|
||||
{
|
||||
startup_ccdm_id_module();
|
||||
return 0;
|
||||
}
|
||||
|
||||
#else
|
||||
void pci_init_board(void)
|
||||
{
|
||||
fsl_pcie_init_board(0);
|
||||
|
||||
hydra_initialize();
|
||||
}
|
||||
|
||||
int board_early_init_r(void)
|
||||
{
|
||||
unsigned int k = 0;
|
||||
ccsr_gpio_t *pgpio = (void *)(CONFIG_SYS_MPC85xx_GPIO3_ADDR);
|
||||
|
||||
/* wait for FPGA configuration to finish */
|
||||
while (!pca9698_get_value(0x22, 11) && (k++ < 30))
|
||||
udelay(100000);
|
||||
|
||||
if (k > 30) {
|
||||
puts("FPGA configuration timed out.\n");
|
||||
} else {
|
||||
/* clear FPGA reset */
|
||||
udelay(1000);
|
||||
setbits_be32(&pgpio->gpdat, 0x00100000);
|
||||
}
|
||||
|
||||
/* give time for PCIe link training */
|
||||
udelay(100000);
|
||||
|
||||
/*
|
||||
* GPIO3_12 PPC_SYSTEMREADY#
|
||||
*/
|
||||
setbits_be32(&pgpio->gpdir, 0x00080000);
|
||||
setbits_be32(&pgpio->gpodr, 0x00080000);
|
||||
clrbits_be32(&pgpio->gpdat, 0x00080000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int last_stage_init(void)
|
||||
{
|
||||
/* Turn on Parade DP501 */
|
||||
pca9698_direction_output(0x22, 7, 1);
|
||||
udelay(500000);
|
||||
|
||||
dp501_powerup(0x08);
|
||||
|
||||
startup_ccdm_id_module();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize on-board and/or PCI Ethernet devices
|
||||
*
|
||||
* Returns:
|
||||
* <0, error
|
||||
* 0, no ethernet devices found
|
||||
* >0, number of ethernet devices initialized
|
||||
*/
|
||||
int board_eth_init(bd_t *bis)
|
||||
{
|
||||
struct fsl_pq_mdio_info mdio_info;
|
||||
struct tsec_info_struct tsec_info[2];
|
||||
unsigned int num = 0;
|
||||
|
||||
#ifdef CONFIG_TSEC1
|
||||
SET_STD_TSEC_INFO(tsec_info[num], 1);
|
||||
num++;
|
||||
#endif
|
||||
#ifdef CONFIG_TSEC2
|
||||
SET_STD_TSEC_INFO(tsec_info[num], 2);
|
||||
num++;
|
||||
#endif
|
||||
|
||||
mdio_info.regs = (struct tsec_mii_mng *)CONFIG_SYS_MDIO_BASE_ADDR;
|
||||
mdio_info.name = DEFAULT_MII_NAME;
|
||||
fsl_pq_mdio_init(bis, &mdio_info);
|
||||
|
||||
return tsec_eth_init(bis, tsec_info, num) + pci_eth_init(bis);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF_BOARD_SETUP
|
||||
void ft_board_setup(void *blob, bd_t *bd)
|
||||
{
|
||||
phys_addr_t base;
|
||||
phys_size_t size;
|
||||
|
||||
ft_cpu_setup(blob, bd);
|
||||
|
||||
base = getenv_bootm_low();
|
||||
size = getenv_bootm_size();
|
||||
|
||||
fdt_fixup_memory(blob, (u64)base, (u64)size);
|
||||
|
||||
#ifdef CONFIG_HAS_FSL_DR_USB
|
||||
fdt_fixup_dr_usb(blob, bd);
|
||||
#endif
|
||||
|
||||
FT_FSL_PCI_SETUP;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void hydra_initialize(void)
|
||||
{
|
||||
unsigned int i;
|
||||
pci_dev_t devno;
|
||||
|
||||
/* Find and probe all the matching PCI devices */
|
||||
for (i = 0; (devno = pci_find_devices(hydra_supported, i)) >= 0; i++) {
|
||||
u32 val;
|
||||
struct ihs_fpga *fpga;
|
||||
u32 versions;
|
||||
u32 fpga_version;
|
||||
u32 fpga_features;
|
||||
|
||||
unsigned hardware_version;
|
||||
unsigned feature_uart_channels;
|
||||
unsigned feature_sb_channels;
|
||||
|
||||
/* Try to enable I/O accesses and bus-mastering */
|
||||
val = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
|
||||
pci_write_config_dword(devno, PCI_COMMAND, val);
|
||||
|
||||
/* Make sure it worked */
|
||||
pci_read_config_dword(devno, PCI_COMMAND, &val);
|
||||
if (!(val & PCI_COMMAND_MEMORY)) {
|
||||
puts("Can't enable I/O memory\n");
|
||||
continue;
|
||||
}
|
||||
if (!(val & PCI_COMMAND_MASTER)) {
|
||||
puts("Can't enable bus-mastering\n");
|
||||
continue;
|
||||
}
|
||||
|
||||
/* read FPGA details */
|
||||
fpga = pci_map_bar(devno, PCI_BASE_ADDRESS_0,
|
||||
PCI_REGION_MEM);
|
||||
|
||||
versions = readl(fpga->versions);
|
||||
fpga_version = readl(fpga->fpga_version);
|
||||
fpga_features = readl(fpga->fpga_features);
|
||||
|
||||
hardware_version = versions & 0xf;
|
||||
feature_uart_channels = (fpga_features >> 6) & 0x1f;
|
||||
feature_sb_channels = fpga_features & 0x1f;
|
||||
|
||||
printf("FPGA%d: ", i);
|
||||
|
||||
switch (hardware_version) {
|
||||
case HWVER_100:
|
||||
printf("HW-Ver 1.00\n");
|
||||
break;
|
||||
|
||||
case HWVER_110:
|
||||
printf("HW-Ver 1.10\n");
|
||||
break;
|
||||
|
||||
case HWVER_120:
|
||||
printf("HW-Ver 1.20\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("HW-Ver %d(not supported)\n",
|
||||
hardware_version);
|
||||
break;
|
||||
}
|
||||
|
||||
printf(" FPGA V %d.%02d, features:",
|
||||
fpga_version / 100, fpga_version % 100);
|
||||
|
||||
printf(" %d uart channel(s)", feature_uart_channels);
|
||||
printf(" %d sideband channel(s)\n", feature_sb_channels);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
71
board/gdsys/p1022/ddr.c
Normal file
71
board/gdsys/p1022/ddr.c
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
* Authors: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <i2c.h>
|
||||
|
||||
#include <asm/fsl_ddr_sdram.h>
|
||||
#include <asm/fsl_ddr_dimm_params.h>
|
||||
|
||||
void fsl_ddr_board_options(memctl_options_t *popts, dimm_params_t *pdimm,
|
||||
unsigned int ctrl_num)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
if (ctrl_num) {
|
||||
printf("Wrong parameter for controller number %d", ctrl_num);
|
||||
return;
|
||||
}
|
||||
if (!pdimm->n_ranks)
|
||||
return;
|
||||
|
||||
/* set odt_rd_cfg and odt_wr_cfg. */
|
||||
for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
|
||||
popts->cs_local_opts[i].odt_rd_cfg = 0;
|
||||
popts->cs_local_opts[i].odt_wr_cfg = 1;
|
||||
}
|
||||
|
||||
popts->clk_adjust = 5;
|
||||
popts->cpo_override = 0x1f;
|
||||
popts->write_data_delay = 2;
|
||||
popts->half_strength_driver_enable = 1;
|
||||
|
||||
/* Per AN4039, enable ZQ calibration. */
|
||||
popts->zq_en = 1;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SPD_EEPROM
|
||||
/*
|
||||
* we only have a "fake" SPD-EEPROM here, which has 16 bit addresses
|
||||
*/
|
||||
void get_spd(generic_spd_eeprom_t *spd, u8 i2c_address)
|
||||
{
|
||||
int ret = i2c_read(i2c_address, 0, 2, (uchar *)spd,
|
||||
sizeof(generic_spd_eeprom_t));
|
||||
|
||||
if (ret) {
|
||||
if (i2c_address ==
|
||||
#ifdef SPD_EEPROM_ADDRESS
|
||||
SPD_EEPROM_ADDRESS
|
||||
#elif defined(SPD_EEPROM_ADDRESS1)
|
||||
SPD_EEPROM_ADDRESS1
|
||||
#endif
|
||||
) {
|
||||
printf("DDR: failed to read SPD from address %u\n",
|
||||
i2c_address);
|
||||
} else {
|
||||
debug("DDR: failed to read SPD from address %u\n",
|
||||
i2c_address);
|
||||
}
|
||||
memset(spd, 0, sizeof(generic_spd_eeprom_t));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
87
board/gdsys/p1022/diu.c
Normal file
87
board/gdsys/p1022/diu.c
Normal file
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright 2010-2011 Freescale Semiconductor, Inc.
|
||||
* Authors: Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* FSL DIU Framebuffer driver
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <linux/ctype.h>
|
||||
#include <asm/io.h>
|
||||
#include <stdio_dev.h>
|
||||
#include <video_fb.h>
|
||||
#include <fsl_diu_fb.h>
|
||||
|
||||
#define PMUXCR_ELBCDIU_MASK 0xc0000000
|
||||
#define PMUXCR_ELBCDIU_NOR16 0x80000000
|
||||
#define PMUXCR_ELBCDIU_DIU 0x40000000
|
||||
|
||||
/*
|
||||
* DIU Area Descriptor
|
||||
*
|
||||
* Note that we need to byte-swap the value before it's written to the AD
|
||||
* register. So even though the registers don't look like they're in the same
|
||||
* bit positions as they are on the MPC8610, the same value is written to the
|
||||
* AD register on the MPC8610 and on the P1022.
|
||||
*/
|
||||
#define AD_BYTE_F 0x10000000
|
||||
#define AD_ALPHA_C_SHIFT 25
|
||||
#define AD_BLUE_C_SHIFT 23
|
||||
#define AD_GREEN_C_SHIFT 21
|
||||
#define AD_RED_C_SHIFT 19
|
||||
#define AD_PIXEL_S_SHIFT 16
|
||||
#define AD_COMP_3_SHIFT 12
|
||||
#define AD_COMP_2_SHIFT 8
|
||||
#define AD_COMP_1_SHIFT 4
|
||||
#define AD_COMP_0_SHIFT 0
|
||||
|
||||
/*
|
||||
* Variables used by the DIU/LBC switching code. It's safe to makes these
|
||||
* global, because the DIU requires DDR, so we'll only run this code after
|
||||
* relocation.
|
||||
*/
|
||||
static u32 pmuxcr;
|
||||
|
||||
void diu_set_pixel_clock(unsigned int pixclock)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
|
||||
unsigned long speed_ccb, temp;
|
||||
u32 pixval;
|
||||
|
||||
speed_ccb = get_bus_freq(0);
|
||||
temp = 1000000000 / pixclock;
|
||||
temp *= 1000;
|
||||
pixval = speed_ccb / temp;
|
||||
debug("DIU pixval = %u\n", pixval);
|
||||
|
||||
/* Modify PXCLK in GUTS CLKDVDR */
|
||||
temp = in_be32(&gur->clkdvdr) & 0x2000FFFF;
|
||||
out_be32(&gur->clkdvdr, temp); /* turn off clock */
|
||||
out_be32(&gur->clkdvdr, temp | 0x80000000 | ((pixval & 0x1F) << 16));
|
||||
}
|
||||
|
||||
int platform_diu_init(unsigned int xres, unsigned int yres, const char *port)
|
||||
{
|
||||
ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
|
||||
u32 pixel_format;
|
||||
|
||||
pixel_format = cpu_to_le32(AD_BYTE_F | (3 << AD_ALPHA_C_SHIFT) |
|
||||
(0 << AD_BLUE_C_SHIFT) | (1 << AD_GREEN_C_SHIFT) |
|
||||
(2 << AD_RED_C_SHIFT) | (8 << AD_COMP_3_SHIFT) |
|
||||
(8 << AD_COMP_2_SHIFT) | (8 << AD_COMP_1_SHIFT) |
|
||||
(8 << AD_COMP_0_SHIFT) | (3 << AD_PIXEL_S_SHIFT));
|
||||
|
||||
printf("DIU: Switching to %ux%u\n", xres, yres);
|
||||
|
||||
/* Set PMUXCR to switch the muxed pins from the LBC to the DIU */
|
||||
clrsetbits_be32(&gur->pmuxcr, PMUXCR_ELBCDIU_MASK, PMUXCR_ELBCDIU_DIU);
|
||||
pmuxcr = in_be32(&gur->pmuxcr);
|
||||
|
||||
return fsl_diu_init(xres, yres, pixel_format, 0);
|
||||
}
|
||||
20
board/gdsys/p1022/law.c
Normal file
20
board/gdsys/p1022/law.c
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
* Authors: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/fsl_law.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
struct law_entry law_table[] = {
|
||||
SET_LAW(CONFIG_SYS_ELBC_BASE_PHYS, LAW_SIZE_1M, LAW_TRGT_IF_LBC),
|
||||
};
|
||||
|
||||
int num_law_entries = ARRAY_SIZE(law_table);
|
||||
63
board/gdsys/p1022/sdhc_boot.c
Normal file
63
board/gdsys/p1022/sdhc_boot.c
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright 2011 Freescale Semiconductor, Inc.
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <mmc.h>
|
||||
#include <malloc.h>
|
||||
|
||||
/*
|
||||
* The environment variables are written to just after the u-boot image
|
||||
* on SDCard, so we must read the MBR to get the start address and code
|
||||
* length of the u-boot image, then calculate the address of the env.
|
||||
*/
|
||||
#define ESDHC_BOOT_IMAGE_SIZE 0x48
|
||||
#define ESDHC_BOOT_IMAGE_ADDR 0x50
|
||||
|
||||
int mmc_get_env_addr(struct mmc *mmc, u32 *env_addr)
|
||||
{
|
||||
u8 *tmp_buf;
|
||||
u32 blklen, code_offset, code_len, n;
|
||||
|
||||
blklen = mmc->read_bl_len;
|
||||
tmp_buf = malloc(blklen);
|
||||
if (!tmp_buf)
|
||||
return 1;
|
||||
|
||||
/* read out the first block, get the config data information */
|
||||
n = mmc->block_dev.block_read(mmc->block_dev.dev, 0, 1, tmp_buf);
|
||||
if (!n) {
|
||||
free(tmp_buf);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Get the Source Address, from offset 0x50 */
|
||||
code_offset = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_ADDR);
|
||||
|
||||
/* Get the code size from offset 0x48 */
|
||||
code_len = *(u32 *)(tmp_buf + ESDHC_BOOT_IMAGE_SIZE);
|
||||
|
||||
*env_addr = code_offset + code_len;
|
||||
|
||||
free(tmp_buf);
|
||||
|
||||
return 0;
|
||||
}
|
||||
77
board/gdsys/p1022/tlb.c
Normal file
77
board/gdsys/p1022/tlb.c
Normal file
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* Copyright 2010 Freescale Semiconductor, Inc.
|
||||
* Authors: Srikanth Srinivasan <srikanth.srinivasan@freescale.com>
|
||||
* Timur Tabi <timur@freescale.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation; either version 2 of the License, or (at your option)
|
||||
* any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/mmu.h>
|
||||
|
||||
struct fsl_e_tlb_entry tlb_table[] = {
|
||||
/* TLB 0 - for temp stack in cache */
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR, CONFIG_SYS_INIT_RAM_ADDR,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
|
||||
CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
|
||||
CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
|
||||
CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 0, BOOKE_PAGESZ_4K, 0),
|
||||
|
||||
/* TLB 1 */
|
||||
/* *I*** - Covers boot page */
|
||||
SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I,
|
||||
0, 0, BOOKE_PAGESZ_4K, 1),
|
||||
|
||||
/* *I*G* - CCSRBAR */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 1, BOOKE_PAGESZ_1M, 1),
|
||||
|
||||
/* *I*G* - eLBC */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_ELBC_BASE, CONFIG_SYS_ELBC_BASE_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 2, BOOKE_PAGESZ_1M, 1),
|
||||
|
||||
#if defined(CONFIG_TRAILBLAZER)
|
||||
/* *I*G - L2SRAM */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_INIT_L2_ADDR, CONFIG_SYS_INIT_L2_ADDR_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 9, BOOKE_PAGESZ_256K, 1),
|
||||
#else
|
||||
/* *I*G* - PCI */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 3, BOOKE_PAGESZ_256M, 1),
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x10000000,
|
||||
CONFIG_SYS_PCIE1_MEM_PHYS + 0x10000000,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 4, BOOKE_PAGESZ_256M, 1),
|
||||
|
||||
/* *I*G* - PCI I/O */
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_IO_VIRT, CONFIG_SYS_PCIE1_IO_PHYS,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
|
||||
0, 5, BOOKE_PAGESZ_256K, 1),
|
||||
|
||||
#ifdef CONFIG_SYS_RAMBOOT
|
||||
SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
|
||||
MAS3_SX|MAS3_SW|MAS3_SR, 0,
|
||||
0, 6, BOOKE_PAGESZ_1G, 1),
|
||||
#endif
|
||||
#endif
|
||||
};
|
||||
|
||||
int num_tlb_entries = ARRAY_SIZE(tlb_table);
|
||||
@@ -1,40 +0,0 @@
|
||||
#
|
||||
# (C) Copyright 2006
|
||||
# Ingenic Semiconductor, <jlwei@ingenic.cn>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
include $(TOPDIR)/config.mk
|
||||
|
||||
LIB = $(obj)lib$(BOARD).o
|
||||
|
||||
COBJS := $(BOARD).o
|
||||
|
||||
SRCS := $(SOBJS:.o=.S) $(COBJS:.o=.c)
|
||||
OBJS := $(addprefix $(obj),$(SOBJS) $(COBJS))
|
||||
|
||||
$(LIB): $(obj).depend $(OBJS) $(SOBJS)
|
||||
$(call cmd_link_o_target, $(OBJS))
|
||||
|
||||
#########################################################################
|
||||
|
||||
# defines $(obj).depend target
|
||||
include $(SRCTREE)/rules.mk
|
||||
|
||||
sinclude $(obj).depend
|
||||
|
||||
#########################################################################
|
||||
@@ -1,31 +0,0 @@
|
||||
#
|
||||
# (C) Copyright 2006 Qi Hardware, Inc.
|
||||
# Author: Xiangfu Liu <xiangfu.z@gmail.com>
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or
|
||||
# modify it under the terms of the GNU General Public License as
|
||||
# published by the Free Software Foundation; either version 2 of
|
||||
# the License, or (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
# MA 02111-1307 USA
|
||||
#
|
||||
|
||||
#
|
||||
# Qi Hardware, Inc. Ben NanoNote (QI_LB60)
|
||||
#
|
||||
|
||||
ifndef TEXT_BASE
|
||||
# ROM version
|
||||
# TEXT_BASE = 0x88000000
|
||||
|
||||
# RAM version
|
||||
TEXT_BASE = 0x80100000
|
||||
endif
|
||||
@@ -1,104 +0,0 @@
|
||||
/*
|
||||
* Authors: Xiangfu Liu <xiangfu@sharism.cc>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/jz4740.h>
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
static void gpio_init(void)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
/* Initialize NAND Flash Pins */
|
||||
__gpio_as_nand();
|
||||
|
||||
/* Initialize SDRAM pins */
|
||||
__gpio_as_sdram_16bit_4720();
|
||||
|
||||
/* Initialize LCD pins */
|
||||
__gpio_as_lcd_18bit();
|
||||
|
||||
/* Initialize MSC pins */
|
||||
__gpio_as_msc();
|
||||
|
||||
/* Initialize Other pins */
|
||||
for (i = 0; i < 7; i++) {
|
||||
__gpio_as_input(GPIO_KEYIN_BASE + i);
|
||||
__gpio_enable_pull(GPIO_KEYIN_BASE + i);
|
||||
}
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
__gpio_as_output(GPIO_KEYOUT_BASE + i);
|
||||
__gpio_clear_pin(GPIO_KEYOUT_BASE + i);
|
||||
}
|
||||
|
||||
__gpio_as_input(GPIO_KEYIN_8);
|
||||
__gpio_enable_pull(GPIO_KEYIN_8);
|
||||
|
||||
/* enable the TP4, TP5 as UART0 */
|
||||
__gpio_jtag_to_uart0();
|
||||
|
||||
__gpio_as_output(GPIO_AUDIO_POP);
|
||||
__gpio_set_pin(GPIO_AUDIO_POP);
|
||||
|
||||
__gpio_as_output(GPIO_LCD_CS);
|
||||
__gpio_clear_pin(GPIO_LCD_CS);
|
||||
|
||||
__gpio_as_output(GPIO_AMP_EN);
|
||||
__gpio_clear_pin(GPIO_AMP_EN);
|
||||
|
||||
__gpio_as_output(GPIO_SDPW_EN);
|
||||
__gpio_disable_pull(GPIO_SDPW_EN);
|
||||
__gpio_clear_pin(GPIO_SDPW_EN);
|
||||
|
||||
__gpio_as_input(GPIO_SD_DETECT);
|
||||
__gpio_disable_pull(GPIO_SD_DETECT);
|
||||
|
||||
__gpio_as_input(GPIO_USB_DETECT);
|
||||
__gpio_enable_pull(GPIO_USB_DETECT);
|
||||
}
|
||||
|
||||
static void cpm_init(void)
|
||||
{
|
||||
struct jz4740_cpm *cpm = (struct jz4740_cpm *)JZ4740_CPM_BASE;
|
||||
uint32_t reg = readl(&cpm->clkgr);
|
||||
|
||||
reg |= CPM_CLKGR_IPU |
|
||||
CPM_CLKGR_CIM |
|
||||
CPM_CLKGR_I2C |
|
||||
CPM_CLKGR_SSI |
|
||||
CPM_CLKGR_UART1 |
|
||||
CPM_CLKGR_SADC |
|
||||
CPM_CLKGR_UHC |
|
||||
CPM_CLKGR_UDC |
|
||||
CPM_CLKGR_AIC1;
|
||||
|
||||
writel(reg, &cpm->clkgr);
|
||||
}
|
||||
|
||||
int board_early_init_f(void)
|
||||
{
|
||||
gpio_init();
|
||||
cpm_init();
|
||||
calc_clocks(); /* calc the clocks */
|
||||
rtc_init(); /* init rtc on any reset */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* U-Boot common routines */
|
||||
int checkboard(void)
|
||||
{
|
||||
printf("Board: Qi LB60 (Ingenic XBurst Jz4740 SoC, Speed %ld MHz)\n",
|
||||
gd->cpu_clk / 1000000);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -58,12 +58,6 @@ u32 get_board_rev(void)
|
||||
#endif
|
||||
|
||||
static void check_hw_revision(void);
|
||||
|
||||
static int hwrevision(int rev)
|
||||
{
|
||||
return (board_rev & 0xf) == rev;
|
||||
}
|
||||
|
||||
struct s3c_plat_otg_data s5pc210_otg_data;
|
||||
|
||||
int board_init(void)
|
||||
@@ -773,9 +767,7 @@ void init_panel_info(vidinfo_t *vid)
|
||||
#ifdef CONFIG_TIZEN
|
||||
get_tizen_logo_info(vid);
|
||||
#endif
|
||||
|
||||
if (hwrevision(2))
|
||||
mipi_lcd_device.reverse_panel = 1;
|
||||
mipi_lcd_device.reverse_panel = 1;
|
||||
|
||||
strcpy(s6e8ax0_platform_data.lcd_panel_name, mipi_lcd_device.name);
|
||||
s6e8ax0_platform_data.lcd_power = lcd_power;
|
||||
|
||||
@@ -492,7 +492,6 @@ incaip mips mips32 incaip -
|
||||
incaip_100MHz mips mips32 incaip - incaip incaip:CPU_CLOCK_RATE=100000000
|
||||
incaip_133MHz mips mips32 incaip - incaip incaip:CPU_CLOCK_RATE=133000000
|
||||
incaip_150MHz mips mips32 incaip - incaip incaip:CPU_CLOCK_RATE=150000000
|
||||
qi_lb60 mips xburst qi_lb60 qi
|
||||
adp-ag101 nds32 n1213 adp-ag101 AndesTech ag101
|
||||
adp-ag101p nds32 n1213 adp-ag101p AndesTech ag101
|
||||
adp-ag102 nds32 n1213 adp-ag102 AndesTech ag102
|
||||
@@ -915,6 +914,10 @@ BSC9132QDS_SDCARD_DDRCLK100 powerpc mpc85xx bsc9132qds freesca
|
||||
BSC9132QDS_SDCARD_DDRCLK133 powerpc mpc85xx bsc9132qds freescale - BSC9132QDS:BSC9132QDS,SDCARD,SYS_CLK_100_DDR_133
|
||||
BSC9132QDS_SPIFLASH_DDRCLK100 powerpc mpc85xx bsc9132qds freescale - BSC9132QDS:BSC9132QDS,SPIFLASH,SYS_CLK_100_DDR_100
|
||||
BSC9132QDS_SPIFLASH_DDRCLK133 powerpc mpc85xx bsc9132qds freescale - BSC9132QDS:BSC9132QDS,SPIFLASH,SYS_CLK_100_DDR_133
|
||||
controlcenterd_36BIT_SDCARD powerpc mpc85xx p1022 gdsys - controlcenterd:36BIT,SDCARD
|
||||
controlcenterd_36BIT_SDCARD_DEVELOP powerpc mpc85xx p1022 gdsys - controlcenterd:36BIT,SDCARD,DEVELOP
|
||||
controlcenterd_TRAILBLAZER powerpc mpc85xx p1022 gdsys - controlcenterd:TRAILBLAZER,SPIFLASH
|
||||
controlcenterd_TRAILBLAZER_DEVELOP powerpc mpc85xx p1022 gdsys - controlcenterd:TRAILBLAZER,SPIFLASH,DEVELOP
|
||||
stxgp3 powerpc mpc85xx stxgp3 stx
|
||||
stxssa powerpc mpc85xx stxssa stx - stxssa
|
||||
stxssa_4M powerpc mpc85xx stxssa stx - stxssa:STXSSA_4M
|
||||
|
||||
@@ -542,10 +542,6 @@ static int boot_selected_os(int argc, char * const argv[], int state,
|
||||
bootm_start_standalone(argc, argv);
|
||||
return 0;
|
||||
}
|
||||
#ifdef CONFIG_SILENT_CONSOLE
|
||||
if (images->os.os == IH_OS_LINUX)
|
||||
fixup_silent_linux();
|
||||
#endif
|
||||
arch_preboot_os();
|
||||
boot_fn(state, argc, argv, images);
|
||||
if (state == BOOTM_STATE_OS_FAKE_GO) /* We expect to return */
|
||||
@@ -656,6 +652,10 @@ static int do_bootm_states(cmd_tbl_t *cmdtp, int flag, int argc,
|
||||
goto err;
|
||||
else if (ret == BOOTM_ERR_OVERLAP)
|
||||
ret = 0;
|
||||
#ifdef CONFIG_SILENT_CONSOLE
|
||||
if (images->os.os == IH_OS_LINUX)
|
||||
fixup_silent_linux();
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Relocate the ramdisk */
|
||||
|
||||
@@ -64,12 +64,12 @@ enum bootmenu_key {
|
||||
|
||||
static char *bootmenu_getoption(unsigned short int n)
|
||||
{
|
||||
char name[MAX_ENV_SIZE] = "bootmenu_";
|
||||
char name[MAX_ENV_SIZE];
|
||||
|
||||
if (n > MAX_COUNT)
|
||||
return NULL;
|
||||
|
||||
sprintf(name + 9, "%d", n);
|
||||
sprintf(name, "bootmenu_%d", n);
|
||||
return getenv(name);
|
||||
}
|
||||
|
||||
|
||||
@@ -67,7 +67,8 @@ int common_diskboot(cmd_tbl_t *cmdtp, const char *intf, int argc,
|
||||
"Name: %.32s Type: %.32s\n", intf, dev, part, info.name,
|
||||
info.type);
|
||||
|
||||
debug("First Block: %ld, # of blocks: %ld, Block Size: %ld\n",
|
||||
debug("First Block: " LBAFU ", # of blocks: " LBAFU
|
||||
", Block Size: %ld\n",
|
||||
info.start, info.size, info.blksz);
|
||||
|
||||
if (dev_desc->block_read(dev, info.start, 1, (ulong *) addr) != 1) {
|
||||
|
||||
@@ -82,8 +82,9 @@ void scsi_ident_cpy (unsigned char *dest, unsigned char *src, unsigned int len);
|
||||
|
||||
static int scsi_read_capacity(ccb *pccb, lbaint_t *capacity,
|
||||
unsigned long *blksz);
|
||||
static ulong scsi_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer);
|
||||
static ulong scsi_write(int device, ulong blknr,
|
||||
static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
|
||||
void *buffer);
|
||||
static ulong scsi_write(int device, lbaint_t blknr,
|
||||
lbaint_t blkcnt, const void *buffer);
|
||||
|
||||
|
||||
@@ -372,7 +373,8 @@ int do_scsi (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
|
||||
#define SCSI_MAX_READ_BLK 0xFFFF /* almost the maximum amount of the scsi_ext command.. */
|
||||
|
||||
static ulong scsi_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer)
|
||||
static ulong scsi_read(int device, lbaint_t blknr, lbaint_t blkcnt,
|
||||
void *buffer)
|
||||
{
|
||||
lbaint_t start, blks;
|
||||
uintptr_t buf_addr;
|
||||
@@ -427,7 +429,7 @@ static ulong scsi_read(int device, ulong blknr, lbaint_t blkcnt, void *buffer)
|
||||
/* Almost the maximum amount of the scsi_ext command.. */
|
||||
#define SCSI_MAX_WRITE_BLK 0xFFFF
|
||||
|
||||
static ulong scsi_write(int device, ulong blknr,
|
||||
static ulong scsi_write(int device, lbaint_t blknr,
|
||||
lbaint_t blkcnt, const void *buffer)
|
||||
{
|
||||
lbaint_t start, blks;
|
||||
|
||||
100
common/cmd_tpm.c
100
common/cmd_tpm.c
@@ -27,6 +27,13 @@
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
/* Useful constants */
|
||||
enum {
|
||||
DIGEST_LENGTH = 20,
|
||||
/* max lengths, valid for RSA keys <= 2048 bits */
|
||||
TPM_PUBKEY_MAX_LENGTH = 288,
|
||||
};
|
||||
|
||||
/**
|
||||
* Print a byte string in hexdecimal format, 16-bytes per line.
|
||||
*
|
||||
@@ -546,6 +553,72 @@ static int do_tpm_nv_write(cmd_tbl_t *cmdtp, int flag,
|
||||
return convert_return_code(err);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TPM_AUTH_SESSIONS
|
||||
|
||||
static int do_tpm_oiap(cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char * const argv[])
|
||||
{
|
||||
uint32_t auth_handle, err;
|
||||
|
||||
err = tpm_oiap(&auth_handle);
|
||||
|
||||
return convert_return_code(err);
|
||||
}
|
||||
|
||||
static int do_tpm_load_key2_oiap(cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char * const argv[])
|
||||
{
|
||||
uint32_t parent_handle, key_len, key_handle, err;
|
||||
uint8_t usage_auth[DIGEST_LENGTH];
|
||||
void *key;
|
||||
|
||||
if (argc < 5)
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
parent_handle = simple_strtoul(argv[1], NULL, 0);
|
||||
key = (void *)simple_strtoul(argv[2], NULL, 0);
|
||||
key_len = simple_strtoul(argv[3], NULL, 0);
|
||||
if (strlen(argv[4]) != 2 * DIGEST_LENGTH)
|
||||
return CMD_RET_FAILURE;
|
||||
parse_byte_string(argv[4], usage_auth, NULL);
|
||||
|
||||
err = tpm_load_key2_oiap(parent_handle, key, key_len, usage_auth,
|
||||
&key_handle);
|
||||
if (!err)
|
||||
printf("Key handle is 0x%x\n", key_handle);
|
||||
|
||||
return convert_return_code(err);
|
||||
}
|
||||
|
||||
static int do_tpm_get_pub_key_oiap(cmd_tbl_t *cmdtp, int flag,
|
||||
int argc, char * const argv[])
|
||||
{
|
||||
uint32_t key_handle, err;
|
||||
uint8_t usage_auth[DIGEST_LENGTH];
|
||||
uint8_t pub_key_buffer[TPM_PUBKEY_MAX_LENGTH];
|
||||
size_t pub_key_len = sizeof(pub_key_buffer);
|
||||
|
||||
if (argc < 3)
|
||||
return CMD_RET_USAGE;
|
||||
|
||||
key_handle = simple_strtoul(argv[1], NULL, 0);
|
||||
if (strlen(argv[2]) != 2 * DIGEST_LENGTH)
|
||||
return CMD_RET_FAILURE;
|
||||
parse_byte_string(argv[2], usage_auth, NULL);
|
||||
|
||||
err = tpm_get_pub_key_oiap(key_handle, usage_auth,
|
||||
pub_key_buffer, &pub_key_len);
|
||||
if (!err) {
|
||||
printf("dump of received pub key structure:\n");
|
||||
print_byte_string(pub_key_buffer, pub_key_len);
|
||||
}
|
||||
return convert_return_code(err);
|
||||
}
|
||||
|
||||
TPM_COMMAND_NO_ARG(tpm_end_oiap)
|
||||
|
||||
#endif /* CONFIG_TPM_AUTH_SESSIONS */
|
||||
|
||||
#define MAKE_TPM_CMD_ENTRY(cmd) \
|
||||
U_BOOT_CMD_MKENT(cmd, 0, 1, do_tpm_ ## cmd, "", "")
|
||||
|
||||
@@ -590,6 +663,16 @@ static cmd_tbl_t tpm_commands[] = {
|
||||
do_tpm_nv_read, "", ""),
|
||||
U_BOOT_CMD_MKENT(nv_write, 0, 1,
|
||||
do_tpm_nv_write, "", ""),
|
||||
#ifdef CONFIG_TPM_AUTH_SESSIONS
|
||||
U_BOOT_CMD_MKENT(oiap, 0, 1,
|
||||
do_tpm_oiap, "", ""),
|
||||
U_BOOT_CMD_MKENT(end_oiap, 0, 1,
|
||||
do_tpm_end_oiap, "", ""),
|
||||
U_BOOT_CMD_MKENT(load_key2_oiap, 0, 1,
|
||||
do_tpm_load_key2_oiap, "", ""),
|
||||
U_BOOT_CMD_MKENT(get_pub_key_oiap, 0, 1,
|
||||
do_tpm_get_pub_key_oiap, "", ""),
|
||||
#endif /* CONFIG_TPM_AUTH_SESSIONS */
|
||||
};
|
||||
|
||||
static int do_tpm(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
|
||||
@@ -638,6 +721,16 @@ U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm,
|
||||
" get_capability cap_area sub_cap addr count\n"
|
||||
" - Read <count> bytes of TPM capability indexed by <cap_area> and\n"
|
||||
" <sub_cap> to memory address <addr>.\n"
|
||||
#ifdef CONFIG_TPM_AUTH_SESSIONS
|
||||
"Storage functions\n"
|
||||
" loadkey2_oiap parent_handle key_addr key_len usage_auth\n"
|
||||
" - loads a key data from memory address <key_addr>, <key_len> bytes\n"
|
||||
" into TPM using the parent key <parent_handle> with authorization\n"
|
||||
" <usage_auth> (20 bytes hex string).\n"
|
||||
" get_pub_key_oiap key_handle usage_auth\n"
|
||||
" - get the public key portion of a loaded key <key_handle> using\n"
|
||||
" authorization <usage auth> (20 bytes hex string)\n"
|
||||
#endif /* CONFIG_TPM_AUTH_SESSIONS */
|
||||
"Endorsement Key Handling Commands:\n"
|
||||
" read_pubek addr count\n"
|
||||
" - Read <count> bytes of the public endorsement key to memory\n"
|
||||
@@ -648,6 +741,13 @@ U_BOOT_CMD(tpm, CONFIG_SYS_MAXARGS, 1, do_tpm,
|
||||
" <digest_hex_string>\n"
|
||||
" pcr_read index addr count\n"
|
||||
" - Read <count> bytes from PCR <index> to memory address <addr>.\n"
|
||||
#ifdef CONFIG_TPM_AUTH_SESSIONS
|
||||
"Authorization Sessions\n"
|
||||
" oiap\n"
|
||||
" - setup an OIAP session\n"
|
||||
" end_oiap\n"
|
||||
" - terminates an active OIAP session\n"
|
||||
#endif /* CONFIG_TPM_AUTH_SESSIONS */
|
||||
"Non-volatile Storage Commands:\n"
|
||||
" nv_define_space index permission size\n"
|
||||
" - Establish a space at index <index> with <permission> of <size> bytes.\n"
|
||||
|
||||
@@ -213,6 +213,10 @@ endif
|
||||
# TODO(sjg@chromium.org): Is this correct on Mac OS?
|
||||
ifdef CONFIG_FIT_SIGNATURE
|
||||
HOSTLIBS += -lssl -lcrypto
|
||||
|
||||
# This affects include/image.h, but including the board config file
|
||||
# is tricky, so manually define this options here.
|
||||
HOSTCFLAGS += -DCONFIG_FIT_SIGNATURE
|
||||
endif
|
||||
|
||||
ifneq ($(CONFIG_SYS_TEXT_BASE),)
|
||||
|
||||
@@ -548,6 +548,8 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
(*dev_desc)->log2blksz = LOG2((*dev_desc)->blksz);
|
||||
|
||||
info->start = 0;
|
||||
info->size = (*dev_desc)->lba;
|
||||
info->blksz = (*dev_desc)->blksz;
|
||||
@@ -631,6 +633,8 @@ int get_device_and_partition(const char *ifname, const char *dev_part_str,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
(*dev_desc)->log2blksz = LOG2((*dev_desc)->blksz);
|
||||
|
||||
ret = part;
|
||||
goto cleanup;
|
||||
|
||||
|
||||
@@ -200,8 +200,8 @@ int get_partition_info_efi(block_dev_desc_t * dev_desc, int part,
|
||||
uuid_string(gpt_pte[part - 1].unique_partition_guid.b, info->uuid);
|
||||
#endif
|
||||
|
||||
debug("%s: start 0x%lX, size 0x%lX, name %s", __func__,
|
||||
info->start, info->size, info->name);
|
||||
debug("%s: start 0x" LBAF ", size 0x" LBAF ", name %s", __func__,
|
||||
info->start, info->size, info->name);
|
||||
|
||||
/* Remember to free pte */
|
||||
free(gpt_pte);
|
||||
@@ -431,7 +431,7 @@ int gpt_fill_pte(gpt_header *gpt_h, gpt_entry *gpt_e,
|
||||
gpt_e[i].partition_name[k] =
|
||||
(efi_char16_t)(partitions[i].name[k]);
|
||||
|
||||
debug("%s: name: %s offset[%d]: 0x%x size[%d]: 0x%lx\n",
|
||||
debug("%s: name: %s offset[%d]: 0x%x size[%d]: 0x" LBAF "\n",
|
||||
__func__, partitions[i].name, i,
|
||||
offset, i, partitions[i].size);
|
||||
}
|
||||
|
||||
@@ -249,8 +249,8 @@ void print_part_iso(block_dev_desc_t * dev_desc)
|
||||
printf("Part Start Sect x Size Type\n");
|
||||
i=0;
|
||||
do {
|
||||
printf (" %2d %8ld %8ld %6ld %.32s\n",
|
||||
i, info.start, info.size, info.blksz, info.type);
|
||||
printf(" %2d " LBAFU " " LBAFU " %6ld %.32s\n",
|
||||
i, info.start, info.size, info.blksz, info.type);
|
||||
i++;
|
||||
} while (get_partition_info_iso_verb(dev_desc,i,&info,0)!=-1);
|
||||
}
|
||||
|
||||
@@ -383,13 +383,16 @@ i2c_read(u8 dev, uint addr, int alen, u8 *data, int length)
|
||||
int i = -1; /* signal error */
|
||||
u8 *a = (u8*)&addr;
|
||||
|
||||
if (i2c_wait4bus() >= 0
|
||||
if (i2c_wait4bus() < 0)
|
||||
return -1;
|
||||
|
||||
if ((!length || alen > 0)
|
||||
&& i2c_write_addr(dev, I2C_WRITE_BIT, 0) != 0
|
||||
&& __i2c_write(&a[4 - alen], alen) == alen)
|
||||
i = 0; /* No error so far */
|
||||
|
||||
if (length
|
||||
&& i2c_write_addr(dev, I2C_READ_BIT, 1) != 0)
|
||||
if (length &&
|
||||
i2c_write_addr(dev, I2C_READ_BIT, alen ? 1 : 0) != 0)
|
||||
i = __i2c_read(data, length);
|
||||
|
||||
writeb(I2C_CR_MEN, &i2c_dev[i2c_bus_num]->cr);
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include <malloc.h>
|
||||
#include <mmc.h>
|
||||
#include <dwmmc.h>
|
||||
#include <asm/arch/clk.h>
|
||||
#include <asm-generic/errno.h>
|
||||
|
||||
#define PAGE_SIZE 4096
|
||||
|
||||
@@ -100,7 +100,7 @@ static uint esdhc_xfertyp(struct mmc_cmd *cmd, struct mmc_data *data)
|
||||
else if (cmd->resp_type & MMC_RSP_PRESENT)
|
||||
xfertyp |= XFERTYP_RSPTYP_48;
|
||||
|
||||
#ifdef CONFIG_MX53
|
||||
#if defined(CONFIG_MX53) || defined(CONFIG_T4240QDS)
|
||||
if (cmd->cmdidx == MMC_CMD_STOP_TRANSMISSION)
|
||||
xfertyp |= XFERTYP_CMDTYP_ABORT;
|
||||
#endif
|
||||
@@ -470,7 +470,7 @@ static int esdhc_init(struct mmc *mmc)
|
||||
int timeout = 1000;
|
||||
|
||||
/* Reset the entire host controller */
|
||||
esdhc_write32(®s->sysctl, SYSCTL_RSTA);
|
||||
esdhc_setbits32(®s->sysctl, SYSCTL_RSTA);
|
||||
|
||||
/* Wait until the controller is available */
|
||||
while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTA) && --timeout)
|
||||
@@ -481,7 +481,7 @@ static int esdhc_init(struct mmc *mmc)
|
||||
esdhc_write32(®s->scr, 0x00000040);
|
||||
#endif
|
||||
|
||||
esdhc_write32(®s->sysctl, SYSCTL_HCKEN | SYSCTL_IPGEN);
|
||||
esdhc_setbits32(®s->sysctl, SYSCTL_HCKEN | SYSCTL_IPGEN);
|
||||
|
||||
/* Set the initial clock speed */
|
||||
mmc_set_clock(mmc, 400000);
|
||||
@@ -515,7 +515,7 @@ static void esdhc_reset(struct fsl_esdhc *regs)
|
||||
unsigned long timeout = 100; /* wait max 100 ms */
|
||||
|
||||
/* reset the controller */
|
||||
esdhc_write32(®s->sysctl, SYSCTL_RSTA);
|
||||
esdhc_setbits32(®s->sysctl, SYSCTL_RSTA);
|
||||
|
||||
/* hardware clears the bit when it is done */
|
||||
while ((esdhc_read32(®s->sysctl) & SYSCTL_RSTA) && --timeout)
|
||||
|
||||
@@ -333,7 +333,15 @@ int genphy_parse_link(struct phy_device *phydev)
|
||||
} else if (lpa & LPA_10FULL)
|
||||
phydev->duplex = DUPLEX_FULL;
|
||||
|
||||
if (mii_reg & BMSR_ESTATEN)
|
||||
/*
|
||||
* Extended status may indicate that the PHY supports
|
||||
* 1000BASE-T/X even though the 1000BASE-T registers
|
||||
* are missing. In this case we can't tell whether the
|
||||
* peer also supports it, so we only check extended
|
||||
* status if the 1000BASE-T registers are actually
|
||||
* missing.
|
||||
*/
|
||||
if ((mii_reg & BMSR_ESTATEN) && !(mii_reg & BMSR_ERCAP))
|
||||
estatus = phy_read(phydev, MDIO_DEVAD_NONE,
|
||||
MII_ESTATUS);
|
||||
|
||||
@@ -404,7 +412,7 @@ int genphy_config(struct phy_device *phydev)
|
||||
if (val & ESTATUS_1000_XFULL)
|
||||
features |= SUPPORTED_1000baseX_Full;
|
||||
if (val & ESTATUS_1000_XHALF)
|
||||
features |= SUPPORTED_1000baseX_Full;
|
||||
features |= SUPPORTED_1000baseX_Half;
|
||||
}
|
||||
|
||||
phydev->supported = features;
|
||||
|
||||
@@ -26,6 +26,7 @@ LIB := $(obj)libtpm.o
|
||||
$(shell mkdir -p $(obj)slb9635_i2c)
|
||||
|
||||
# TODO: Merge tpm_tis_lpc.c with tpm.c
|
||||
COBJS-$(CONFIG_TPM_ATMEL_TWI) += tpm_atmel_twi.o
|
||||
COBJS-$(CONFIG_TPM_TIS_I2C) += tpm.o
|
||||
COBJS-$(CONFIG_TPM_TIS_I2C) += tpm_tis_i2c.o
|
||||
COBJS-$(CONFIG_TPM_TIS_LPC) += tpm_tis_lpc.o
|
||||
|
||||
121
drivers/tpm/tpm_atmel_twi.c
Normal file
121
drivers/tpm/tpm_atmel_twi.c
Normal file
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <tpm.h>
|
||||
#include <i2c.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#define ATMEL_TPM_TIMEOUT_MS 5000 /* sufficient for anything but
|
||||
generating/exporting keys */
|
||||
|
||||
/*
|
||||
* tis_init()
|
||||
*
|
||||
* Initialize the TPM device. Returns 0 on success or -1 on
|
||||
* failure (in case device probing did not succeed).
|
||||
*/
|
||||
int tis_init(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* tis_open()
|
||||
*
|
||||
* Requests access to locality 0 for the caller. After all commands have been
|
||||
* completed the caller is supposed to call tis_close().
|
||||
*
|
||||
* Returns 0 on success, -1 on failure.
|
||||
*/
|
||||
int tis_open(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* tis_close()
|
||||
*
|
||||
* terminate the currect session with the TPM by releasing the locked
|
||||
* locality. Returns 0 on success of -1 on failure (in case lock
|
||||
* removal did not succeed).
|
||||
*/
|
||||
int tis_close(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* tis_sendrecv()
|
||||
*
|
||||
* Send the requested data to the TPM and then try to get its response
|
||||
*
|
||||
* @sendbuf - buffer of the data to send
|
||||
* @send_size size of the data to send
|
||||
* @recvbuf - memory to save the response to
|
||||
* @recv_len - pointer to the size of the response buffer
|
||||
*
|
||||
* Returns 0 on success (and places the number of response bytes at recv_len)
|
||||
* or -1 on failure.
|
||||
*/
|
||||
int tis_sendrecv(const uint8_t *sendbuf, size_t send_size, uint8_t *recvbuf,
|
||||
size_t *recv_len)
|
||||
{
|
||||
int res;
|
||||
unsigned long start;
|
||||
|
||||
#ifdef DEBUG
|
||||
memset(recvbuf, 0xcc, *recv_len);
|
||||
printf("send to TPM (%d bytes, recv_len=%d):\n", send_size, *recv_len);
|
||||
print_buffer(0, (void *)sendbuf, 1, send_size, 0);
|
||||
#endif
|
||||
|
||||
res = i2c_write(0x29, 0, 0, (uchar *)sendbuf, send_size);
|
||||
if (res) {
|
||||
printf("i2c_write returned %d\n", res);
|
||||
return -1;
|
||||
}
|
||||
|
||||
start = get_timer(0);
|
||||
while ((res = i2c_read(0x29, 0, 0, recvbuf, 10))) {
|
||||
if (get_timer(start) > ATMEL_TPM_TIMEOUT_MS) {
|
||||
puts("tpm timed out\n");
|
||||
return -1;
|
||||
}
|
||||
udelay(100);
|
||||
}
|
||||
if (!res) {
|
||||
*recv_len = get_unaligned_be32(recvbuf + 2);
|
||||
if (*recv_len > 10)
|
||||
res = i2c_read(0x29, 0, 0, recvbuf, *recv_len);
|
||||
}
|
||||
if (res) {
|
||||
printf("i2c_read returned %d (rlen=%d)\n", res, *recv_len);
|
||||
#ifdef DEBUG
|
||||
print_buffer(0, recvbuf, 1, *recv_len, 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef DEBUG
|
||||
if (!res) {
|
||||
printf("read from TPM (%d bytes):\n", *recv_len);
|
||||
print_buffer(0, recvbuf, 1, *recv_len, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
||||
@@ -126,7 +126,8 @@ static unsigned long cramfs_resolve (unsigned long begin, unsigned long offset,
|
||||
namelen--;
|
||||
}
|
||||
|
||||
if (!strncmp (filename, name, namelen)) {
|
||||
if (!strncmp(filename, name, namelen) &&
|
||||
(namelen == strlen(filename))) {
|
||||
char *p = strtok (NULL, "/");
|
||||
|
||||
if (raw && (p == NULL || *p == '\0'))
|
||||
|
||||
@@ -42,7 +42,7 @@
|
||||
#include <ext_common.h>
|
||||
#include "ext4_common.h"
|
||||
|
||||
unsigned long part_offset;
|
||||
lbaint_t part_offset;
|
||||
|
||||
static block_dev_desc_t *ext4fs_block_dev_desc;
|
||||
static disk_partition_t *part_info;
|
||||
@@ -58,7 +58,7 @@ void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info)
|
||||
get_fs()->dev_desc->log2blksz;
|
||||
}
|
||||
|
||||
int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
|
||||
int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf)
|
||||
{
|
||||
unsigned block_len;
|
||||
int log2blksz = ext4fs_block_dev_desc->log2blksz;
|
||||
@@ -74,7 +74,8 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
|
||||
if ((sector < 0) ||
|
||||
((sector + ((byte_offset + byte_len - 1) >> log2blksz))
|
||||
>= part_info->size)) {
|
||||
printf("%s read outside partition %d\n", __func__, sector);
|
||||
printf("%s read outside partition " LBAFU "\n", __func__,
|
||||
sector);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -82,7 +83,7 @@ int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf)
|
||||
sector += byte_offset >> log2blksz;
|
||||
byte_offset &= ext4fs_block_dev_desc->blksz - 1;
|
||||
|
||||
debug(" <%d, %d, %d>\n", sector, byte_offset, byte_len);
|
||||
debug(" <" LBAFU ", %d, %d>\n", sector, byte_offset, byte_len);
|
||||
|
||||
if (byte_offset != 0) {
|
||||
/* read first part which isn't aligned with start of sector */
|
||||
|
||||
@@ -84,7 +84,7 @@ void put_ext4(uint64_t off, void *buf, uint32_t size)
|
||||
|
||||
if ((startblock + (size >> log2blksz)) >
|
||||
(part_offset + fs->total_sect)) {
|
||||
printf("part_offset is %lu\n", part_offset);
|
||||
printf("part_offset is " LBAFU "\n", part_offset);
|
||||
printf("total_sector is %llu\n", fs->total_sect);
|
||||
printf("error: overflow occurs\n");
|
||||
return;
|
||||
@@ -405,7 +405,7 @@ restart:
|
||||
previous_blknr = root_blknr;
|
||||
}
|
||||
|
||||
status = ext4fs_devread(first_block_no_of_root
|
||||
status = ext4fs_devread((lbaint_t)first_block_no_of_root
|
||||
* fs->sect_perblk,
|
||||
0, fs->blksz, root_first_block_buffer);
|
||||
if (status == 0)
|
||||
@@ -545,7 +545,7 @@ static int search_dir(struct ext2_inode *parent_inode, char *dirname)
|
||||
if (!block_buffer)
|
||||
goto fail;
|
||||
|
||||
status = ext4fs_devread(blknr * fs->sect_perblk,
|
||||
status = ext4fs_devread((lbaint_t)blknr * fs->sect_perblk,
|
||||
0, fs->blksz, (char *)block_buffer);
|
||||
if (status == 0)
|
||||
goto fail;
|
||||
@@ -783,7 +783,7 @@ static int check_filename(char *filename, unsigned int blknr)
|
||||
if (!root_first_block_buffer)
|
||||
return -ENOMEM;
|
||||
root_first_block_addr = root_first_block_buffer;
|
||||
status = ext4fs_devread(first_block_no_of_root *
|
||||
status = ext4fs_devread((lbaint_t)first_block_no_of_root *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz, root_first_block_buffer);
|
||||
if (status == 0)
|
||||
@@ -895,7 +895,8 @@ long int ext4fs_get_new_blk_no(void)
|
||||
fs->first_pass_bbmap++;
|
||||
bgd[i].free_blocks--;
|
||||
fs->sb->free_blocks--;
|
||||
status = ext4fs_devread(bgd[i].block_id *
|
||||
status = ext4fs_devread((lbaint_t)
|
||||
bgd[i].block_id *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz,
|
||||
journal_buffer);
|
||||
@@ -957,7 +958,7 @@ restart:
|
||||
/* journal backup */
|
||||
if (prev_bg_bitmap_index != bg_idx) {
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status = ext4fs_devread(bgd[bg_idx].block_id
|
||||
status = ext4fs_devread((lbaint_t)bgd[bg_idx].block_id
|
||||
* fs->sect_perblk,
|
||||
0, fs->blksz, journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -1026,7 +1027,8 @@ int ext4fs_get_new_inode_no(void)
|
||||
bgd[i].free_inodes--;
|
||||
bgd[i].bg_itable_unused--;
|
||||
fs->sb->free_inodes--;
|
||||
status = ext4fs_devread(bgd[i].inode_id *
|
||||
status = ext4fs_devread((lbaint_t)
|
||||
bgd[i].inode_id *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz,
|
||||
journal_buffer);
|
||||
@@ -1067,7 +1069,8 @@ restart:
|
||||
/* journal backup */
|
||||
if (prev_inode_bitmap_index != ibmap_idx) {
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status = ext4fs_devread(bgd[ibmap_idx].inode_id
|
||||
status = ext4fs_devread((lbaint_t)
|
||||
bgd[ibmap_idx].inode_id
|
||||
* fs->sect_perblk,
|
||||
0, fs->blksz, journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -1129,7 +1132,7 @@ static void alloc_single_indirect_block(struct ext2_inode *file_inode,
|
||||
(*no_blks_reqd)++;
|
||||
debug("SIPB %ld: %u\n", si_blockno, *total_remaining_blocks);
|
||||
|
||||
status = ext4fs_devread(si_blockno * fs->sect_perblk,
|
||||
status = ext4fs_devread((lbaint_t)si_blockno * fs->sect_perblk,
|
||||
0, fs->blksz, (char *)si_buffer);
|
||||
memset(si_buffer, '\0', fs->blksz);
|
||||
if (status == 0)
|
||||
@@ -1193,7 +1196,7 @@ static void alloc_double_indirect_block(struct ext2_inode *file_inode,
|
||||
debug("DIPB %ld: %u\n", di_blockno_parent,
|
||||
*total_remaining_blocks);
|
||||
|
||||
status = ext4fs_devread(di_blockno_parent *
|
||||
status = ext4fs_devread((lbaint_t)di_blockno_parent *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz, (char *)di_parent_buffer);
|
||||
|
||||
@@ -1224,7 +1227,7 @@ static void alloc_double_indirect_block(struct ext2_inode *file_inode,
|
||||
debug("DICB %ld: %u\n", di_blockno_child,
|
||||
*total_remaining_blocks);
|
||||
|
||||
status = ext4fs_devread(di_blockno_child *
|
||||
status = ext4fs_devread((lbaint_t)di_blockno_child *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz,
|
||||
(char *)di_child_buff);
|
||||
@@ -1429,7 +1432,7 @@ static struct ext4_extent_header *ext4fs_get_extent_block
|
||||
while (1) {
|
||||
index = (struct ext4_extent_idx *)(ext_block + 1);
|
||||
|
||||
if (le32_to_cpu(ext_block->eh_magic) != EXT4_EXT_MAGIC)
|
||||
if (le16_to_cpu(ext_block->eh_magic) != EXT4_EXT_MAGIC)
|
||||
return 0;
|
||||
|
||||
if (ext_block->eh_depth == 0)
|
||||
@@ -1437,17 +1440,18 @@ static struct ext4_extent_header *ext4fs_get_extent_block
|
||||
i = -1;
|
||||
do {
|
||||
i++;
|
||||
if (i >= le32_to_cpu(ext_block->eh_entries))
|
||||
if (i >= le16_to_cpu(ext_block->eh_entries))
|
||||
break;
|
||||
} while (fileblock > le32_to_cpu(index[i].ei_block));
|
||||
|
||||
if (--i < 0)
|
||||
return 0;
|
||||
|
||||
block = le32_to_cpu(index[i].ei_leaf_hi);
|
||||
block = le16_to_cpu(index[i].ei_leaf_hi);
|
||||
block = (block << 32) + le32_to_cpu(index[i].ei_leaf_lo);
|
||||
|
||||
if (ext4fs_devread(block << log2_blksz, 0, fs->blksz, buf))
|
||||
if (ext4fs_devread((lbaint_t)block << log2_blksz, 0, fs->blksz,
|
||||
buf))
|
||||
ext_block = (struct ext4_extent_header *)buf;
|
||||
else
|
||||
return 0;
|
||||
@@ -1470,7 +1474,8 @@ static int ext4fs_blockgroup
|
||||
debug("ext4fs read %d group descriptor (blkno %ld blkoff %u)\n",
|
||||
group, blkno, blkoff);
|
||||
|
||||
return ext4fs_devread(blkno << (LOG2_BLOCK_SIZE(data) - log2blksz),
|
||||
return ext4fs_devread((lbaint_t)blkno <<
|
||||
(LOG2_BLOCK_SIZE(data) - log2blksz),
|
||||
blkoff, sizeof(struct ext2_block_group),
|
||||
(char *)blkgrp);
|
||||
}
|
||||
@@ -1497,8 +1502,8 @@ int ext4fs_read_inode(struct ext2_data *data, int ino, struct ext2_inode *inode)
|
||||
(ino % __le32_to_cpu(sblock->inodes_per_group)) / inodes_per_block;
|
||||
blkoff = (ino % inodes_per_block) * fs->inodesz;
|
||||
/* Read the inode. */
|
||||
status = ext4fs_devread(blkno << (LOG2_BLOCK_SIZE(data) - log2blksz),
|
||||
blkoff,
|
||||
status = ext4fs_devread((lbaint_t)blkno << (LOG2_BLOCK_SIZE(data) -
|
||||
log2blksz), blkoff,
|
||||
sizeof(struct ext2_inode), (char *)inode);
|
||||
if (status == 0)
|
||||
return 0;
|
||||
@@ -1543,17 +1548,17 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
|
||||
do {
|
||||
i++;
|
||||
if (i >= le32_to_cpu(ext_block->eh_entries))
|
||||
if (i >= le16_to_cpu(ext_block->eh_entries))
|
||||
break;
|
||||
} while (fileblock >= le32_to_cpu(extent[i].ee_block));
|
||||
if (--i >= 0) {
|
||||
fileblock -= le32_to_cpu(extent[i].ee_block);
|
||||
if (fileblock >= le32_to_cpu(extent[i].ee_len)) {
|
||||
if (fileblock >= le16_to_cpu(extent[i].ee_len)) {
|
||||
free(buf);
|
||||
return 0;
|
||||
}
|
||||
|
||||
start = le32_to_cpu(extent[i].ee_start_hi);
|
||||
start = le16_to_cpu(extent[i].ee_start_hi);
|
||||
start = (start << 32) +
|
||||
le32_to_cpu(extent[i].ee_start_lo);
|
||||
free(buf);
|
||||
@@ -1597,7 +1602,7 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
if ((__le32_to_cpu(inode->b.blocks.indir_block) <<
|
||||
log2_blksz) != ext4fs_indir1_blkno) {
|
||||
status =
|
||||
ext4fs_devread(__le32_to_cpu
|
||||
ext4fs_devread((lbaint_t)__le32_to_cpu
|
||||
(inode->b.blocks.
|
||||
indir_block) << log2_blksz, 0,
|
||||
blksz, (char *)ext4fs_indir1_block);
|
||||
@@ -1646,7 +1651,7 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
if ((__le32_to_cpu(inode->b.blocks.double_indir_block) <<
|
||||
log2_blksz) != ext4fs_indir1_blkno) {
|
||||
status =
|
||||
ext4fs_devread(__le32_to_cpu
|
||||
ext4fs_devread((lbaint_t)__le32_to_cpu
|
||||
(inode->b.blocks.
|
||||
double_indir_block) << log2_blksz,
|
||||
0, blksz,
|
||||
@@ -1686,7 +1691,7 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
}
|
||||
if ((__le32_to_cpu(ext4fs_indir1_block[rblock / perblock]) <<
|
||||
log2_blksz) != ext4fs_indir2_blkno) {
|
||||
status = ext4fs_devread(__le32_to_cpu
|
||||
status = ext4fs_devread((lbaint_t)__le32_to_cpu
|
||||
(ext4fs_indir1_block
|
||||
[rblock /
|
||||
perblock]) << log2_blksz, 0,
|
||||
@@ -1738,7 +1743,8 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
if ((__le32_to_cpu(inode->b.blocks.triple_indir_block) <<
|
||||
log2_blksz) != ext4fs_indir1_blkno) {
|
||||
status = ext4fs_devread
|
||||
(__le32_to_cpu(inode->b.blocks.triple_indir_block)
|
||||
((lbaint_t)
|
||||
__le32_to_cpu(inode->b.blocks.triple_indir_block)
|
||||
<< log2_blksz, 0, blksz,
|
||||
(char *)ext4fs_indir1_block);
|
||||
if (status == 0) {
|
||||
@@ -1778,7 +1784,7 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
perblock_parent]) <<
|
||||
log2_blksz)
|
||||
!= ext4fs_indir2_blkno) {
|
||||
status = ext4fs_devread(__le32_to_cpu
|
||||
status = ext4fs_devread((lbaint_t)__le32_to_cpu
|
||||
(ext4fs_indir1_block
|
||||
[rblock /
|
||||
perblock_parent]) <<
|
||||
@@ -1823,7 +1829,7 @@ long int read_allocated_block(struct ext2_inode *inode, int fileblock)
|
||||
perblock_child]) <<
|
||||
log2_blksz) != ext4fs_indir3_blkno) {
|
||||
status =
|
||||
ext4fs_devread(__le32_to_cpu
|
||||
ext4fs_devread((lbaint_t)__le32_to_cpu
|
||||
(ext4fs_indir2_block
|
||||
[(rblock / perblock_child)
|
||||
% (blksz / 4)]) << log2_blksz, 0,
|
||||
|
||||
@@ -360,7 +360,8 @@ void recover_transaction(int prev_desc_logical_no)
|
||||
(struct ext2_inode *)&inode_journal);
|
||||
blknr = read_allocated_block((struct ext2_inode *)
|
||||
&inode_journal, i);
|
||||
ext4fs_devread(blknr * fs->sect_perblk, 0, fs->blksz, temp_buff);
|
||||
ext4fs_devread((lbaint_t)blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
temp_buff);
|
||||
p_jdb = (char *)temp_buff;
|
||||
jdb = (struct journal_header_t *) temp_buff;
|
||||
ofs = sizeof(struct journal_header_t);
|
||||
@@ -384,7 +385,7 @@ void recover_transaction(int prev_desc_logical_no)
|
||||
continue;
|
||||
}
|
||||
blknr = read_allocated_block(&inode_journal, i);
|
||||
ext4fs_devread(blknr * fs->sect_perblk, 0,
|
||||
ext4fs_devread((lbaint_t)blknr * fs->sect_perblk, 0,
|
||||
fs->blksz, metadata_buff);
|
||||
put_ext4((uint64_t)(be32_to_cpu(tag->block) * fs->blksz),
|
||||
metadata_buff, (uint32_t) fs->blksz);
|
||||
@@ -431,7 +432,8 @@ int ext4fs_check_journal_state(int recovery_flag)
|
||||
|
||||
ext4fs_read_inode(ext4fs_root, EXT2_JOURNAL_INO, &inode_journal);
|
||||
blknr = read_allocated_block(&inode_journal, EXT2_JOURNAL_SUPERBLOCK);
|
||||
ext4fs_devread(blknr * fs->sect_perblk, 0, fs->blksz, temp_buff);
|
||||
ext4fs_devread((lbaint_t)blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
temp_buff);
|
||||
jsb = (struct journal_superblock_t *) temp_buff;
|
||||
|
||||
if (fs->sb->feature_incompat & EXT3_FEATURE_INCOMPAT_RECOVER) {
|
||||
@@ -455,7 +457,7 @@ int ext4fs_check_journal_state(int recovery_flag)
|
||||
while (1) {
|
||||
blknr = read_allocated_block(&inode_journal, i);
|
||||
memset(temp_buff1, '\0', fs->blksz);
|
||||
ext4fs_devread(blknr * fs->sect_perblk,
|
||||
ext4fs_devread((lbaint_t)blknr * fs->sect_perblk,
|
||||
0, fs->blksz, temp_buff1);
|
||||
jdb = (struct journal_header_t *) temp_buff1;
|
||||
|
||||
@@ -574,7 +576,8 @@ static void update_descriptor_block(long int blknr)
|
||||
ext4fs_read_inode(ext4fs_root, EXT2_JOURNAL_INO, &inode_journal);
|
||||
jsb_blknr = read_allocated_block(&inode_journal,
|
||||
EXT2_JOURNAL_SUPERBLOCK);
|
||||
ext4fs_devread(jsb_blknr * fs->sect_perblk, 0, fs->blksz, temp_buff);
|
||||
ext4fs_devread((lbaint_t)jsb_blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
temp_buff);
|
||||
jsb = (struct journal_superblock_t *) temp_buff;
|
||||
|
||||
jdb.h_blocktype = cpu_to_be32(EXT3_JOURNAL_DESCRIPTOR_BLOCK);
|
||||
@@ -621,10 +624,12 @@ static void update_commit_block(long int blknr)
|
||||
if (!temp_buff)
|
||||
return;
|
||||
|
||||
ext4fs_read_inode(ext4fs_root, EXT2_JOURNAL_INO, &inode_journal);
|
||||
ext4fs_read_inode(ext4fs_root, EXT2_JOURNAL_INO,
|
||||
&inode_journal);
|
||||
jsb_blknr = read_allocated_block(&inode_journal,
|
||||
EXT2_JOURNAL_SUPERBLOCK);
|
||||
ext4fs_devread(jsb_blknr * fs->sect_perblk, 0, fs->blksz, temp_buff);
|
||||
ext4fs_devread((lbaint_t)jsb_blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
temp_buff);
|
||||
jsb = (struct journal_superblock_t *) temp_buff;
|
||||
|
||||
jdb.h_blocktype = cpu_to_be32(EXT3_JOURNAL_COMMIT_BLOCK);
|
||||
|
||||
@@ -88,8 +88,8 @@ int ext4fs_get_bgdtable(void)
|
||||
if (!fs->gdtable)
|
||||
return -ENOMEM;
|
||||
/* read the group descriptor table */
|
||||
status = ext4fs_devread(fs->gdtable_blkno * fs->sect_perblk, 0,
|
||||
fs->blksz * fs->no_blk_pergdt, fs->gdtable);
|
||||
status = ext4fs_devread((lbaint_t)fs->gdtable_blkno * fs->sect_perblk,
|
||||
0, fs->blksz * fs->no_blk_pergdt, fs->gdtable);
|
||||
if (status == 0)
|
||||
goto fail;
|
||||
|
||||
@@ -142,7 +142,7 @@ static void delete_single_indirect_block(struct ext2_inode *inode)
|
||||
/* journal backup */
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
status =
|
||||
ext4fs_devread(bgd[bg_idx].block_id *
|
||||
ext4fs_devread((lbaint_t)bgd[bg_idx].block_id *
|
||||
fs->sect_perblk, 0, fs->blksz,
|
||||
journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -186,8 +186,8 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
|
||||
}
|
||||
DIB_start_addr = (unsigned int *)di_buffer;
|
||||
blknr = inode->b.blocks.double_indir_block;
|
||||
status = ext4fs_devread(blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
(char *)di_buffer);
|
||||
status = ext4fs_devread((lbaint_t)blknr * fs->sect_perblk, 0,
|
||||
fs->blksz, (char *)di_buffer);
|
||||
for (i = 0; i < fs->blksz / sizeof(int); i++) {
|
||||
if (*di_buffer == 0)
|
||||
break;
|
||||
@@ -208,7 +208,8 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
|
||||
fs->sb->free_blocks++;
|
||||
/* journal backup */
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
status = ext4fs_devread(bgd[bg_idx].block_id
|
||||
status = ext4fs_devread((lbaint_t)
|
||||
bgd[bg_idx].block_id
|
||||
* fs->sect_perblk, 0,
|
||||
fs->blksz,
|
||||
journal_buffer);
|
||||
@@ -238,7 +239,7 @@ static void delete_double_indirect_block(struct ext2_inode *inode)
|
||||
/* journal backup */
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status = ext4fs_devread(bgd[bg_idx].block_id *
|
||||
status = ext4fs_devread((lbaint_t)bgd[bg_idx].block_id *
|
||||
fs->sect_perblk, 0, fs->blksz,
|
||||
journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -287,8 +288,8 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
|
||||
}
|
||||
tib_start_addr = (unsigned int *)tigp_buffer;
|
||||
blknr = inode->b.blocks.triple_indir_block;
|
||||
status = ext4fs_devread(blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
(char *)tigp_buffer);
|
||||
status = ext4fs_devread((lbaint_t)blknr * fs->sect_perblk, 0,
|
||||
fs->blksz, (char *)tigp_buffer);
|
||||
for (i = 0; i < fs->blksz / sizeof(int); i++) {
|
||||
if (*tigp_buffer == 0)
|
||||
break;
|
||||
@@ -298,7 +299,7 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
|
||||
if (!tip_buffer)
|
||||
goto fail;
|
||||
tipb_start_addr = (unsigned int *)tip_buffer;
|
||||
status = ext4fs_devread((*tigp_buffer) *
|
||||
status = ext4fs_devread((lbaint_t)(*tigp_buffer) *
|
||||
fs->sect_perblk, 0, fs->blksz,
|
||||
(char *)tip_buffer);
|
||||
for (j = 0; j < fs->blksz / sizeof(int); j++) {
|
||||
@@ -325,6 +326,7 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
status =
|
||||
ext4fs_devread(
|
||||
(lbaint_t)
|
||||
bgd[bg_idx].block_id *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz,
|
||||
@@ -365,7 +367,8 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status =
|
||||
ext4fs_devread(bgd[bg_idx].block_id *
|
||||
ext4fs_devread((lbaint_t)
|
||||
bgd[bg_idx].block_id *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz, journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -394,7 +397,7 @@ static void delete_triple_indirect_block(struct ext2_inode *inode)
|
||||
/* journal backup */
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status = ext4fs_devread(bgd[bg_idx].block_id *
|
||||
status = ext4fs_devread((lbaint_t)bgd[bg_idx].block_id *
|
||||
fs->sect_perblk, 0, fs->blksz,
|
||||
journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -480,7 +483,8 @@ static int ext4fs_delete_file(int inodeno)
|
||||
/* journal backup */
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
status =
|
||||
ext4fs_devread(bgd[bg_idx].block_id *
|
||||
ext4fs_devread((lbaint_t)
|
||||
bgd[bg_idx].block_id *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz, journal_buffer);
|
||||
if (status == 0)
|
||||
@@ -524,7 +528,8 @@ static int ext4fs_delete_file(int inodeno)
|
||||
/* journal backup */
|
||||
if (prev_bg_bmap_idx != bg_idx) {
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status = ext4fs_devread(bgd[bg_idx].block_id
|
||||
status = ext4fs_devread((lbaint_t)
|
||||
bgd[bg_idx].block_id
|
||||
* fs->sect_perblk,
|
||||
0, fs->blksz,
|
||||
journal_buffer);
|
||||
@@ -555,7 +560,7 @@ static int ext4fs_delete_file(int inodeno)
|
||||
if (!read_buffer)
|
||||
goto fail;
|
||||
start_block_address = read_buffer;
|
||||
status = ext4fs_devread(blkno * fs->sect_perblk,
|
||||
status = ext4fs_devread((lbaint_t)blkno * fs->sect_perblk,
|
||||
0, fs->blksz, read_buffer);
|
||||
if (status == 0)
|
||||
goto fail;
|
||||
@@ -578,7 +583,7 @@ static int ext4fs_delete_file(int inodeno)
|
||||
fs->sb->free_inodes++;
|
||||
/* journal backup */
|
||||
memset(journal_buffer, '\0', fs->blksz);
|
||||
status = ext4fs_devread(bgd[ibmap_idx].inode_id *
|
||||
status = ext4fs_devread((lbaint_t)bgd[ibmap_idx].inode_id *
|
||||
fs->sect_perblk, 0, fs->blksz, journal_buffer);
|
||||
if (status == 0)
|
||||
goto fail;
|
||||
@@ -653,7 +658,8 @@ int ext4fs_init(void)
|
||||
|
||||
for (i = 0; i < fs->no_blkgrp; i++) {
|
||||
status =
|
||||
ext4fs_devread(fs->bgd[i].block_id * fs->sect_perblk, 0,
|
||||
ext4fs_devread((lbaint_t)fs->bgd[i].block_id *
|
||||
fs->sect_perblk, 0,
|
||||
fs->blksz, (char *)fs->blk_bmaps[i]);
|
||||
if (status == 0)
|
||||
goto fail;
|
||||
@@ -670,7 +676,8 @@ int ext4fs_init(void)
|
||||
}
|
||||
|
||||
for (i = 0; i < fs->no_blkgrp; i++) {
|
||||
status = ext4fs_devread(fs->bgd[i].inode_id * fs->sect_perblk,
|
||||
status = ext4fs_devread((lbaint_t)fs->bgd[i].inode_id *
|
||||
fs->sect_perblk,
|
||||
0, fs->blksz,
|
||||
(char *)fs->inode_bmaps[i]);
|
||||
if (status == 0)
|
||||
@@ -710,7 +717,7 @@ void ext4fs_deinit(void)
|
||||
&inode_journal);
|
||||
blknr = read_allocated_block(&inode_journal,
|
||||
EXT2_JOURNAL_SUPERBLOCK);
|
||||
ext4fs_devread(blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
ext4fs_devread((lbaint_t)blknr * fs->sect_perblk, 0, fs->blksz,
|
||||
temp_buff);
|
||||
jsb = (struct journal_superblock_t *)temp_buff;
|
||||
jsb->s_start = cpu_to_be32(0);
|
||||
@@ -934,7 +941,8 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
|
||||
(inodeno % __le32_to_cpu(sblock->inodes_per_group)) /
|
||||
inodes_per_block;
|
||||
blkoff = (inodeno % inodes_per_block) * fs->inodesz;
|
||||
ext4fs_devread(itable_blkno * fs->sect_perblk, 0, fs->blksz, temp_ptr);
|
||||
ext4fs_devread((lbaint_t)itable_blkno * fs->sect_perblk, 0, fs->blksz,
|
||||
temp_ptr);
|
||||
if (ext4fs_log_journal(temp_ptr, itable_blkno))
|
||||
goto fail;
|
||||
|
||||
@@ -954,7 +962,7 @@ int ext4fs_write(const char *fname, unsigned char *buffer,
|
||||
blkoff = (parent_inodeno % inodes_per_block) * fs->inodesz;
|
||||
if (parent_itable_blkno != itable_blkno) {
|
||||
memset(temp_ptr, '\0', fs->blksz);
|
||||
ext4fs_devread(parent_itable_blkno * fs->sect_perblk,
|
||||
ext4fs_devread((lbaint_t)parent_itable_blkno * fs->sect_perblk,
|
||||
0, fs->blksz, temp_ptr);
|
||||
if (ext4fs_log_journal(temp_ptr, parent_itable_blkno))
|
||||
goto fail;
|
||||
|
||||
@@ -62,16 +62,16 @@ int ext4fs_read_file(struct ext2fs_node *node, int pos,
|
||||
{
|
||||
struct ext_filesystem *fs = get_fs();
|
||||
int i;
|
||||
int blockcnt;
|
||||
lbaint_t blockcnt;
|
||||
int log2blksz = fs->dev_desc->log2blksz;
|
||||
int log2_fs_blocksize = LOG2_BLOCK_SIZE(node->data) - log2blksz;
|
||||
int blocksize = (1 << (log2_fs_blocksize + log2blksz));
|
||||
unsigned int filesize = __le32_to_cpu(node->inode.size);
|
||||
int previous_block_number = -1;
|
||||
int delayed_start = 0;
|
||||
int delayed_extent = 0;
|
||||
int delayed_skipfirst = 0;
|
||||
int delayed_next = 0;
|
||||
lbaint_t previous_block_number = -1;
|
||||
lbaint_t delayed_start = 0;
|
||||
lbaint_t delayed_extent = 0;
|
||||
lbaint_t delayed_skipfirst = 0;
|
||||
lbaint_t delayed_next = 0;
|
||||
char *delayed_buf = NULL;
|
||||
short status;
|
||||
|
||||
@@ -82,7 +82,7 @@ int ext4fs_read_file(struct ext2fs_node *node, int pos,
|
||||
blockcnt = ((len + pos) + blocksize - 1) / blocksize;
|
||||
|
||||
for (i = pos / blocksize; i < blockcnt; i++) {
|
||||
int blknr;
|
||||
lbaint_t blknr;
|
||||
int blockoff = pos % blocksize;
|
||||
int blockend = blocksize;
|
||||
int skipfirst = 0;
|
||||
|
||||
522
include/configs/controlcenterd.h
Normal file
522
include/configs/controlcenterd.h
Normal file
@@ -0,0 +1,522 @@
|
||||
/*
|
||||
* (C) Copyright 2013
|
||||
* Dirk Eibach, Guntermann & Drunck GmbH, dirk.eibach@gdsys.cc
|
||||
*
|
||||
* based on P1022DS.h
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of
|
||||
* the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
||||
* MA 02111-1307 USA
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_H
|
||||
#define __CONFIG_H
|
||||
|
||||
#ifdef CONFIG_36BIT
|
||||
#define CONFIG_PHYS_64BIT
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SDCARD
|
||||
#define CONFIG_RAMBOOT_SDCARD
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_SPIFLASH
|
||||
#define CONFIG_RAMBOOT_SPIFLASH
|
||||
#endif
|
||||
|
||||
/* High Level Configuration Options */
|
||||
#define CONFIG_BOOKE /* BOOKE */
|
||||
#define CONFIG_E500 /* BOOKE e500 family */
|
||||
#define CONFIG_MPC85xx /* MPC8540/60/55/41/48 */
|
||||
#define CONFIG_P1022
|
||||
#define CONFIG_CONTROLCENTERD
|
||||
#define CONFIG_MP /* support multiple processors */
|
||||
|
||||
#define CONFIG_SYS_NO_FLASH
|
||||
#define CONFIG_ENABLE_36BIT_PHYS
|
||||
#define CONFIG_FSL_LAW /* Use common FSL init code */
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
#define CONFIG_IDENT_STRING " controlcenterd trailblazer 0.01"
|
||||
#else
|
||||
#define CONFIG_IDENT_STRING " controlcenterd 0.01"
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
#define CONFIG_ADDR_MAP
|
||||
#define CONFIG_SYS_NUM_ADDR_MAP 16 /* number of TLB1 entries */
|
||||
#endif
|
||||
|
||||
#define CONFIG_L2_CACHE
|
||||
#define CONFIG_BTB
|
||||
|
||||
#define CONFIG_SYS_CLK_FREQ 66666600
|
||||
#define CONFIG_DDR_CLK_FREQ 66666600
|
||||
|
||||
#define CONFIG_SYS_RAMBOOT
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
|
||||
#define CONFIG_SYS_TEXT_BASE 0xf8fc0000
|
||||
#define CONFIG_RESET_VECTOR_ADDRESS 0xf8fffffc
|
||||
#define CONFIG_SYS_MONITOR_LEN (256 * 1024)
|
||||
|
||||
/*
|
||||
* Config the L2 Cache
|
||||
*/
|
||||
#define CONFIG_SYS_INIT_L2_ADDR 0xf8fc0000
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
#define CONFIG_SYS_INIT_L2_ADDR_PHYS 0xff8fc0000ull
|
||||
#else
|
||||
#define CONFIG_SYS_INIT_L2_ADDR_PHYS CONFIG_SYS_INIT_L2_ADDR
|
||||
#endif
|
||||
#define CONFIG_SYS_L2_SIZE (256 << 10)
|
||||
#define CONFIG_SYS_INIT_L2_END (CONFIG_SYS_INIT_L2_ADDR + CONFIG_SYS_L2_SIZE)
|
||||
|
||||
#else /* CONFIG_TRAILBLAZER */
|
||||
|
||||
#define CONFIG_SYS_TEXT_BASE 0x11000000
|
||||
#define CONFIG_RESET_VECTOR_ADDRESS 0x1107fffc
|
||||
#define CONFIG_SYS_MONITOR_LEN (512 * 1024)
|
||||
|
||||
#endif /* CONFIG_TRAILBLAZER */
|
||||
|
||||
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
|
||||
#define CONFIG_SYS_MALLOC_LEN (10 * 1024 * 1024)
|
||||
|
||||
|
||||
/*
|
||||
* Memory map
|
||||
*
|
||||
* 0x0000_0000 0x3fff_ffff DDR 1G Cacheable
|
||||
* 0xc000_0000 0xdfff_ffff PCI Express Mem 512M non-cacheable
|
||||
* 0xffc0_0000 0xffc2_ffff PCI IO range 192K non-cacheable
|
||||
*
|
||||
* Localbus non-cacheable
|
||||
* 0xe000_0000 0xe00f_ffff eLBC 1M non-cacheable
|
||||
* 0xf8fc0000 0xf8ff_ffff L2 SRAM 256k Cacheable
|
||||
* 0xffd0_0000 0xffd0_3fff L1 for stack 16K Cacheable TLB0
|
||||
* 0xffe0_0000 0xffef_ffff CCSR 1M non-cacheable
|
||||
*/
|
||||
|
||||
#define CONFIG_SYS_INIT_RAM_LOCK
|
||||
#define CONFIG_SYS_INIT_RAM_ADDR 0xffd00000 /* Initial L1 address */
|
||||
#define CONFIG_SYS_INIT_RAM_SIZE 0x00004000 /* used area in RAM */
|
||||
#define CONFIG_SYS_GBL_DATA_OFFSET \
|
||||
(CONFIG_SYS_INIT_RAM_SIZE - GENERATED_GBL_DATA_SIZE)
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET CONFIG_SYS_GBL_DATA_OFFSET
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
/* leave CCSRBAR at default, because u-boot expects it to be exactly there */
|
||||
#define CONFIG_SYS_CCSRBAR CONFIG_SYS_CCSRBAR_DEFAULT
|
||||
#else
|
||||
#define CONFIG_SYS_CCSRBAR 0xffe00000
|
||||
#endif
|
||||
#define CONFIG_SYS_CCSRBAR_PHYS_LOW CONFIG_SYS_CCSRBAR
|
||||
#define CONFIG_SYS_MPC85xx_GPIO3_ADDR (CONFIG_SYS_CCSRBAR+0xf200)
|
||||
|
||||
/*
|
||||
* DDR Setup
|
||||
*/
|
||||
|
||||
#define CONFIG_SYS_DDR_SDRAM_BASE 0x00000000
|
||||
#define CONFIG_SYS_SDRAM_BASE CONFIG_SYS_DDR_SDRAM_BASE
|
||||
#define CONFIG_SYS_SDRAM_SIZE 1024
|
||||
#define CONFIG_VERY_BIG_RAM
|
||||
|
||||
#define CONFIG_FSL_DDR3
|
||||
#define CONFIG_NUM_DDR_CONTROLLERS 1
|
||||
#define CONFIG_DIMM_SLOTS_PER_CTLR 1
|
||||
#define CONFIG_CHIP_SELECTS_PER_CTRL (2 * CONFIG_DIMM_SLOTS_PER_CTLR)
|
||||
|
||||
#define CONFIG_SYS_MEMTEST_START 0x00000000
|
||||
#define CONFIG_SYS_MEMTEST_END 0x3fffffff
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
#define CONFIG_SPD_EEPROM
|
||||
#define SPD_EEPROM_ADDRESS 0x52
|
||||
/*#define CONFIG_FSL_DDR_INTERACTIVE*/
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Local Bus Definitions
|
||||
*/
|
||||
#define CONFIG_FSL_ELBC /* Has Enhanced localbus controller */
|
||||
|
||||
#define CONFIG_SYS_ELBC_BASE 0xe0000000
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
#define CONFIG_SYS_ELBC_BASE_PHYS 0xfe0000000ull
|
||||
#else
|
||||
#define CONFIG_SYS_ELBC_BASE_PHYS CONFIG_SYS_ELBC_BASE
|
||||
#endif
|
||||
|
||||
#define CONFIG_UART_BR_PRELIM \
|
||||
(BR_PHYS_ADDR((CONFIG_SYS_ELBC_BASE_PHYS)) | BR_PS_8 | BR_V)
|
||||
#define CONFIG_UART_OR_PRELIM (OR_AM_32KB | 0xff7)
|
||||
|
||||
#define CONFIG_SYS_BR0_PRELIM 0 /* CS0 was originally intended for FPGA */
|
||||
#define CONFIG_SYS_OR0_PRELIM 0 /* debugging, was never used */
|
||||
|
||||
#define CONFIG_SYS_BR1_PRELIM CONFIG_UART_BR_PRELIM
|
||||
#define CONFIG_SYS_OR1_PRELIM CONFIG_UART_OR_PRELIM
|
||||
|
||||
/*
|
||||
* Serial Port
|
||||
*/
|
||||
#define CONFIG_CONS_INDEX 2
|
||||
#define CONFIG_SYS_NS16550
|
||||
#define CONFIG_SYS_NS16550_SERIAL
|
||||
#define CONFIG_SYS_NS16550_REG_SIZE 1
|
||||
#define CONFIG_SYS_NS16550_CLK get_bus_freq(0)
|
||||
|
||||
#define CONFIG_SYS_BAUDRATE_TABLE \
|
||||
{300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200}
|
||||
|
||||
#define CONFIG_SYS_NS16550_COM1 (CONFIG_SYS_CCSRBAR+0x4500)
|
||||
#define CONFIG_SYS_NS16550_COM2 (CONFIG_SYS_CCSRBAR+0x4600)
|
||||
|
||||
/*
|
||||
* I2C
|
||||
*/
|
||||
#define CONFIG_HARD_I2C
|
||||
#define CONFIG_I2C_MULTI_BUS
|
||||
#define CONFIG_CMD_I2C
|
||||
|
||||
#define CONFIG_FSL_I2C
|
||||
#define CONFIG_SYS_I2C_OFFSET 0x3000
|
||||
#define CONFIG_SYS_I2C2_OFFSET 0x3100
|
||||
#define CONFIG_SYS_I2C_SPEED 400000
|
||||
#define CONFIG_SYS_I2C_SLAVE 0x7F
|
||||
/* Probing DP501 I2C-Bridge will hang */
|
||||
#define CONFIG_SYS_I2C_NOPROBES { {0, 0x30}, {0, 0x37}, {0, 0x3a}, \
|
||||
{0, 0x3b}, {0, 0x50} }
|
||||
|
||||
#define CONFIG_PCA9698 /* NXP PCA9698 */
|
||||
|
||||
#define CONFIG_CMD_EEPROM
|
||||
#define CONFIG_SYS_I2C_EEPROM_ADDR 0x52
|
||||
#define CONFIG_SYS_I2C_EEPROM_ADDR_LEN 2
|
||||
|
||||
#ifndef CONFIG_TRAILBLAZER
|
||||
/*
|
||||
* eSPI - Enhanced SPI
|
||||
*/
|
||||
#define CONFIG_HARD_SPI
|
||||
#define CONFIG_FSL_ESPI
|
||||
|
||||
#define CONFIG_SPI_FLASH
|
||||
#define CONFIG_SPI_FLASH_STMICRO
|
||||
|
||||
#define CONFIG_CMD_SF
|
||||
#define CONFIG_SF_DEFAULT_SPEED 10000000
|
||||
#define CONFIG_SF_DEFAULT_MODE 0
|
||||
#endif
|
||||
|
||||
/*
|
||||
* TPM
|
||||
*/
|
||||
#define CONFIG_TPM_ATMEL_TWI
|
||||
#define CONFIG_TPM
|
||||
#define CONFIG_TPM_AUTH_SESSIONS
|
||||
#define CONFIG_SHA1
|
||||
#define CONFIG_CMD_TPM
|
||||
|
||||
/*
|
||||
* MMC
|
||||
*/
|
||||
#define CONFIG_MMC
|
||||
#define CONFIG_GENERIC_MMC
|
||||
#define CONFIG_CMD_MMC
|
||||
|
||||
#define CONFIG_FSL_ESDHC
|
||||
#define CONFIG_SYS_FSL_ESDHC_ADDR CONFIG_SYS_MPC85xx_ESDHC_ADDR
|
||||
|
||||
|
||||
#ifndef CONFIG_TRAILBLAZER
|
||||
|
||||
/*
|
||||
* Video
|
||||
*/
|
||||
#define CONFIG_FSL_DIU_FB
|
||||
#define CONFIG_SYS_DIU_ADDR (CONFIG_SYS_CCSRBAR + 0x10000)
|
||||
#define CONFIG_VIDEO
|
||||
#define CONFIG_CFB_CONSOLE
|
||||
#define CONFIG_VGA_AS_SINGLE_DEVICE
|
||||
#define CONFIG_CMD_BMP
|
||||
|
||||
/*
|
||||
* General PCI
|
||||
* Memory space is mapped 1-1, but I/O space must start from 0.
|
||||
*/
|
||||
#define CONFIG_PCI /* Enable PCI/PCIE */
|
||||
#define CONFIG_PCIE1 /* PCIE controler 1 (slot 1) */
|
||||
#define CONFIG_PCI_INDIRECT_BRIDGE
|
||||
#define CONFIG_PCI_PNP /* do pci plug-and-play */
|
||||
#define CONFIG_PCI_SCAN_SHOW /* show pci devices on startup */
|
||||
#define CONFIG_SYS_PCI_64BIT /* enable 64-bit PCI resources */
|
||||
#define CONFIG_CMD_PCI
|
||||
|
||||
#define CONFIG_FSL_PCI_INIT /* Use common FSL init code */
|
||||
#define CONFIG_FSL_PCIE_RESET /* need PCIe reset errata */
|
||||
|
||||
#define CONFIG_SYS_PCIE1_MEM_VIRT 0xc0000000
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
#define CONFIG_SYS_PCIE1_MEM_BUS 0xe0000000
|
||||
#define CONFIG_SYS_PCIE1_MEM_PHYS 0xc40000000ull
|
||||
#else
|
||||
#define CONFIG_SYS_PCIE1_MEM_BUS 0xc0000000
|
||||
#define CONFIG_SYS_PCIE1_MEM_PHYS 0xc0000000
|
||||
#endif
|
||||
#define CONFIG_SYS_PCIE1_MEM_SIZE 0x20000000 /* 512M */
|
||||
#define CONFIG_SYS_PCIE1_IO_VIRT 0xffc20000
|
||||
#define CONFIG_SYS_PCIE1_IO_BUS 0x00000000
|
||||
#ifdef CONFIG_PHYS_64BIT
|
||||
#define CONFIG_SYS_PCIE1_IO_PHYS 0xfffc20000ull
|
||||
#else
|
||||
#define CONFIG_SYS_PCIE1_IO_PHYS 0xffc20000
|
||||
#endif
|
||||
#define CONFIG_SYS_PCIE1_IO_SIZE 0x00010000 /* 64k */
|
||||
|
||||
/*
|
||||
* SATA
|
||||
*/
|
||||
#define CONFIG_LIBATA
|
||||
#define CONFIG_LBA48
|
||||
#define CONFIG_CMD_SATA
|
||||
|
||||
#define CONFIG_FSL_SATA
|
||||
#define CONFIG_SYS_SATA_MAX_DEVICE 2
|
||||
#define CONFIG_SATA1
|
||||
#define CONFIG_SYS_SATA1 CONFIG_SYS_MPC85xx_SATA1_ADDR
|
||||
#define CONFIG_SYS_SATA1_FLAGS FLAGS_DMA
|
||||
#define CONFIG_SATA2
|
||||
#define CONFIG_SYS_SATA2 CONFIG_SYS_MPC85xx_SATA2_ADDR
|
||||
#define CONFIG_SYS_SATA2_FLAGS FLAGS_DMA
|
||||
|
||||
/*
|
||||
* Ethernet
|
||||
*/
|
||||
#define CONFIG_TSEC_ENET
|
||||
|
||||
#define CONFIG_TSECV2
|
||||
|
||||
#define CONFIG_MII /* MII PHY management */
|
||||
#define CONFIG_TSEC1 1
|
||||
#define CONFIG_TSEC1_NAME "eTSEC1"
|
||||
#define CONFIG_TSEC2 1
|
||||
#define CONFIG_TSEC2_NAME "eTSEC2"
|
||||
|
||||
#define TSEC1_PHY_ADDR 0
|
||||
#define TSEC2_PHY_ADDR 1
|
||||
|
||||
#define TSEC1_FLAGS (TSEC_GIGABIT | TSEC_REDUCED)
|
||||
#define TSEC2_FLAGS (TSEC_GIGABIT | TSEC_REDUCED)
|
||||
|
||||
#define TSEC1_PHYIDX 0
|
||||
#define TSEC2_PHYIDX 0
|
||||
|
||||
#define CONFIG_ETHPRIME "eTSEC1"
|
||||
|
||||
#define CONFIG_PHY_GIGE /* Include GbE speed/duplex detection */
|
||||
|
||||
/*
|
||||
* USB
|
||||
*/
|
||||
#define CONFIG_USB_EHCI
|
||||
#define CONFIG_CMD_USB
|
||||
#define CONFIG_USB_STORAGE
|
||||
|
||||
#define CONFIG_HAS_FSL_DR_USB
|
||||
#define CONFIG_USB_EHCI_FSL
|
||||
#define CONFIG_EHCI_HCD_INIT_AFTER_RESET
|
||||
|
||||
#endif /* CONFIG_TRAILBLAZER */
|
||||
|
||||
/*
|
||||
* Environment
|
||||
*/
|
||||
#if defined(CONFIG_TRAILBLAZER)
|
||||
#define CONFIG_ENV_IS_NOWHERE
|
||||
#define CONFIG_ENV_SIZE 0x2000 /* 8KB */
|
||||
#undef CONFIG_CMD_SAVEENV
|
||||
#elif defined(CONFIG_RAMBOOT_SPIFLASH)
|
||||
#define CONFIG_ENV_IS_IN_SPI_FLASH
|
||||
#define CONFIG_ENV_SPI_BUS 0
|
||||
#define CONFIG_ENV_SPI_CS 0
|
||||
#define CONFIG_ENV_SPI_MAX_HZ 10000000
|
||||
#define CONFIG_ENV_SPI_MODE 0
|
||||
#define CONFIG_ENV_SIZE 0x2000 /* 8KB */
|
||||
#define CONFIG_ENV_OFFSET 0x100000 /* 1MB */
|
||||
#define CONFIG_ENV_SECT_SIZE 0x10000
|
||||
#elif defined(CONFIG_RAMBOOT_SDCARD)
|
||||
#define CONFIG_ENV_IS_IN_MMC
|
||||
#define CONFIG_FSL_FIXED_MMC_LOCATION
|
||||
#define CONFIG_ENV_SIZE 0x2000
|
||||
#define CONFIG_SYS_MMC_ENV_DEV 0
|
||||
#endif
|
||||
|
||||
#define CONFIG_SYS_EXTRA_ENV_RELOC
|
||||
|
||||
#define CONFIG_SYS_CONSOLE_IS_IN_ENV
|
||||
|
||||
/*
|
||||
* Command line configuration.
|
||||
*/
|
||||
#ifndef CONFIG_TRAILBLAZER
|
||||
#define CONFIG_SYS_HUSH_PARSER
|
||||
#define CONFIG_SYS_LONGHELP
|
||||
#define CONFIG_CMDLINE_EDITING /* Command-line editing */
|
||||
#define CONFIG_AUTO_COMPLETE /* add autocompletion support */
|
||||
#endif /* CONFIG_TRAILBLAZER */
|
||||
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x2000000 /* default load address */
|
||||
#define CONFIG_SYS_PROMPT "=> " /* Monitor Command Prompt */
|
||||
#ifdef CONFIG_CMD_KGDB
|
||||
#define CONFIG_SYS_CBSIZE 1024 /* Console I/O Buffer Size */
|
||||
#else
|
||||
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#endif
|
||||
/* Print Buffer Size */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
#define CONFIG_SYS_MAXARGS 16
|
||||
#define CONFIG_SYS_BARGSIZE CONFIG_SYS_CBSIZE
|
||||
|
||||
#include <config_cmd_default.h>
|
||||
|
||||
#ifndef CONFIG_TRAILBLAZER
|
||||
|
||||
#define CONFIG_CMD_ELF
|
||||
#define CONFIG_CMD_ERRATA
|
||||
#define CONFIG_CMD_EXT2
|
||||
#define CONFIG_CMD_FAT
|
||||
#define CONFIG_CMD_IRQ
|
||||
#define CONFIG_CMD_MII
|
||||
#define CONFIG_CMD_NET
|
||||
#define CONFIG_CMD_PING
|
||||
#define CONFIG_CMD_SETEXPR
|
||||
#define CONFIG_CMD_REGINFO
|
||||
|
||||
/*
|
||||
* Board initialisation callbacks
|
||||
*/
|
||||
#define CONFIG_BOARD_EARLY_INIT_F
|
||||
#define CONFIG_BOARD_EARLY_INIT_R
|
||||
#define CONFIG_MISC_INIT_R
|
||||
#define CONFIG_LAST_STAGE_INIT
|
||||
|
||||
/*
|
||||
* Pass open firmware flat tree
|
||||
*/
|
||||
#define CONFIG_OF_LIBFDT
|
||||
#define CONFIG_OF_BOARD_SETUP
|
||||
#define CONFIG_OF_STDOUT_VIA_ALIAS
|
||||
|
||||
/* new uImage format support */
|
||||
#define CONFIG_FIT
|
||||
#define CONFIG_FIT_VERBOSE
|
||||
|
||||
#else /* CONFIG_TRAILBLAZER */
|
||||
|
||||
#define CONFIG_BOARD_EARLY_INIT_F
|
||||
#define CONFIG_BOARD_EARLY_INIT_R
|
||||
#define CONFIG_LAST_STAGE_INIT
|
||||
#undef CONFIG_CMD_BOOTM
|
||||
|
||||
#endif /* CONFIG_TRAILBLAZER */
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CONFIG_SYS_HZ 1000
|
||||
#define CONFIG_HW_WATCHDOG
|
||||
#define CONFIG_LOADS_ECHO
|
||||
#define CONFIG_SYS_LOADS_BAUD_CHANGE
|
||||
#define CONFIG_DOS_PARTITION
|
||||
|
||||
/*
|
||||
* For booting Linux, the board info and command line data
|
||||
* have to be in the first 64 MB of memory, since this is
|
||||
* the maximum mapped by the Linux kernel during initialization.
|
||||
*/
|
||||
#define CONFIG_SYS_BOOTMAPSZ (64 << 20) /* Initial Linux Memory map */
|
||||
#define CONFIG_SYS_BOOTM_LEN (64 << 20) /* Increase max gunzip size */
|
||||
|
||||
/*
|
||||
* Environment Configuration
|
||||
*/
|
||||
|
||||
#ifdef CONFIG_TRAILBLAZER
|
||||
|
||||
#define CONFIG_BOOTDELAY 0 /* -1 disables auto-boot */
|
||||
#define CONFIG_BAUDRATE 115200
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"mp_holdoff=1\0"
|
||||
|
||||
#else
|
||||
|
||||
#define CONFIG_HOSTNAME controlcenterd
|
||||
#define CONFIG_ROOTPATH "/opt/nfsroot"
|
||||
#define CONFIG_BOOTFILE "uImage"
|
||||
#define CONFIG_UBOOTPATH u-boot.bin /* U-Boot image on TFTP */
|
||||
|
||||
#define CONFIG_LOADADDR 1000000
|
||||
|
||||
#define CONFIG_BOOTDELAY 10 /* -1 disables auto-boot */
|
||||
|
||||
#define CONFIG_BAUDRATE 115200
|
||||
|
||||
#define CONFIG_EXTRA_ENV_SETTINGS \
|
||||
"netdev=eth0\0" \
|
||||
"uboot=" __stringify(CONFIG_UBOOTPATH) "\0" \
|
||||
"ubootaddr=" __stringify(CONFIG_SYS_TEXT_BASE) "\0" \
|
||||
"tftpflash=tftpboot $loadaddr $uboot && " \
|
||||
"protect off $ubootaddr +$filesize && " \
|
||||
"erase $ubootaddr +$filesize && " \
|
||||
"cp.b $loadaddr $ubootaddr $filesize && " \
|
||||
"protect on $ubootaddr +$filesize && " \
|
||||
"cmp.b $loadaddr $ubootaddr $filesize\0" \
|
||||
"consoledev=ttyS1\0" \
|
||||
"ramdiskaddr=2000000\0" \
|
||||
"ramdiskfile=rootfs.ext2.gz.uboot\0" \
|
||||
"fdtaddr=c00000\0" \
|
||||
"fdtfile=controlcenterd.dtb\0" \
|
||||
"bdev=sda3\0"
|
||||
|
||||
/* these are used and NUL-terminated in env_default.h */
|
||||
#define CONFIG_NFSBOOTCOMMAND \
|
||||
"setenv bootargs root=/dev/nfs rw " \
|
||||
"nfsroot=$serverip:$rootpath " \
|
||||
"ip=$ipaddr:$serverip:$gatewayip:$netmask:$hostname:$netdev:off " \
|
||||
"console=$consoledev,$baudrate $othbootargs $videobootargs;" \
|
||||
"tftp $loadaddr $bootfile;" \
|
||||
"tftp $fdtaddr $fdtfile;" \
|
||||
"bootm $loadaddr - $fdtaddr"
|
||||
|
||||
#define CONFIG_RAMBOOTCOMMAND \
|
||||
"setenv bootargs root=/dev/ram rw " \
|
||||
"console=$consoledev,$baudrate $othbootargs $videobootargs;" \
|
||||
"tftp $ramdiskaddr $ramdiskfile;" \
|
||||
"tftp $loadaddr $bootfile;" \
|
||||
"tftp $fdtaddr $fdtfile;" \
|
||||
"bootm $loadaddr $ramdiskaddr $fdtaddr"
|
||||
|
||||
#define CONFIG_BOOTCOMMAND CONFIG_RAMBOOTCOMMAND
|
||||
|
||||
#endif /* CONFIG_TRAILBLAZER */
|
||||
|
||||
#endif
|
||||
@@ -1,206 +0,0 @@
|
||||
/*
|
||||
* Authors: Xiangfu Liu <xiangfu.z@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version
|
||||
* 3 of the License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#ifndef __CONFIG_QI_LB60_H
|
||||
#define __CONFIG_QI_LB60_H
|
||||
|
||||
#define CONFIG_MIPS32 /* MIPS32 CPU core */
|
||||
#define CONFIG_SYS_LITTLE_ENDIAN
|
||||
#define CONFIG_JZSOC /* Jz SoC */
|
||||
#define CONFIG_JZ4740 /* Jz4740 SoC */
|
||||
#define CONFIG_NAND_JZ4740
|
||||
|
||||
#define CONFIG_SYS_CPU_SPEED 336000000 /* CPU clock: 336 MHz */
|
||||
#define CONFIG_SYS_EXTAL 12000000 /* EXTAL freq: 12 MHz */
|
||||
#define CONFIG_SYS_HZ (CONFIG_SYS_EXTAL / 256) /* incrementer freq */
|
||||
#define CONFIG_SYS_MIPS_TIMER_FREQ CONFIG_SYS_CPU_SPEED
|
||||
|
||||
#define CONFIG_SYS_UART_BASE JZ4740_UART0_BASE /* Base of the UART channel */
|
||||
#define CONFIG_BAUDRATE 57600
|
||||
|
||||
#define CONFIG_SKIP_LOWLEVEL_INIT
|
||||
#define CONFIG_BOARD_EARLY_INIT_F
|
||||
#define CONFIG_SYS_NO_FLASH
|
||||
#define CONFIG_SYS_FLASH_BASE 0 /* init flash_base as 0 */
|
||||
#define CONFIG_ENV_OVERWRITE
|
||||
|
||||
#define CONFIG_BOOTP_MASK (CONFIG_BOOTP_DEFAUL)
|
||||
#define CONFIG_BOOTDELAY 0
|
||||
#define CONFIG_BOOTARGS "mem=32M console=tty0 console=ttyS0,57600n8 ubi.mtd=2 rootfstype=ubifs root=ubi0:rootfs rw rootwait"
|
||||
#define CONFIG_BOOTCOMMAND "nand read 0x80600000 0x400000 0x200000;bootm"
|
||||
|
||||
/*
|
||||
* Command line configuration.
|
||||
*/
|
||||
#define CONFIG_CMD_BOOTD /* bootd */
|
||||
#define CONFIG_CMD_CONSOLE /* coninfo */
|
||||
#define CONFIG_CMD_ECHO /* echo arguments */
|
||||
|
||||
#define CONFIG_CMD_LOADB /* loadb */
|
||||
#define CONFIG_CMD_LOADS /* loads */
|
||||
#define CONFIG_CMD_MEMORY /* md mm nm mw cp cmp crc base loop mtest */
|
||||
#define CONFIG_CMD_MISC /* Misc functions like sleep etc*/
|
||||
#define CONFIG_CMD_RUN /* run command in env variable */
|
||||
#define CONFIG_CMD_SAVEENV /* saveenv */
|
||||
#define CONFIG_CMD_SETGETDCR /* DCR support on 4xx */
|
||||
#define CONFIG_CMD_SOURCE /* "source" command support */
|
||||
#define CONFIG_CMD_NAND
|
||||
|
||||
/*
|
||||
* Serial download configuration
|
||||
*/
|
||||
#define CONFIG_LOADS_ECHO 1 /* echo on for serial download */
|
||||
|
||||
/*
|
||||
* Miscellaneous configurable options
|
||||
*/
|
||||
#define CONFIG_SYS_MAXARGS 16
|
||||
#define CONFIG_SYS_LONGHELP
|
||||
#define CONFIG_SYS_PROMPT "NanoNote# "
|
||||
#define CONFIG_SYS_CBSIZE 256 /* Console I/O Buffer Size */
|
||||
#define CONFIG_SYS_PBSIZE (CONFIG_SYS_CBSIZE + sizeof(CONFIG_SYS_PROMPT) + 16)
|
||||
|
||||
#define CONFIG_SYS_MALLOC_LEN (4 * 1024 * 1024)
|
||||
#define CONFIG_SYS_BOOTPARAMS_LEN (128 * 1024)
|
||||
|
||||
#define CONFIG_SYS_SDRAM_BASE 0x80000000 /* Cached addr */
|
||||
#define CONFIG_SYS_INIT_SP_OFFSET 0x400000
|
||||
#define CONFIG_SYS_LOAD_ADDR 0x80600000
|
||||
#define CONFIG_SYS_MEMTEST_START 0x80100000
|
||||
#define CONFIG_SYS_MEMTEST_END 0x80800000
|
||||
|
||||
/*
|
||||
* Environment
|
||||
*/
|
||||
#define CONFIG_ENV_IS_IN_NAND /* use NAND for environment vars */
|
||||
|
||||
#define CONFIG_SYS_NAND_5_ADDR_CYCLE
|
||||
/*
|
||||
* if board nand flash is 1GB, set to 1
|
||||
* if board nand flash is 2GB, set to 2
|
||||
* for change the PAGE_SIZE and BLOCK_SIZE
|
||||
* will delete when there is no 1GB flash
|
||||
*/
|
||||
#define NANONOTE_NAND_SIZE 2
|
||||
|
||||
#define CONFIG_SYS_NAND_PAGE_SIZE (2048 * NANONOTE_NAND_SIZE)
|
||||
#define CONFIG_SYS_NAND_BLOCK_SIZE (256 * NANONOTE_NAND_SIZE << 10)
|
||||
/* nand bad block was marked at this page in a block, start from 0 */
|
||||
#define CONFIG_SYS_NAND_BADBLOCK_PAGE 127
|
||||
#define CONFIG_SYS_NAND_PAGE_COUNT 128
|
||||
#define CONFIG_SYS_NAND_BAD_BLOCK_POS 0
|
||||
/* ECC offset position in oob area, default value is 6 if it isn't defined */
|
||||
#define CONFIG_SYS_NAND_ECC_POS (6 * NANONOTE_NAND_SIZE)
|
||||
#define CONFIG_SYS_NAND_ECCSIZE 512
|
||||
#define CONFIG_SYS_NAND_ECCBYTES 9
|
||||
#define CONFIG_SYS_NAND_ECCPOS \
|
||||
{12, 13, 14, 15, 16, 17, 18, 19,\
|
||||
20, 21, 22, 23, 24, 25, 26, 27, \
|
||||
28, 29, 30, 31, 32, 33, 34, 35, \
|
||||
36, 37, 38, 39, 40, 41, 42, 43, \
|
||||
44, 45, 46, 47, 48, 49, 50, 51, \
|
||||
52, 53, 54, 55, 56, 57, 58, 59, \
|
||||
60, 61, 62, 63, 64, 65, 66, 67, \
|
||||
68, 69, 70, 71, 72, 73, 74, 75, \
|
||||
76, 77, 78, 79, 80, 81, 82, 83}
|
||||
|
||||
#define CONFIG_SYS_NAND_OOBSIZE 128
|
||||
#define CONFIG_SYS_NAND_BASE 0xB8000000
|
||||
#define CONFIG_SYS_ONENAND_BASE CONFIG_SYS_NAND_BASE
|
||||
#define CONFIG_SYS_MAX_NAND_DEVICE 1
|
||||
#define CONFIG_SYS_NAND_SELECT_DEVICE 1 /* nand driver supports mutipl.*/
|
||||
#define CONFIG_NAND_SPL_TEXT_BASE 0x80000000
|
||||
|
||||
/*
|
||||
* IPL (Initial Program Loader, integrated inside CPU)
|
||||
* Will load first 8k from NAND (SPL) into cache and execute it from there.
|
||||
*
|
||||
* SPL (Secondary Program Loader)
|
||||
* Will load special U-Boot version (NUB) from NAND and execute it. This SPL
|
||||
* has to fit into 8kByte. It sets up the CPU and configures the SDRAM
|
||||
* controller and the NAND controller so that the special U-Boot image can be
|
||||
* loaded from NAND to SDRAM.
|
||||
*
|
||||
* NUB (NAND U-Boot)
|
||||
* This NAND U-Boot (NUB) is a special U-Boot version which can be started
|
||||
* from RAM. Therefore it mustn't (re-)configure the SDRAM controller.
|
||||
*
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_DST 0x80100000 /* Load NUB to this addr */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_START CONFIG_SYS_NAND_U_BOOT_DST
|
||||
/* Start NUB from this addr*/
|
||||
|
||||
/*
|
||||
* Define the partitioning of the NAND chip (only RAM U-Boot is needed here)
|
||||
*/
|
||||
#define CONFIG_SYS_NAND_U_BOOT_OFFS (256 << 10) /* Offset to RAM U-Boot image */
|
||||
#define CONFIG_SYS_NAND_U_BOOT_SIZE (512 << 10) /* Size of RAM U-Boot image */
|
||||
|
||||
#define CONFIG_ENV_SIZE (4 << 10)
|
||||
#define CONFIG_ENV_OFFSET \
|
||||
(CONFIG_SYS_NAND_BLOCK_SIZE + CONFIG_SYS_NAND_U_BOOT_SIZE)
|
||||
#define CONFIG_ENV_OFFSET_REDUND \
|
||||
(CONFIG_ENV_OFFSET + CONFIG_SYS_NAND_BLOCK_SIZE)
|
||||
|
||||
#define CONFIG_SYS_TEXT_BASE 0x80100000
|
||||
#define CONFIG_SYS_MONITOR_BASE CONFIG_SYS_TEXT_BASE
|
||||
|
||||
/*
|
||||
* SDRAM Info.
|
||||
*/
|
||||
#define CONFIG_NR_DRAM_BANKS 1
|
||||
|
||||
/*
|
||||
* Cache Configuration
|
||||
*/
|
||||
#define CONFIG_SYS_DCACHE_SIZE 16384
|
||||
#define CONFIG_SYS_ICACHE_SIZE 16384
|
||||
#define CONFIG_SYS_CACHELINE_SIZE 32
|
||||
|
||||
/*
|
||||
* GPIO definition
|
||||
*/
|
||||
#define GPIO_LCD_CS (2 * 32 + 21)
|
||||
#define GPIO_AMP_EN (3 * 32 + 4)
|
||||
|
||||
#define GPIO_SDPW_EN (3 * 32 + 2)
|
||||
#define GPIO_SD_DETECT (3 * 32 + 0)
|
||||
|
||||
#define GPIO_BUZZ_PWM (3 * 32 + 27)
|
||||
#define GPIO_USB_DETECT (3 * 32 + 28)
|
||||
|
||||
#define GPIO_AUDIO_POP (1 * 32 + 29)
|
||||
#define GPIO_COB_TEST (1 * 32 + 30)
|
||||
|
||||
#define GPIO_KEYOUT_BASE (2 * 32 + 10)
|
||||
#define GPIO_KEYIN_BASE (3 * 32 + 18)
|
||||
#define GPIO_KEYIN_8 (3 * 32 + 26)
|
||||
|
||||
#define GPIO_SD_CD_N GPIO_SD_DETECT /* SD Card insert detect */
|
||||
#define GPIO_SD_VCC_EN_N GPIO_SDPW_EN /* SD Card Power Enable */
|
||||
|
||||
#define SPEN GPIO_LCD_CS /* LCDCS :Serial command enable */
|
||||
#define SPDA (2 * 32 + 22) /* LCDSCL:Serial command clock input */
|
||||
#define SPCK (2 * 32 + 23) /* LCDSDA:Serial command data input */
|
||||
|
||||
/* SDRAM paramters */
|
||||
#define SDRAM_BW16 1 /* Data bus width: 0-32bit, 1-16bit */
|
||||
#define SDRAM_BANK4 1 /* Banks each chip: 0-2bank, 1-4bank */
|
||||
#define SDRAM_ROW 13 /* Row address: 11 to 13 */
|
||||
#define SDRAM_COL 9 /* Column address: 8 to 12 */
|
||||
#define SDRAM_CASL 2 /* CAS latency: 2 or 3 */
|
||||
|
||||
/* SDRAM Timings, unit: ns */
|
||||
#define SDRAM_TRAS 45 /* RAS# Active Time */
|
||||
#define SDRAM_RCD 20 /* RAS# to CAS# Delay */
|
||||
#define SDRAM_TPC 20 /* RAS# Precharge Time */
|
||||
#define SDRAM_TRWL 7 /* Write Latency Time */
|
||||
#define SDRAM_TREF 15625 /* Refresh period: 8192 cycles/64ms */
|
||||
|
||||
#endif
|
||||
@@ -189,7 +189,7 @@
|
||||
"nfsroot=/nfsroot/arm\0" \
|
||||
"bootblock=" CONFIG_BOOTBLOCK "\0" \
|
||||
"loaduimage=ext4load mmc ${mmcdev}:${mmcbootpart} 0x40007FC0 uImage\0" \
|
||||
"loaddtb=ext4load mmc ${mmcdev}:${mmcbootpart} ${fdtaddr}" \
|
||||
"loaddtb=ext4load mmc ${mmcdev}:${mmcbootpart} ${fdtaddr} " \
|
||||
"${fdtfile}\0" \
|
||||
"mmcdev=0\0" \
|
||||
"mmcbootpart=2\0" \
|
||||
|
||||
@@ -135,7 +135,7 @@ int ext4fs_mount(unsigned part_length);
|
||||
void ext4fs_close(void);
|
||||
int ext4fs_ls(const char *dirname);
|
||||
void ext4fs_free_node(struct ext2fs_node *node, struct ext2fs_node *currroot);
|
||||
int ext4fs_devread(int sector, int byte_offset, int byte_len, char *buf);
|
||||
int ext4fs_devread(lbaint_t sector, int byte_offset, int byte_len, char *buf);
|
||||
void ext4fs_set_blk_dev(block_dev_desc_t *rbdd, disk_partition_t *info);
|
||||
long int read_allocated_block(struct ext2_inode *inode, int fileblock);
|
||||
int ext4fs_probe(block_dev_desc_t *fs_dev_desc,
|
||||
|
||||
@@ -180,7 +180,7 @@ struct ext2_data {
|
||||
struct ext2fs_node diropen;
|
||||
};
|
||||
|
||||
extern unsigned long part_offset;
|
||||
extern lbaint_t part_offset;
|
||||
|
||||
int do_ext2ls(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
int do_ext2load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]);
|
||||
|
||||
@@ -44,9 +44,11 @@ extern ulong ide_bus_offset[];
|
||||
#ifdef CONFIG_SYS_64BIT_LBA
|
||||
typedef uint64_t lbaint_t;
|
||||
#define LBAF "%llx"
|
||||
#define LBAFU "%llu"
|
||||
#else
|
||||
typedef ulong lbaint_t;
|
||||
#define LBAF "%lx"
|
||||
#define LBAFU "%lu"
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -97,8 +97,8 @@ typedef struct block_dev_desc {
|
||||
#define DEV_TYPE_OPDISK 0x07 /* optical disk */
|
||||
|
||||
typedef struct disk_partition {
|
||||
ulong start; /* # of first block in partition */
|
||||
ulong size; /* number of blocks in partition */
|
||||
lbaint_t start; /* # of first block in partition */
|
||||
lbaint_t size; /* number of blocks in partition */
|
||||
ulong blksz; /* block size in bytes */
|
||||
uchar name[32]; /* partition name */
|
||||
uchar type[32]; /* string type description */
|
||||
|
||||
174
include/tpm.h
174
include/tpm.h
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013 The Chromium OS Authors.
|
||||
* Coypright (c) 2013 Guntermann & Drunck GmbH
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
@@ -53,6 +54,120 @@ enum tpm_nv_index {
|
||||
TPM_NV_INDEX_DIR = 0x10000001,
|
||||
};
|
||||
|
||||
/**
|
||||
* TPM return codes as defined in the TCG Main specification
|
||||
* (TPM Main Part 2 Structures; Specification version 1.2)
|
||||
*/
|
||||
enum tpm_return_code {
|
||||
TPM_BASE = 0x00000000,
|
||||
TPM_NON_FATAL = 0x00000800,
|
||||
TPM_SUCCESS = TPM_BASE,
|
||||
/* TPM-defined fatal error codes */
|
||||
TPM_AUTHFAIL = TPM_BASE + 1,
|
||||
TPM_BADINDEX = TPM_BASE + 2,
|
||||
TPM_BAD_PARAMETER = TPM_BASE + 3,
|
||||
TPM_AUDITFAILURE = TPM_BASE + 4,
|
||||
TPM_CLEAR_DISABLED = TPM_BASE + 5,
|
||||
TPM_DEACTIVATED = TPM_BASE + 6,
|
||||
TPM_DISABLED = TPM_BASE + 7,
|
||||
TPM_DISABLED_CMD = TPM_BASE + 8,
|
||||
TPM_FAIL = TPM_BASE + 9,
|
||||
TPM_BAD_ORDINAL = TPM_BASE + 10,
|
||||
TPM_INSTALL_DISABLED = TPM_BASE + 11,
|
||||
TPM_INVALID_KEYHANDLE = TPM_BASE + 12,
|
||||
TPM_KEYNOTFOUND = TPM_BASE + 13,
|
||||
TPM_INAPPROPRIATE_ENC = TPM_BASE + 14,
|
||||
TPM_MIGRATE_FAIL = TPM_BASE + 15,
|
||||
TPM_INVALID_PCR_INFO = TPM_BASE + 16,
|
||||
TPM_NOSPACE = TPM_BASE + 17,
|
||||
TPM_NOSRK = TPM_BASE + 18,
|
||||
TPM_NOTSEALED_BLOB = TPM_BASE + 19,
|
||||
TPM_OWNER_SET = TPM_BASE + 20,
|
||||
TPM_RESOURCES = TPM_BASE + 21,
|
||||
TPM_SHORTRANDOM = TPM_BASE + 22,
|
||||
TPM_SIZE = TPM_BASE + 23,
|
||||
TPM_WRONGPCRVAL = TPM_BASE + 24,
|
||||
TPM_BAD_PARAM_SIZE = TPM_BASE + 25,
|
||||
TPM_SHA_THREAD = TPM_BASE + 26,
|
||||
TPM_SHA_ERROR = TPM_BASE + 27,
|
||||
TPM_FAILEDSELFTEST = TPM_BASE + 28,
|
||||
TPM_AUTH2FAIL = TPM_BASE + 29,
|
||||
TPM_BADTAG = TPM_BASE + 30,
|
||||
TPM_IOERROR = TPM_BASE + 31,
|
||||
TPM_ENCRYPT_ERROR = TPM_BASE + 32,
|
||||
TPM_DECRYPT_ERROR = TPM_BASE + 33,
|
||||
TPM_INVALID_AUTHHANDLE = TPM_BASE + 34,
|
||||
TPM_NO_ENDORSEMENT = TPM_BASE + 35,
|
||||
TPM_INVALID_KEYUSAGE = TPM_BASE + 36,
|
||||
TPM_WRONG_ENTITYTYPE = TPM_BASE + 37,
|
||||
TPM_INVALID_POSTINIT = TPM_BASE + 38,
|
||||
TPM_INAPPROPRIATE_SIG = TPM_BASE + 39,
|
||||
TPM_BAD_KEY_PROPERTY = TPM_BASE + 40,
|
||||
TPM_BAD_MIGRATION = TPM_BASE + 41,
|
||||
TPM_BAD_SCHEME = TPM_BASE + 42,
|
||||
TPM_BAD_DATASIZE = TPM_BASE + 43,
|
||||
TPM_BAD_MODE = TPM_BASE + 44,
|
||||
TPM_BAD_PRESENCE = TPM_BASE + 45,
|
||||
TPM_BAD_VERSION = TPM_BASE + 46,
|
||||
TPM_NO_WRAP_TRANSPORT = TPM_BASE + 47,
|
||||
TPM_AUDITFAIL_UNSUCCESSFUL = TPM_BASE + 48,
|
||||
TPM_AUDITFAIL_SUCCESSFUL = TPM_BASE + 49,
|
||||
TPM_NOTRESETABLE = TPM_BASE + 50,
|
||||
TPM_NOTLOCAL = TPM_BASE + 51,
|
||||
TPM_BAD_TYPE = TPM_BASE + 52,
|
||||
TPM_INVALID_RESOURCE = TPM_BASE + 53,
|
||||
TPM_NOTFIPS = TPM_BASE + 54,
|
||||
TPM_INVALID_FAMILY = TPM_BASE + 55,
|
||||
TPM_NO_NV_PERMISSION = TPM_BASE + 56,
|
||||
TPM_REQUIRES_SIGN = TPM_BASE + 57,
|
||||
TPM_KEY_NOTSUPPORTED = TPM_BASE + 58,
|
||||
TPM_AUTH_CONFLICT = TPM_BASE + 59,
|
||||
TPM_AREA_LOCKED = TPM_BASE + 60,
|
||||
TPM_BAD_LOCALITY = TPM_BASE + 61,
|
||||
TPM_READ_ONLY = TPM_BASE + 62,
|
||||
TPM_PER_NOWRITE = TPM_BASE + 63,
|
||||
TPM_FAMILY_COUNT = TPM_BASE + 64,
|
||||
TPM_WRITE_LOCKED = TPM_BASE + 65,
|
||||
TPM_BAD_ATTRIBUTES = TPM_BASE + 66,
|
||||
TPM_INVALID_STRUCTURE = TPM_BASE + 67,
|
||||
TPM_KEY_OWNER_CONTROL = TPM_BASE + 68,
|
||||
TPM_BAD_COUNTER = TPM_BASE + 69,
|
||||
TPM_NOT_FULLWRITE = TPM_BASE + 70,
|
||||
TPM_CONTEXT_GAP = TPM_BASE + 71,
|
||||
TPM_MAXNVWRITES = TPM_BASE + 72,
|
||||
TPM_NOOPERATOR = TPM_BASE + 73,
|
||||
TPM_RESOURCEMISSING = TPM_BASE + 74,
|
||||
TPM_DELEGATE_LOCK = TPM_BASE + 75,
|
||||
TPM_DELEGATE_FAMILY = TPM_BASE + 76,
|
||||
TPM_DELEGATE_ADMIN = TPM_BASE + 77,
|
||||
TPM_TRANSPORT_NOTEXCLUSIVE = TPM_BASE + 78,
|
||||
TPM_OWNER_CONTROL = TPM_BASE + 79,
|
||||
TPM_DAA_RESOURCES = TPM_BASE + 80,
|
||||
TPM_DAA_INPUT_DATA0 = TPM_BASE + 81,
|
||||
TPM_DAA_INPUT_DATA1 = TPM_BASE + 82,
|
||||
TPM_DAA_ISSUER_SETTINGS = TPM_BASE + 83,
|
||||
TPM_DAA_TPM_SETTINGS = TPM_BASE + 84,
|
||||
TPM_DAA_STAGE = TPM_BASE + 85,
|
||||
TPM_DAA_ISSUER_VALIDITY = TPM_BASE + 86,
|
||||
TPM_DAA_WRONG_W = TPM_BASE + 87,
|
||||
TPM_BAD_HANDLE = TPM_BASE + 88,
|
||||
TPM_BAD_DELEGATE = TPM_BASE + 89,
|
||||
TPM_BADCONTEXT = TPM_BASE + 90,
|
||||
TPM_TOOMANYCONTEXTS = TPM_BASE + 91,
|
||||
TPM_MA_TICKET_SIGNATURE = TPM_BASE + 92,
|
||||
TPM_MA_DESTINATION = TPM_BASE + 93,
|
||||
TPM_MA_SOURCE = TPM_BASE + 94,
|
||||
TPM_MA_AUTHORITY = TPM_BASE + 95,
|
||||
TPM_PERMANENTEK = TPM_BASE + 97,
|
||||
TPM_BAD_SIGNATURE = TPM_BASE + 98,
|
||||
TPM_NOCONTEXTSPACE = TPM_BASE + 99,
|
||||
/* TPM-defined non-fatal errors */
|
||||
TPM_RETRY = TPM_BASE + TPM_NON_FATAL,
|
||||
TPM_NEEDS_SELFTEST = TPM_BASE + TPM_NON_FATAL + 1,
|
||||
TPM_DOING_SELFTEST = TPM_BASE + TPM_NON_FATAL + 2,
|
||||
TPM_DEFEND_LOCK_RUNNING = TPM_BASE + TPM_NON_FATAL + 3,
|
||||
};
|
||||
|
||||
/**
|
||||
* Initialize TPM device. It must be called before any TPM commands.
|
||||
*
|
||||
@@ -201,4 +316,63 @@ uint32_t tpm_physical_set_deactivated(uint8_t state);
|
||||
uint32_t tpm_get_capability(uint32_t cap_area, uint32_t sub_cap,
|
||||
void *cap, size_t count);
|
||||
|
||||
/**
|
||||
* Issue a TPM_FlushSpecific command for a AUTH ressource.
|
||||
*
|
||||
* @param auth_handle handle of the auth session
|
||||
* @return return code of the operation
|
||||
*/
|
||||
uint32_t tpm_terminate_auth_session(uint32_t auth_handle);
|
||||
|
||||
/**
|
||||
* Issue a TPM_OIAP command to setup an object independant authorization
|
||||
* session.
|
||||
* Information about the session is stored internally.
|
||||
* If there was already an OIAP session active it is terminated and a new
|
||||
* session is set up.
|
||||
*
|
||||
* @param auth_handle pointer to the (new) auth handle or NULL.
|
||||
* @return return code of the operation
|
||||
*/
|
||||
uint32_t tpm_oiap(uint32_t *auth_handle);
|
||||
|
||||
/**
|
||||
* Ends an active OIAP session.
|
||||
*
|
||||
* @return return code of the operation
|
||||
*/
|
||||
uint32_t tpm_end_oiap(void);
|
||||
|
||||
/**
|
||||
* Issue a TPM_LoadKey2 (Auth1) command using an OIAP session for authenticating
|
||||
* the usage of the parent key.
|
||||
*
|
||||
* @param parent_handle handle of the parent key.
|
||||
* @param key pointer to the key structure (TPM_KEY or TPM_KEY12).
|
||||
* @param key_length size of the key structure
|
||||
* @param parent_key_usage_auth usage auth for the parent key
|
||||
* @param key_handle pointer to the key handle
|
||||
* @return return code of the operation
|
||||
*/
|
||||
uint32_t tpm_load_key2_oiap(uint32_t parent_handle,
|
||||
const void *key, size_t key_length,
|
||||
const void *parent_key_usage_auth,
|
||||
uint32_t *key_handle);
|
||||
|
||||
/**
|
||||
* Issue a TPM_GetPubKey (Auth1) command using an OIAP session for
|
||||
* authenticating the usage of the key.
|
||||
*
|
||||
* @param key_handle handle of the key
|
||||
* @param usage_auth usage auth for the key
|
||||
* @param pubkey pointer to the pub key buffer; may be NULL if the pubkey
|
||||
* should not be stored.
|
||||
* @param pubkey_len pointer to the pub key buffer len. On entry: the size of
|
||||
* the provided pubkey buffer. On successful exit: the size
|
||||
* of the stored TPM_PUBKEY structure (iff pubkey != NULL).
|
||||
* @return return code of the operation
|
||||
*/
|
||||
uint32_t tpm_get_pub_key_oiap(uint32_t key_handle, const void *usage_auth,
|
||||
void *pubkey, size_t *pubkey_len);
|
||||
|
||||
#endif /* __TPM_H */
|
||||
|
||||
351
lib/tpm.c
351
lib/tpm.c
@@ -1,5 +1,6 @@
|
||||
/*
|
||||
* Copyright (c) 2013 The Chromium OS Authors.
|
||||
* Coypright (c) 2013 Guntermann & Drunck GmbH
|
||||
*
|
||||
* See file CREDITS for list of people who contributed to this
|
||||
* project.
|
||||
@@ -22,6 +23,7 @@
|
||||
|
||||
#include <common.h>
|
||||
#include <stdarg.h>
|
||||
#include <sha1.h>
|
||||
#include <tpm.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
@@ -35,8 +37,31 @@ enum {
|
||||
TPM_REQUEST_HEADER_LENGTH = 10,
|
||||
TPM_RESPONSE_HEADER_LENGTH = 10,
|
||||
PCR_DIGEST_LENGTH = 20,
|
||||
DIGEST_LENGTH = 20,
|
||||
TPM_REQUEST_AUTH_LENGTH = 45,
|
||||
TPM_RESPONSE_AUTH_LENGTH = 41,
|
||||
/* some max lengths, valid for RSA keys <= 2048 bits */
|
||||
TPM_KEY12_MAX_LENGTH = 618,
|
||||
TPM_PUBKEY_MAX_LENGTH = 288,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_TPM_AUTH_SESSIONS
|
||||
|
||||
#ifndef CONFIG_SHA1
|
||||
#error "TPM_AUTH_SESSIONS require SHA1 to be configured, too"
|
||||
#endif /* !CONFIG_SHA1 */
|
||||
|
||||
struct session_data {
|
||||
int valid;
|
||||
uint32_t handle;
|
||||
uint8_t nonce_even[DIGEST_LENGTH];
|
||||
uint8_t nonce_odd[DIGEST_LENGTH];
|
||||
};
|
||||
|
||||
static struct session_data oiap_session = {0, };
|
||||
|
||||
#endif /* CONFIG_TPM_AUTH_SESSIONS */
|
||||
|
||||
/**
|
||||
* Pack data into a byte string. The data types are specified in
|
||||
* the format string: 'b' means unsigned byte, 'w' unsigned word,
|
||||
@@ -235,7 +260,7 @@ static uint32_t tpm_sendrecv_command(const void *command,
|
||||
response, &response_length);
|
||||
if (err)
|
||||
return TPM_LIB_ERROR;
|
||||
if (response)
|
||||
if (size_ptr)
|
||||
*size_ptr = response_length;
|
||||
|
||||
return tpm_return_code(response);
|
||||
@@ -579,3 +604,327 @@ uint32_t tpm_get_capability(uint32_t cap_area, uint32_t sub_cap,
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TPM_AUTH_SESSIONS
|
||||
|
||||
/**
|
||||
* Fill an authentication block in a request.
|
||||
* This func can create the first as well as the second auth block (for
|
||||
* double authorized commands).
|
||||
*
|
||||
* @param request pointer to the request (w/ uninitialised auth data)
|
||||
* @param request_len0 length of the request without auth data
|
||||
* @param handles_len length of the handles area in request
|
||||
* @param auth_session pointer to the (valid) auth session to be used
|
||||
* @param request_auth pointer to the auth block of the request to be filled
|
||||
* @param auth authentication data (HMAC key)
|
||||
*/
|
||||
static uint32_t create_request_auth(const void *request, size_t request_len0,
|
||||
size_t handles_len,
|
||||
struct session_data *auth_session,
|
||||
void *request_auth, const void *auth)
|
||||
{
|
||||
uint8_t hmac_data[DIGEST_LENGTH * 3 + 1];
|
||||
sha1_context hash_ctx;
|
||||
const size_t command_code_offset = 6;
|
||||
const size_t auth_nonce_odd_offset = 4;
|
||||
const size_t auth_continue_offset = 24;
|
||||
const size_t auth_auth_offset = 25;
|
||||
|
||||
if (!auth_session || !auth_session->valid)
|
||||
return TPM_LIB_ERROR;
|
||||
|
||||
sha1_starts(&hash_ctx);
|
||||
sha1_update(&hash_ctx, request + command_code_offset, 4);
|
||||
if (request_len0 > TPM_REQUEST_HEADER_LENGTH + handles_len)
|
||||
sha1_update(&hash_ctx,
|
||||
request + TPM_REQUEST_HEADER_LENGTH + handles_len,
|
||||
request_len0 - TPM_REQUEST_HEADER_LENGTH
|
||||
- handles_len);
|
||||
sha1_finish(&hash_ctx, hmac_data);
|
||||
|
||||
sha1_starts(&hash_ctx);
|
||||
sha1_update(&hash_ctx, auth_session->nonce_odd, DIGEST_LENGTH);
|
||||
sha1_update(&hash_ctx, hmac_data, sizeof(hmac_data));
|
||||
sha1_finish(&hash_ctx, auth_session->nonce_odd);
|
||||
|
||||
if (pack_byte_string(request_auth, TPM_REQUEST_AUTH_LENGTH, "dsb",
|
||||
0, auth_session->handle,
|
||||
auth_nonce_odd_offset, auth_session->nonce_odd,
|
||||
DIGEST_LENGTH,
|
||||
auth_continue_offset, 1))
|
||||
return TPM_LIB_ERROR;
|
||||
if (pack_byte_string(hmac_data, sizeof(hmac_data), "ss",
|
||||
DIGEST_LENGTH,
|
||||
auth_session->nonce_even,
|
||||
DIGEST_LENGTH,
|
||||
2 * DIGEST_LENGTH,
|
||||
request_auth + auth_nonce_odd_offset,
|
||||
DIGEST_LENGTH + 1))
|
||||
return TPM_LIB_ERROR;
|
||||
sha1_hmac(auth, DIGEST_LENGTH, hmac_data, sizeof(hmac_data),
|
||||
request_auth + auth_auth_offset);
|
||||
|
||||
return TPM_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify an authentication block in a response.
|
||||
* Since this func updates the nonce_even in the session data it has to be
|
||||
* called when receiving a succesfull AUTH response.
|
||||
* This func can verify the first as well as the second auth block (for
|
||||
* double authorized commands).
|
||||
*
|
||||
* @param command_code command code of the request
|
||||
* @param response pointer to the request (w/ uninitialised auth data)
|
||||
* @param handles_len length of the handles area in response
|
||||
* @param auth_session pointer to the (valid) auth session to be used
|
||||
* @param response_auth pointer to the auth block of the response to be verified
|
||||
* @param auth authentication data (HMAC key)
|
||||
*/
|
||||
static uint32_t verify_response_auth(uint32_t command_code,
|
||||
const void *response, size_t response_len0,
|
||||
size_t handles_len,
|
||||
struct session_data *auth_session,
|
||||
const void *response_auth, const void *auth)
|
||||
{
|
||||
uint8_t hmac_data[DIGEST_LENGTH * 3 + 1];
|
||||
uint8_t computed_auth[DIGEST_LENGTH];
|
||||
sha1_context hash_ctx;
|
||||
const size_t return_code_offset = 6;
|
||||
const size_t auth_continue_offset = 20;
|
||||
const size_t auth_auth_offset = 21;
|
||||
uint8_t auth_continue;
|
||||
|
||||
if (!auth_session || !auth_session->valid)
|
||||
return TPM_AUTHFAIL;
|
||||
if (pack_byte_string(hmac_data, sizeof(hmac_data), "d",
|
||||
0, command_code))
|
||||
return TPM_LIB_ERROR;
|
||||
if (response_len0 < TPM_RESPONSE_HEADER_LENGTH)
|
||||
return TPM_LIB_ERROR;
|
||||
|
||||
sha1_starts(&hash_ctx);
|
||||
sha1_update(&hash_ctx, response + return_code_offset, 4);
|
||||
sha1_update(&hash_ctx, hmac_data, 4);
|
||||
if (response_len0 > TPM_RESPONSE_HEADER_LENGTH + handles_len)
|
||||
sha1_update(&hash_ctx,
|
||||
response + TPM_RESPONSE_HEADER_LENGTH + handles_len,
|
||||
response_len0 - TPM_RESPONSE_HEADER_LENGTH
|
||||
- handles_len);
|
||||
sha1_finish(&hash_ctx, hmac_data);
|
||||
|
||||
memcpy(auth_session->nonce_even, response_auth, DIGEST_LENGTH);
|
||||
auth_continue = ((uint8_t *)response_auth)[auth_continue_offset];
|
||||
if (pack_byte_string(hmac_data, sizeof(hmac_data), "ssb",
|
||||
DIGEST_LENGTH,
|
||||
response_auth,
|
||||
DIGEST_LENGTH,
|
||||
2 * DIGEST_LENGTH,
|
||||
auth_session->nonce_odd,
|
||||
DIGEST_LENGTH,
|
||||
3 * DIGEST_LENGTH,
|
||||
auth_continue))
|
||||
return TPM_LIB_ERROR;
|
||||
|
||||
sha1_hmac(auth, DIGEST_LENGTH, hmac_data, sizeof(hmac_data),
|
||||
computed_auth);
|
||||
|
||||
if (memcmp(computed_auth, response_auth + auth_auth_offset,
|
||||
DIGEST_LENGTH))
|
||||
return TPM_AUTHFAIL;
|
||||
|
||||
return TPM_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
uint32_t tpm_terminate_auth_session(uint32_t auth_handle)
|
||||
{
|
||||
const uint8_t command[18] = {
|
||||
0x00, 0xc1, /* TPM_TAG */
|
||||
0x00, 0x00, 0x00, 0x00, /* parameter size */
|
||||
0x00, 0x00, 0x00, 0xba, /* TPM_COMMAND_CODE */
|
||||
0x00, 0x00, 0x00, 0x00, /* TPM_HANDLE */
|
||||
0x00, 0x00, 0x00, 0x02, /* TPM_RESSOURCE_TYPE */
|
||||
};
|
||||
const size_t req_handle_offset = TPM_REQUEST_HEADER_LENGTH;
|
||||
uint8_t request[COMMAND_BUFFER_SIZE];
|
||||
|
||||
if (pack_byte_string(request, sizeof(request), "sd",
|
||||
0, command, sizeof(command),
|
||||
req_handle_offset, auth_handle))
|
||||
return TPM_LIB_ERROR;
|
||||
if (oiap_session.valid && oiap_session.handle == auth_handle)
|
||||
oiap_session.valid = 0;
|
||||
|
||||
return tpm_sendrecv_command(request, NULL, NULL);
|
||||
}
|
||||
|
||||
uint32_t tpm_end_oiap(void)
|
||||
{
|
||||
uint32_t err = TPM_SUCCESS;
|
||||
if (oiap_session.valid)
|
||||
err = tpm_terminate_auth_session(oiap_session.handle);
|
||||
return err;
|
||||
}
|
||||
|
||||
uint32_t tpm_oiap(uint32_t *auth_handle)
|
||||
{
|
||||
const uint8_t command[10] = {
|
||||
0x00, 0xc1, /* TPM_TAG */
|
||||
0x00, 0x00, 0x00, 0x0a, /* parameter size */
|
||||
0x00, 0x00, 0x00, 0x0a, /* TPM_COMMAND_CODE */
|
||||
};
|
||||
const size_t res_auth_handle_offset = TPM_RESPONSE_HEADER_LENGTH;
|
||||
const size_t res_nonce_even_offset = TPM_RESPONSE_HEADER_LENGTH + 4;
|
||||
uint8_t response[COMMAND_BUFFER_SIZE];
|
||||
size_t response_length = sizeof(response);
|
||||
uint32_t err;
|
||||
|
||||
if (oiap_session.valid)
|
||||
tpm_terminate_auth_session(oiap_session.handle);
|
||||
|
||||
err = tpm_sendrecv_command(command, response, &response_length);
|
||||
if (err)
|
||||
return err;
|
||||
if (unpack_byte_string(response, response_length, "ds",
|
||||
res_auth_handle_offset, &oiap_session.handle,
|
||||
res_nonce_even_offset, &oiap_session.nonce_even,
|
||||
(uint32_t)DIGEST_LENGTH))
|
||||
return TPM_LIB_ERROR;
|
||||
oiap_session.valid = 1;
|
||||
if (auth_handle)
|
||||
*auth_handle = oiap_session.handle;
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t tpm_load_key2_oiap(uint32_t parent_handle,
|
||||
const void *key, size_t key_length,
|
||||
const void *parent_key_usage_auth,
|
||||
uint32_t *key_handle)
|
||||
{
|
||||
const uint8_t command[14] = {
|
||||
0x00, 0xc2, /* TPM_TAG */
|
||||
0x00, 0x00, 0x00, 0x00, /* parameter size */
|
||||
0x00, 0x00, 0x00, 0x41, /* TPM_COMMAND_CODE */
|
||||
0x00, 0x00, 0x00, 0x00, /* parent handle */
|
||||
};
|
||||
const size_t req_size_offset = 2;
|
||||
const size_t req_parent_handle_offset = TPM_REQUEST_HEADER_LENGTH;
|
||||
const size_t req_key_offset = TPM_REQUEST_HEADER_LENGTH + 4;
|
||||
const size_t res_handle_offset = TPM_RESPONSE_HEADER_LENGTH;
|
||||
uint8_t request[sizeof(command) + TPM_KEY12_MAX_LENGTH
|
||||
+ TPM_REQUEST_AUTH_LENGTH];
|
||||
uint8_t response[COMMAND_BUFFER_SIZE];
|
||||
size_t response_length = sizeof(response);
|
||||
uint32_t err;
|
||||
|
||||
if (!oiap_session.valid) {
|
||||
err = tpm_oiap(NULL);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (pack_byte_string(request, sizeof(request), "sdds",
|
||||
0, command, sizeof(command),
|
||||
req_size_offset,
|
||||
sizeof(command) + key_length
|
||||
+ TPM_REQUEST_AUTH_LENGTH,
|
||||
req_parent_handle_offset, parent_handle,
|
||||
req_key_offset, key, key_length
|
||||
))
|
||||
return TPM_LIB_ERROR;
|
||||
|
||||
err = create_request_auth(request, sizeof(command) + key_length, 4,
|
||||
&oiap_session,
|
||||
request + sizeof(command) + key_length,
|
||||
parent_key_usage_auth);
|
||||
if (err)
|
||||
return err;
|
||||
err = tpm_sendrecv_command(request, response, &response_length);
|
||||
if (err) {
|
||||
if (err == TPM_AUTHFAIL)
|
||||
oiap_session.valid = 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
err = verify_response_auth(0x00000041, response,
|
||||
response_length - TPM_RESPONSE_AUTH_LENGTH,
|
||||
4, &oiap_session,
|
||||
response + response_length - TPM_RESPONSE_AUTH_LENGTH,
|
||||
parent_key_usage_auth);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (key_handle) {
|
||||
if (unpack_byte_string(response, response_length, "d",
|
||||
res_handle_offset, key_handle))
|
||||
return TPM_LIB_ERROR;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t tpm_get_pub_key_oiap(uint32_t key_handle, const void *usage_auth,
|
||||
void *pubkey, size_t *pubkey_len)
|
||||
{
|
||||
const uint8_t command[14] = {
|
||||
0x00, 0xc2, /* TPM_TAG */
|
||||
0x00, 0x00, 0x00, 0x00, /* parameter size */
|
||||
0x00, 0x00, 0x00, 0x21, /* TPM_COMMAND_CODE */
|
||||
0x00, 0x00, 0x00, 0x00, /* key handle */
|
||||
};
|
||||
const size_t req_size_offset = 2;
|
||||
const size_t req_key_handle_offset = TPM_REQUEST_HEADER_LENGTH;
|
||||
const size_t res_pubkey_offset = TPM_RESPONSE_HEADER_LENGTH;
|
||||
uint8_t request[sizeof(command) + TPM_REQUEST_AUTH_LENGTH];
|
||||
uint8_t response[TPM_RESPONSE_HEADER_LENGTH + TPM_PUBKEY_MAX_LENGTH
|
||||
+ TPM_RESPONSE_AUTH_LENGTH];
|
||||
size_t response_length = sizeof(response);
|
||||
uint32_t err;
|
||||
|
||||
if (!oiap_session.valid) {
|
||||
err = tpm_oiap(NULL);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (pack_byte_string(request, sizeof(request), "sdd",
|
||||
0, command, sizeof(command),
|
||||
req_size_offset,
|
||||
(uint32_t)(sizeof(command)
|
||||
+ TPM_REQUEST_AUTH_LENGTH),
|
||||
req_key_handle_offset, key_handle
|
||||
))
|
||||
return TPM_LIB_ERROR;
|
||||
err = create_request_auth(request, sizeof(command), 4, &oiap_session,
|
||||
request + sizeof(command), usage_auth);
|
||||
if (err)
|
||||
return err;
|
||||
err = tpm_sendrecv_command(request, response, &response_length);
|
||||
if (err) {
|
||||
if (err == TPM_AUTHFAIL)
|
||||
oiap_session.valid = 0;
|
||||
return err;
|
||||
}
|
||||
err = verify_response_auth(0x00000021, response,
|
||||
response_length - TPM_RESPONSE_AUTH_LENGTH,
|
||||
0, &oiap_session,
|
||||
response + response_length - TPM_RESPONSE_AUTH_LENGTH,
|
||||
usage_auth);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (pubkey) {
|
||||
if ((response_length - TPM_RESPONSE_HEADER_LENGTH
|
||||
- TPM_RESPONSE_AUTH_LENGTH) > *pubkey_len)
|
||||
return TPM_LIB_ERROR;
|
||||
*pubkey_len = response_length - TPM_RESPONSE_HEADER_LENGTH
|
||||
- TPM_RESPONSE_AUTH_LENGTH;
|
||||
memcpy(pubkey, response + res_pubkey_offset,
|
||||
response_length - TPM_RESPONSE_HEADER_LENGTH
|
||||
- TPM_RESPONSE_AUTH_LENGTH);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* CONFIG_TPM_AUTH_SESSIONS */
|
||||
|
||||
@@ -452,12 +452,12 @@ Most of these are indicated by a TODO in the code.
|
||||
|
||||
It would be nice if this could handle the In-reply-to side of things.
|
||||
|
||||
The tests are incomplete, as is customary. Use the -t flag to run them,
|
||||
and make sure you are in the tools/scripts/patman directory first:
|
||||
The tests are incomplete, as is customary. Use the --test flag to run them,
|
||||
and make sure you are in the tools/patman directory first:
|
||||
|
||||
$ cd /path/to/u-boot
|
||||
$ cd tools/scripts/patman
|
||||
$ patman -t
|
||||
$ cd tools/patman
|
||||
$ ./patman --test
|
||||
|
||||
Error handling doesn't always produce friendly error messages - e.g.
|
||||
putting an incorrect tag in a commit may provide a confusing message.
|
||||
|
||||
Reference in New Issue
Block a user