07 Sep, 2016

1 commit

  • On the raspberry pi, you can disable the serial port to gain dynamic frequency
    scaling which can get handy at times.

    However, in such a configuration the serial controller gets its rx queue filled
    up with zero bytes which then happily get transmitted on to whoever calls
    getc() today.

    This patch adds detection logic for that case by checking whether the RX pin is
    mapped to GPIO15 and disables the mini uart if it is not mapped properly.

    That way we can leave the driver enabled in the tree and can determine during
    runtime whether serial is usable or not, having a single binary that allows for
    uart and non-uart operation.

    Signed-off-by: Alexander Graf
    Acked-by: Stephen Warren
    Reviewed-by: Simon Glass

    Alexander Graf
     

16 Jul, 2016

1 commit


12 Apr, 2016

2 commits

  • Now that rpi_*defconfig and Kconfig (rather than the config header file)
    provide the identity of the build, we don't need to separate config
    headers and board directories for each RPi variant. Set CONFIG_SYS_BOARD
    and CONFIG_SYS_CONFIG_NAME so that we can get rid of the duplication. This
    requires a tiny number of extra ifdefs in the config header.

    The only disadvantage of this approach is that the $board/$board_name
    environment variables aren't as descriptive as they used to be. This isn't
    really an issue because those only exist to allow scripts to create DTB
    filenames at runtime. However, the RPi board code already sets $fdtfile to
    something more accurate based on FW-reported board ID anyway.

    While at it, unify some Kconfig select options, and add a MAINTAINERS
    entry for bcm283x too.

    Partially-suggested-by: Tom Rini
    Signed-off-by: Stephen Warren
    Reviewed-by: Tom Rini

    Stephen Warren
     
  • On all Pis so far, the VC FW provides a short stub to set up the ARM CPU
    before entering the kernel (a/k/a U-Boot for us). This feature is not
    currently supported by the VC FW when booting in 64-bit mode. However,
    this feature will likely appear in the near future, and this U-Boot port
    assumes that such a feature is in place. Without that feature, or a
    temporary workaround described below, U-Boot will not boot.

    Once the VC FW does provide the ARM stub, u-boot.bin built for rpi_3 can
    be used drectly as kernel7.img, in the same way as any other RPi port. The
    following config.txt is required:

    # Fix mini UART input frequency, and setup/enable up the UART.
    # Without this option, U-Boot will not boot, even if you don't care
    # about the serial console. This option will always be required for
    # all RPi3 use-cases, unless the PL011 UART is used, which is not
    # yet supported by rpi_3* builds of U-Boot.
    enable_uart=1
    # Boot in AArch64 (64-bit) mode.
    # It is possible that a future VC FW will remove the need for this
    # option, instead auto-setting 32-/64-bit mode based on the "kernel"
    # filename present on the SD card.
    arm_control=0x200

    Prior to the VC FW providing the ARM boot stub, you can use the following
    steps to build an equivalent stub into the U-Boot binary:

    git clone https://github.com/swarren/rpi-3-aarch64-demo.git \
    ../rpi-3-aarch64-demo
    (cd ../rpi-3-aarch64-demo && ./build.sh)
    Build U-Boot for rpi_3 in the usual way
    cat ../rpi-3-aarch64-demo/armstub64.bin u-boot.bin > u-boot.bin.stubbed
    Use u-boot.bin.stubbed as kernel7.img on the Pi SD card.

    In this case, the following additional entries are required in config.txt:

    # Tell the FW to load the kernel image at address 0, the reset vector.
    kernel_old=1

    Signed-off-by: Stephen Warren
    Reviewed-by: Tom Rini

    Stephen Warren
     

02 Apr, 2016

