162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2007 David Gibson, IBM Corporation. 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Based on earlier code: 662306a36Sopenharmony_ci * Copyright (C) Paul Mackerras 1997. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Matt Porter <mporter@kernel.crashing.org> 962306a36Sopenharmony_ci * Copyright 2002-2005 MontaVista Software Inc. 1062306a36Sopenharmony_ci * 1162306a36Sopenharmony_ci * Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net> 1262306a36Sopenharmony_ci * Copyright (c) 2003, 2004 Zultys Technologies 1362306a36Sopenharmony_ci */ 1462306a36Sopenharmony_ci#include <stdarg.h> 1562306a36Sopenharmony_ci#include <stddef.h> 1662306a36Sopenharmony_ci#include "types.h" 1762306a36Sopenharmony_ci#include "elf.h" 1862306a36Sopenharmony_ci#include "string.h" 1962306a36Sopenharmony_ci#include "stdio.h" 2062306a36Sopenharmony_ci#include "page.h" 2162306a36Sopenharmony_ci#include "ops.h" 2262306a36Sopenharmony_ci#include "reg.h" 2362306a36Sopenharmony_ci#include "io.h" 2462306a36Sopenharmony_ci#include "dcr.h" 2562306a36Sopenharmony_ci#include "4xx.h" 2662306a36Sopenharmony_ci#include "44x.h" 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistatic u8 *ebony_mac0, *ebony_mac1; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci#define EBONY_FPGA_PATH "/plb/opb/ebc/fpga" 3162306a36Sopenharmony_ci#define EBONY_FPGA_FLASH_SEL 0x01 3262306a36Sopenharmony_ci#define EBONY_SMALL_FLASH_PATH "/plb/opb/ebc/small-flash" 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistatic void ebony_flashsel_fixup(void) 3562306a36Sopenharmony_ci{ 3662306a36Sopenharmony_ci void *devp; 3762306a36Sopenharmony_ci u32 reg[3] = {0x0, 0x0, 0x80000}; 3862306a36Sopenharmony_ci u8 *fpga; 3962306a36Sopenharmony_ci u8 fpga_reg0 = 0x0; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci devp = finddevice(EBONY_FPGA_PATH); 4262306a36Sopenharmony_ci if (!devp) 4362306a36Sopenharmony_ci fatal("Couldn't locate FPGA node %s\n\r", EBONY_FPGA_PATH); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci if (getprop(devp, "virtual-reg", &fpga, sizeof(fpga)) != sizeof(fpga)) 4662306a36Sopenharmony_ci fatal("%s has missing or invalid virtual-reg property\n\r", 4762306a36Sopenharmony_ci EBONY_FPGA_PATH); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci fpga_reg0 = in_8(fpga); 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci devp = finddevice(EBONY_SMALL_FLASH_PATH); 5262306a36Sopenharmony_ci if (!devp) 5362306a36Sopenharmony_ci fatal("Couldn't locate small flash node %s\n\r", 5462306a36Sopenharmony_ci EBONY_SMALL_FLASH_PATH); 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_ci if (getprop(devp, "reg", reg, sizeof(reg)) != sizeof(reg)) 5762306a36Sopenharmony_ci fatal("%s has reg property of unexpected size\n\r", 5862306a36Sopenharmony_ci EBONY_SMALL_FLASH_PATH); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci /* Invert address bit 14 (IBM-endian) if FLASH_SEL fpga bit is set */ 6162306a36Sopenharmony_ci if (fpga_reg0 & EBONY_FPGA_FLASH_SEL) 6262306a36Sopenharmony_ci reg[1] ^= 0x80000; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci setprop(devp, "reg", reg, sizeof(reg)); 6562306a36Sopenharmony_ci} 6662306a36Sopenharmony_ci 6762306a36Sopenharmony_cistatic void ebony_fixups(void) 6862306a36Sopenharmony_ci{ 6962306a36Sopenharmony_ci // FIXME: sysclk should be derived by reading the FPGA registers 7062306a36Sopenharmony_ci unsigned long sysclk = 33000000; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci ibm440gp_fixup_clocks(sysclk, 6 * 1843200); 7362306a36Sopenharmony_ci ibm4xx_sdram_fixup_memsize(); 7462306a36Sopenharmony_ci dt_fixup_mac_address_by_alias("ethernet0", ebony_mac0); 7562306a36Sopenharmony_ci dt_fixup_mac_address_by_alias("ethernet1", ebony_mac1); 7662306a36Sopenharmony_ci ibm4xx_fixup_ebc_ranges("/plb/opb/ebc"); 7762306a36Sopenharmony_ci ebony_flashsel_fixup(); 7862306a36Sopenharmony_ci} 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_civoid ebony_init(void *mac0, void *mac1) 8162306a36Sopenharmony_ci{ 8262306a36Sopenharmony_ci platform_ops.fixups = ebony_fixups; 8362306a36Sopenharmony_ci platform_ops.exit = ibm44x_dbcr_reset; 8462306a36Sopenharmony_ci ebony_mac0 = mac0; 8562306a36Sopenharmony_ci ebony_mac1 = mac1; 8662306a36Sopenharmony_ci fdt_init(_dtb_start); 8762306a36Sopenharmony_ci serial_console_init(); 8862306a36Sopenharmony_ci} 89