ipq4019: Enabling qca common bootipq command

Change-Id: Ia5c3e996142dfdc194f0ed2f4bbe860b586a4139
Signed-off-by: Gokul Sriram Palanisamy <gpalan@codeaurora.org>
This commit is contained in:
Gokul Sriram Palanisamy 2016-07-06 21:57:33 +05:30
parent 2230d5482d
commit 4a358cb07e
11 changed files with 183 additions and 68 deletions

View file

@ -3,3 +3,4 @@ ccflags-y += -I$(srctree)/board/qca/ipq40xx/
obj-y := smem.o
obj-y += timer.o
obj-y += scm.o
obj-y += cmd_bootqca.o

View file

@ -11,18 +11,18 @@
* GNU General Public License for more details.
*/
#include <configs/ipq40xx_cdp.h>
#include <configs/ipq40xx.h>
#include <common.h>
#include <command.h>
#include <image.h>
#include <nand.h>
#include <errno.h>
#include <asm/arch-ipq40xx/scm.h>
#include <asm/arch-qcom-common/scm.h>
#include <part.h>
#include <linux/mtd/ubi.h>
#include <asm/arch-ipq40xx/smem.h>
#include <asm/arch-qcom-common/smem.h>
#include <mmc.h>
#include "ipq40xx_cdp.h"
#include "ipq40xx.h"
#define DLOAD_MAGIC_COOKIE0x10
#define XMK_STR(x)#x
@ -93,7 +93,7 @@ static int set_fs_bootargs(int *fs_on_nand)
char *bootargs;
unsigned int active_part = 0;
#define nand_rootfs"ubi.mtd=" QCA_ROOT_FS_PART_NAME " root=mtd:ubi_rootfs rootfstype=squashfs"
#define nand_rootfs "ubi.mtd=" QCA_ROOT_FS_PART_NAME " root=mtd:ubi_rootfs rootfstype=squashfs"
if (sfi->flash_type == SMEM_BOOT_SPI_FLASH) {
if (((sfi->rootfs.offset == 0xBAD0FF5E) &&
@ -258,8 +258,8 @@ static int do_boot_signedimg(cmd_tbl_t *cmdtp, int flag, int argc, char *const a
*/
snprintf(runcmd, sizeof(runcmd),
"nand device %d && "
"set mtdids nand%d=nand%d && "
"set mtdparts mtdparts=nand%d:0x%llx@0x%llx(fs),${msmparts} && "
"setenv mtdids nand%d=nand%d && "
"setenv mtdparts mtdparts=nand%d:0x%llx@0x%llx(fs),${msmparts} && "
"ubi part fs && "
"ubi read 0x%x kernel && ", gboard_param->spi_nand_available,
gboard_param->spi_nand_available,
@ -420,8 +420,8 @@ static int do_boot_unsignedimg(cmd_tbl_t *cmdtp, int flag, int argc, char *const
}
snprintf(runcmd, sizeof(runcmd),
"set mtdids nand0=nand0 && "
"set mtdparts mtdparts=nand0:0x%llx@0x%llx(fs),${msmparts} && "
"setenv mtdids nand0=nand0 && "
"setenv mtdparts mtdparts=nand0:0x%llx@0x%llx(fs),${msmparts} && "
"ubi part fs && "
"ubi read 0x%x kernel && ",
sfi->rootfs.size, sfi->rootfs.offset,
@ -436,8 +436,8 @@ static int do_boot_unsignedimg(cmd_tbl_t *cmdtp, int flag, int argc, char *const
}
snprintf(runcmd, sizeof(runcmd),
"nand device %d && "
"set mtdids nand%d=nand%d && "
"set mtdparts mtdparts=nand%d:0x%llx@0x%llx(fs),${msmparts} && "
"setenv mtdids nand%d=nand%d && "
"setenv mtdparts mtdparts=nand%d:0x%llx@0x%llx(fs),${msmparts} && "
"ubi part fs && "
"ubi read 0x%x kernel && ",
gboard_param->spi_nand_available,
@ -535,7 +535,7 @@ static int do_bootipq(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
* set fdt_high parameter so that u-boot will not load
* dtb above CONFIG_IPQ40XX_FDT_HIGH region.
*/
if (run_command("set fdt_high " MK_STR(CONFIG_IPQ_FDT_HIGH) "\n", 0)
if (run_command("setenv fdt_high " MK_STR(CONFIG_IPQ_FDT_HIGH) "\n", 0)
!= CMD_RET_SUCCESS) {
return CMD_RET_FAILURE;
}

View file

@ -61,24 +61,6 @@ struct qca_platfrom {
unsigned foundry_id;
};
typedef enum {
SMEM_SPINLOCK_ARRAY = 7,
SMEM_AARM_PARTITION_TABLE = 9,
SMEM_HW_SW_BUILD_ID = 137,
SMEM_USABLE_RAM_PARTITION_TABLE = 402,
SMEM_POWER_ON_STATUS_INFO = 403,
SMEM_IMAGE_VERSION_TABLE = 469,
SMEM_BOOT_FLASH_TYPE = 478,
SMEM_BOOT_FLASH_INDEX = 479,
SMEM_BOOT_FLASH_CHIP_SELECT = 480,
SMEM_BOOT_FLASH_BLOCK_SIZE = 481,
SMEM_BOOT_FLASH_DENSITY = 482,
SMEM_PARTITION_TABLE_OFFSET = 483,
SMEM_FIRST_VALID_TYPE = SMEM_SPINLOCK_ARRAY,
SMEM_LAST_VALID_TYPE = SMEM_PARTITION_TABLE_OFFSET,
SMEM_MAX_SIZE = SMEM_PARTITION_TABLE_OFFSET + 1,
} smem_mem_type_t;
struct smem_proc_comm {
unsigned command;
unsigned status;
@ -225,6 +207,22 @@ int smem_ptable_init(void)
return 0;
}
/*
* smem_bootconfig_info - retrieve bootconfig flags
*/
int smem_bootconfig_info(void)
{
unsigned ret;
ret = smem_read_alloc_entry(SMEM_BOOT_DUALPARTINFO,
&qca_smem_bootconfig_info, sizeof(qca_smem_bootconfig_info_t));
if ((ret != 0) || (qca_smem_bootconfig_info.magic
!= _SMEM_DUAL_BOOTINFO_MAGIC))
return -ENOMSG;
return 0;
}
unsigned int get_rootfs_active_partition(void)
{
int i;
@ -252,7 +250,7 @@ unsigned int get_partition_table_offset(void)
return primary_mibib;
}
/**
/*
* smem_getpart - retreive partition start and size
* @part_name: partition name
* @start: location where the start offset is to be stored
@ -282,7 +280,7 @@ int smem_getpart(char *part_name, uint32_t *start, uint32_t *size)
return 0;
}
/**
/*
* smem_get_boot_flash - retreive the boot flash info
* @flash_type: location where the flash type is to be stored
* @flash_index: location where the flash index is to be stored
@ -369,7 +367,7 @@ unsigned int smem_get_board_platform_type()
return machid;
}
/**
/*
* smem_ptable_init - initializes RAM partition table from SMEM
*
*/
@ -394,8 +392,41 @@ int smem_ram_ptable_init(struct smem_ram_ptable *smem_ram_ptable)
return 1;
}
/*
* get nand block size by device id.
* dev_id is 0 for parallel nand.
* dev_id is 1 for spi nand.
*/
uint32_t get_nand_block_size(uint8_t dev_id)
{
struct mtd_info *mtd;
mtd = &nand_info[dev_id];
return mtd->erasesize;
}
/*
* get flash block size based on partition name.
*/
static inline uint32_t get_flash_block_size(char *name,
qca_smem_flash_info_t *smem)
{
return (get_which_flash_param(name) == 1) ?
get_nand_block_size(0)
: smem->flash_block_size;
}
#define part_which_flash(p) (((p)->attr & 0xff000000) >> 24)
static inline uint32_t get_part_block_size(struct smem_ptn *p,
qca_smem_flash_info_t *sfi)
{
return (part_which_flash(p) == 1) ?
get_nand_block_size(0)
: sfi->flash_block_size;
}
void qca_set_part_entry(char *name, qca_smem_flash_info_t *smem,
qca_part_entry_t *part, uint32_t start, uint32_t size)
{
@ -408,14 +439,12 @@ uint32_t qca_smem_get_flash_block_size(void)
return qca_smem_flash_info.flash_block_size;
}
char *qca_smem_part_to_mtdparts(char *mtdid)
void qca_smem_part_to_mtdparts(char *mtdid)
{
#if 0
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
int i, l;
int device_id = 0;
char *part = parts, *unit;
char *part = mtdid, *unit;
int init = 0;
uint32_t bsize;
@ -427,7 +456,7 @@ char *qca_smem_part_to_mtdparts(char *mtdid)
bsize = get_part_block_size(p, sfi);
if (part_which_flash(p) && init == 0) {
device_id = (gboard_param->spi_nand_available == 1) ? 1 : 0;
device_id = 0; /* Hard coded as gboard_param is to be removed and nand is not enabled yet */
l = sprintf(part, ";nand%d:", device_id);
part += l;
init = 1;
@ -459,13 +488,9 @@ char *qca_smem_part_to_mtdparts(char *mtdid)
}
if (i == 0)
return NULL;
mtdid = NULL;
*part = 0; /* Remove the trailing comma */
return parts;
#endif
return NULL; //fix_me
*(part-1) = 0; /* Remove the trailing ',' character */
}
/*

View file

@ -142,6 +142,6 @@ extern qca_smem_bootconfig_info_t qca_smem_bootconfig_info;
int smem_bootconfig_info(void);
unsigned int get_rootfs_active_partition(void);
unsigned int get_mibib_active_partition(void);
char *qca_smem_part_to_mtdparts(char *mtdid);
void qca_smem_part_to_mtdparts(char *mtdid);
#endif

View file

@ -22,6 +22,8 @@
#include <nand.h>
#include <part.h>
#include <asm/arch-qcom-common/smem.h>
#include <asm/arch-qcom-common/scm.h>
#include <jffs2/load_kernel.h>
DECLARE_GLOBAL_DATA_PTR;
@ -38,6 +40,8 @@ extern int nand_env_init(void);
extern int nand_saveenv(void);
extern void nand_env_relocate_spec(void);
extern int ipq_spi_init(u16);
extern int fdt_node_set_part_info(void *blob, int parent_offset,
struct mtd_device *dev);
/*
* Don't have this as a '.bss' variable. The '.bss' and '.rel.dyn'
* sections seem to overlap.
@ -169,16 +173,21 @@ int board_init(void)
return ret;
}
}
if (sfi->flash_type == SMEM_BOOT_NAND_FLASH) {
switch (sfi->flash_type) {
case SMEM_BOOT_NAND_FLASH:
nand_env_device = CONFIG_QPIC_NAND_NAND_INFO_IDX;
} else if (sfi->flash_type == SMEM_BOOT_SPI_FLASH) {
break;
case SMEM_BOOT_SPI_FLASH:
nand_env_device = CONFIG_IPQ_SPI_NOR_INFO_IDX;
} else if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
break;
case SMEM_BOOT_MMC_FLASH:
break;
default:
printf("BUG: unsupported flash type : %d\n", sfi->flash_type);
BUG();
}
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
ret = smem_getpart("0:APPSBLENV", &start_blocks, &size_blocks);
if (ret < 0) {
@ -190,19 +199,23 @@ int board_init(void)
board_env_size = ((loff_t) sfi->flash_block_size) * size_blocks;
}
if (sfi->flash_type == SMEM_BOOT_NAND_FLASH) {
switch (sfi->flash_type) {
case SMEM_BOOT_NAND_FLASH:
board_env_range = CONFIG_ENV_SIZE_MAX;
BUG_ON(board_env_size < CONFIG_ENV_SIZE_MAX);
} else if (sfi->flash_type == SMEM_BOOT_SPI_FLASH) {
BUG_ON(board_env_size < CONFIG_ENV_SIZE_MAX);
break;
case SMEM_BOOT_SPI_FLASH:
board_env_range = board_env_size;
BUG_ON(board_env_size > CONFIG_ENV_SIZE_MAX);
BUG_ON(board_env_size > CONFIG_ENV_SIZE_MAX);
break;
#ifdef CONFIG_QCA_MMC
} else if (sfi->flash_type == SMEM_BOOT_MMC_FLASH) {
case SMEM_BOOT_MMC_FLASH:
board_env_range = CONFIG_ENV_SIZE_MAX;
break;
#endif
} else {
default:
printf("BUG: unsupported flash type : %d\n", sfi->flash_type);
BUG();
BUG();
}
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
@ -293,6 +306,17 @@ void reset_cpu(ulong addr)
{
}
static void reset_crashdump(void)
{
unsigned int magic_cookie = CLEAR_MAGIC;
unsigned int clear_info[] =
{ 1 /* Disable wdog debug */, 0 /* SDI enable*/, };
scm_call(SCM_SVC_BOOT, SCM_CMD_TZ_CONFIG_HW_FOR_RAM_DUMP_ID,
(const void *)&clear_info, sizeof(clear_info), NULL, 0);
scm_call(SCM_SVC_BOOT, SCM_CMD_TZ_FORCE_DLOAD_ID, &magic_cookie,
sizeof(magic_cookie), NULL, 0);
}
int dram_init(void)
{
struct smem_ram_ptable rtable;
@ -502,12 +526,12 @@ void ipq_fdt_fixup_mtdparts(void *blob, struct flash_node_info *ni)
* By default, u-boot will walk the dram bank info and populate the /memory
* node; here, overwrite this behavior so we describe all of memory instead.
*/
void ft_board_setup(void *blob, bd_t *bd)
int ft_board_setup(void *blob, bd_t *bd)
{
u64 memory_start = CONFIG_SYS_SDRAM_BASE;
u64 memory_size = gboard_param->ddr_size;
char *mtdparts = NULL;
char parts_str[256];
char parts_str[4096];
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
struct flash_node_info nodes[] = {
{ "qcom,msm-nand", MTD_DEV_TYPE_NAND, 0 },
@ -522,7 +546,8 @@ void ft_board_setup(void *blob, bd_t *bd)
ipq_fdt_mem_rsvd_fixup(blob);
#endif
if (sfi->flash_type == SMEM_BOOT_NAND_FLASH) {
mtdparts = "mtdparts=nand0";
sprintf(parts_str, "mtdparts=nand0");
mtdparts = parts_str;
} else if (sfi->flash_type == SMEM_BOOT_SPI_FLASH) {
/* Patch NOR block size and density for
* generic probe case */
@ -532,22 +557,19 @@ void ft_board_setup(void *blob, bd_t *bd)
sprintf(parts_str,
"mtdparts=nand1:0x%x@0(rootfs);spi0.0",
IPQ_NAND_ROOTFS_SIZE);
mtdparts = parts_str;
} else if (gboard_param->nor_nand_available &&
get_which_flash_param("rootfs") == 0) {
sprintf(parts_str,
"mtdparts=nand0:0x%x@0(rootfs);spi0.0",
IPQ_NAND_ROOTFS_SIZE);
mtdparts = parts_str;
} else {
mtdparts = "mtdparts=spi0.0";
sprintf(parts_str, "mtdparts=spi0.0");
}
mtdparts = parts_str;
}
if (mtdparts) {
mtdparts = qca_smem_part_to_mtdparts(mtdparts);
qca_smem_part_to_mtdparts(mtdparts);
if (mtdparts != NULL) {
debug("mtdparts = %s\n", mtdparts);
setenv("mtdparts", mtdparts);
@ -557,13 +579,12 @@ void ft_board_setup(void *blob, bd_t *bd)
ipq_fdt_fixup_mtdparts(blob, nodes);
}
dcache_disable();
ipq40xx_set_ethmac_addr();
fdt_fixup_ethernet(blob);
#ifdef CONFIG_QCA_MMC
board_mmc_deinit();
#endif
return 0;
}
#endif /* CONFIG_OF_BOARD_SETUP */

View file

@ -116,6 +116,25 @@ typedef struct {
const char *dtb_config_name[MAX_CONF_NAME];
} __attribute__ ((__packed__)) board_ipq40xx_params_t;
typedef enum {
SMEM_SPINLOCK_ARRAY = 7,
SMEM_AARM_PARTITION_TABLE = 9,
SMEM_HW_SW_BUILD_ID = 137,
SMEM_USABLE_RAM_PARTITION_TABLE = 402,
SMEM_POWER_ON_STATUS_INFO = 403,
SMEM_IMAGE_VERSION_TABLE = 469,
SMEM_BOOT_FLASH_TYPE = 478,
SMEM_BOOT_FLASH_INDEX = 479,
SMEM_BOOT_FLASH_CHIP_SELECT = 480,
SMEM_BOOT_FLASH_BLOCK_SIZE = 481,
SMEM_BOOT_FLASH_DENSITY = 482,
SMEM_PARTITION_TABLE_OFFSET = 483,
SMEM_BOOT_DUALPARTINFO = 484,
SMEM_FIRST_VALID_TYPE = SMEM_SPINLOCK_ARRAY,
SMEM_LAST_VALID_TYPE = SMEM_PARTITION_TABLE_OFFSET,
SMEM_MAX_SIZE = SMEM_PARTITION_TABLE_OFFSET + 1,
} smem_mem_type_t;
extern board_ipq40xx_params_t *gboard_param;
unsigned int get_board_index(unsigned int machid);
void qca_configure_gpio(gpio_func_data_t *gpio, uint count);

View file

@ -28,4 +28,23 @@
#define GCC_SDCC1_APPS_N 0x1842010
#define GCC_SDCC1_APPS_D 0x1842014
typedef enum {
SMEM_SPINLOCK_ARRAY = 7,
SMEM_AARM_PARTITION_TABLE = 9,
SMEM_HW_SW_BUILD_ID = 137,
SMEM_USABLE_RAM_PARTITION_TABLE = 402,
SMEM_POWER_ON_STATUS_INFO = 403,
SMEM_IMAGE_VERSION_TABLE = 469,
SMEM_BOOT_FLASH_TYPE = 478,
SMEM_BOOT_FLASH_INDEX = 479,
SMEM_BOOT_FLASH_CHIP_SELECT = 480,
SMEM_BOOT_FLASH_BLOCK_SIZE = 481,
SMEM_BOOT_FLASH_DENSITY = 482,
SMEM_PARTITION_TABLE_OFFSET = 483,
SMEM_BOOT_DUALPARTINFO = 484,
SMEM_FIRST_VALID_TYPE = SMEM_SPINLOCK_ARRAY,
SMEM_LAST_VALID_TYPE = SMEM_PARTITION_TABLE_OFFSET,
SMEM_MAX_SIZE = SMEM_PARTITION_TABLE_OFFSET + 1,
} smem_mem_type_t;
#endif /* _IPQ807X_H_ */

View file

@ -327,6 +327,17 @@ int ubi_volume_write(char *volume, void *buf, size_t size)
return ubi_volume_begin_write(volume, buf, size, size);
}
long long ubi_get_volume_size(char *volume)
{
struct ubi_volume *vol;
vol = ubi_find_volume(volume);
if (vol == NULL)
return -ENODEV;
return vol->used_bytes;
}
int ubi_volume_read(char *volume, char *buf, size_t size)
{
int err, lnum, off, len, tbuf_size;

View file

@ -27,6 +27,13 @@ typedef volatile unsigned char vu_char;
#if defined(CONFIG_PCI) && defined(CONFIG_4xx)
#include <pci.h>
#endif
#if defined(CONFIG_IPQ40XX)
#include <../board/qca/ipq40xx/ipq40xx.h>
#elif defined(CONFIG_IPQ_RUMI)
#include <../board/qca/ipq807x/ipq807x.h>
#endif
#if defined(CONFIG_8xx)
#include <asm/8xx_immap.h>
#if defined(CONFIG_MPC859) || defined(CONFIG_MPC859T) || \

View file

@ -138,6 +138,9 @@ typedef struct {
#define CONFIG_QPIC_NAND_NAND_INFO_IDX 0
#define CONFIG_IPQ_SPI_NAND_INFO_IDX 1
#define CONFIG_IPQ_SPI_NOR_INFO_IDX 2
#define QCA_ROOT_FS_PART_NAME "rootfs"
/*
* SPI Flash Configs
*/
@ -171,7 +174,15 @@ typedef struct {
#define CONFIG_MTD_PARTITIONS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_BOOTCOMMAND "bootipq"
#define CONFIG_CMD_UBI
#define CONFIG_RBTREE
#define CONFIG_CMD_BOOTZ
#define CONFIG_SYS_BOOTM_LEN (64 << 20)
#define CONFIG_IPQ_FDT_HIGH 0x87000000
#define CONFIG_OF_BOARD_SETUP 1
#define CONFIG_FDT_FIXUP_PARTITIONS
#define CONFIG_BOOTCOMMAND "bootipq"
#define CONFIG_BOOTDELAY 2
#endif /* _IPQ40XX_H */

View file

@ -228,6 +228,7 @@ struct ubi_notification {
/* UBI descriptor given to users when they open UBI volumes */
struct ubi_volume_desc;
long long ubi_get_volume_size(char *volume);
int ubi_get_device_info(int ubi_num, struct ubi_device_info *di);
void ubi_get_volume_info(struct ubi_volume_desc *desc,
struct ubi_volume_info *vi);