All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH] ppc4xx: Add 405EP based PMC405DE board
Date: Wed, 15 Jul 2009 07:03:22 +0200	[thread overview]
Message-ID: <200907150703.22676.sr@denx.de> (raw)
In-Reply-To: <200907131524.18552.matthias.fuchs@esd.eu>

On Monday 13 July 2009 15:24:18 Matthias Fuchs wrote:
> Signed-off-by: Matthias Fuchs <matthias.fuchs@esd.eu>

Thanks. Looks good. Only some nitpicking comments (coding-style) below.

> +++ b/board/esd/pmc405de/pmc405de.c
> @@ -0,0 +1,587 @@
> +/*
> + * (C) Copyright 2009
> + * Matthias Fuchs, esd gmbh germany, matthias.fuchs at esd.eu
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * 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.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
> + * MA 02111-1307 USA
> + */
> +
> +#include <common.h>
> +#include <libfdt.h>
> +#include <fdt_support.h>
> +#include <asm/processor.h>
> +#include <asm/io.h>
> +#include <asm/4xx_pci.h>
> +#include <command.h>
> +#include <malloc.h>
> +
> +#define CPLD_VERSION			(CONFIG_SYS_CPLD_BASE + 0)
> +#define CPLD_VERSION_MASK		0x0f
> +#define CPLD_STATUS			(CONFIG_SYS_CPLD_BASE + 4)
> +#define CPLD_CONTROL			(CONFIG_SYS_CPLD_BASE + 8)
> +#define CPLD_CONTROL_POSTLED_N		0x01
> +#define CPLD_CONTROL_POSTLED_GATE	0x02
> +#define CPLD_CONTROL_RESETOUT_N		0x40
> +#define CPLD_CONTROL_RESETOUT_N_GATE	0x80
> +
> +DECLARE_GLOBAL_DATA_PTR;
> +
> +extern void __ft_board_setup(void *blob, bd_t *bd);
> +extern void pll_write(u32 a, u32 b);
> +
> +static int wait_for_pci_ready_done;
> +
> +static int is_monarch(void);
> +static int pci_is_66mhz(void);
> +static int board_revision(void);
> +static int cpld_revision(void);
> +
> +int board_early_init_f(void)
> +{
> +	u32 pllmr0, pllmr1;
> +
> +	/*
> +	 * check M66EN and patch PLB:PCI divider for 66MHz PCI
> +	 *
> +	 * fCPU==333MHz && fPCI==66MHz (PLBDiv==3 && M66EN==1): PLB/PCI=1
> +	 * fCPU==333MHz && fPCI==33MHz (PLBDiv==3 && M66EN==0): PLB/PCI=2
> +	 * fCPU==133|266MHz && fPCI==66MHz (PLBDiv==1|2 && M66EN==1): PLB/PCI=2
> +	 * fCPU==133|266MHz && fPCI==33MHz (PLBDiv==1|2 && M66EN==0): PLB/PCI=3
> +	 *
> +	 * finally call pll_write() which will do a chip reset
> +	 * and never return.
> +	 */
> +	pllmr0 = mfdcr(CPC0_PLLMR0);
> +	pllmr1 = mfdcr(CPC0_PLLMR1);
> +
> +	if ((pllmr0 & PLLMR0_CPU_TO_PLB_MASK) == PLLMR0_CPU_PLB_DIV_3) {
> +		/* fCPU=333MHz, fPLB=111MHz */
> +		if (pci_is_66mhz()) {
> +			if ((pllmr0 & PLLMR0_PCI_TO_PLB_MASK) !=
> +			    PLLMR0_PCI_PLB_DIV_1) {
> +				pll_write((pllmr0 & ~PLLMR0_PCI_TO_PLB_MASK) |
> +					  PLLMR0_PCI_PLB_DIV_1, pllmr1);
> +			}
> +		} else {
> +			if ((pllmr0 & PLLMR0_PCI_TO_PLB_MASK) !=
> +			    PLLMR0_PCI_PLB_DIV_2) {
> +				pll_write((pllmr0 & ~PLLMR0_PCI_TO_PLB_MASK) |
> +					  PLLMR0_PCI_PLB_DIV_2, pllmr1);
> +			}
> +		}
> +	} else {
> +		/* fCPU=133|266MHz, fPLB=133MHz */
> +		if (pci_is_66mhz()) {
> +			if ((pllmr0 & PLLMR0_PCI_TO_PLB_MASK) !=
> +			    PLLMR0_PCI_PLB_DIV_2) {
> +				pll_write((pllmr0 & ~PLLMR0_PCI_TO_PLB_MASK) |
> +					  PLLMR0_PCI_PLB_DIV_2, pllmr1);
> +			}
> +		} else {
> +			if ((pllmr0 & PLLMR0_PCI_TO_PLB_MASK) !=
> +			    PLLMR0_PCI_PLB_DIV_3) {
> +				pll_write((pllmr0 & ~PLLMR0_PCI_TO_PLB_MASK) |
> +					  PLLMR0_PCI_PLB_DIV_3, pllmr1);
> +			}
> +		}
> +	}
> +
> +	/*
> +	 * IRQ 25 (EXT IRQ 0) PCI-INTA#; active low; level sensitive
> +	 * IRQ 26 (EXT IRQ 1) PCI-INTB#; active low; level sensitive
> +	 * IRQ 27 (EXT IRQ 2) PCI-INTC#; active low; level sensitive
> +	 * IRQ 28 (EXT IRQ 3) PCI-INTD#; active low; level sensitive
> +	 * IRQ 29 (EXT IRQ 4) ETH0-PHY-IRQ#; active low; level sensitive
> +	 * IRQ 30 (EXT IRQ 5) ETH1-PHY-IRQ#; active low; level sensitive
> +	 * IRQ 31 (EXT IRQ 6) PLD-IRQ#; active low; level sensitive
> +	 */
> +	mtdcr(uicsr, 0xFFFFFFFF);       /* clear all ints */
> +	mtdcr(uicer, 0x00000000);       /* disable all ints */
> +	mtdcr(uiccr, 0x00000000);       /* set all to be non-critical*/
> +	mtdcr(uicpr, 0xFFFFFF80);       /* set int polarities */
> +	mtdcr(uictr, 0x10000000);       /* set int trigger levels */
> +	mtdcr(uicvcr, 0x00000001);      /* set vect base=0, INT0 highest prio */
> +	mtdcr(uicsr, 0xFFFFFFFF);       /* clear all ints */
> +
> +	/*
> +	 * EBC Configuration Register:
> +	 * - set ready timeout to 512 ebc-clks -> ca. 15 us
> +	 * - EBC lines are always driven
> +	 */
> +	mtebc (epcr, 0xa8400000);

Please remove this space before "(" here.

> +
> +	return 0;
> +}
> +
> +int misc_init_r(void)
> +{
> +	int i;
> +
> +	if (!is_monarch()) {
> +		/* PCI configuration done: release EREADY */
> +		out_be32((void*)GPIO0_OR,
> +			 in_be32((void*)GPIO0_OR) | CONFIG_SYS_GPIO_EREADY);
> +		out_be32((void*)GPIO0_TCR,
> +			 in_be32((void*)GPIO0_TCR) | CONFIG_SYS_GPIO_EREADY);
> +	}
> +
> +	/* turn off POST LED */
> +	out_8((void*)CPLD_CONTROL,
> +	      CPLD_CONTROL_POSTLED_N | CPLD_CONTROL_POSTLED_GATE);
> +
> +	/* turn on LEDs: RUN, A, B */
> +	out_be32((void*)GPIO0_OR,
> +		 in_be32((void*)GPIO0_OR) &
> +		 ~(CONFIG_SYS_GPIO_LEDRUN_N |
> +		   CONFIG_SYS_GPIO_LEDA_N |
> +		   CONFIG_SYS_GPIO_LEDB_N));
> +
> +	for (i=0; i < 200; i++)
> +		udelay(1000);
> +
> +	/* turn off LEDs: A, B */
> +	out_be32((void*)GPIO0_OR,
> +		 in_be32((void*)GPIO0_OR) |
> +		 (CONFIG_SYS_GPIO_LEDA_N |
> +		  CONFIG_SYS_GPIO_LEDB_N));
> +
> +	return (0);
> +}
> +
> +static int is_monarch(void)
> +{
> +	if (in_be32((void*)GPIO0_IR) & CONFIG_SYS_GPIO_MONARCH_N)
> +		return 0;
> +	return 1;
> +}
> +
> +static int pci_is_66mhz(void)
> +{
> +	if (in_be32((void*)GPIO0_IR) & CONFIG_SYS_GPIO_M66EN)
> +		return 1;
> +	return 0;
> +}
> +
> +static int board_revision(void)
> +{
> +	return ((in_be32((void*)GPIO0_IR) & CONFIG_SYS_GPIO_HWREV_MASK) >>
> +		CONFIG_SYS_GPIO_HWREV_SHIFT);
> +}
> +
> +static int cpld_revision(void)
> +{
> +	return ((in_8((void*)CPLD_VERSION) & CPLD_VERSION_MASK));
> +}
> +
> +/*
> + * Check Board Identity
> + */
> +int checkboard(void)
> +{
> +	puts("Board: esd GmbH - PMC-CPU/405-DE");
> +
> +	gd->board_type = board_revision();
> +	printf(", Rev 1.%ld, ", gd->board_type);
> +
> +	if (!is_monarch())
> +		puts("non-");
> +
> +	printf("monarch, PCI=%s MHz, PLD-Rev 1.%d\n",
> +	       pci_is_66mhz() ? "66" : "33", cpld_revision());
> +
> +	return 0;
> +}
> +
> +
> +static void wait_for_pci_ready(void)
> +{
> +	int i;
> +	char *s = getenv("pcidelay");
> +
> +	/* only wait once */
> +	if (wait_for_pci_ready_done)
> +		return;
> +
> +	/*
> +	 * We have our own handling of the pcidelay variable.
> +	 * Using CONFIG_PCI_BOOTDELAY enables pausing for host
> +	 * and adapter devices. For adapter devices we do not
> +	 * want this.
> +	 */
> +	if (s) {
> +		int ms = simple_strtoul(s, NULL, 10);
> +		printf("PCI:   Waiting for %d ms\n", ms);
> +		for (i=0; i<ms; i++)
> +			udelay(1000);
> +	}
> +
> +	if (!(in_be32((void*)GPIO0_IR) & CONFIG_SYS_GPIO_EREADY)) {
> +		printf("PCI:   Waiting for EREADY (CTRL-C to skip) ... ");
> +		while (1) {
> +			if (ctrlc()) {
> +				puts("abort\n");
> +				break;
> +			}
> +			if (in_be32((void*)GPIO0_IR) & CONFIG_SYS_GPIO_EREADY) {
> +				printf("done\n");
> +				break;
> +			}
> +		}
> +	}
> +
> +	wait_for_pci_ready_done = 1;
> +}
> +
> +/*
> + * Overwrite weak is_pci_host()
> + *
> + * This routine is called to determine if a pci scan should be
> + * performed. With various hardware environments (especially cPCI and
> + * PPMC) it's insufficient to depend on the state of the arbiter enable
> + * bit in the strap register, or generic host/adapter assumptions.
> + *
> + * Return 0 for adapter mode, non-zero for host (monarch) mode.
> + */
> +int is_pci_host(struct pci_controller *hose)
> +{
> +	char *s;
> +
> +	if (!is_monarch()) {
> +		/*
> +		 * Overwrite PCI identification when running in
> +		 * non-monarch mode
> +		 * This should be moved into pci_target_init()
> +		 * when it is sometimes available for 405 CPUs
> +		 */
> +		pci_write_config_word(PCIDEVID_405GP,
> +				      PCI_SUBSYSTEM_ID,
> +				      CONFIG_SYS_PCI_SUBSYS_ID_NONMONARCH);
> +		pci_write_config_word(PCIDEVID_405GP,
> +				      PCI_CLASS_SUB_CODE,
> +				      CONFIG_SYS_PCI_CLASSCODE_NONMONARCH);
> +	}
> +
> +	s = getenv("pciscan");
> +	if (s == NULL)
> +		if (is_monarch()) {
> +			wait_for_pci_ready();
> +			return 1;
> +		} else
> +			return 0;
> +	else if (!strcmp(s, "yes"))
> +		return 1;

This "if/else" statements should have braces ({) since it's not a single-line 
statement.

Best regards,
Stefan

=====================================================================
DENX Software Engineering GmbH,     MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-0 Fax: +49-8142-66989-80  Email: office at denx.de
=====================================================================

  reply	other threads:[~2009-07-15  5:03 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-07-13 13:24 [U-Boot] [PATCH] ppc4xx: Add 405EP based PMC405DE board Matthias Fuchs
2009-07-15  5:03 ` Stefan Roese [this message]
  -- strict thread matches above, loose matches on Subject: below --
2009-07-20 11:01 matthias.fuchs at esd.eu
2009-07-20 20:50 ` Wolfgang Denk

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200907150703.22676.sr@denx.de \
    --to=sr@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.