1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2015 Gooogle, Inc 3*4882a593Smuzhiyun * Written by Simon Glass <sjg@chromium.org> 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #ifndef _ASM_SIPI_H 9*4882a593Smuzhiyun #define _ASM_SIPI_H 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #define AP_DEFAULT_BASE 0x30000 12*4882a593Smuzhiyun #define AP_DEFAULT_SIZE 0x10000 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef __ASSEMBLER__ 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun /** 17*4882a593Smuzhiyun * struct sipi_params_16bit - 16-bit SIPI entry-point parameters 18*4882a593Smuzhiyun * 19*4882a593Smuzhiyun * These are set up in the same space as the SIPI 16-bit code so that each AP 20*4882a593Smuzhiyun * can access the parameters when it boots. 21*4882a593Smuzhiyun * 22*4882a593Smuzhiyun * Each of these must be set up for the AP to boot, except @segment which is 23*4882a593Smuzhiyun * set in the assembly code. 24*4882a593Smuzhiyun * 25*4882a593Smuzhiyun * @ap_start: 32-bit SIPI entry point for U-Boot 26*4882a593Smuzhiyun * @segment: Code segment for U-Boot 27*4882a593Smuzhiyun * @pad: Padding (not used) 28*4882a593Smuzhiyun * @gdt_limit: U-Boot GDT limit (X86_GDT_SIZE - 1) 29*4882a593Smuzhiyun * @gdt: U-Boot GDT (gd->arch.gdt) 30*4882a593Smuzhiyun * @unused: Not used 31*4882a593Smuzhiyun */ 32*4882a593Smuzhiyun struct __packed sipi_params_16bit { 33*4882a593Smuzhiyun u32 ap_start; 34*4882a593Smuzhiyun u16 segment; 35*4882a593Smuzhiyun u16 pad; 36*4882a593Smuzhiyun u16 gdt_limit; 37*4882a593Smuzhiyun u32 gdt; 38*4882a593Smuzhiyun u16 unused; 39*4882a593Smuzhiyun }; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /** 42*4882a593Smuzhiyun * struct sipi_params - 32-bit SIP entry-point parameters 43*4882a593Smuzhiyun * 44*4882a593Smuzhiyun * These are used by the AP init code and must be set up before the APs start. 45*4882a593Smuzhiyun * The members must match with the sipi_params layout in sipi_vector.S. 46*4882a593Smuzhiyun * 47*4882a593Smuzhiyun * The stack area extends down from @stack_top, with @stack_size allocated 48*4882a593Smuzhiyun * for each AP. 49*4882a593Smuzhiyun * 50*4882a593Smuzhiyun * @idt_ptr: Interrupt descriptor table pointer 51*4882a593Smuzhiyun * @stack_top: Top of the AP stack area 52*4882a593Smuzhiyun * @stack_size: Size of each AP's stack 53*4882a593Smuzhiyun * @microcode_lock: Used to ensure only one AP loads microcode at once 54*4882a593Smuzhiyun * 0xffffffff enables parallel loading. 55*4882a593Smuzhiyun * @microcode_ptr: Pointer to microcode, or 0 if none 56*4882a593Smuzhiyun * @msr_table_ptr: Pointer to saved MSRs, a list of struct saved_msr 57*4882a593Smuzhiyun * @msr_count: Number of saved MSRs 58*4882a593Smuzhiyun * @c_handler: C function to call once early init is complete 59*4882a593Smuzhiyun * @ap_count: Shared atomic value to allocate CPU indexes 60*4882a593Smuzhiyun */ 61*4882a593Smuzhiyun struct sipi_params { 62*4882a593Smuzhiyun u32 idt_ptr; 63*4882a593Smuzhiyun u32 stack_top; 64*4882a593Smuzhiyun u32 stack_size; 65*4882a593Smuzhiyun u32 microcode_lock; 66*4882a593Smuzhiyun u32 microcode_ptr; 67*4882a593Smuzhiyun u32 msr_table_ptr; 68*4882a593Smuzhiyun u32 msr_count; 69*4882a593Smuzhiyun u32 c_handler; 70*4882a593Smuzhiyun atomic_t ap_count; 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* 16-bit AP entry point */ 74*4882a593Smuzhiyun void ap_start16(void); 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun /* end of 16-bit code/data, marks the region to be copied to SIP vector */ 77*4882a593Smuzhiyun void ap_start16_code_end(void); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun /* 32-bit AP entry point */ 80*4882a593Smuzhiyun void ap_start(void); 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun extern char sipi_params_16bit[]; 83*4882a593Smuzhiyun extern char sipi_params[]; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun #endif /* __ASSEMBLER__ */ 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #endif 88