Skip to content
Snippets Groups Projects
  1. Oct 22, 2018
    • Bin Meng's avatar
      x86: tsc: Introduce config option for early timer frequency · 6ce38364
      Bin Meng authored
      
      So far the TSC timer driver supports trying hardware calibration first
      and using device tree as last resort for its running frequency as the
      normal timer.
      
      However when it is used as the early timer, it only supports hardware
      calibration and if it fails, the driver just panics. This introduces
      a new config option to specify the early timer frequency in MHz and
      it should be equal to the value described in the device tree.
      
      Without this patch, the travis-ci testing on QEMU x86_64 target fails
      each time after it finishes the 'bootefi selftest' as the test.py see
      an error was emitted on the console like this:
      
        TSC frequency is ZERO
        resetting ...
        ### ERROR ### Please RESET the board ###
      
      It's strange that this error is consistently seen on the travis-ci
      machine, but only occasionally seen on my local machine (maybe 1 out
      of 10). Since QEMU x86_64 target enables BOOTSTAGE support which uses
      early timer, with this fix it should work without any failure.
      
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
      6ce38364
    • Bin Meng's avatar
      x86: Fix the mystery of printch() during 64-bit boot · 49d5ff43
      Bin Meng authored
      
      At present in arch_setup_gd() it calls printch(' ') at the end which
      has been a mystery for a long time as without such call the 64-bit
      U-Boot just does not boot at all.
      
      In fact this is due to the bug that board_init_f() was called with
      boot_flags not being set. Hence whatever value being there in the
      rdi register becomes the boot_flags if without such magic call.
      With a printch(' ') call the rdi register is initialized as 0x20
      and this value seems to be sane enough for the whole boot process.
      
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Reviewed-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      49d5ff43
    • Heinrich Schuchardt's avatar
      x86: put global data pointer into the .data section · 2c78a79e
      Heinrich Schuchardt authored
      
      On x86_64 the field global_data_ptr is assigned before relocation. As
      sections for uninitialized global data (.bss) overlap with the relocation
      sections (.rela) this destroys the relocation table and leads to spurious
      errors.
      
      Initialization forces the global_data_ptr into a section for initialized
      global data (.data) which cannot overlap any .rela section.
      
      Fixes: a160092a ("x86: Support global_data on x86_64")
      Signed-off-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Tested-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      2c78a79e
    • Heinrich Schuchardt's avatar
      x86: detect unsupported relocation types · 80df194f
      Heinrich Schuchardt authored
      
      Currently we support only relocations of type ELF64_R_TYPE or ELF32_R_TYPE.
      We should be warned if other relocation types appear in the relocation
      sections.
      
      This type of message has helped to identify code overwriting a relocation
      section before relocation and incorrect parsing of relocation tables.
      
      Signed-off-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      80df194f
    • Heinrich Schuchardt's avatar
      x86: qemu: enable CONFIG_SPL_DM_RTC · 194924d8
      Heinrich Schuchardt authored
      
      Since commit 380d4f78 ("rtc: Allow use of RTC in SPL and TPL")
      qemu-x86_64_defconfig does not boot anymore.
      
      Fixes: 380d4f78 ("rtc: Allow use of RTC in SPL and TPL")
      Signed-off-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      194924d8
    • Bin Meng's avatar
      x86: doc: Remove stale sections of 64-bit support · 0e028bf9
      Bin Meng authored
      
      There are some sections in current doc saying 64-bit is unsupported.
      This apparently is out of date. Remove it.
      
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Reviewed-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      0e028bf9
    • Bin Meng's avatar
      x86: doc: Mention qemu-x86_64 support · 6feb2ff5
      Bin Meng authored
      
      Currently only 32-bit U-Boot for QEMU x86 is documented. Mention
      the 64-bit support.
      
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Reviewed-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
      6feb2ff5
    • Bin Meng's avatar
      x86: Ensure no instruction sets of MMX/SSE are generated in 64-bit build · dd4611de
      Bin Meng authored
      
      With the '-march=core2' fix, it seems that we have some luck that
      the 64-bit U-Boot boots again. However if we examine the disassembly
      codes there are still SSE instructions elsewhere which means passing
      cpu type to GCC is not enough to prevent it from generating these
      instructions. A simple test case is doing a 'bootefi selftest' from
      the U-Boot shell and it leads to a reset too.
      
      The 'bootefi selftest' reset is even seen with the image created by
      the relative older GCC 5.4.0, the one shipped by Ubuntu 16.04.
      
      The reset actually originates from undefined instruction exception
      caused by these SSE instructions. To keep U-Boot as a bootloader as
      simple as possible, we don't want to handle such advanced SIMD stuff.
      To make sure no MMX/SSE instruction sets are generated, tell GCC not
      to do this. Note AVX is out of the question as CORE2 is old enough
      to support AVX yet.
      
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Reviewed-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
      dd4611de
    • Bin Meng's avatar
      x86: Specify -march=core2 to build 64-bit U-Boot proper · a139cc18
      Bin Meng authored
      
      With newer kernel.org GCC (7.3.0 or 8.1.0), the u-boot.rom image
      built for qemu-x86_64 target does not boot. It keeps resetting
      soon after the 32-bit SPL jumps to 64-bit proper. Debugging shows
      that the reset happens inside env_callback_init().
      
      000000000113dd85 <env_callback_init>:
       113dd85:       41 54                   push   %r12
       113dd87:       55                      push   %rbp
       113dd88:       31 c0                   xor    %eax,%eax
       113dd8a:       53                      push   %rbx
       113dd8b:       0f 57 c0                xorps  %xmm0,%xmm0
      
      Executing "xorps %xmm0,%xmm0" causes CPU to immediately reset.
      However older GCC like 5.4.0 (the one shipped by Ubuntu 16.04)
      does not generate such instructions that utilizes SSE for this
      function - env_callback_init() and U-Boot boots without any issue.
      Explicitly specifying -march=core2 for newer GCC allows U-Boot
      proper to boot again. Examine assembly codes of env_callback_init
      and there is no SSE instruction in that function hence U-Boot
      continues to boot.
      
      core2 seems to be the oldest arch in GCC that supports 64-bit.
      Like 32-bit U-Boot build we use -march=i386 which is the most
      conservative cpu type so that the image can run on any x86
      processor, let's do the same for the 64-bit U-Boot build.
      
      Signed-off-by: default avatarBin Meng <bmeng.cn@gmail.com>
      Reviewed-by: default avatarHeinrich Schuchardt <xypron.glpk@gmx.de>
      Reviewed-by: default avatarSimon Glass <sjg@chromium.org>
      a139cc18
    • Hannes Schmelzer's avatar
      x86/bootm: fix error handling in boot_prep_linux(...) · c74e3295
      Hannes Schmelzer authored
      
      Once we get a zero pointer from load_zimage(...) we must bunch out
      instead of continue boot.
      
      Signed-off-by: default avatarHannes Schmelzer <hannes.schmelzer@br-automation.com>
      Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
      c74e3295
    • Simon Glass's avatar
      Enable CONFIG_TIMER_EARLY with bootstage · 97d20f69
      Simon Glass authored
      
      In initr_bootstage() we call bootstage_mark_name() which ends up calling
      timer_get_us(). This call happens before initr_dm(), which inits driver
      model.
      
      On x86 we set gd->timer to NULL in the transition from board_init_f()
      to board_init_r(). See board_init_f_r() for this assignment. So U-Boot
      knows there is no timer available in the period immediately after
      relocation.
      
      On x86 the timer_get_us() call is implemented as calls to get_ticks() and
      get_tbclk(). Both of these call dm_timer_init() to set up the timer, if
      gd->timer is NULL and the early timer is not available.
      
      However dm_timer_init() cannot succeed before initr_dm() is called.
      
      So it seems that on x86 if we want to use CONFIG_BOOTSTAGE we must enable
      CONFIG_TIMER_EARLY. Update the Kconfig to handle this.
      
      Note: On most architectures we can rely on the pre-relocation memory still
      being available, so that gd->timer pointers to a valid timer device and
      everything works correctly. Admittedly this is not strictly correct since
      the timer device is set up by pre-relocation U-Boot, but normally this is
      fine. On x86 the 'CAR' (cache-as-RAM) memory used by pre-relocation U-Boot
      disappears in board_init_f_r() and any attempt to access it will hang.
      This is the reason why we must mark the timer as invalid when we get to
      board_init_f_r().
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
      97d20f69
    • Simon Glass's avatar
      binman: Add support for Intel reference code · 27fb0cf1
      Simon Glass authored
      
      Some platforms use this instead of FSP to set up the platform, including
      memory. Add support for this in binman. This is needed for
      chromebook_samus, for example.
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
      27fb0cf1
    • Simon Glass's avatar
      chromebook_samus: Increase pre-relocation memory · d7e84521
      Simon Glass authored
      
      With bootstage now allocating pre-relocation memory the current amount
      available is insufficient. Increase it a little.
      
      Signed-off-by: default avatarSimon Glass <sjg@chromium.org>
      Reviewed-by: default avatarBin Meng <bmeng.cn@gmail.com>
      d7e84521
  2. Oct 20, 2018
  3. Oct 19, 2018
  4. Oct 18, 2018
Loading