xref: /openbmc/linux/arch/powerpc/boot/ebony.c (revision 75bf465f0bc33e9b776a46d6a1b9b990f5fb7c37)
1*2874c5fdSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later
2f6dfc805SDavid Gibson /*
3f6dfc805SDavid Gibson  * Copyright 2007 David Gibson, IBM Corporation.
4f6dfc805SDavid Gibson  *
5f6dfc805SDavid Gibson  * Based on earlier code:
6f6dfc805SDavid Gibson  *   Copyright (C) Paul Mackerras 1997.
7f6dfc805SDavid Gibson  *
8f6dfc805SDavid Gibson  *   Matt Porter <mporter@kernel.crashing.org>
9f6dfc805SDavid Gibson  *   Copyright 2002-2005 MontaVista Software Inc.
10f6dfc805SDavid Gibson  *
11f6dfc805SDavid Gibson  *   Eugene Surovegin <eugene.surovegin@zultys.com> or <ebs@ebshome.net>
12f6dfc805SDavid Gibson  *   Copyright (c) 2003, 2004 Zultys Technologies
13f6dfc805SDavid Gibson  */
14f6dfc805SDavid Gibson #include <stdarg.h>
15f6dfc805SDavid Gibson #include <stddef.h>
16f6dfc805SDavid Gibson #include "types.h"
17f6dfc805SDavid Gibson #include "elf.h"
18f6dfc805SDavid Gibson #include "string.h"
19f6dfc805SDavid Gibson #include "stdio.h"
20f6dfc805SDavid Gibson #include "page.h"
21f6dfc805SDavid Gibson #include "ops.h"
22f6dfc805SDavid Gibson #include "reg.h"
230d279d47SDavid Gibson #include "io.h"
24f6dfc805SDavid Gibson #include "dcr.h"
25e90f3b74SJosh Boyer #include "4xx.h"
26f6dfc805SDavid Gibson #include "44x.h"
27f6dfc805SDavid Gibson 
28f6dfc805SDavid Gibson static u8 *ebony_mac0, *ebony_mac1;
29f6dfc805SDavid Gibson 
300d279d47SDavid Gibson #define EBONY_FPGA_PATH		"/plb/opb/ebc/fpga"
310d279d47SDavid Gibson #define	EBONY_FPGA_FLASH_SEL	0x01
320d279d47SDavid Gibson #define EBONY_SMALL_FLASH_PATH	"/plb/opb/ebc/small-flash"
330d279d47SDavid Gibson 
ebony_flashsel_fixup(void)340d279d47SDavid Gibson static void ebony_flashsel_fixup(void)
350d279d47SDavid Gibson {
360d279d47SDavid Gibson 	void *devp;
370d279d47SDavid Gibson 	u32 reg[3] = {0x0, 0x0, 0x80000};
380d279d47SDavid Gibson 	u8 *fpga;
390d279d47SDavid Gibson 	u8 fpga_reg0 = 0x0;
400d279d47SDavid Gibson 
410d279d47SDavid Gibson 	devp = finddevice(EBONY_FPGA_PATH);
420d279d47SDavid Gibson 	if (!devp)
430d279d47SDavid Gibson 		fatal("Couldn't locate FPGA node %s\n\r", EBONY_FPGA_PATH);
440d279d47SDavid Gibson 
450d279d47SDavid Gibson 	if (getprop(devp, "virtual-reg", &fpga, sizeof(fpga)) != sizeof(fpga))
460d279d47SDavid Gibson 		fatal("%s has missing or invalid virtual-reg property\n\r",
470d279d47SDavid Gibson 		      EBONY_FPGA_PATH);
480d279d47SDavid Gibson 
490d279d47SDavid Gibson 	fpga_reg0 = in_8(fpga);
500d279d47SDavid Gibson 
510d279d47SDavid Gibson 	devp = finddevice(EBONY_SMALL_FLASH_PATH);
520d279d47SDavid Gibson 	if (!devp)
530d279d47SDavid Gibson 		fatal("Couldn't locate small flash node %s\n\r",
540d279d47SDavid Gibson 		      EBONY_SMALL_FLASH_PATH);
550d279d47SDavid Gibson 
560d279d47SDavid Gibson 	if (getprop(devp, "reg", reg, sizeof(reg)) != sizeof(reg))
570d279d47SDavid Gibson 		fatal("%s has reg property of unexpected size\n\r",
580d279d47SDavid Gibson 		      EBONY_SMALL_FLASH_PATH);
590d279d47SDavid Gibson 
600d279d47SDavid Gibson 	/* Invert address bit 14 (IBM-endian) if FLASH_SEL fpga bit is set */
610d279d47SDavid Gibson 	if (fpga_reg0 & EBONY_FPGA_FLASH_SEL)
620d279d47SDavid Gibson 		reg[1] ^= 0x80000;
630d279d47SDavid Gibson 
640d279d47SDavid Gibson 	setprop(devp, "reg", reg, sizeof(reg));
650d279d47SDavid Gibson }
660d279d47SDavid Gibson 
ebony_fixups(void)67f6dfc805SDavid Gibson static void ebony_fixups(void)
68f6dfc805SDavid Gibson {
69f6dfc805SDavid Gibson 	// FIXME: sysclk should be derived by reading the FPGA registers
70f6dfc805SDavid Gibson 	unsigned long sysclk = 33000000;
71f6dfc805SDavid Gibson 
72f6dfc805SDavid Gibson 	ibm440gp_fixup_clocks(sysclk, 6 * 1843200);
73d23f5099SBenjamin Herrenschmidt 	ibm4xx_sdram_fixup_memsize();
74ecc6cd73SDavid Gibson 	dt_fixup_mac_address_by_alias("ethernet0", ebony_mac0);
75ecc6cd73SDavid Gibson 	dt_fixup_mac_address_by_alias("ethernet1", ebony_mac1);
76b2ba34f3SDavid Gibson 	ibm4xx_fixup_ebc_ranges("/plb/opb/ebc");
770d279d47SDavid Gibson 	ebony_flashsel_fixup();
78f6dfc805SDavid Gibson }
79f6dfc805SDavid Gibson 
ebony_init(void * mac0,void * mac1)80f6dfc805SDavid Gibson void ebony_init(void *mac0, void *mac1)
81f6dfc805SDavid Gibson {
82f6dfc805SDavid Gibson 	platform_ops.fixups = ebony_fixups;
8311123346SDavid Gibson 	platform_ops.exit = ibm44x_dbcr_reset;
84f6dfc805SDavid Gibson 	ebony_mac0 = mac0;
85f6dfc805SDavid Gibson 	ebony_mac1 = mac1;
862f0dfeaaSDavid Gibson 	fdt_init(_dtb_start);
87f6dfc805SDavid Gibson 	serial_console_init();
88f6dfc805SDavid Gibson }
89