3 commits

  • The Raspberry Pi 3 contains a BCM2837 SoC. The BCM2837 is a BCM2836 with
    the CPU complex swapped out for a quad-core ARMv8. This can operate in 32-
    or 64-bit mode. 32-bit mode is the current default selected by the
    VideoCore firmware on the Raspberry Pi 3. This patch adds a 32-bit port of
    U-Boot for the Raspberry Pi 3.

    >From U-Boot's perspective, the only delta between the RPi 2 and RPi 3 is a
    change in usage of the SoC UARTs. On all previous Pis, the PL011 was the
    only UART in use. The Raspberry Pi 3 adds a Bluetooth module which uses a
    UART to connect to the SoC. By default, the PL011 is used for this purpose
    since it has larger FIFOs than the other "mini" UART. However, this can
    be configured via the VideoCore firmware's config.txt file. This patch
    hard-codes use of the mini UART in the RPi 3 port. If your system uses the
    PL011 UART for the console even on the RPi 3, please use the RPi 2 U-Boot
    port instead. A future change might determine which UART to use at
    run-time, thus allowing the RPi 2 and RPi 3 (32-bit) ports to be squashed
    together.

    The mini UART has some limitations. One externally visible issue in the
    BCM2837 integration is that the UART divides the SoC's "core clock" to
    generate the baud rate. The core clock is typically variable, and under
    control of the VideoCore firmware for thermal management reasons. If the
    VC FW does modify the core clock rate, UART communication will be
    corrupted since the baud rate will vary from the expected value. This was
    not an issue for the PL011 UART, since it is fed by a fixed 3MHz clock. To
    work around this, the VideoCore firmware can be told not to modify the SoC
    core clock. However, the only way this can happen and be thermally safe is
    to limit the core clock to a low/minimum frequency. This leaves
    performance on the table for use-cases that don't care about a UART
    console. Consequently, use of the mini UART console must be explicitly
    requested by entering the following line into config.txt:

    enable_uart=1

    A recent version of the VC firmware is required to ensure that the mini
    UART is fully and correctly initialized by the VC FW; at least
    firmware.git 046effa13ebc "firmware: arm_loader: emmc clock depends on
    core clock See: https://github.com/raspberrypi/firmware/issues/572".

    Signed-off-by: Stephen Warren
    Reviewed-by: Tom Rini

    Stephen Warren
     
  • This allows U-Boot to known the name of the board.

    The existing rpi_2_defconfig can operate correctly on the Raspberry Pi 3
    in 32-bit mode /if/ you have configured the firmware to use the PL011 UART
    as the console UART (the default is the mini UART). This requires two
    things:
    a) config.txt should contain dtoverlay=pi3-miniuart-bt
    b) You should run the following to tell the VC FW to process DT when
    booting, and copy u-boot.bin.img (rather than u-boot.bin) to the SD card
    as the kernel image:

    path/to/kernel/scripts/mkknlimg --dtok u-boot.bin u-boot.bin.img

    This works as of firmware.git commit 046effa13ebc "firmware: arm_loader:
    emmc clock depends on core clock See:
    https://github.com/raspberrypi/firmware/issues/572".

    Signed-off-by: Stephen Warren
    Reviewed-by: Tom Rini

    Stephen Warren
     
  • To simplify support for new SoCs, just use a constant filename
    for the unknown case. In practice this case shouldn't be hit anyway, so
    the filename isn't relevant, and certainly doesn't need to differentiate
    between SoCs. If a user has an as-yet-unknown board, they can override
    this value in the environment anyway.

    Signed-off-by: Stephen Warren
    Reviewed-by: Tom Rini

    Stephen Warren
     

27 Mar, 2016

1 commit

  • Currently, CONFIG_BCM2835 is defined for all BCM283x builds and _BCM2836
    is defined when building for that SoC. That means there isn't a single
    define that means "exactly BCM2835". This will complicate future patches
    where BCM2835-vs-anything-else needs to be determined simply.

    Modify the code to define one or the other of CONFIG_BCM2835/BCM2836 so
    future patches are simpler.

    Signed-off-by: Stephen Warren
    Reviewed-by: Tom Rini

    Stephen Warren
     

23 Mar, 2016

1 commit

  • For Raspberry Pi, we had the input clock rate to the pl011 fixed in
    the rpi.c file, but it may be changed by firmware due to user changes
    to config.txt. Since the firmware always sets up the uart (default
    115200 output unless the user changes it), we can just skip our own
    uart init to simplify the boot process and more reliably get serial
    output.

    Signed-off-by: Eric Anholt
    Reviewed-by: Tom Rini
    Tested-by: Stephen Warren

    Eric Anholt
     

25 Feb, 2016

1 commit


08 Feb, 2016

