diff mbox

[U-Boot,v3,11/27] x86: queensbay: Adapt FSP support codes

Message ID 1418389545-11254-12-git-send-email-bmeng.cn@gmail.com
State Accepted
Delegated to: Simon Glass
Headers show

Commit Message

Bin Meng Dec. 12, 2014, 1:05 p.m. UTC
Use inline assembly codes to call FspNotify() to make sure parameters
are passed on the stack as required by the FSP calling convention.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>

---

Changes in v3:
- Move license header changes to last commit

Changes in v2:
- Update the codes to use U-Boot coding style

 arch/x86/cpu/queensbay/fsp_configs.c               |  5 ++-
 arch/x86/cpu/queensbay/fsp_support.c               | 39 ++++++++++++++--------
 .../include/asm/arch-queensbay/fsp/fsp_support.h   |  2 +-
 3 files changed, 28 insertions(+), 18 deletions(-)

Comments

Simon Glass Dec. 12, 2014, 6:49 p.m. UTC | #1
Hi Bin,

On 12 December 2014 at 06:05, Bin Meng <bmeng.cn@gmail.com> wrote:
> Use inline assembly codes to call FspNotify() to make sure parameters
> are passed on the stack as required by the FSP calling convention.
>
> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>
> ---
>
> Changes in v3:
> - Move license header changes to last commit
>
> Changes in v2:
> - Update the codes to use U-Boot coding style
>
>  arch/x86/cpu/queensbay/fsp_configs.c               |  5 ++-
>  arch/x86/cpu/queensbay/fsp_support.c               | 39 ++++++++++++++--------
>  .../include/asm/arch-queensbay/fsp/fsp_support.h   |  2 +-
>  3 files changed, 28 insertions(+), 18 deletions(-)
>
> diff --git a/arch/x86/cpu/queensbay/fsp_configs.c b/arch/x86/cpu/queensbay/fsp_configs.c
> index a7bb314..aef18fc 100644
> --- a/arch/x86/cpu/queensbay/fsp_configs.c
> +++ b/arch/x86/cpu/queensbay/fsp_configs.c
> @@ -5,9 +5,8 @@
>   * SPDX-License-Identifier:    Intel
>   */
>
> -#include <types.h>
> -#include <string.h>
> -#include "fsp_support.h"
> +#include <common.h>
> +#include <asm/arch/fsp/fsp_support.h>
>
>  void update_fsp_upd(struct upd_region_t *fsp_upd)
>  {
> diff --git a/arch/x86/cpu/queensbay/fsp_support.c b/arch/x86/cpu/queensbay/fsp_support.c
> index 2048030..df3bbd0 100644
> --- a/arch/x86/cpu/queensbay/fsp_support.c
> +++ b/arch/x86/cpu/queensbay/fsp_support.c
> @@ -5,9 +5,9 @@
>   * SPDX-License-Identifier:    Intel
>   */
>
> -#include <types.h>
> -#include <string.h>
> -#include "fsp_support.h"
> +#include <common.h>
> +#include <asm/arch/fsp/fsp_support.h>
> +#include <asm/post.h>
>
>  /**
>   * Reads a 64-bit value from memory that may be unaligned.
> @@ -99,13 +99,14 @@ u32 __attribute__((optimize("O0"))) find_fsp_header(void)
>         return (u32)fsp;
>  }
>
> -#ifdef __PRE_RAM__
>  void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>  {
>         u32 stack_len;
>         u32 stack_base;
>         u32 stack_top;
>
> +       post_code(POST_MRC);
> +
>         ASSERT(status == 0);
>
>         /* Get the migrated stack in normal memory */
> @@ -121,7 +122,7 @@ void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>                         ((u32)shared_data - *(u32 *)stack_top));
>
>         /* The boot loader main function entry */
> -       bl_main_continue(hob_list, shared_data);
> +       fsp_init_done(hob_list);
>  }
>
>  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
> @@ -178,6 +179,8 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>         shared_data.fsp_hdr = fsp_hdr;
>         shared_data.stack_top = (u32 *)stack_top;
>
> +       post_code(POST_PRE_MRC);
> +
>         /*
>          * Use ASM code to ensure the register value in EAX & ECX
>          * will be passed into BlContinuationFunc
> @@ -187,11 +190,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>                 "call   *%%eax;"
>                 ".global asm_continuation;"
>                 "asm_continuation:;"
> -               "popl   %%eax;" /* pop out return address */
> -               "pushl  %%ecx;" /* push shared_data pointer */
> -               "pushl  %%eax;" /* push back return address */
> +               "movl   %%ebx, %%eax;"          /* shared_data */
> +               "movl   4(%%esp), %%edx;"       /* status */
> +               "movl   8(%%esp), %%ecx;"       /* hob_list */
>                 "jmp    fsp_continue;"
> -               : : "m"(params_ptr), "a"(init), "c"(&shared_data)
> +               : : "m"(params_ptr), "a"(init), "b"(&shared_data)
>         );
>
>         /*
> @@ -209,12 +212,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>         ASSERT(FALSE);
>  }
>
> -#else
> -
>  u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>  {
>         fsp_notify_f notify;
>         struct fsp_notify_params_t params;
> +       struct fsp_notify_params_t *params_ptr;
>         u32 status;
>
>         if (!fsp_hdr)
> @@ -227,13 +229,22 @@ u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>
>         notify = (fsp_notify_f)(fsp_hdr->img_base + fsp_hdr->fsp_notify);
>         params.phase = phase;
> -       status = notify(&params);
> +       params_ptr = &params;
> +
> +       /*
> +        * Use ASM code to ensure correct parameter is on the stack for
> +        * FspNotify as U-Boot is using different ABI from FSP
> +        */
> +       asm volatile (
> +               "pushl  %1;"            /* push notify phase */
> +               "call   *%%eax;"        /* call FspNotify */
> +               "addl   $4, %%esp;"     /* clean up the stack */
> +               : "=a"(status) : "m"(params_ptr), "a"(notify), "m"(*params_ptr)
> +       );
>
>         return status;
>  }
>
> -#endif  /* __PRE_RAM__ */
> -
>  u32 get_usable_lowmem_top(const void *hob_list)
>  {
>         union hob_pointers_t hob;
> diff --git a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
> index 3e53ea1..3296a2b 100644
> --- a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
> +++ b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
> @@ -26,7 +26,7 @@ struct shared_data_t {

Can we get rid of the _t suffix on these structures? A follow-on patch
would be OK if you prefer.

>
>  void asm_continuation(void);
>
> -void bl_main_continue(void *hob_list, struct shared_data_t *shared_data);
> +void fsp_init_done(void *hob_list);

Function comments for these?

Regards,
Simon
Bin Meng Dec. 13, 2014, 4:50 a.m. UTC | #2
Hi Simon,

On Sat, Dec 13, 2014 at 2:49 AM, Simon Glass <sjg@chromium.org> wrote:
> Hi Bin,
>
> On 12 December 2014 at 06:05, Bin Meng <bmeng.cn@gmail.com> wrote:
>> Use inline assembly codes to call FspNotify() to make sure parameters
>> are passed on the stack as required by the FSP calling convention.
>>
>> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>>
>> ---
>>
>> Changes in v3:
>> - Move license header changes to last commit
>>
>> Changes in v2:
>> - Update the codes to use U-Boot coding style
>>
>>  arch/x86/cpu/queensbay/fsp_configs.c               |  5 ++-
>>  arch/x86/cpu/queensbay/fsp_support.c               | 39 ++++++++++++++--------
>>  .../include/asm/arch-queensbay/fsp/fsp_support.h   |  2 +-
>>  3 files changed, 28 insertions(+), 18 deletions(-)
>>
>> diff --git a/arch/x86/cpu/queensbay/fsp_configs.c b/arch/x86/cpu/queensbay/fsp_configs.c
>> index a7bb314..aef18fc 100644
>> --- a/arch/x86/cpu/queensbay/fsp_configs.c
>> +++ b/arch/x86/cpu/queensbay/fsp_configs.c
>> @@ -5,9 +5,8 @@
>>   * SPDX-License-Identifier:    Intel
>>   */
>>
>> -#include <types.h>
>> -#include <string.h>
>> -#include "fsp_support.h"
>> +#include <common.h>
>> +#include <asm/arch/fsp/fsp_support.h>
>>
>>  void update_fsp_upd(struct upd_region_t *fsp_upd)
>>  {
>> diff --git a/arch/x86/cpu/queensbay/fsp_support.c b/arch/x86/cpu/queensbay/fsp_support.c
>> index 2048030..df3bbd0 100644
>> --- a/arch/x86/cpu/queensbay/fsp_support.c
>> +++ b/arch/x86/cpu/queensbay/fsp_support.c
>> @@ -5,9 +5,9 @@
>>   * SPDX-License-Identifier:    Intel
>>   */
>>
>> -#include <types.h>
>> -#include <string.h>
>> -#include "fsp_support.h"
>> +#include <common.h>
>> +#include <asm/arch/fsp/fsp_support.h>
>> +#include <asm/post.h>
>>
>>  /**
>>   * Reads a 64-bit value from memory that may be unaligned.
>> @@ -99,13 +99,14 @@ u32 __attribute__((optimize("O0"))) find_fsp_header(void)
>>         return (u32)fsp;
>>  }
>>
>> -#ifdef __PRE_RAM__
>>  void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>>  {
>>         u32 stack_len;
>>         u32 stack_base;
>>         u32 stack_top;
>>
>> +       post_code(POST_MRC);
>> +
>>         ASSERT(status == 0);
>>
>>         /* Get the migrated stack in normal memory */
>> @@ -121,7 +122,7 @@ void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>>                         ((u32)shared_data - *(u32 *)stack_top));
>>
>>         /* The boot loader main function entry */
>> -       bl_main_continue(hob_list, shared_data);
>> +       fsp_init_done(hob_list);
>>  }
>>
>>  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>> @@ -178,6 +179,8 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>         shared_data.fsp_hdr = fsp_hdr;
>>         shared_data.stack_top = (u32 *)stack_top;
>>
>> +       post_code(POST_PRE_MRC);
>> +
>>         /*
>>          * Use ASM code to ensure the register value in EAX & ECX
>>          * will be passed into BlContinuationFunc
>> @@ -187,11 +190,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>                 "call   *%%eax;"
>>                 ".global asm_continuation;"
>>                 "asm_continuation:;"
>> -               "popl   %%eax;" /* pop out return address */
>> -               "pushl  %%ecx;" /* push shared_data pointer */
>> -               "pushl  %%eax;" /* push back return address */
>> +               "movl   %%ebx, %%eax;"          /* shared_data */
>> +               "movl   4(%%esp), %%edx;"       /* status */
>> +               "movl   8(%%esp), %%ecx;"       /* hob_list */
>>                 "jmp    fsp_continue;"
>> -               : : "m"(params_ptr), "a"(init), "c"(&shared_data)
>> +               : : "m"(params_ptr), "a"(init), "b"(&shared_data)
>>         );
>>
>>         /*
>> @@ -209,12 +212,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>         ASSERT(FALSE);
>>  }
>>
>> -#else
>> -
>>  u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>>  {
>>         fsp_notify_f notify;
>>         struct fsp_notify_params_t params;
>> +       struct fsp_notify_params_t *params_ptr;
>>         u32 status;
>>
>>         if (!fsp_hdr)
>> @@ -227,13 +229,22 @@ u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>>
>>         notify = (fsp_notify_f)(fsp_hdr->img_base + fsp_hdr->fsp_notify);
>>         params.phase = phase;
>> -       status = notify(&params);
>> +       params_ptr = &params;
>> +
>> +       /*
>> +        * Use ASM code to ensure correct parameter is on the stack for
>> +        * FspNotify as U-Boot is using different ABI from FSP
>> +        */
>> +       asm volatile (
>> +               "pushl  %1;"            /* push notify phase */
>> +               "call   *%%eax;"        /* call FspNotify */
>> +               "addl   $4, %%esp;"     /* clean up the stack */
>> +               : "=a"(status) : "m"(params_ptr), "a"(notify), "m"(*params_ptr)
>> +       );
>>
>>         return status;
>>  }
>>
>> -#endif  /* __PRE_RAM__ */
>> -
>>  u32 get_usable_lowmem_top(const void *hob_list)
>>  {
>>         union hob_pointers_t hob;
>> diff --git a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>> index 3e53ea1..3296a2b 100644
>> --- a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>> +++ b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>> @@ -26,7 +26,7 @@ struct shared_data_t {
>
> Can we get rid of the _t suffix on these structures? A follow-on patch
> would be OK if you prefer.

Yes, I will send a follow-on patch.

>>
>>  void asm_continuation(void);
>>
>> -void bl_main_continue(void *hob_list, struct shared_data_t *shared_data);
>> +void fsp_init_done(void *hob_list);
>
> Function comments for these?
>

Will be fixed in the follow-on patch.

Regards,
Bin
Bin Meng Dec. 14, 2014, 4:17 a.m. UTC | #3
Hi Simon,

On Sat, Dec 13, 2014 at 12:50 PM, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Sat, Dec 13, 2014 at 2:49 AM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Bin,
>>
>> On 12 December 2014 at 06:05, Bin Meng <bmeng.cn@gmail.com> wrote:
>>> Use inline assembly codes to call FspNotify() to make sure parameters
>>> are passed on the stack as required by the FSP calling convention.
>>>
>>> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>>>
>>> ---
>>>
>>> Changes in v3:
>>> - Move license header changes to last commit
>>>
>>> Changes in v2:
>>> - Update the codes to use U-Boot coding style
>>>
>>>  arch/x86/cpu/queensbay/fsp_configs.c               |  5 ++-
>>>  arch/x86/cpu/queensbay/fsp_support.c               | 39 ++++++++++++++--------
>>>  .../include/asm/arch-queensbay/fsp/fsp_support.h   |  2 +-
>>>  3 files changed, 28 insertions(+), 18 deletions(-)
>>>
>>> diff --git a/arch/x86/cpu/queensbay/fsp_configs.c b/arch/x86/cpu/queensbay/fsp_configs.c
>>> index a7bb314..aef18fc 100644
>>> --- a/arch/x86/cpu/queensbay/fsp_configs.c
>>> +++ b/arch/x86/cpu/queensbay/fsp_configs.c
>>> @@ -5,9 +5,8 @@
>>>   * SPDX-License-Identifier:    Intel
>>>   */
>>>
>>> -#include <types.h>
>>> -#include <string.h>
>>> -#include "fsp_support.h"
>>> +#include <common.h>
>>> +#include <asm/arch/fsp/fsp_support.h>
>>>
>>>  void update_fsp_upd(struct upd_region_t *fsp_upd)
>>>  {
>>> diff --git a/arch/x86/cpu/queensbay/fsp_support.c b/arch/x86/cpu/queensbay/fsp_support.c
>>> index 2048030..df3bbd0 100644
>>> --- a/arch/x86/cpu/queensbay/fsp_support.c
>>> +++ b/arch/x86/cpu/queensbay/fsp_support.c
>>> @@ -5,9 +5,9 @@
>>>   * SPDX-License-Identifier:    Intel
>>>   */
>>>
>>> -#include <types.h>
>>> -#include <string.h>
>>> -#include "fsp_support.h"
>>> +#include <common.h>
>>> +#include <asm/arch/fsp/fsp_support.h>
>>> +#include <asm/post.h>
>>>
>>>  /**
>>>   * Reads a 64-bit value from memory that may be unaligned.
>>> @@ -99,13 +99,14 @@ u32 __attribute__((optimize("O0"))) find_fsp_header(void)
>>>         return (u32)fsp;
>>>  }
>>>
>>> -#ifdef __PRE_RAM__
>>>  void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>>>  {
>>>         u32 stack_len;
>>>         u32 stack_base;
>>>         u32 stack_top;
>>>
>>> +       post_code(POST_MRC);
>>> +
>>>         ASSERT(status == 0);
>>>
>>>         /* Get the migrated stack in normal memory */
>>> @@ -121,7 +122,7 @@ void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>>>                         ((u32)shared_data - *(u32 *)stack_top));
>>>
>>>         /* The boot loader main function entry */
>>> -       bl_main_continue(hob_list, shared_data);
>>> +       fsp_init_done(hob_list);
>>>  }
>>>
>>>  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>> @@ -178,6 +179,8 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>         shared_data.fsp_hdr = fsp_hdr;
>>>         shared_data.stack_top = (u32 *)stack_top;
>>>
>>> +       post_code(POST_PRE_MRC);
>>> +
>>>         /*
>>>          * Use ASM code to ensure the register value in EAX & ECX
>>>          * will be passed into BlContinuationFunc
>>> @@ -187,11 +190,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>                 "call   *%%eax;"
>>>                 ".global asm_continuation;"
>>>                 "asm_continuation:;"
>>> -               "popl   %%eax;" /* pop out return address */
>>> -               "pushl  %%ecx;" /* push shared_data pointer */
>>> -               "pushl  %%eax;" /* push back return address */
>>> +               "movl   %%ebx, %%eax;"          /* shared_data */
>>> +               "movl   4(%%esp), %%edx;"       /* status */
>>> +               "movl   8(%%esp), %%ecx;"       /* hob_list */
>>>                 "jmp    fsp_continue;"
>>> -               : : "m"(params_ptr), "a"(init), "c"(&shared_data)
>>> +               : : "m"(params_ptr), "a"(init), "b"(&shared_data)
>>>         );
>>>
>>>         /*
>>> @@ -209,12 +212,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>         ASSERT(FALSE);
>>>  }
>>>
>>> -#else
>>> -
>>>  u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>>>  {
>>>         fsp_notify_f notify;
>>>         struct fsp_notify_params_t params;
>>> +       struct fsp_notify_params_t *params_ptr;
>>>         u32 status;
>>>
>>>         if (!fsp_hdr)
>>> @@ -227,13 +229,22 @@ u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>>>
>>>         notify = (fsp_notify_f)(fsp_hdr->img_base + fsp_hdr->fsp_notify);
>>>         params.phase = phase;
>>> -       status = notify(&params);
>>> +       params_ptr = &params;
>>> +
>>> +       /*
>>> +        * Use ASM code to ensure correct parameter is on the stack for
>>> +        * FspNotify as U-Boot is using different ABI from FSP
>>> +        */
>>> +       asm volatile (
>>> +               "pushl  %1;"            /* push notify phase */
>>> +               "call   *%%eax;"        /* call FspNotify */
>>> +               "addl   $4, %%esp;"     /* clean up the stack */
>>> +               : "=a"(status) : "m"(params_ptr), "a"(notify), "m"(*params_ptr)
>>> +       );
>>>
>>>         return status;
>>>  }
>>>
>>> -#endif  /* __PRE_RAM__ */
>>> -
>>>  u32 get_usable_lowmem_top(const void *hob_list)
>>>  {
>>>         union hob_pointers_t hob;
>>> diff --git a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>>> index 3e53ea1..3296a2b 100644
>>> --- a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>>> +++ b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>>> @@ -26,7 +26,7 @@ struct shared_data_t {
>>
>> Can we get rid of the _t suffix on these structures? A follow-on patch
>> would be OK if you prefer.
>
> Yes, I will send a follow-on patch.
>
>>>
>>>  void asm_continuation(void);
>>>
>>> -void bl_main_continue(void *hob_list, struct shared_data_t *shared_data);
>>> +void fsp_init_done(void *hob_list);
>>
>> Function comments for these?
>>
>
> Will be fixed in the follow-on patch.
>

These two issues are fixed in the follow-on patch @
http://patchwork.ozlabs.org/patch/420827/

Regards,
Bin
Simon Glass Dec. 15, 2014, 6:26 p.m. UTC | #4
On 13 December 2014 at 21:17, Bin Meng <bmeng.cn@gmail.com> wrote:
> Hi Simon,
>
> On Sat, Dec 13, 2014 at 12:50 PM, Bin Meng <bmeng.cn@gmail.com> wrote:
>> Hi Simon,
>>
>> On Sat, Dec 13, 2014 at 2:49 AM, Simon Glass <sjg@chromium.org> wrote:
>>> Hi Bin,
>>>
>>> On 12 December 2014 at 06:05, Bin Meng <bmeng.cn@gmail.com> wrote:
>>>> Use inline assembly codes to call FspNotify() to make sure parameters
>>>> are passed on the stack as required by the FSP calling convention.
>>>>
>>>> Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
>>>>
>>>> ---
>>>>
>>>> Changes in v3:
>>>> - Move license header changes to last commit
>>>>
>>>> Changes in v2:
>>>> - Update the codes to use U-Boot coding style
>>>>
>>>>  arch/x86/cpu/queensbay/fsp_configs.c               |  5 ++-
>>>>  arch/x86/cpu/queensbay/fsp_support.c               | 39 ++++++++++++++--------
>>>>  .../include/asm/arch-queensbay/fsp/fsp_support.h   |  2 +-
>>>>  3 files changed, 28 insertions(+), 18 deletions(-)
>>>>
>>>> diff --git a/arch/x86/cpu/queensbay/fsp_configs.c b/arch/x86/cpu/queensbay/fsp_configs.c
>>>> index a7bb314..aef18fc 100644
>>>> --- a/arch/x86/cpu/queensbay/fsp_configs.c
>>>> +++ b/arch/x86/cpu/queensbay/fsp_configs.c
>>>> @@ -5,9 +5,8 @@
>>>>   * SPDX-License-Identifier:    Intel
>>>>   */
>>>>
>>>> -#include <types.h>
>>>> -#include <string.h>
>>>> -#include "fsp_support.h"
>>>> +#include <common.h>
>>>> +#include <asm/arch/fsp/fsp_support.h>
>>>>
>>>>  void update_fsp_upd(struct upd_region_t *fsp_upd)
>>>>  {
>>>> diff --git a/arch/x86/cpu/queensbay/fsp_support.c b/arch/x86/cpu/queensbay/fsp_support.c
>>>> index 2048030..df3bbd0 100644
>>>> --- a/arch/x86/cpu/queensbay/fsp_support.c
>>>> +++ b/arch/x86/cpu/queensbay/fsp_support.c
>>>> @@ -5,9 +5,9 @@
>>>>   * SPDX-License-Identifier:    Intel
>>>>   */
>>>>
>>>> -#include <types.h>
>>>> -#include <string.h>
>>>> -#include "fsp_support.h"
>>>> +#include <common.h>
>>>> +#include <asm/arch/fsp/fsp_support.h>
>>>> +#include <asm/post.h>
>>>>
>>>>  /**
>>>>   * Reads a 64-bit value from memory that may be unaligned.
>>>> @@ -99,13 +99,14 @@ u32 __attribute__((optimize("O0"))) find_fsp_header(void)
>>>>         return (u32)fsp;
>>>>  }
>>>>
>>>> -#ifdef __PRE_RAM__
>>>>  void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>>>>  {
>>>>         u32 stack_len;
>>>>         u32 stack_base;
>>>>         u32 stack_top;
>>>>
>>>> +       post_code(POST_MRC);
>>>> +
>>>>         ASSERT(status == 0);
>>>>
>>>>         /* Get the migrated stack in normal memory */
>>>> @@ -121,7 +122,7 @@ void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
>>>>                         ((u32)shared_data - *(u32 *)stack_top));
>>>>
>>>>         /* The boot loader main function entry */
>>>> -       bl_main_continue(hob_list, shared_data);
>>>> +       fsp_init_done(hob_list);
>>>>  }
>>>>
>>>>  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>> @@ -178,6 +179,8 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>>         shared_data.fsp_hdr = fsp_hdr;
>>>>         shared_data.stack_top = (u32 *)stack_top;
>>>>
>>>> +       post_code(POST_PRE_MRC);
>>>> +
>>>>         /*
>>>>          * Use ASM code to ensure the register value in EAX & ECX
>>>>          * will be passed into BlContinuationFunc
>>>> @@ -187,11 +190,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>>                 "call   *%%eax;"
>>>>                 ".global asm_continuation;"
>>>>                 "asm_continuation:;"
>>>> -               "popl   %%eax;" /* pop out return address */
>>>> -               "pushl  %%ecx;" /* push shared_data pointer */
>>>> -               "pushl  %%eax;" /* push back return address */
>>>> +               "movl   %%ebx, %%eax;"          /* shared_data */
>>>> +               "movl   4(%%esp), %%edx;"       /* status */
>>>> +               "movl   8(%%esp), %%ecx;"       /* hob_list */
>>>>                 "jmp    fsp_continue;"
>>>> -               : : "m"(params_ptr), "a"(init), "c"(&shared_data)
>>>> +               : : "m"(params_ptr), "a"(init), "b"(&shared_data)
>>>>         );
>>>>
>>>>         /*
>>>> @@ -209,12 +212,11 @@ void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
>>>>         ASSERT(FALSE);
>>>>  }
>>>>
>>>> -#else
>>>> -
>>>>  u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>>>>  {
>>>>         fsp_notify_f notify;
>>>>         struct fsp_notify_params_t params;
>>>> +       struct fsp_notify_params_t *params_ptr;
>>>>         u32 status;
>>>>
>>>>         if (!fsp_hdr)
>>>> @@ -227,13 +229,22 @@ u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
>>>>
>>>>         notify = (fsp_notify_f)(fsp_hdr->img_base + fsp_hdr->fsp_notify);
>>>>         params.phase = phase;
>>>> -       status = notify(&params);
>>>> +       params_ptr = &params;
>>>> +
>>>> +       /*
>>>> +        * Use ASM code to ensure correct parameter is on the stack for
>>>> +        * FspNotify as U-Boot is using different ABI from FSP
>>>> +        */
>>>> +       asm volatile (
>>>> +               "pushl  %1;"            /* push notify phase */
>>>> +               "call   *%%eax;"        /* call FspNotify */
>>>> +               "addl   $4, %%esp;"     /* clean up the stack */
>>>> +               : "=a"(status) : "m"(params_ptr), "a"(notify), "m"(*params_ptr)
>>>> +       );
>>>>
>>>>         return status;
>>>>  }
>>>>
>>>> -#endif  /* __PRE_RAM__ */
>>>> -
>>>>  u32 get_usable_lowmem_top(const void *hob_list)
>>>>  {
>>>>         union hob_pointers_t hob;
>>>> diff --git a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>>>> index 3e53ea1..3296a2b 100644
>>>> --- a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>>>> +++ b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
>>>> @@ -26,7 +26,7 @@ struct shared_data_t {
>>>
>>> Can we get rid of the _t suffix on these structures? A follow-on patch
>>> would be OK if you prefer.
>>
>> Yes, I will send a follow-on patch.
>>
>>>>
>>>>  void asm_continuation(void);
>>>>
>>>> -void bl_main_continue(void *hob_list, struct shared_data_t *shared_data);
>>>> +void fsp_init_done(void *hob_list);
>>>
>>> Function comments for these?
>>>
>>
>> Will be fixed in the follow-on patch.
>>
>
> These two issues are fixed in the follow-on patch @
> http://patchwork.ozlabs.org/patch/420827/

Applied to u-boot-x86, thanks!
diff mbox

Patch

diff --git a/arch/x86/cpu/queensbay/fsp_configs.c b/arch/x86/cpu/queensbay/fsp_configs.c
index a7bb314..aef18fc 100644
--- a/arch/x86/cpu/queensbay/fsp_configs.c
+++ b/arch/x86/cpu/queensbay/fsp_configs.c
@@ -5,9 +5,8 @@ 
  * SPDX-License-Identifier:	Intel
  */
 
-#include <types.h>
-#include <string.h>
-#include "fsp_support.h"
+#include <common.h>
+#include <asm/arch/fsp/fsp_support.h>
 
 void update_fsp_upd(struct upd_region_t *fsp_upd)
 {
diff --git a/arch/x86/cpu/queensbay/fsp_support.c b/arch/x86/cpu/queensbay/fsp_support.c
index 2048030..df3bbd0 100644
--- a/arch/x86/cpu/queensbay/fsp_support.c
+++ b/arch/x86/cpu/queensbay/fsp_support.c
@@ -5,9 +5,9 @@ 
  * SPDX-License-Identifier:	Intel
  */
 
-#include <types.h>
-#include <string.h>
-#include "fsp_support.h"
+#include <common.h>
+#include <asm/arch/fsp/fsp_support.h>
+#include <asm/post.h>
 
 /**
  * Reads a 64-bit value from memory that may be unaligned.
@@ -99,13 +99,14 @@  u32 __attribute__((optimize("O0"))) find_fsp_header(void)
 	return (u32)fsp;
 }
 
-#ifdef __PRE_RAM__
 void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
 {
 	u32 stack_len;
 	u32 stack_base;
 	u32 stack_top;
 
+	post_code(POST_MRC);
+
 	ASSERT(status == 0);
 
 	/* Get the migrated stack in normal memory */
@@ -121,7 +122,7 @@  void fsp_continue(struct shared_data_t *shared_data, u32 status, void *hob_list)
 			((u32)shared_data - *(u32 *)stack_top));
 
 	/* The boot loader main function entry */
-	bl_main_continue(hob_list, shared_data);
+	fsp_init_done(hob_list);
 }
 
 void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
@@ -178,6 +179,8 @@  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
 	shared_data.fsp_hdr = fsp_hdr;
 	shared_data.stack_top = (u32 *)stack_top;
 
+	post_code(POST_PRE_MRC);
+
 	/*
 	 * Use ASM code to ensure the register value in EAX & ECX
 	 * will be passed into BlContinuationFunc
@@ -187,11 +190,11 @@  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
 		"call	*%%eax;"
 		".global asm_continuation;"
 		"asm_continuation:;"
-		"popl	%%eax;"	/* pop out return address */
-		"pushl	%%ecx;"	/* push shared_data pointer */
-		"pushl	%%eax;"	/* push back return address */
+		"movl	%%ebx, %%eax;"		/* shared_data */
+		"movl	4(%%esp), %%edx;"	/* status */
+		"movl	8(%%esp), %%ecx;"	/* hob_list */
 		"jmp	fsp_continue;"
-		: : "m"(params_ptr), "a"(init), "c"(&shared_data)
+		: : "m"(params_ptr), "a"(init), "b"(&shared_data)
 	);
 
 	/*
@@ -209,12 +212,11 @@  void fsp_init(u32 stack_top, u32 boot_mode, void *nvs_buf)
 	ASSERT(FALSE);
 }
 
-#else
-
 u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
 {
 	fsp_notify_f notify;
 	struct fsp_notify_params_t params;
+	struct fsp_notify_params_t *params_ptr;
 	u32 status;
 
 	if (!fsp_hdr)
@@ -227,13 +229,22 @@  u32 fsp_notify(struct fsp_header_t *fsp_hdr, u32 phase)
 
 	notify = (fsp_notify_f)(fsp_hdr->img_base + fsp_hdr->fsp_notify);
 	params.phase = phase;
-	status = notify(&params);
+	params_ptr = &params;
+
+	/*
+	 * Use ASM code to ensure correct parameter is on the stack for
+	 * FspNotify as U-Boot is using different ABI from FSP
+	 */
+	asm volatile (
+		"pushl	%1;"		/* push notify phase */
+		"call	*%%eax;"	/* call FspNotify */
+		"addl	$4, %%esp;"	/* clean up the stack */
+		: "=a"(status) : "m"(params_ptr), "a"(notify), "m"(*params_ptr)
+	);
 
 	return status;
 }
 
-#endif  /* __PRE_RAM__ */
-
 u32 get_usable_lowmem_top(const void *hob_list)
 {
 	union hob_pointers_t hob;
diff --git a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
index 3e53ea1..3296a2b 100644
--- a/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
+++ b/arch/x86/include/asm/arch-queensbay/fsp/fsp_support.h
@@ -26,7 +26,7 @@  struct shared_data_t {
 
 void asm_continuation(void);
 
-void bl_main_continue(void *hob_list, struct shared_data_t *shared_data);
+void fsp_init_done(void *hob_list);
 
 /**
  * FSP Continuation function