qca: Moving board initialization routines to a common file

Adding a common file board_init.c and moving board initialization
related routines here to keep them generic.

Change-Id: I0694d8db9d7c5a7f745c623d12551bf112f11b78
Signed-off-by: Gokul Sriram Palanisamy <gpalan@codeaurora.org>
This commit is contained in:
Gokul Sriram Palanisamy 2016-08-23 18:39:34 +05:30
parent 03787a3b82
commit 35ee65208c
6 changed files with 249 additions and 227 deletions

View file

@ -1,2 +1,3 @@
obj-y := cmd_bootqca.o
obj-y += fdt_info.o
obj-y += board_init.o

View file

@ -0,0 +1,223 @@
/*
* Copyright (c) 2016 The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
* only version 2 as published by the Free Software Foundation.
*
* 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.
*/
#include <common.h>
#include <environment.h>
#include <asm/arch-qcom-common/smem.h>
#include <asm/arch-qcom-common/uart.h>
#include <asm/arch-qcom-common/gpio.h>
#include <fdtdec.h>
DECLARE_GLOBAL_DATA_PTR;
extern int nand_env_device;
extern env_t *nand_env_ptr;
extern char *nand_env_name_spec;
extern int nand_saveenv(void);
#ifdef CONFIG_QCA_MMC
extern env_t *mmc_env_ptr;
extern char *mmc_env_name_spec;
extern int mmc_saveenv(void);
#endif
env_t *env_ptr;
char *env_name_spec;
int (*saveenv)(void);
loff_t board_env_offset;
loff_t board_env_range;
loff_t board_env_size;
int board_init(void)
{
int ret;
uint32_t start_blocks;
uint32_t size_blocks;
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
gd->bd->bi_boot_params = QCA_BOOT_PARAMS_ADDR;
gd->bd->bi_arch_number = smem_get_board_platform_type();
ret = smem_get_boot_flash(&sfi->flash_type,
&sfi->flash_index,
&sfi->flash_chip_select,
&sfi->flash_block_size,
&sfi->flash_density);
if (ret < 0) {
printf("cdp: get boot flash failed\n");
return ret;
}
/*
* Should be inited, before env_relocate() is called,
* since env. offset is obtained from SMEM.
*/
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
ret = smem_ptable_init();
if (ret < 0) {
printf("cdp: SMEM init failed\n");
return ret;
}
}
switch (sfi->flash_type) {
case SMEM_BOOT_NAND_FLASH:
nand_env_device = CONFIG_QPIC_NAND_NAND_INFO_IDX;
break;
case SMEM_BOOT_SPI_FLASH:
nand_env_device = CONFIG_IPQ_SPI_NOR_INFO_IDX;
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) {
printf("cdp: get environment part failed\n");
return ret;
}
board_env_offset = ((loff_t) sfi->flash_block_size) * start_blocks;
board_env_size = ((loff_t) sfi->flash_block_size) * size_blocks;
}
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);
break;
case SMEM_BOOT_SPI_FLASH:
board_env_range = board_env_size;
BUG_ON(board_env_size > CONFIG_ENV_SIZE_MAX);
break;
#ifdef CONFIG_QCA_MMC
case SMEM_BOOT_MMC_FLASH:
board_env_range = CONFIG_ENV_SIZE_MAX;
break;
#endif
default:
printf("BUG: unsupported flash type : %d\n", sfi->flash_type);
BUG();
}
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
saveenv = nand_saveenv;
env_ptr = nand_env_ptr;
env_name_spec = nand_env_name_spec;
#ifdef CONFIG_QCA_MMC
} else {
saveenv = mmc_saveenv;
env_ptr = mmc_env_ptr;
env_name_spec = mmc_env_name_spec;
#endif
}
return 0;
}
void get_kernel_fs_part_details(void)
{
int ret, i;
uint32_t start; /* block number */
uint32_t size; /* no. of blocks */
qca_smem_flash_info_t *smem = &qca_smem_flash_info;
struct { char *name; qca_part_entry_t *part; } entries[] = {
{ "0:HLOS", &smem->hlos },
{ "rootfs", &smem->rootfs },
};
for (i = 0; i < ARRAY_SIZE(entries); i++) {
ret = smem_getpart(entries[i].name, &start, &size);
if (ret < 0) {
qca_part_entry_t *part = entries[i].part;
debug("cdp: get part failed for %s\n", entries[i].name);
part->offset = 0xBAD0FF5E;
part->size = 0xBAD0FF5E;
} else {
qca_set_part_entry(entries[i].name, smem, entries[i].part, start, size);
}
}
return;
}
/*
* This function is called in the very beginning.
* Retreive the machtype info from SMEM and map the board specific
* parameters. Shared memory region at Dram address 0x40400000
* contains the machine id/ board type data polulated by SBL.
*/
int board_early_init_f(void)
{
return 0;
}
int board_late_init(void)
{
unsigned int machid;
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
get_kernel_fs_part_details();
}
/* get machine type from SMEM and set in env */
machid = gd->bd->bi_arch_number;
printf("machid: %x\n", machid);
if (machid != 0) {
setenv_addr("machid", (void *)machid);
gd->bd->bi_arch_number = machid;
}
return 0;
}
int dram_init(void)
{
struct smem_ram_ptable rtable;
int i;
int mx = ARRAY_SIZE(rtable.parts);
if (smem_ram_ptable_init(&rtable) > 0) {
gd->ram_size = 0;
for (i = 0; i < mx; i++) {
if (rtable.parts[i].category == RAM_PARTITION_SDRAM &&
rtable.parts[i].type == RAM_PARTITION_SYS_MEMORY) {
gd->ram_size += rtable.parts[i].size;
}
}
} else {
gd->ram_size = fdtdec_get_uint(gd->fdt_blob, 0, "ddr_size", 256);
gd->ram_size <<= 20;
}
return 0;
}
void enable_caches(void)
{
icache_enable();
}
void disable_caches(void)
{
icache_disable();
}
void clear_l2cache_err(void)
{
return;
}