3 commits

  • Let's set "ethaddr" when we get the ethernet address too, so that
    fdt_fixup_ethernet() sets the address in the device tree and the Linux
    driver can pick it up.

    Signed-off-by: Lubomir Rintel
    Tested-by: Stephen Warren

    Lubomir Rintel
     
  • The P5 header was not present on "Model B" any board prior to Revision 2.0,
    there's no need for a separate device tree.

    Also, it looks like "rev2" is incorrectly used to only cover the 512MiB
    memory models; there also were 256MiB 2.0 boards.

    I don't have all of the boards to check this, I'm following this table:
    http://elinux.org/RPi_HardwareHistory#Board_Revision_History

    Signed-off-by: Lubomir Rintel

    Lubomir Rintel
     
  • This source has been blessed by Dom Cobley at the RPi Foundation, so seems
    like the best source to refer to. It's a superset of and consistent with
    the other sources.

    Cc: Lubomir Rintel
    Cc: Eric Anholt
    Signed-off-by: Stephen Warren

    Stephen Warren
     

06 Dec, 2015

3 commits

  • For U-Boot's purposes, at present all we care about is ensuring there's
    a model table entry.

    Signed-off-by: Stephen Warren

    Stephen Warren
     
  • The RPi has two different schemes for encoding board revision values.
    When adding RPi 2 support, I thought that the conflicting type field
    values were to be interpreted based on bcm2835-vs-bcm2836. In fact, the
    scheme bit determines the encoding. The RPi Zero uses the bcm2835 yet
    uses the new encoding scheme. Fix the code to cater for this correctly.

    Signed-off-by: Stephen Warren

    Stephen Warren
     
  • There are two numbering schemes for the RPi revision values; old and new
    scheme. The values within each scheme overlap. Hence, it doesn't make
    sense to have absolute/global names for the revision IDs. Get rid of the
    names and just use the raw revision/type values to set up the array of
    per-revision data.

    This change makes most sense when coupled with the next change. However,
    it's split out so that the mechanical cut/paste is separate from the
    logic changes for easier review and problem bisection.

    Signed-off-by: Stephen Warren

    Stephen Warren
     

25 Oct, 2015

1 commit


19 Oct, 2015

1 commit


12 Sep, 2015

1 commit


13 Aug, 2015

1 commit


13 Apr, 2015

1 commit

  • According to Gordon Henderson's WiringPi library, there are some more
    Pi revision IDs out there. Add support for them.

    http://git.drogon.net/?p=wiringPi;a=blob_plain;f=wiringPi/wiringPi.c;hb=5edd177112c99416f68ba3e8c6c4db6ed942e796

    At least ID 0x13 is out in the wild:

    Reported-by: Chee-Yang Chau
    Signed-off-by: Stephen Warren

    Stephen Warren
     

28 Mar, 2015

1 commit


24 Mar, 2015

1 commit


21 Feb, 2015

2 commits


10 Feb, 2015

1 commit

  • We now have api functions that can support compiling simplefb code as its own
    module. Since this code is not part of the display functionality, extract it
    to its own file.

    Raspberry Pi is updated to accommodate the changes.

    Signed-off-by: Nikita Kiryanov
    Acked-by: Stephen Warren
    Reviewed-by: Simon Glass
    Tested-by: Bo Shen
    Tested-by: Josh Wu
    Cc: Simon Glass
    Cc: Anatolij Gustschin
    Cc: Stephen Warren

    Nikita Kiryanov
     

30 Dec, 2014

3 commits


12 Dec, 2014

1 commit


08 Dec, 2014

2 commits

  • The U-Boot port runs on a variety of RPi models, not just the B. So,
    rename the port to something slightly more generic.

    Signed-off-by: Stephen Warren
    Reviewed-by: Simon Glass
    Tested-by: Simon Glass

    Stephen Warren
     
  • Detect the board revision early during boot, and print the decoded
    model name.

    Eventually, this information can be used for tasks such as:
    - Allowing/preventing USB device mode; some models have a USB device on-
    board so only host mode makes sense. Others connect the SoC directly
    to the USB connector, so device-mode might make sense.
    - The on-board USB hub/Ethernet requires different GPIOs to enable it,
    although luckily the default appears to be fine so far.
    - The compute module contains an on-board eMMC device, so we could store
    the environment there. Other models use an SD card and so don't support
    saving the environment (unless we store it in a file on the FAT boot
    partition...)

    Set $fdtfile based on this information. At present, the mainline Linux
    kernel doesn't contain a separate DTB for most models, but I hope that
    will change soon.

    Signed-off-by: Stephen Warren
    Reviewed-by: Simon Glass
    Tested-by: Simon Glass

    Stephen Warren
     

