1*83d290c5STom Rini /* SPDX-License-Identifier: GPL-2.0+ */ 2fea25720SGraeme Russ /* 3fea25720SGraeme Russ * (C) Copyright 2002 4fa82f871SAlbert ARIBAUD * Daniel Engström, Omicron Ceti AB, daniel@omicron.se 5fea25720SGraeme Russ */ 6fea25720SGraeme Russ 7fea25720SGraeme Russ #ifndef __ASM_PROCESSOR_H_ 8fea25720SGraeme Russ #define __ASM_PROCESSOR_H_ 1 9fea25720SGraeme Russ 10109ad143SGraeme Russ #define X86_GDT_ENTRY_SIZE 8 11109ad143SGraeme Russ 12e34aef1dSSimon Glass #define X86_GDT_ENTRY_NULL 0 13e34aef1dSSimon Glass #define X86_GDT_ENTRY_UNUSED 1 14e34aef1dSSimon Glass #define X86_GDT_ENTRY_32BIT_CS 2 15109ad143SGraeme Russ #define X86_GDT_ENTRY_32BIT_DS 3 16e34aef1dSSimon Glass #define X86_GDT_ENTRY_32BIT_FS 4 17e34aef1dSSimon Glass #define X86_GDT_ENTRY_16BIT_CS 5 18e34aef1dSSimon Glass #define X86_GDT_ENTRY_16BIT_DS 6 19e34aef1dSSimon Glass #define X86_GDT_ENTRY_16BIT_FLAT_CS 7 20e34aef1dSSimon Glass #define X86_GDT_ENTRY_16BIT_FLAT_DS 8 21e34aef1dSSimon Glass #define X86_GDT_NUM_ENTRIES 9 22109ad143SGraeme Russ 23109ad143SGraeme Russ #define X86_GDT_SIZE (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE) 24fea25720SGraeme Russ 2545b5a378SSimon Glass /* Length of the public header on Intel microcode blobs */ 2645b5a378SSimon Glass #define UCODE_HEADER_LEN 0x30 2745b5a378SSimon Glass 2821b9b14bSSimon Glass #ifndef __ASSEMBLY__ 2921b9b14bSSimon Glass 30ff6a8f3cSSimon Glass /* 31ff6a8f3cSSimon Glass * This register is documented in (for example) the Intel Atom Processor E3800 32ff6a8f3cSSimon Glass * Product Family Datasheet in "PCU - Power Management Controller (PMC)". 33ff6a8f3cSSimon Glass * 34ff6a8f3cSSimon Glass * RST_CNT: Reset Control Register (RST_CNT) Offset cf9. 35ff6a8f3cSSimon Glass * 36ff6a8f3cSSimon Glass * The naming follows Intel's naming. 37ff6a8f3cSSimon Glass */ 382a605d4dSSimon Glass #define IO_PORT_RESET 0xcf9 39f5fbbe95SSimon Glass 40ff6a8f3cSSimon Glass enum { 41ff6a8f3cSSimon Glass SYS_RST = 1 << 1, /* 0 for soft reset, 1 for hard reset */ 42ff6a8f3cSSimon Glass RST_CPU = 1 << 2, /* initiate reset */ 43ff6a8f3cSSimon Glass FULL_RST = 1 << 3, /* full power cycle */ 44ff6a8f3cSSimon Glass }; 45ff6a8f3cSSimon Glass 46ff6a8f3cSSimon Glass /** 47ff6a8f3cSSimon Glass * x86_full_reset() - reset everything: perform a full power cycle 48ff6a8f3cSSimon Glass */ 49ff6a8f3cSSimon Glass void x86_full_reset(void); 50ff6a8f3cSSimon Glass 5121b9b14bSSimon Glass static inline __attribute__((always_inline)) void cpu_hlt(void) 5221b9b14bSSimon Glass { 5321b9b14bSSimon Glass asm("hlt"); 5421b9b14bSSimon Glass } 5521b9b14bSSimon Glass 5621b9b14bSSimon Glass static inline ulong cpu_get_sp(void) 5721b9b14bSSimon Glass { 5821b9b14bSSimon Glass ulong result; 5921b9b14bSSimon Glass 6021b9b14bSSimon Glass asm volatile( 6121b9b14bSSimon Glass "mov %%esp, %%eax" 6221b9b14bSSimon Glass : "=a" (result)); 6321b9b14bSSimon Glass return result; 6421b9b14bSSimon Glass } 6521b9b14bSSimon Glass 6621b9b14bSSimon Glass #endif /* __ASSEMBLY__ */ 6721b9b14bSSimon Glass 68fea25720SGraeme Russ #endif 69