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