Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
6588 serge 1
#ifndef _ASM_X86_ACPI_H
2
#define _ASM_X86_ACPI_H
3
 
4
/*
5
 *  Copyright (C) 2001 Paul Diefenbaugh 
6
 *  Copyright (C) 2001 Patrick Mochel 
7
 *
8
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
9
 *
10
 *  This program is free software; you can redistribute it and/or modify
11
 *  it under the terms of the GNU General Public License as published by
12
 *  the Free Software Foundation; either version 2 of the License, or
13
 *  (at your option) any later version.
14
 *
15
 *  This program is distributed in the hope that it will be useful,
16
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
17
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18
 *  GNU General Public License for more details.
19
 *
20
 *  You should have received a copy of the GNU General Public License
21
 *  along with this program; if not, write to the Free Software
22
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
23
 *
24
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
25
 */
26
#include 
27
 
28
#include 
29
#include 
30
#include 
31
 
32
#ifdef CONFIG_ACPI_APEI
33
# include 
34
#endif
35
 
36
#ifdef CONFIG_ACPI
37
extern int acpi_lapic;
38
extern int acpi_ioapic;
39
extern int acpi_noirq;
40
extern int acpi_strict;
41
extern int acpi_disabled;
42
extern int acpi_pci_disabled;
43
extern int acpi_skip_timer_override;
44
extern int acpi_use_timer_override;
45
extern int acpi_fix_pin2_polarity;
46
extern int acpi_disable_cmcff;
47
 
48
extern u8 acpi_sci_flags;
49
extern int acpi_sci_override_gsi;
50
void acpi_pic_sci_set_trigger(unsigned int, u16);
51
 
52
extern int (*__acpi_register_gsi)(struct device *dev, u32 gsi,
53
				  int trigger, int polarity);
54
extern void (*__acpi_unregister_gsi)(u32 gsi);
55
 
56
static inline void disable_acpi(void)
57
{
58
	acpi_disabled = 1;
59
	acpi_pci_disabled = 1;
60
	acpi_noirq = 1;
61
}
62
 
63
extern int acpi_gsi_to_irq(u32 gsi, unsigned int *irq);
64
 
65
static inline void acpi_noirq_set(void) { acpi_noirq = 1; }
66
static inline void acpi_disable_pci(void)
67
{
68
	acpi_pci_disabled = 1;
69
	acpi_noirq_set();
70
}
71
 
72
/* Low-level suspend routine. */
73
extern int (*acpi_suspend_lowlevel)(void);
74
 
75
/* Physical address to resume after wakeup */
76
#define acpi_wakeup_address ((unsigned long)(real_mode_header->wakeup_start))
77
 
78
/*
79
 * Check if the CPU can handle C2 and deeper
80
 */
81
static inline unsigned int acpi_processor_cstate_check(unsigned int max_cstate)
82
{
83
	/*
84
	 * Early models (<=5) of AMD Opterons are not supposed to go into
85
	 * C2 state.
86
	 *
87
	 * Steppings 0x0A and later are good
88
	 */
89
	if (boot_cpu_data.x86 == 0x0F &&
90
	    boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
91
	    boot_cpu_data.x86_model <= 0x05 &&
92
	    boot_cpu_data.x86_mask < 0x0A)
93
		return 1;
94
	else if (amd_e400_c1e_detected)
95
		return 1;
96
	else
97
		return max_cstate;
98
}
99
 
100
static inline bool arch_has_acpi_pdc(void)
101
{
102
	struct cpuinfo_x86 *c = &cpu_data(0);
103
	return (c->x86_vendor == X86_VENDOR_INTEL ||
104
		c->x86_vendor == X86_VENDOR_CENTAUR);
105
}
106
 
107
static inline void arch_acpi_set_pdc_bits(u32 *buf)
108
{
109
	struct cpuinfo_x86 *c = &cpu_data(0);
110
 
111
	buf[2] |= ACPI_PDC_C_CAPABILITY_SMP;
112
 
113
	if (cpu_has(c, X86_FEATURE_EST))
114
		buf[2] |= ACPI_PDC_EST_CAPABILITY_SWSMP;
115
 
116
	if (cpu_has(c, X86_FEATURE_ACPI))
117
		buf[2] |= ACPI_PDC_T_FFH;
118
 
119
	/*
120
	 * If mwait/monitor is unsupported, C2/C3_FFH will be disabled
121
	 */
122
	if (!cpu_has(c, X86_FEATURE_MWAIT))
123
		buf[2] &= ~(ACPI_PDC_C_C2C3_FFH);
124
}
125
 
126
static inline bool acpi_has_cpu_in_madt(void)
127
{
128
	return !!acpi_lapic;
129
}
130
 
131
#else /* !CONFIG_ACPI */
132
 
133
#define acpi_lapic 0
134
#define acpi_ioapic 0
135
#define acpi_disable_cmcff 0
136
static inline void acpi_noirq_set(void) { }
137
static inline void acpi_disable_pci(void) { }
138
static inline void disable_acpi(void) { }
139
 
140
#endif /* !CONFIG_ACPI */
141
 
142
#define ARCH_HAS_POWER_INIT	1
143
 
144
#ifdef CONFIG_ACPI_NUMA
145
extern int acpi_numa;
146
extern int x86_acpi_numa_init(void);
147
#endif /* CONFIG_ACPI_NUMA */
148
 
149
#define acpi_unlazy_tlb(x)	leave_mm(x)
150
 
151
#ifdef CONFIG_ACPI_APEI
152
static inline pgprot_t arch_apei_get_mem_attribute(phys_addr_t addr)
153
{
154
	/*
155
	 * We currently have no way to look up the EFI memory map
156
	 * attributes for a region in a consistent way, because the
157
	 * memmap is discarded after efi_free_boot_services(). So if
158
	 * you call efi_mem_attributes() during boot and at runtime,
159
	 * you could theoretically see different attributes.
160
	 *
161
	 * Since we are yet to see any x86 platforms that require
162
	 * anything other than PAGE_KERNEL (some arm64 platforms
163
	 * require the equivalent of PAGE_KERNEL_NOCACHE), return that
164
	 * until we know differently.
165
	 */
166
	 return PAGE_KERNEL;
167
}
168
#endif
169
 
170
#endif /* _ASM_X86_ACPI_H */