View file

@ -12,12 +12,10 @@
*/
#include <common.h>
#include <asm/global_data.h>
#include <asm/io.h>
#include <asm/errno.h>
#include <environment.h>
#include <configs/ipq40xx.h>
#include "ipq40xx.h"
#include <nand.h>
#include <part.h>
#include <asm/arch-qcom-common/smem.h>
@ -33,26 +31,17 @@ DECLARE_GLOBAL_DATA_PTR;
qca_mmc mmc_host;
loff_t board_env_offset;
loff_t board_env_range;
loff_t board_env_size;
extern int nand_env_device;
char *env_name_spec;
extern char *nand_env_name_spec;
int (*saveenv)(void);
env_t *env_ptr;
extern env_t *nand_env_ptr;
extern loff_t board_env_offset;
extern loff_t board_env_range;
extern loff_t board_env_size;
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);
extern int mmc_env_init(void);
extern void mmc_env_relocate_spec(void);
extern int mmc_saveenv(void);
extern env_t *mmc_env_ptr;
extern char *mmc_env_name_spec;
/*
* Don't have this as a '.bss' variable. The '.bss' and '.rel.dyn'
@ -87,7 +76,6 @@ extern char *mmc_env_name_spec;
#define BOOT_VERSION 0
#define TZ_VERSION 1
int env_init(void)
{
int ret;
@ -133,143 +121,6 @@ void env_relocate_spec(void)
};
int board_init(void)
{
int ret;
uint32_t start_blocks;
uint32_t size_blocks;
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
gd->bd->bi_boot_params = QCA_BOOT_PARAMS_ADDR;
gd->bd->bi_arch_number = smem_get_board_platform_type();
ret = smem_get_boot_flash(&sfi->flash_type,
&sfi->flash_index,
&sfi->flash_chip_select,
&sfi->flash_block_size,
&sfi->flash_density);
if (ret < 0) {
printf("cdp: get boot flash failed\n");
return ret;
}
/*
* Should be inited, before env_relocate() is called,
* since env. offset is obtained from SMEM.
*/
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
ret = smem_ptable_init();
if (ret < 0) {
printf("cdp: SMEM init failed\n");
return ret;
}
}
switch (sfi->flash_type) {
case SMEM_BOOT_NAND_FLASH:
nand_env_device = CONFIG_QPIC_NAND_NAND_INFO_IDX;
break;
case SMEM_BOOT_SPI_FLASH:
nand_env_device = CONFIG_IPQ_SPI_NOR_INFO_IDX;
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) {
printf("cdp: get environment part failed\n");
return ret;
}
board_env_offset = ((loff_t) sfi->flash_block_size) * start_blocks;
board_env_size = ((loff_t) sfi->flash_block_size) * size_blocks;
}
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);
break;
case SMEM_BOOT_SPI_FLASH:
board_env_range = board_env_size;
BUG_ON(board_env_size > CONFIG_ENV_SIZE_MAX);
break;
#ifdef CONFIG_QCA_MMC
case SMEM_BOOT_MMC_FLASH:
board_env_range = CONFIG_ENV_SIZE_MAX;
break;
#endif
default:
printf("BUG: unsupported flash type : %d\n", sfi->flash_type);
BUG();
}
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
saveenv = nand_saveenv;
env_ptr = nand_env_ptr;
env_name_spec = nand_env_name_spec;
#ifdef CONFIG_QCA_MMC
} else {
saveenv = mmc_saveenv;
env_ptr = mmc_env_ptr;
env_name_spec = mmc_env_name_spec;
#endif
}
return 0;
}
void qca_get_part_details(void)
{
int ret, i;
uint32_t start; /* block number */
uint32_t size; /* no. of blocks */
qca_smem_flash_info_t *smem = &qca_smem_flash_info;
struct { char *name; qca_part_entry_t *part; } entries[] = {
{ "0:HLOS", &smem->hlos },
{ "rootfs", &smem->rootfs },
};
for (i = 0; i < ARRAY_SIZE(entries); i++) {
ret = smem_getpart(entries[i].name, &start, &size);
if (ret < 0) {
qca_part_entry_t *part = entries[i].part;
debug("cdp: get part failed for %s\n", entries[i].name);
part->offset = 0xBAD0FF5E;
part->size = 0xBAD0FF5E;
} else {
qca_set_part_entry(entries[i].name, smem, entries[i].part, start, size);
}
}
return;
}
int board_late_init(void)
{
unsigned int machid;
qca_smem_flash_info_t *sfi = &qca_smem_flash_info;
if (sfi->flash_type != SMEM_BOOT_MMC_FLASH) {
qca_get_part_details();
}
/* get machine type from SMEM and set in env */
machid = gd->bd->bi_arch_number;
printf("machid: %x\n", machid);
if (machid != 0) {
setenv_addr("machid", (void *)machid);
gd->bd->bi_arch_number = machid;
}
return 0;
}
void qca_serial_init(struct ipq_serial_platdata *plat)
{
int node;
@ -282,27 +133,6 @@ void qca_serial_init(struct ipq_serial_platdata *plat)
qca_gpio_init(node);
}
/*
* This function is called in the very beginning.
* Retreive the machtype info from SMEM and map the board specific
* parameters. Shared memory region at Dram address 0x40400000
* contains the machine id/ board type data polulated by SBL.
*/
int board_early_init_f(void)
{
return 0;
}
void enable_caches(void)
{
icache_enable();
}
void clear_l2cache_err(void)
{
return;
}
void reset_cpu(ulong addr)
{
}
@ -318,34 +148,12 @@ static void reset_crashdump(void)
sizeof(magic_cookie), NULL, 0);
}
int dram_init(void)
{
struct smem_ram_ptable rtable;
int i;
int mx = ARRAY_SIZE(rtable.parts);
if (smem_ram_ptable_init(&rtable) > 0) {
gd->ram_size = 0;
for (i = 0; i < mx; i++) {
if (rtable.parts[i].category == RAM_PARTITION_SDRAM &&
rtable.parts[i].type == RAM_PARTITION_SYS_MEMORY) {
gd->ram_size += rtable.parts[i].size;
}
}
} else {
gd->ram_size = fdtdec_get_uint(gd->fdt_blob, 0, "ddr_size", 256);
gd->ram_size *= (1024 * 1024);
}
return 0;
}
void board_nand_init(void)
{
struct qpic_nand_init_config config;
int node, gpio_node;
fdt_addr_t nand_base;
node = fdtdec_next_compatible(gd->fdt_blob, 0,
COMPAT_QCOM_QPIC_NAND_V1_4_20);

View file

@ -15,8 +15,6 @@
#include <asm/global_data.h>
#include <asm/io.h>
#include <environment.h>
#include "ipq807x.h"
#include <asm/arch-qcom-common/qca_common.h>
#include <asm/arch-qcom-common/qpic_nand.h>
#include <asm/arch-qcom-common/uart.h>
@ -27,32 +25,11 @@ DECLARE_GLOBAL_DATA_PTR;
qca_mmc mmc_host;
void enable_caches(void)
{
icache_enable();
}
void disable_caches(void)
{
icache_disable();
}
int board_init(void)
{
return 0;
}
void qca_serial_init(struct ipq_serial_platdata *plat)
{
writel(1, GCC_BLSP1_UART1_APPS_CBCR);
}
int dram_init(void)
{
gd->ram_size = CONFIG_SYS_SDRAM_SIZE;
return 0;
}
unsigned long timer_read_counter(void)
{
return 0;

View file

@ -393,8 +393,8 @@ ulong getenv_hex(const char *varname, ulong default_val);
* Return -1 if variable does not exist (default to true)
*/
int getenv_yesno(const char *var);
#ifdef CONFIG_IPQ40XX_ENV
extern int (*saveenv)(void);
#if defined(CONFIG_IPQ40XX_ENV) || defined(CONFIG_IPQ807X_ENV)
extern int (*saveenv)(void);
#else
int saveenv (void);
#endif

View file

@ -36,12 +36,6 @@
#define CONFIG_SKIP_LOWLEVEL_INIT
#define CONFIG_SYS_BOOTM_LEN (64 << 20)
#define CONFIG_ENV_SIZE 0x2000
#define CONFIG_ENV_SIZE_MAX (256 << 10) /* 256 KB */
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE_MAX + (256 << 10))
#define CONFIG_ENV_IS_NOWHERE 1
#define HAVE_BLOCK_DEVICE
/*
* Size of malloc() pool
@ -96,9 +90,27 @@
#define CONFIG_MAX_RAM_BANK_SIZE CONFIG_SYS_SDRAM_SIZE
#define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_SDRAM_BASE + (64 << 20))
#define QCA_KERNEL_START_ADDR CONFIG_SYS_SDRAM_BASE
#define QCA_DRAM_KERNEL_SIZE CONFIG_SYS_SDRAM_SIZE
#define QCA_BOOT_PARAMS_ADDR (QCA_KERNEL_START_ADDR + 0x100)
#define CONFIG_OF_COMBINE 1
#define CONFIG_QCA_SMEM_BASE 0x4AB00000
#ifndef __ASSEMBLY__
#include <compiler.h>
extern loff_t board_env_offset;
#endif
#define CONFIG_IPQ807X_ENV 1
#define CONFIG_ENV_OFFSET board_env_offset
#define CONFIG_ENV_SIZE 0x2000
#define CONFIG_ENV_SIZE_MAX (256 << 10) /* 256 KB */
#define CONFIG_SYS_MALLOC_LEN (CONFIG_ENV_SIZE_MAX + (256 << 10))
#define CONFIG_ENV_IS_IN_NAND 1
/*
* SPI Flash Configs
*/
@ -141,6 +153,7 @@
#define CONFIG_IPQ_NAND_NAND_INFO_IDX 0
#define CONFIG_QPIC_NAND_NAND_INFO_IDX 0
#define CONFIG_IPQ_SPI_NOR_INFO_IDX 2
#define CONFIG_SCM_TZ64 1
/*