137fc0ed2SRob Herring /* 237fc0ed2SRob Herring * Copyright 2010-2011 Calxeda, Inc. 337fc0ed2SRob Herring * 41a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 537fc0ed2SRob Herring */ 637fc0ed2SRob Herring 737fc0ed2SRob Herring #include <common.h> 837fc0ed2SRob Herring #include <ahci.h> 9bd0d90efSRob Herring #include <netdev.h> 1037fc0ed2SRob Herring #include <scsi.h> 1137fc0ed2SRob Herring 121ace4022SAlexey Brodkin #include <linux/sizes.h> 13877012dfSRob Herring #include <asm/io.h> 1437fc0ed2SRob Herring 1576c3999dSRob Herring #define HB_AHCI_BASE 0xffe08000 1676c3999dSRob Herring 17083ffd65SRob Herring #define HB_SCU_A9_PWR_STATUS 0xfff10008 180c34e69fSRob Herring #define HB_SREG_A9_PWR_REQ 0xfff3cf00 194a3ea216SRob Herring #define HB_SREG_A9_BOOT_SRC_STAT 0xfff3cf04 2076c3999dSRob Herring #define HB_SREG_A9_PWRDOM_STAT 0xfff3cf20 21*f8973325SMark Langsdorf #define HB_SREG_A15_PWR_CTRL 0xfff3c200 2276c3999dSRob Herring 230c34e69fSRob Herring #define HB_PWR_SUSPEND 0 240c34e69fSRob Herring #define HB_PWR_SOFT_RESET 1 250c34e69fSRob Herring #define HB_PWR_HARD_RESET 2 260c34e69fSRob Herring #define HB_PWR_SHUTDOWN 3 270c34e69fSRob Herring 2876c3999dSRob Herring #define PWRDOM_STAT_SATA 0x80000000 2976c3999dSRob Herring #define PWRDOM_STAT_PCI 0x40000000 3076c3999dSRob Herring #define PWRDOM_STAT_EMMC 0x20000000 3176c3999dSRob Herring 32083ffd65SRob Herring #define HB_SCU_A9_PWR_NORMAL 0 33083ffd65SRob Herring #define HB_SCU_A9_PWR_DORMANT 2 34083ffd65SRob Herring #define HB_SCU_A9_PWR_OFF 3 35083ffd65SRob Herring 3637fc0ed2SRob Herring DECLARE_GLOBAL_DATA_PTR; 3737fc0ed2SRob Herring 3837fc0ed2SRob Herring /* 3937fc0ed2SRob Herring * Miscellaneous platform dependent initialisations 4037fc0ed2SRob Herring */ 4137fc0ed2SRob Herring int board_init(void) 4237fc0ed2SRob Herring { 4337fc0ed2SRob Herring icache_enable(); 4437fc0ed2SRob Herring 4537fc0ed2SRob Herring return 0; 4637fc0ed2SRob Herring } 4737fc0ed2SRob Herring 489a420986SRob Herring /* We know all the init functions have been run now */ 499a420986SRob Herring int board_eth_init(bd_t *bis) 509a420986SRob Herring { 519a420986SRob Herring int rc = 0; 529a420986SRob Herring 539a420986SRob Herring #ifdef CONFIG_CALXEDA_XGMAC 549a420986SRob Herring rc += calxedaxgmac_initialize(0, 0xfff50000); 559a420986SRob Herring rc += calxedaxgmac_initialize(1, 0xfff51000); 569a420986SRob Herring #endif 579a420986SRob Herring return rc; 589a420986SRob Herring } 599a420986SRob Herring 60b9463226SIan Campbell #ifdef CONFIG_SCSI_AHCI_PLAT 61b9463226SIan Campbell void scsi_init(void) 6237fc0ed2SRob Herring { 6376c3999dSRob Herring u32 reg = readl(HB_SREG_A9_PWRDOM_STAT); 644a3ea216SRob Herring 6576c3999dSRob Herring if (reg & PWRDOM_STAT_SATA) { 669efaca3eSScott Wood ahci_init((void __iomem *)HB_AHCI_BASE); 6737fc0ed2SRob Herring scsi_scan(1); 6876c3999dSRob Herring } 69b9463226SIan Campbell } 70b9463226SIan Campbell #endif 71b9463226SIan Campbell 72b9463226SIan Campbell #ifdef CONFIG_MISC_INIT_R 73b9463226SIan Campbell int misc_init_r(void) 74b9463226SIan Campbell { 75b9463226SIan Campbell char envbuffer[16]; 76b9463226SIan Campbell u32 boot_choice; 774a3ea216SRob Herring 784a3ea216SRob Herring boot_choice = readl(HB_SREG_A9_BOOT_SRC_STAT) & 0xff; 794a3ea216SRob Herring sprintf(envbuffer, "bootcmd%d", boot_choice); 804a3ea216SRob Herring if (getenv(envbuffer)) { 814a3ea216SRob Herring sprintf(envbuffer, "run bootcmd%d", boot_choice); 824a3ea216SRob Herring setenv("bootcmd", envbuffer); 834a3ea216SRob Herring } else 844a3ea216SRob Herring setenv("bootcmd", ""); 854a3ea216SRob Herring 8637fc0ed2SRob Herring return 0; 8737fc0ed2SRob Herring } 8895395023SRob Herring #endif 8937fc0ed2SRob Herring 9037fc0ed2SRob Herring int dram_init(void) 9137fc0ed2SRob Herring { 9237fc0ed2SRob Herring gd->ram_size = SZ_512M; 9337fc0ed2SRob Herring return 0; 9437fc0ed2SRob Herring } 9537fc0ed2SRob Herring 9637fc0ed2SRob Herring void dram_init_banksize(void) 9737fc0ed2SRob Herring { 9837fc0ed2SRob Herring gd->bd->bi_dram[0].start = CONFIG_SYS_SDRAM_BASE; 9937fc0ed2SRob Herring gd->bd->bi_dram[0].size = PHYS_SDRAM_1_SIZE; 10037fc0ed2SRob Herring } 10137fc0ed2SRob Herring 10276c3999dSRob Herring #if defined(CONFIG_OF_BOARD_SETUP) 103e895a4b0SSimon Glass int ft_board_setup(void *fdt, bd_t *bd) 10476c3999dSRob Herring { 10576c3999dSRob Herring static const char disabled[] = "disabled"; 10676c3999dSRob Herring u32 reg = readl(HB_SREG_A9_PWRDOM_STAT); 10776c3999dSRob Herring 10876c3999dSRob Herring if (!(reg & PWRDOM_STAT_SATA)) 10976c3999dSRob Herring do_fixup_by_compat(fdt, "calxeda,hb-ahci", "status", 11076c3999dSRob Herring disabled, sizeof(disabled), 1); 11176c3999dSRob Herring 11276c3999dSRob Herring if (!(reg & PWRDOM_STAT_EMMC)) 11376c3999dSRob Herring do_fixup_by_compat(fdt, "calxeda,hb-sdhci", "status", 11476c3999dSRob Herring disabled, sizeof(disabled), 1); 115e895a4b0SSimon Glass 116e895a4b0SSimon Glass return 0; 11776c3999dSRob Herring } 11876c3999dSRob Herring #endif 11976c3999dSRob Herring 120*f8973325SMark Langsdorf static int is_highbank(void) 121*f8973325SMark Langsdorf { 122*f8973325SMark Langsdorf uint32_t midr; 123*f8973325SMark Langsdorf 124*f8973325SMark Langsdorf asm volatile ("mrc p15, 0, %0, c0, c0, 0\n" : "=r"(midr)); 125*f8973325SMark Langsdorf 126*f8973325SMark Langsdorf return (midr & 0xfff0) == 0xc090; 127*f8973325SMark Langsdorf } 128*f8973325SMark Langsdorf 12937fc0ed2SRob Herring void reset_cpu(ulong addr) 13037fc0ed2SRob Herring { 1310c34e69fSRob Herring writel(HB_PWR_HARD_RESET, HB_SREG_A9_PWR_REQ); 132*f8973325SMark Langsdorf if (is_highbank()) 133083ffd65SRob Herring writeb(HB_SCU_A9_PWR_OFF, HB_SCU_A9_PWR_STATUS); 134*f8973325SMark Langsdorf else 135*f8973325SMark Langsdorf writel(0x1, HB_SREG_A15_PWR_CTRL); 1365bedf884SRob Herring 1375bedf884SRob Herring wfi(); 13837fc0ed2SRob Herring } 139