Branch data Line data Source code
1 : : /* sfi.h Simple Firmware Interface */ 2 : : 3 : : /* 4 : : 5 : : This file is provided under a dual BSD/GPLv2 license. When using or 6 : : redistributing this file, you may do so under either license. 7 : : 8 : : GPL LICENSE SUMMARY 9 : : 10 : : Copyright(c) 2009 Intel Corporation. All rights reserved. 11 : : 12 : : This program is free software; you can redistribute it and/or modify 13 : : it under the terms of version 2 of the GNU General Public License as 14 : : published by the Free Software Foundation. 15 : : 16 : : This program is distributed in the hope that it will be useful, but 17 : : WITHOUT ANY WARRANTY; without even the implied warranty of 18 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 19 : : General Public License for more details. 20 : : 21 : : You should have received a copy of the GNU General Public License 22 : : along with this program; if not, write to the Free Software 23 : : Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. 24 : : The full GNU General Public License is included in this distribution 25 : : in the file called LICENSE.GPL. 26 : : 27 : : BSD LICENSE 28 : : 29 : : Copyright(c) 2009 Intel Corporation. All rights reserved. 30 : : 31 : : Redistribution and use in source and binary forms, with or without 32 : : modification, are permitted provided that the following conditions 33 : : are met: 34 : : 35 : : * Redistributions of source code must retain the above copyright 36 : : notice, this list of conditions and the following disclaimer. 37 : : * Redistributions in binary form must reproduce the above copyright 38 : : notice, this list of conditions and the following disclaimer in 39 : : the documentation and/or other materials provided with the 40 : : distribution. 41 : : * Neither the name of Intel Corporation nor the names of its 42 : : contributors may be used to endorse or promote products derived 43 : : from this software without specific prior written permission. 44 : : 45 : : THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 46 : : "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 47 : : LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 48 : : A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 49 : : OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 50 : : SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 51 : : LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 52 : : DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 53 : : THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 54 : : (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 55 : : OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 56 : : 57 : : */ 58 : : 59 : : #ifndef _LINUX_SFI_H 60 : : #define _LINUX_SFI_H 61 : : 62 : : #include <linux/init.h> 63 : : #include <linux/types.h> 64 : : 65 : : /* Table signatures reserved by the SFI specification */ 66 : : #define SFI_SIG_SYST "SYST" 67 : : #define SFI_SIG_FREQ "FREQ" 68 : : #define SFI_SIG_IDLE "IDLE" 69 : : #define SFI_SIG_CPUS "CPUS" 70 : : #define SFI_SIG_MTMR "MTMR" 71 : : #define SFI_SIG_MRTC "MRTC" 72 : : #define SFI_SIG_MMAP "MMAP" 73 : : #define SFI_SIG_APIC "APIC" 74 : : #define SFI_SIG_XSDT "XSDT" 75 : : #define SFI_SIG_WAKE "WAKE" 76 : : #define SFI_SIG_DEVS "DEVS" 77 : : #define SFI_SIG_GPIO "GPIO" 78 : : 79 : : #define SFI_SIGNATURE_SIZE 4 80 : : #define SFI_OEM_ID_SIZE 6 81 : : #define SFI_OEM_TABLE_ID_SIZE 8 82 : : 83 : : #define SFI_NAME_LEN 16 84 : : 85 : : #define SFI_SYST_SEARCH_BEGIN 0x000E0000 86 : : #define SFI_SYST_SEARCH_END 0x000FFFFF 87 : : 88 : : #define SFI_GET_NUM_ENTRIES(ptable, entry_type) \ 89 : : ((ptable->header.len - sizeof(struct sfi_table_header)) / \ 90 : : (sizeof(entry_type))) 91 : : /* 92 : : * Table structures must be byte-packed to match the SFI specification, 93 : : * as they are provided by the BIOS. 94 : : */ 95 : : struct sfi_table_header { 96 : : char sig[SFI_SIGNATURE_SIZE]; 97 : : u32 len; 98 : : u8 rev; 99 : : u8 csum; 100 : : char oem_id[SFI_OEM_ID_SIZE]; 101 : : char oem_table_id[SFI_OEM_TABLE_ID_SIZE]; 102 : : } __packed; 103 : : 104 : : struct sfi_table_simple { 105 : : struct sfi_table_header header; 106 : : u64 pentry[1]; 107 : : } __packed; 108 : : 109 : : /* Comply with UEFI spec 2.1 */ 110 : : struct sfi_mem_entry { 111 : : u32 type; 112 : : u64 phys_start; 113 : : u64 virt_start; 114 : : u64 pages; 115 : : u64 attrib; 116 : : } __packed; 117 : : 118 : : struct sfi_cpu_table_entry { 119 : : u32 apic_id; 120 : : } __packed; 121 : : 122 : : struct sfi_cstate_table_entry { 123 : : u32 hint; /* MWAIT hint */ 124 : : u32 latency; /* latency in ms */ 125 : : } __packed; 126 : : 127 : : struct sfi_apic_table_entry { 128 : : u64 phys_addr; /* phy base addr for APIC reg */ 129 : : } __packed; 130 : : 131 : : struct sfi_freq_table_entry { 132 : : u32 freq_mhz; /* in MHZ */ 133 : : u32 latency; /* transition latency in ms */ 134 : : u32 ctrl_val; /* value to write to PERF_CTL */ 135 : : } __packed; 136 : : 137 : : struct sfi_wake_table_entry { 138 : : u64 phys_addr; /* pointer to where the wake vector locates */ 139 : : } __packed; 140 : : 141 : : struct sfi_timer_table_entry { 142 : : u64 phys_addr; /* phy base addr for the timer */ 143 : : u32 freq_hz; /* in HZ */ 144 : : u32 irq; 145 : : } __packed; 146 : : 147 : : struct sfi_rtc_table_entry { 148 : : u64 phys_addr; /* phy base addr for the RTC */ 149 : : u32 irq; 150 : : } __packed; 151 : : 152 : : struct sfi_device_table_entry { 153 : : u8 type; /* bus type, I2C, SPI or ...*/ 154 : : #define SFI_DEV_TYPE_SPI 0 155 : : #define SFI_DEV_TYPE_I2C 1 156 : : #define SFI_DEV_TYPE_UART 2 157 : : #define SFI_DEV_TYPE_HSI 3 158 : : #define SFI_DEV_TYPE_IPC 4 159 : : #define SFI_DEV_TYPE_SD 5 160 : : 161 : : u8 host_num; /* attached to host 0, 1...*/ 162 : : u16 addr; 163 : : u8 irq; 164 : : u32 max_freq; 165 : : char name[SFI_NAME_LEN]; 166 : : } __packed; 167 : : 168 : : struct sfi_gpio_table_entry { 169 : : char controller_name[SFI_NAME_LEN]; 170 : : u16 pin_no; 171 : : char pin_name[SFI_NAME_LEN]; 172 : : } __packed; 173 : : 174 : : typedef int (*sfi_table_handler) (struct sfi_table_header *table); 175 : : 176 : : #ifdef CONFIG_SFI 177 : : extern void __init sfi_init(void); 178 : : extern int __init sfi_platform_init(void); 179 : : extern void __init sfi_init_late(void); 180 : : extern int sfi_table_parse(char *signature, char *oem_id, char *oem_table_id, 181 : : sfi_table_handler handler); 182 : : 183 : : extern int sfi_disabled; 184 : : static inline void disable_sfi(void) 185 : : { 186 : : sfi_disabled = 1; 187 : : } 188 : : 189 : : #else /* !CONFIG_SFI */ 190 : : 191 : 28 : static inline void sfi_init(void) 192 : : { 193 : 28 : } 194 : : 195 : 28 : static inline void sfi_init_late(void) 196 : : { 197 : 28 : } 198 : : 199 : : #define sfi_disabled 0 200 : : 201 : : static inline int sfi_table_parse(char *signature, char *oem_id, 202 : : char *oem_table_id, 203 : : sfi_table_handler handler) 204 : : { 205 : : return -1; 206 : : } 207 : : 208 : : #endif /* !CONFIG_SFI */ 209 : : 210 : : #endif /*_LINUX_SFI_H*/