21 Nov, 2014

1 commit

  • This function can fail if the device tree runs out of space. Rather than
    silently booting with an incomplete device tree, allow the failure to be
    detected.

    Unfortunately this involves changing a lot of places in the code. I have
    not changed behvaiour to return an error where one is not currently
    returned, to avoid unexpected breakage.

    Eventually it would be nice to allow boards to register functions to be
    called to update the device tree. This would avoid all the many functions
    to do this. However it's not clear yet if this should be done using driver
    model or with a linker list. This work is left for later.

    Signed-off-by: Simon Glass
    Acked-by: Anatolij Gustschin

    Simon Glass
     

29 Oct, 2014

1 commit

  • This commit introduces a Kconfig symbol for each ARM CPU:
    CPU_ARM720T, CPU_ARM920T, CPU_ARM926EJS, CPU_ARM946ES, CPU_ARM1136,
    CPU_ARM1176, CPU_V7, CPU_PXA, CPU_SA1100.
    Also, it adds the CPU feature Kconfig symbol HAS_VBAR which is selected
    for CPU_ARM1176 and CPU_V7.

    For each target, the corresponding CPU is selected and the definition of
    SYS_CPU in the corresponding Kconfig file is removed.

    Also, it removes redundant "string" type in some Kconfig files.

    Signed-off-by: Georges Savoundararadj
    Acked-by: Albert ARIBAUD
    Cc: Masahiro Yamada

    Georges Savoundararadj
     

27 Oct, 2014

1 commit


23 Oct, 2014

2 commits


14 Sep, 2014

1 commit

  • Now the types of CONFIG_SYS_{ARCH, CPU, SOC, VENDOR, BOARD, CONFIG_NAME}
    are specified in arch/Kconfig.

    We can delete the ones in arch and board Kconfig files.

    This commit can be easily reproduced by the following command:

    find . -name Kconfig -a ! -path ./arch/Kconfig | xargs sed -i -e '
    /config[[:space:]]SYS_\(ARCH\|CPU\|SOC\|\VENDOR\|BOARD\|CONFIG_NAME\)/ {
    N
    s/\n[[:space:]]*string//
    }
    '

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

30 Jul, 2014

2 commits

  • We have switched to Kconfig and the boards.cfg file is going to
    be removed. We have to retrieve the board status and maintainers
    information from it.

    The MAINTAINERS format as in Linux Kernel would be nice
    because we can crib the scripts/get_maintainer.pl script.

    After some discussion, we chose to put a MAINTAINERS file under each
    board directory, not the top-level one because we want to collect
    relevant information for a board into a single place.

    TODO:
    Modify get_maintainer.pl to scan multiple MAINTAINERS files.

    Signed-off-by: Masahiro Yamada
    Suggested-by: Tom Rini
    Acked-by: Simon Glass

    Masahiro Yamada
     
  • This commit adds:
    - arch/${ARCH}/Kconfig
    provide a menu to select target boards
    - board/${VENDOR}/${BOARD}/Kconfig or board/${BOARD}/Kconfig
    set CONFIG macros to the appropriate values for each board
    - configs/${TARGET_BOARD}_defconfig
    default setting of each board

    (This commit was automatically generated by a conversion script
    based on boards.cfg)

    In Linux Kernel, defconfig files are located under
    arch/${ARCH}/configs/ directory.
    It works in Linux Kernel since ARCH is always given from the
    command line for cross compile.

    But in U-Boot, ARCH is not given from the command line.
    Which means we cannot know ARCH until the board configuration is done.
    That is why all the "*_defconfig" files should be gathered into a
    single directory ./configs/.

    Signed-off-by: Masahiro Yamada
    Acked-by: Simon Glass

    Masahiro Yamada