Subversion Repositories Kolibri OS

Rev

Rev 6660 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6660 Rev 6937
1
/*
1
/*
2
 * Copyright 2008 Intel Corporation 
2
 * Copyright 2008 Intel Corporation 
3
 * Copyright 2008 Red Hat 
3
 * Copyright 2008 Red Hat 
4
 *
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining
5
 * Permission is hereby granted, free of charge, to any person obtaining
6
 * a copy of this software and associated documentation files (the
6
 * a copy of this software and associated documentation files (the
7
 * "Software"), to deal in the Software without restriction, including
7
 * "Software"), to deal in the Software without restriction, including
8
 * without limitation the rights to use, copy, modify, merge, publish,
8
 * without limitation the rights to use, copy, modify, merge, publish,
9
 * distribute, sub license, and/or sell copies of the Software, and to
9
 * distribute, sub license, and/or sell copies of the Software, and to
10
 * permit persons to whom the Software is furnished to do so, subject to
10
 * permit persons to whom the Software is furnished to do so, subject to
11
 * the following conditions:
11
 * the following conditions:
12
 *
12
 *
13
 * The above copyright notice and this permission notice (including the
13
 * The above copyright notice and this permission notice (including the
14
 * next paragraph) shall be included in all copies or substantial
14
 * next paragraph) shall be included in all copies or substantial
15
 * portions of the Software.
15
 * portions of the Software.
16
 *
16
 *
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20
 * NON-INFRINGEMENT.  IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE
20
 * NON-INFRINGEMENT.  IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE
21
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
21
 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
22
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22
 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
23
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24
 * SOFTWARE.
24
 * SOFTWARE.
25
 *
25
 *
26
 */
26
 */
27
 
27
 
28
#include 
28
#include 
-
 
29
#include 
29
#include 
30
#include 
30
 
31
 
31
#include 
32
#include 
32
#include 
33
#include 
33
#include "i915_drv.h"
34
#include "i915_drv.h"
34
#include "intel_drv.h"
35
#include "intel_drv.h"
35
 
36
 
36
#define PCI_ASLE		0xe4
37
#define PCI_ASLE		0xe4
37
#define PCI_ASLS		0xfc
38
#define PCI_ASLS		0xfc
38
#define PCI_SWSCI		0xe8
39
#define PCI_SWSCI		0xe8
39
#define PCI_SWSCI_SCISEL	(1 << 15)
40
#define PCI_SWSCI_SCISEL	(1 << 15)
40
#define PCI_SWSCI_GSSCIE	(1 << 0)
41
#define PCI_SWSCI_GSSCIE	(1 << 0)
41
 
42
 
42
#define OPREGION_HEADER_OFFSET 0
43
#define OPREGION_HEADER_OFFSET 0
43
#define OPREGION_ACPI_OFFSET   0x100
44
#define OPREGION_ACPI_OFFSET   0x100
44
#define   ACPI_CLID 0x01ac /* current lid state indicator */
45
#define   ACPI_CLID 0x01ac /* current lid state indicator */
45
#define   ACPI_CDCK 0x01b0 /* current docking state indicator */
46
#define   ACPI_CDCK 0x01b0 /* current docking state indicator */
46
#define OPREGION_SWSCI_OFFSET  0x200
47
#define OPREGION_SWSCI_OFFSET  0x200
47
#define OPREGION_ASLE_OFFSET   0x300
48
#define OPREGION_ASLE_OFFSET   0x300
48
#define OPREGION_VBT_OFFSET    0x400
49
#define OPREGION_VBT_OFFSET    0x400
-
 
50
#define OPREGION_ASLE_EXT_OFFSET	0x1C00
49
 
51
 
50
#define OPREGION_SIGNATURE "IntelGraphicsMem"
52
#define OPREGION_SIGNATURE "IntelGraphicsMem"
51
#define MBOX_ACPI      (1<<0)
53
#define MBOX_ACPI      (1<<0)
52
#define MBOX_SWSCI     (1<<1)
54
#define MBOX_SWSCI     (1<<1)
53
#define MBOX_ASLE      (1<<2)
55
#define MBOX_ASLE      (1<<2)
54
#define MBOX_ASLE_EXT  (1<<4)
56
#define MBOX_ASLE_EXT  (1<<4)
55
 
57
 
56
struct opregion_header {
58
struct opregion_header {
57
	u8 signature[16];
59
	u8 signature[16];
58
	u32 size;
60
	u32 size;
59
	u32 opregion_ver;
61
	u32 opregion_ver;
60
	u8 bios_ver[32];
62
	u8 bios_ver[32];
61
	u8 vbios_ver[16];
63
	u8 vbios_ver[16];
62
	u8 driver_ver[16];
64
	u8 driver_ver[16];
63
	u32 mboxes;
65
	u32 mboxes;
64
	u32 driver_model;
66
	u32 driver_model;
65
	u32 pcon;
67
	u32 pcon;
66
	u8 dver[32];
68
	u8 dver[32];
67
	u8 rsvd[124];
69
	u8 rsvd[124];
68
} __packed;
70
} __packed;
69
 
71
 
70
/* OpRegion mailbox #1: public ACPI methods */
72
/* OpRegion mailbox #1: public ACPI methods */
71
struct opregion_acpi {
73
struct opregion_acpi {
72
	u32 drdy;       /* driver readiness */
74
	u32 drdy;       /* driver readiness */
73
	u32 csts;       /* notification status */
75
	u32 csts;       /* notification status */
74
	u32 cevt;       /* current event */
76
	u32 cevt;       /* current event */
75
	u8 rsvd1[20];
77
	u8 rsvd1[20];
76
	u32 didl[8];    /* supported display devices ID list */
78
	u32 didl[8];    /* supported display devices ID list */
77
	u32 cpdl[8];    /* currently presented display list */
79
	u32 cpdl[8];    /* currently presented display list */
78
	u32 cadl[8];    /* currently active display list */
80
	u32 cadl[8];    /* currently active display list */
79
	u32 nadl[8];    /* next active devices list */
81
	u32 nadl[8];    /* next active devices list */
80
	u32 aslp;       /* ASL sleep time-out */
82
	u32 aslp;       /* ASL sleep time-out */
81
	u32 tidx;       /* toggle table index */
83
	u32 tidx;       /* toggle table index */
82
	u32 chpd;       /* current hotplug enable indicator */
84
	u32 chpd;       /* current hotplug enable indicator */
83
	u32 clid;       /* current lid state*/
85
	u32 clid;       /* current lid state*/
84
	u32 cdck;       /* current docking state */
86
	u32 cdck;       /* current docking state */
85
	u32 sxsw;       /* Sx state resume */
87
	u32 sxsw;       /* Sx state resume */
86
	u32 evts;       /* ASL supported events */
88
	u32 evts;       /* ASL supported events */
87
	u32 cnot;       /* current OS notification */
89
	u32 cnot;       /* current OS notification */
88
	u32 nrdy;       /* driver status */
90
	u32 nrdy;       /* driver status */
89
	u32 did2[7];	/* extended supported display devices ID list */
91
	u32 did2[7];	/* extended supported display devices ID list */
90
	u32 cpd2[7];	/* extended attached display devices list */
92
	u32 cpd2[7];	/* extended attached display devices list */
91
	u8 rsvd2[4];
93
	u8 rsvd2[4];
92
} __packed;
94
} __packed;
93
 
95
 
94
/* OpRegion mailbox #2: SWSCI */
96
/* OpRegion mailbox #2: SWSCI */
95
struct opregion_swsci {
97
struct opregion_swsci {
96
	u32 scic;       /* SWSCI command|status|data */
98
	u32 scic;       /* SWSCI command|status|data */
97
	u32 parm;       /* command parameters */
99
	u32 parm;       /* command parameters */
98
	u32 dslp;       /* driver sleep time-out */
100
	u32 dslp;       /* driver sleep time-out */
99
	u8 rsvd[244];
101
	u8 rsvd[244];
100
} __packed;
102
} __packed;
101
 
103
 
102
/* OpRegion mailbox #3: ASLE */
104
/* OpRegion mailbox #3: ASLE */
103
struct opregion_asle {
105
struct opregion_asle {
104
	u32 ardy;       /* driver readiness */
106
	u32 ardy;       /* driver readiness */
105
	u32 aslc;       /* ASLE interrupt command */
107
	u32 aslc;       /* ASLE interrupt command */
106
	u32 tche;       /* technology enabled indicator */
108
	u32 tche;       /* technology enabled indicator */
107
	u32 alsi;       /* current ALS illuminance reading */
109
	u32 alsi;       /* current ALS illuminance reading */
108
	u32 bclp;       /* backlight brightness to set */
110
	u32 bclp;       /* backlight brightness to set */
109
	u32 pfit;       /* panel fitting state */
111
	u32 pfit;       /* panel fitting state */
110
	u32 cblv;       /* current brightness level */
112
	u32 cblv;       /* current brightness level */
111
	u16 bclm[20];   /* backlight level duty cycle mapping table */
113
	u16 bclm[20];   /* backlight level duty cycle mapping table */
112
	u32 cpfm;       /* current panel fitting mode */
114
	u32 cpfm;       /* current panel fitting mode */
113
	u32 epfm;       /* enabled panel fitting modes */
115
	u32 epfm;       /* enabled panel fitting modes */
114
	u8 plut[74];    /* panel LUT and identifier */
116
	u8 plut[74];    /* panel LUT and identifier */
115
	u32 pfmb;       /* PWM freq and min brightness */
117
	u32 pfmb;       /* PWM freq and min brightness */
116
	u32 cddv;       /* color correction default values */
118
	u32 cddv;       /* color correction default values */
117
	u32 pcft;       /* power conservation features */
119
	u32 pcft;       /* power conservation features */
118
	u32 srot;       /* supported rotation angles */
120
	u32 srot;       /* supported rotation angles */
119
	u32 iuer;       /* IUER events */
121
	u32 iuer;       /* IUER events */
120
	u64 fdss;
122
	u64 fdss;
121
	u32 fdsp;
123
	u32 fdsp;
122
	u32 stat;
124
	u32 stat;
-
 
125
	u64 rvda;	/* Physical address of raw vbt data */
-
 
126
	u32 rvds;	/* Size of raw vbt data */
-
 
127
	u8 rsvd[58];
-
 
128
} __packed;
-
 
129
 
-
 
130
/* OpRegion mailbox #5: ASLE ext */
-
 
131
struct opregion_asle_ext {
-
 
132
	u32 phed;	/* Panel Header */
-
 
133
	u8 bddc[256];	/* Panel EDID */
123
	u8 rsvd[70];
134
	u8 rsvd[764];
124
} __packed;
135
} __packed;
125
 
136
 
126
/* Driver readiness indicator */
137
/* Driver readiness indicator */
127
#define ASLE_ARDY_READY		(1 << 0)
138
#define ASLE_ARDY_READY		(1 << 0)
128
#define ASLE_ARDY_NOT_READY	(0 << 0)
139
#define ASLE_ARDY_NOT_READY	(0 << 0)
129
 
140
 
130
/* ASLE Interrupt Command (ASLC) bits */
141
/* ASLE Interrupt Command (ASLC) bits */
131
#define ASLC_SET_ALS_ILLUM		(1 << 0)
142
#define ASLC_SET_ALS_ILLUM		(1 << 0)
132
#define ASLC_SET_BACKLIGHT		(1 << 1)
143
#define ASLC_SET_BACKLIGHT		(1 << 1)
133
#define ASLC_SET_PFIT			(1 << 2)
144
#define ASLC_SET_PFIT			(1 << 2)
134
#define ASLC_SET_PWM_FREQ		(1 << 3)
145
#define ASLC_SET_PWM_FREQ		(1 << 3)
135
#define ASLC_SUPPORTED_ROTATION_ANGLES	(1 << 4)
146
#define ASLC_SUPPORTED_ROTATION_ANGLES	(1 << 4)
136
#define ASLC_BUTTON_ARRAY		(1 << 5)
147
#define ASLC_BUTTON_ARRAY		(1 << 5)
137
#define ASLC_CONVERTIBLE_INDICATOR	(1 << 6)
148
#define ASLC_CONVERTIBLE_INDICATOR	(1 << 6)
138
#define ASLC_DOCKING_INDICATOR		(1 << 7)
149
#define ASLC_DOCKING_INDICATOR		(1 << 7)
139
#define ASLC_ISCT_STATE_CHANGE		(1 << 8)
150
#define ASLC_ISCT_STATE_CHANGE		(1 << 8)
140
#define ASLC_REQ_MSK			0x1ff
151
#define ASLC_REQ_MSK			0x1ff
141
/* response bits */
152
/* response bits */
142
#define ASLC_ALS_ILLUM_FAILED		(1 << 10)
153
#define ASLC_ALS_ILLUM_FAILED		(1 << 10)
143
#define ASLC_BACKLIGHT_FAILED		(1 << 12)
154
#define ASLC_BACKLIGHT_FAILED		(1 << 12)
144
#define ASLC_PFIT_FAILED		(1 << 14)
155
#define ASLC_PFIT_FAILED		(1 << 14)
145
#define ASLC_PWM_FREQ_FAILED		(1 << 16)
156
#define ASLC_PWM_FREQ_FAILED		(1 << 16)
146
#define ASLC_ROTATION_ANGLES_FAILED	(1 << 18)
157
#define ASLC_ROTATION_ANGLES_FAILED	(1 << 18)
147
#define ASLC_BUTTON_ARRAY_FAILED	(1 << 20)
158
#define ASLC_BUTTON_ARRAY_FAILED	(1 << 20)
148
#define ASLC_CONVERTIBLE_FAILED		(1 << 22)
159
#define ASLC_CONVERTIBLE_FAILED		(1 << 22)
149
#define ASLC_DOCKING_FAILED		(1 << 24)
160
#define ASLC_DOCKING_FAILED		(1 << 24)
150
#define ASLC_ISCT_STATE_FAILED		(1 << 26)
161
#define ASLC_ISCT_STATE_FAILED		(1 << 26)
151
 
162
 
152
/* Technology enabled indicator */
163
/* Technology enabled indicator */
153
#define ASLE_TCHE_ALS_EN	(1 << 0)
164
#define ASLE_TCHE_ALS_EN	(1 << 0)
154
#define ASLE_TCHE_BLC_EN	(1 << 1)
165
#define ASLE_TCHE_BLC_EN	(1 << 1)
155
#define ASLE_TCHE_PFIT_EN	(1 << 2)
166
#define ASLE_TCHE_PFIT_EN	(1 << 2)
156
#define ASLE_TCHE_PFMB_EN	(1 << 3)
167
#define ASLE_TCHE_PFMB_EN	(1 << 3)
157
 
168
 
158
/* ASLE backlight brightness to set */
169
/* ASLE backlight brightness to set */
159
#define ASLE_BCLP_VALID                (1<<31)
170
#define ASLE_BCLP_VALID                (1<<31)
160
#define ASLE_BCLP_MSK          (~(1<<31))
171
#define ASLE_BCLP_MSK          (~(1<<31))
161
 
172
 
162
/* ASLE panel fitting request */
173
/* ASLE panel fitting request */
163
#define ASLE_PFIT_VALID         (1<<31)
174
#define ASLE_PFIT_VALID         (1<<31)
164
#define ASLE_PFIT_CENTER (1<<0)
175
#define ASLE_PFIT_CENTER (1<<0)
165
#define ASLE_PFIT_STRETCH_TEXT (1<<1)
176
#define ASLE_PFIT_STRETCH_TEXT (1<<1)
166
#define ASLE_PFIT_STRETCH_GFX (1<<2)
177
#define ASLE_PFIT_STRETCH_GFX (1<<2)
167
 
178
 
168
/* PWM frequency and minimum brightness */
179
/* PWM frequency and minimum brightness */
169
#define ASLE_PFMB_BRIGHTNESS_MASK (0xff)
180
#define ASLE_PFMB_BRIGHTNESS_MASK (0xff)
170
#define ASLE_PFMB_BRIGHTNESS_VALID (1<<8)
181
#define ASLE_PFMB_BRIGHTNESS_VALID (1<<8)
171
#define ASLE_PFMB_PWM_MASK (0x7ffffe00)
182
#define ASLE_PFMB_PWM_MASK (0x7ffffe00)
172
#define ASLE_PFMB_PWM_VALID (1<<31)
183
#define ASLE_PFMB_PWM_VALID (1<<31)
173
 
184
 
174
#define ASLE_CBLV_VALID         (1<<31)
185
#define ASLE_CBLV_VALID         (1<<31)
175
 
186
 
176
/* IUER */
187
/* IUER */
177
#define ASLE_IUER_DOCKING		(1 << 7)
188
#define ASLE_IUER_DOCKING		(1 << 7)
178
#define ASLE_IUER_CONVERTIBLE		(1 << 6)
189
#define ASLE_IUER_CONVERTIBLE		(1 << 6)
179
#define ASLE_IUER_ROTATION_LOCK_BTN	(1 << 4)
190
#define ASLE_IUER_ROTATION_LOCK_BTN	(1 << 4)
180
#define ASLE_IUER_VOLUME_DOWN_BTN	(1 << 3)
191
#define ASLE_IUER_VOLUME_DOWN_BTN	(1 << 3)
181
#define ASLE_IUER_VOLUME_UP_BTN		(1 << 2)
192
#define ASLE_IUER_VOLUME_UP_BTN		(1 << 2)
182
#define ASLE_IUER_WINDOWS_BTN		(1 << 1)
193
#define ASLE_IUER_WINDOWS_BTN		(1 << 1)
183
#define ASLE_IUER_POWER_BTN		(1 << 0)
194
#define ASLE_IUER_POWER_BTN		(1 << 0)
184
 
195
 
185
/* Software System Control Interrupt (SWSCI) */
196
/* Software System Control Interrupt (SWSCI) */
186
#define SWSCI_SCIC_INDICATOR		(1 << 0)
197
#define SWSCI_SCIC_INDICATOR		(1 << 0)
187
#define SWSCI_SCIC_MAIN_FUNCTION_SHIFT	1
198
#define SWSCI_SCIC_MAIN_FUNCTION_SHIFT	1
188
#define SWSCI_SCIC_MAIN_FUNCTION_MASK	(0xf << 1)
199
#define SWSCI_SCIC_MAIN_FUNCTION_MASK	(0xf << 1)
189
#define SWSCI_SCIC_SUB_FUNCTION_SHIFT	8
200
#define SWSCI_SCIC_SUB_FUNCTION_SHIFT	8
190
#define SWSCI_SCIC_SUB_FUNCTION_MASK	(0xff << 8)
201
#define SWSCI_SCIC_SUB_FUNCTION_MASK	(0xff << 8)
191
#define SWSCI_SCIC_EXIT_PARAMETER_SHIFT	8
202
#define SWSCI_SCIC_EXIT_PARAMETER_SHIFT	8
192
#define SWSCI_SCIC_EXIT_PARAMETER_MASK	(0xff << 8)
203
#define SWSCI_SCIC_EXIT_PARAMETER_MASK	(0xff << 8)
193
#define SWSCI_SCIC_EXIT_STATUS_SHIFT	5
204
#define SWSCI_SCIC_EXIT_STATUS_SHIFT	5
194
#define SWSCI_SCIC_EXIT_STATUS_MASK	(7 << 5)
205
#define SWSCI_SCIC_EXIT_STATUS_MASK	(7 << 5)
195
#define SWSCI_SCIC_EXIT_STATUS_SUCCESS	1
206
#define SWSCI_SCIC_EXIT_STATUS_SUCCESS	1
196
 
207
 
197
#define SWSCI_FUNCTION_CODE(main, sub) \
208
#define SWSCI_FUNCTION_CODE(main, sub) \
198
	((main) << SWSCI_SCIC_MAIN_FUNCTION_SHIFT | \
209
	((main) << SWSCI_SCIC_MAIN_FUNCTION_SHIFT | \
199
	 (sub) << SWSCI_SCIC_SUB_FUNCTION_SHIFT)
210
	 (sub) << SWSCI_SCIC_SUB_FUNCTION_SHIFT)
200
 
211
 
201
/* SWSCI: Get BIOS Data (GBDA) */
212
/* SWSCI: Get BIOS Data (GBDA) */
202
#define SWSCI_GBDA			4
213
#define SWSCI_GBDA			4
203
#define SWSCI_GBDA_SUPPORTED_CALLS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 0)
214
#define SWSCI_GBDA_SUPPORTED_CALLS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 0)
204
#define SWSCI_GBDA_REQUESTED_CALLBACKS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 1)
215
#define SWSCI_GBDA_REQUESTED_CALLBACKS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 1)
205
#define SWSCI_GBDA_BOOT_DISPLAY_PREF	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 4)
216
#define SWSCI_GBDA_BOOT_DISPLAY_PREF	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 4)
206
#define SWSCI_GBDA_PANEL_DETAILS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 5)
217
#define SWSCI_GBDA_PANEL_DETAILS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 5)
207
#define SWSCI_GBDA_TV_STANDARD		SWSCI_FUNCTION_CODE(SWSCI_GBDA, 6)
218
#define SWSCI_GBDA_TV_STANDARD		SWSCI_FUNCTION_CODE(SWSCI_GBDA, 6)
208
#define SWSCI_GBDA_INTERNAL_GRAPHICS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 7)
219
#define SWSCI_GBDA_INTERNAL_GRAPHICS	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 7)
209
#define SWSCI_GBDA_SPREAD_SPECTRUM	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 10)
220
#define SWSCI_GBDA_SPREAD_SPECTRUM	SWSCI_FUNCTION_CODE(SWSCI_GBDA, 10)
210
 
221
 
211
/* SWSCI: System BIOS Callbacks (SBCB) */
222
/* SWSCI: System BIOS Callbacks (SBCB) */
212
#define SWSCI_SBCB			6
223
#define SWSCI_SBCB			6
213
#define SWSCI_SBCB_SUPPORTED_CALLBACKS	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 0)
224
#define SWSCI_SBCB_SUPPORTED_CALLBACKS	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 0)
214
#define SWSCI_SBCB_INIT_COMPLETION	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 1)
225
#define SWSCI_SBCB_INIT_COMPLETION	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 1)
215
#define SWSCI_SBCB_PRE_HIRES_SET_MODE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 3)
226
#define SWSCI_SBCB_PRE_HIRES_SET_MODE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 3)
216
#define SWSCI_SBCB_POST_HIRES_SET_MODE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 4)
227
#define SWSCI_SBCB_POST_HIRES_SET_MODE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 4)
217
#define SWSCI_SBCB_DISPLAY_SWITCH	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 5)
228
#define SWSCI_SBCB_DISPLAY_SWITCH	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 5)
218
#define SWSCI_SBCB_SET_TV_FORMAT	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 6)
229
#define SWSCI_SBCB_SET_TV_FORMAT	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 6)
219
#define SWSCI_SBCB_ADAPTER_POWER_STATE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 7)
230
#define SWSCI_SBCB_ADAPTER_POWER_STATE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 7)
220
#define SWSCI_SBCB_DISPLAY_POWER_STATE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 8)
231
#define SWSCI_SBCB_DISPLAY_POWER_STATE	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 8)
221
#define SWSCI_SBCB_SET_BOOT_DISPLAY	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 9)
232
#define SWSCI_SBCB_SET_BOOT_DISPLAY	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 9)
222
#define SWSCI_SBCB_SET_PANEL_DETAILS	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 10)
233
#define SWSCI_SBCB_SET_PANEL_DETAILS	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 10)
223
#define SWSCI_SBCB_SET_INTERNAL_GFX	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 11)
234
#define SWSCI_SBCB_SET_INTERNAL_GFX	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 11)
224
#define SWSCI_SBCB_POST_HIRES_TO_DOS_FS	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 16)
235
#define SWSCI_SBCB_POST_HIRES_TO_DOS_FS	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 16)
225
#define SWSCI_SBCB_SUSPEND_RESUME	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 17)
236
#define SWSCI_SBCB_SUSPEND_RESUME	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 17)
226
#define SWSCI_SBCB_SET_SPREAD_SPECTRUM	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 18)
237
#define SWSCI_SBCB_SET_SPREAD_SPECTRUM	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 18)
227
#define SWSCI_SBCB_POST_VBE_PM		SWSCI_FUNCTION_CODE(SWSCI_SBCB, 19)
238
#define SWSCI_SBCB_POST_VBE_PM		SWSCI_FUNCTION_CODE(SWSCI_SBCB, 19)
228
#define SWSCI_SBCB_ENABLE_DISABLE_AUDIO	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 21)
239
#define SWSCI_SBCB_ENABLE_DISABLE_AUDIO	SWSCI_FUNCTION_CODE(SWSCI_SBCB, 21)
229
 
240
 
230
#define ACPI_OTHER_OUTPUT (0<<8)
241
#define ACPI_OTHER_OUTPUT (0<<8)
231
#define ACPI_VGA_OUTPUT (1<<8)
242
#define ACPI_VGA_OUTPUT (1<<8)
232
#define ACPI_TV_OUTPUT (2<<8)
243
#define ACPI_TV_OUTPUT (2<<8)
233
#define ACPI_DIGITAL_OUTPUT (3<<8)
244
#define ACPI_DIGITAL_OUTPUT (3<<8)
234
#define ACPI_LVDS_OUTPUT (4<<8)
245
#define ACPI_LVDS_OUTPUT (4<<8)
235
 
246
 
236
#define MAX_DSLP	1500
247
#define MAX_DSLP	1500
237
 
248
 
238
#ifdef CONFIG_ACPI
249
#ifdef CONFIG_ACPI
239
static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out)
250
static int swsci(struct drm_device *dev, u32 function, u32 parm, u32 *parm_out)
240
{
251
{
241
	struct drm_i915_private *dev_priv = dev->dev_private;
252
	struct drm_i915_private *dev_priv = dev->dev_private;
242
	struct opregion_swsci *swsci = dev_priv->opregion.swsci;
253
	struct opregion_swsci *swsci = dev_priv->opregion.swsci;
243
	u32 main_function, sub_function, scic;
254
	u32 main_function, sub_function, scic;
244
	u16 pci_swsci;
255
	u16 pci_swsci;
245
	u32 dslp;
256
	u32 dslp;
246
 
257
 
247
	if (!swsci)
258
	if (!swsci)
248
		return -ENODEV;
259
		return -ENODEV;
249
 
260
 
250
	main_function = (function & SWSCI_SCIC_MAIN_FUNCTION_MASK) >>
261
	main_function = (function & SWSCI_SCIC_MAIN_FUNCTION_MASK) >>
251
		SWSCI_SCIC_MAIN_FUNCTION_SHIFT;
262
		SWSCI_SCIC_MAIN_FUNCTION_SHIFT;
252
	sub_function = (function & SWSCI_SCIC_SUB_FUNCTION_MASK) >>
263
	sub_function = (function & SWSCI_SCIC_SUB_FUNCTION_MASK) >>
253
		SWSCI_SCIC_SUB_FUNCTION_SHIFT;
264
		SWSCI_SCIC_SUB_FUNCTION_SHIFT;
254
 
265
 
255
	/* Check if we can call the function. See swsci_setup for details. */
266
	/* Check if we can call the function. See swsci_setup for details. */
256
	if (main_function == SWSCI_SBCB) {
267
	if (main_function == SWSCI_SBCB) {
257
		if ((dev_priv->opregion.swsci_sbcb_sub_functions &
268
		if ((dev_priv->opregion.swsci_sbcb_sub_functions &
258
		     (1 << sub_function)) == 0)
269
		     (1 << sub_function)) == 0)
259
			return -EINVAL;
270
			return -EINVAL;
260
	} else if (main_function == SWSCI_GBDA) {
271
	} else if (main_function == SWSCI_GBDA) {
261
		if ((dev_priv->opregion.swsci_gbda_sub_functions &
272
		if ((dev_priv->opregion.swsci_gbda_sub_functions &
262
		     (1 << sub_function)) == 0)
273
		     (1 << sub_function)) == 0)
263
			return -EINVAL;
274
			return -EINVAL;
264
	}
275
	}
265
 
276
 
266
	/* Driver sleep timeout in ms. */
277
	/* Driver sleep timeout in ms. */
267
	dslp = swsci->dslp;
278
	dslp = swsci->dslp;
268
	if (!dslp) {
279
	if (!dslp) {
269
		/* The spec says 2ms should be the default, but it's too small
280
		/* The spec says 2ms should be the default, but it's too small
270
		 * for some machines. */
281
		 * for some machines. */
271
		dslp = 50;
282
		dslp = 50;
272
	} else if (dslp > MAX_DSLP) {
283
	} else if (dslp > MAX_DSLP) {
273
		/* Hey bios, trust must be earned. */
284
		/* Hey bios, trust must be earned. */
274
		DRM_INFO_ONCE("ACPI BIOS requests an excessive sleep of %u ms, "
285
		DRM_INFO_ONCE("ACPI BIOS requests an excessive sleep of %u ms, "
275
			      "using %u ms instead\n", dslp, MAX_DSLP);
286
			      "using %u ms instead\n", dslp, MAX_DSLP);
276
		dslp = MAX_DSLP;
287
		dslp = MAX_DSLP;
277
	}
288
	}
278
 
289
 
279
	/* The spec tells us to do this, but we are the only user... */
290
	/* The spec tells us to do this, but we are the only user... */
280
	scic = swsci->scic;
291
	scic = swsci->scic;
281
	if (scic & SWSCI_SCIC_INDICATOR) {
292
	if (scic & SWSCI_SCIC_INDICATOR) {
282
		DRM_DEBUG_DRIVER("SWSCI request already in progress\n");
293
		DRM_DEBUG_DRIVER("SWSCI request already in progress\n");
283
		return -EBUSY;
294
		return -EBUSY;
284
	}
295
	}
285
 
296
 
286
	scic = function | SWSCI_SCIC_INDICATOR;
297
	scic = function | SWSCI_SCIC_INDICATOR;
287
 
298
 
288
	swsci->parm = parm;
299
	swsci->parm = parm;
289
	swsci->scic = scic;
300
	swsci->scic = scic;
290
 
301
 
291
	/* Ensure SCI event is selected and event trigger is cleared. */
302
	/* Ensure SCI event is selected and event trigger is cleared. */
292
	pci_read_config_word(dev->pdev, PCI_SWSCI, &pci_swsci);
303
	pci_read_config_word(dev->pdev, PCI_SWSCI, &pci_swsci);
293
	if (!(pci_swsci & PCI_SWSCI_SCISEL) || (pci_swsci & PCI_SWSCI_GSSCIE)) {
304
	if (!(pci_swsci & PCI_SWSCI_SCISEL) || (pci_swsci & PCI_SWSCI_GSSCIE)) {
294
		pci_swsci |= PCI_SWSCI_SCISEL;
305
		pci_swsci |= PCI_SWSCI_SCISEL;
295
		pci_swsci &= ~PCI_SWSCI_GSSCIE;
306
		pci_swsci &= ~PCI_SWSCI_GSSCIE;
296
		pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
307
		pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
297
	}
308
	}
298
 
309
 
299
	/* Use event trigger to tell bios to check the mail. */
310
	/* Use event trigger to tell bios to check the mail. */
300
	pci_swsci |= PCI_SWSCI_GSSCIE;
311
	pci_swsci |= PCI_SWSCI_GSSCIE;
301
	pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
312
	pci_write_config_word(dev->pdev, PCI_SWSCI, pci_swsci);
302
 
313
 
303
	/* Poll for the result. */
314
	/* Poll for the result. */
304
#define C (((scic = swsci->scic) & SWSCI_SCIC_INDICATOR) == 0)
315
#define C (((scic = swsci->scic) & SWSCI_SCIC_INDICATOR) == 0)
305
	if (wait_for(C, dslp)) {
316
	if (wait_for(C, dslp)) {
306
		DRM_DEBUG_DRIVER("SWSCI request timed out\n");
317
		DRM_DEBUG_DRIVER("SWSCI request timed out\n");
307
		return -ETIMEDOUT;
318
		return -ETIMEDOUT;
308
	}
319
	}
309
 
320
 
310
	scic = (scic & SWSCI_SCIC_EXIT_STATUS_MASK) >>
321
	scic = (scic & SWSCI_SCIC_EXIT_STATUS_MASK) >>
311
		SWSCI_SCIC_EXIT_STATUS_SHIFT;
322
		SWSCI_SCIC_EXIT_STATUS_SHIFT;
312
 
323
 
313
	/* Note: scic == 0 is an error! */
324
	/* Note: scic == 0 is an error! */
314
	if (scic != SWSCI_SCIC_EXIT_STATUS_SUCCESS) {
325
	if (scic != SWSCI_SCIC_EXIT_STATUS_SUCCESS) {
315
		DRM_DEBUG_DRIVER("SWSCI request error %u\n", scic);
326
		DRM_DEBUG_DRIVER("SWSCI request error %u\n", scic);
316
		return -EIO;
327
		return -EIO;
317
	}
328
	}
318
 
329
 
319
	if (parm_out)
330
	if (parm_out)
320
		*parm_out = swsci->parm;
331
		*parm_out = swsci->parm;
321
 
332
 
322
	return 0;
333
	return 0;
323
 
334
 
324
#undef C
335
#undef C
325
}
336
}
326
 
337
 
327
#define DISPLAY_TYPE_CRT			0
338
#define DISPLAY_TYPE_CRT			0
328
#define DISPLAY_TYPE_TV				1
339
#define DISPLAY_TYPE_TV				1
329
#define DISPLAY_TYPE_EXTERNAL_FLAT_PANEL	2
340
#define DISPLAY_TYPE_EXTERNAL_FLAT_PANEL	2
330
#define DISPLAY_TYPE_INTERNAL_FLAT_PANEL	3
341
#define DISPLAY_TYPE_INTERNAL_FLAT_PANEL	3
331
 
342
 
332
int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
343
int intel_opregion_notify_encoder(struct intel_encoder *intel_encoder,
333
				  bool enable)
344
				  bool enable)
334
{
345
{
335
	struct drm_device *dev = intel_encoder->base.dev;
346
	struct drm_device *dev = intel_encoder->base.dev;
336
	u32 parm = 0;
347
	u32 parm = 0;
337
	u32 type = 0;
348
	u32 type = 0;
338
	u32 port;
349
	u32 port;
339
 
350
 
340
	/* don't care about old stuff for now */
351
	/* don't care about old stuff for now */
341
	if (!HAS_DDI(dev))
352
	if (!HAS_DDI(dev))
342
		return 0;
353
		return 0;
343
 
354
 
344
	if (intel_encoder->type == INTEL_OUTPUT_DSI)
355
	if (intel_encoder->type == INTEL_OUTPUT_DSI)
345
		port = 0;
356
		port = 0;
346
	else
357
	else
347
		port = intel_ddi_get_encoder_port(intel_encoder);
358
		port = intel_ddi_get_encoder_port(intel_encoder);
348
 
359
 
349
	if (port == PORT_E)  {
360
	if (port == PORT_E)  {
350
		port = 0;
361
		port = 0;
351
	} else {
362
	} else {
352
		parm |= 1 << port;
363
		parm |= 1 << port;
353
		port++;
364
		port++;
354
	}
365
	}
355
 
366
 
356
	if (!enable)
367
	if (!enable)
357
		parm |= 4 << 8;
368
		parm |= 4 << 8;
358
 
369
 
359
	switch (intel_encoder->type) {
370
	switch (intel_encoder->type) {
360
	case INTEL_OUTPUT_ANALOG:
371
	case INTEL_OUTPUT_ANALOG:
361
		type = DISPLAY_TYPE_CRT;
372
		type = DISPLAY_TYPE_CRT;
362
		break;
373
		break;
363
	case INTEL_OUTPUT_UNKNOWN:
374
	case INTEL_OUTPUT_UNKNOWN:
364
	case INTEL_OUTPUT_DISPLAYPORT:
375
	case INTEL_OUTPUT_DISPLAYPORT:
365
	case INTEL_OUTPUT_HDMI:
376
	case INTEL_OUTPUT_HDMI:
366
	case INTEL_OUTPUT_DP_MST:
377
	case INTEL_OUTPUT_DP_MST:
367
		type = DISPLAY_TYPE_EXTERNAL_FLAT_PANEL;
378
		type = DISPLAY_TYPE_EXTERNAL_FLAT_PANEL;
368
		break;
379
		break;
369
	case INTEL_OUTPUT_EDP:
380
	case INTEL_OUTPUT_EDP:
370
	case INTEL_OUTPUT_DSI:
381
	case INTEL_OUTPUT_DSI:
371
		type = DISPLAY_TYPE_INTERNAL_FLAT_PANEL;
382
		type = DISPLAY_TYPE_INTERNAL_FLAT_PANEL;
372
		break;
383
		break;
373
	default:
384
	default:
374
		WARN_ONCE(1, "unsupported intel_encoder type %d\n",
385
		WARN_ONCE(1, "unsupported intel_encoder type %d\n",
375
			  intel_encoder->type);
386
			  intel_encoder->type);
376
		return -EINVAL;
387
		return -EINVAL;
377
	}
388
	}
378
 
389
 
379
	parm |= type << (16 + port * 3);
390
	parm |= type << (16 + port * 3);
380
 
391
 
381
	return swsci(dev, SWSCI_SBCB_DISPLAY_POWER_STATE, parm, NULL);
392
	return swsci(dev, SWSCI_SBCB_DISPLAY_POWER_STATE, parm, NULL);
382
}
393
}
383
 
394
 
384
static const struct {
395
static const struct {
385
	pci_power_t pci_power_state;
396
	pci_power_t pci_power_state;
386
	u32 parm;
397
	u32 parm;
387
} power_state_map[] = {
398
} power_state_map[] = {
388
	{ PCI_D0,	0x00 },
399
	{ PCI_D0,	0x00 },
389
	{ PCI_D1,	0x01 },
400
	{ PCI_D1,	0x01 },
390
	{ PCI_D2,	0x02 },
401
	{ PCI_D2,	0x02 },
391
	{ PCI_D3hot,	0x04 },
402
	{ PCI_D3hot,	0x04 },
392
	{ PCI_D3cold,	0x04 },
403
	{ PCI_D3cold,	0x04 },
393
};
404
};
394
 
405
 
395
int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
406
int intel_opregion_notify_adapter(struct drm_device *dev, pci_power_t state)
396
{
407
{
397
	int i;
408
	int i;
398
 
409
 
399
	if (!HAS_DDI(dev))
410
	if (!HAS_DDI(dev))
400
		return 0;
411
		return 0;
401
 
412
 
402
	for (i = 0; i < ARRAY_SIZE(power_state_map); i++) {
413
	for (i = 0; i < ARRAY_SIZE(power_state_map); i++) {
403
		if (state == power_state_map[i].pci_power_state)
414
		if (state == power_state_map[i].pci_power_state)
404
			return swsci(dev, SWSCI_SBCB_ADAPTER_POWER_STATE,
415
			return swsci(dev, SWSCI_SBCB_ADAPTER_POWER_STATE,
405
				     power_state_map[i].parm, NULL);
416
				     power_state_map[i].parm, NULL);
406
	}
417
	}
407
 
418
 
408
	return -EINVAL;
419
	return -EINVAL;
409
}
420
}
410
 
421
 
411
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
422
static u32 asle_set_backlight(struct drm_device *dev, u32 bclp)
412
{
423
{
413
	struct drm_i915_private *dev_priv = dev->dev_private;
424
	struct drm_i915_private *dev_priv = dev->dev_private;
414
	struct intel_connector *intel_connector;
425
	struct intel_connector *connector;
415
	struct opregion_asle *asle = dev_priv->opregion.asle;
426
	struct opregion_asle *asle = dev_priv->opregion.asle;
416
 
427
 
417
	DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
428
	DRM_DEBUG_DRIVER("bclp = 0x%08x\n", bclp);
418
 
429
 
419
	if (acpi_video_get_backlight_type() == acpi_backlight_native) {
430
	if (acpi_video_get_backlight_type() == acpi_backlight_native) {
420
		DRM_DEBUG_KMS("opregion backlight request ignored\n");
431
		DRM_DEBUG_KMS("opregion backlight request ignored\n");
421
		return 0;
432
		return 0;
422
	}
433
	}
423
 
434
 
424
	if (!(bclp & ASLE_BCLP_VALID))
435
	if (!(bclp & ASLE_BCLP_VALID))
425
		return ASLC_BACKLIGHT_FAILED;
436
		return ASLC_BACKLIGHT_FAILED;
426
 
437
 
427
	bclp &= ASLE_BCLP_MSK;
438
	bclp &= ASLE_BCLP_MSK;
428
	if (bclp > 255)
439
	if (bclp > 255)
429
		return ASLC_BACKLIGHT_FAILED;
440
		return ASLC_BACKLIGHT_FAILED;
430
 
441
 
431
	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
442
	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
432
 
443
 
433
	/*
444
	/*
434
	 * Update backlight on all connectors that support backlight (usually
445
	 * Update backlight on all connectors that support backlight (usually
435
	 * only one).
446
	 * only one).
436
	 */
447
	 */
437
	DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp);
448
	DRM_DEBUG_KMS("updating opregion backlight %d/255\n", bclp);
438
	list_for_each_entry(intel_connector, &dev->mode_config.connector_list, base.head)
449
	for_each_intel_connector(dev, connector)
439
		intel_panel_set_backlight_acpi(intel_connector, bclp, 255);
450
		intel_panel_set_backlight_acpi(connector, bclp, 255);
440
	asle->cblv = DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID;
451
	asle->cblv = DIV_ROUND_UP(bclp * 100, 255) | ASLE_CBLV_VALID;
441
 
452
 
442
	drm_modeset_unlock(&dev->mode_config.connection_mutex);
453
	drm_modeset_unlock(&dev->mode_config.connection_mutex);
443
 
454
 
444
 
455
 
445
	return 0;
456
	return 0;
446
}
457
}
447
 
458
 
448
static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi)
459
static u32 asle_set_als_illum(struct drm_device *dev, u32 alsi)
449
{
460
{
450
	/* alsi is the current ALS reading in lux. 0 indicates below sensor
461
	/* alsi is the current ALS reading in lux. 0 indicates below sensor
451
	   range, 0xffff indicates above sensor range. 1-0xfffe are valid */
462
	   range, 0xffff indicates above sensor range. 1-0xfffe are valid */
452
	DRM_DEBUG_DRIVER("Illum is not supported\n");
463
	DRM_DEBUG_DRIVER("Illum is not supported\n");
453
	return ASLC_ALS_ILLUM_FAILED;
464
	return ASLC_ALS_ILLUM_FAILED;
454
}
465
}
455
 
466
 
456
static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb)
467
static u32 asle_set_pwm_freq(struct drm_device *dev, u32 pfmb)
457
{
468
{
458
	DRM_DEBUG_DRIVER("PWM freq is not supported\n");
469
	DRM_DEBUG_DRIVER("PWM freq is not supported\n");
459
	return ASLC_PWM_FREQ_FAILED;
470
	return ASLC_PWM_FREQ_FAILED;
460
}
471
}
461
 
472
 
462
static u32 asle_set_pfit(struct drm_device *dev, u32 pfit)
473
static u32 asle_set_pfit(struct drm_device *dev, u32 pfit)
463
{
474
{
464
	/* Panel fitting is currently controlled by the X code, so this is a
475
	/* Panel fitting is currently controlled by the X code, so this is a
465
	   noop until modesetting support works fully */
476
	   noop until modesetting support works fully */
466
	DRM_DEBUG_DRIVER("Pfit is not supported\n");
477
	DRM_DEBUG_DRIVER("Pfit is not supported\n");
467
	return ASLC_PFIT_FAILED;
478
	return ASLC_PFIT_FAILED;
468
}
479
}
469
 
480
 
470
static u32 asle_set_supported_rotation_angles(struct drm_device *dev, u32 srot)
481
static u32 asle_set_supported_rotation_angles(struct drm_device *dev, u32 srot)
471
{
482
{
472
	DRM_DEBUG_DRIVER("SROT is not supported\n");
483
	DRM_DEBUG_DRIVER("SROT is not supported\n");
473
	return ASLC_ROTATION_ANGLES_FAILED;
484
	return ASLC_ROTATION_ANGLES_FAILED;
474
}
485
}
475
 
486
 
476
static u32 asle_set_button_array(struct drm_device *dev, u32 iuer)
487
static u32 asle_set_button_array(struct drm_device *dev, u32 iuer)
477
{
488
{
478
	if (!iuer)
489
	if (!iuer)
479
		DRM_DEBUG_DRIVER("Button array event is not supported (nothing)\n");
490
		DRM_DEBUG_DRIVER("Button array event is not supported (nothing)\n");
480
	if (iuer & ASLE_IUER_ROTATION_LOCK_BTN)
491
	if (iuer & ASLE_IUER_ROTATION_LOCK_BTN)
481
		DRM_DEBUG_DRIVER("Button array event is not supported (rotation lock)\n");
492
		DRM_DEBUG_DRIVER("Button array event is not supported (rotation lock)\n");
482
	if (iuer & ASLE_IUER_VOLUME_DOWN_BTN)
493
	if (iuer & ASLE_IUER_VOLUME_DOWN_BTN)
483
		DRM_DEBUG_DRIVER("Button array event is not supported (volume down)\n");
494
		DRM_DEBUG_DRIVER("Button array event is not supported (volume down)\n");
484
	if (iuer & ASLE_IUER_VOLUME_UP_BTN)
495
	if (iuer & ASLE_IUER_VOLUME_UP_BTN)
485
		DRM_DEBUG_DRIVER("Button array event is not supported (volume up)\n");
496
		DRM_DEBUG_DRIVER("Button array event is not supported (volume up)\n");
486
	if (iuer & ASLE_IUER_WINDOWS_BTN)
497
	if (iuer & ASLE_IUER_WINDOWS_BTN)
487
		DRM_DEBUG_DRIVER("Button array event is not supported (windows)\n");
498
		DRM_DEBUG_DRIVER("Button array event is not supported (windows)\n");
488
	if (iuer & ASLE_IUER_POWER_BTN)
499
	if (iuer & ASLE_IUER_POWER_BTN)
489
		DRM_DEBUG_DRIVER("Button array event is not supported (power)\n");
500
		DRM_DEBUG_DRIVER("Button array event is not supported (power)\n");
490
 
501
 
491
	return ASLC_BUTTON_ARRAY_FAILED;
502
	return ASLC_BUTTON_ARRAY_FAILED;
492
}
503
}
493
 
504
 
494
static u32 asle_set_convertible(struct drm_device *dev, u32 iuer)
505
static u32 asle_set_convertible(struct drm_device *dev, u32 iuer)
495
{
506
{
496
	if (iuer & ASLE_IUER_CONVERTIBLE)
507
	if (iuer & ASLE_IUER_CONVERTIBLE)
497
		DRM_DEBUG_DRIVER("Convertible is not supported (clamshell)\n");
508
		DRM_DEBUG_DRIVER("Convertible is not supported (clamshell)\n");
498
	else
509
	else
499
		DRM_DEBUG_DRIVER("Convertible is not supported (slate)\n");
510
		DRM_DEBUG_DRIVER("Convertible is not supported (slate)\n");
500
 
511
 
501
	return ASLC_CONVERTIBLE_FAILED;
512
	return ASLC_CONVERTIBLE_FAILED;
502
}
513
}
503
 
514
 
504
static u32 asle_set_docking(struct drm_device *dev, u32 iuer)
515
static u32 asle_set_docking(struct drm_device *dev, u32 iuer)
505
{
516
{
506
	if (iuer & ASLE_IUER_DOCKING)
517
	if (iuer & ASLE_IUER_DOCKING)
507
		DRM_DEBUG_DRIVER("Docking is not supported (docked)\n");
518
		DRM_DEBUG_DRIVER("Docking is not supported (docked)\n");
508
	else
519
	else
509
		DRM_DEBUG_DRIVER("Docking is not supported (undocked)\n");
520
		DRM_DEBUG_DRIVER("Docking is not supported (undocked)\n");
510
 
521
 
511
	return ASLC_DOCKING_FAILED;
522
	return ASLC_DOCKING_FAILED;
512
}
523
}
513
 
524
 
514
static u32 asle_isct_state(struct drm_device *dev)
525
static u32 asle_isct_state(struct drm_device *dev)
515
{
526
{
516
	DRM_DEBUG_DRIVER("ISCT is not supported\n");
527
	DRM_DEBUG_DRIVER("ISCT is not supported\n");
517
	return ASLC_ISCT_STATE_FAILED;
528
	return ASLC_ISCT_STATE_FAILED;
518
}
529
}
519
 
530
 
520
static void asle_work(struct work_struct *work)
531
static void asle_work(struct work_struct *work)
521
{
532
{
522
	struct intel_opregion *opregion =
533
	struct intel_opregion *opregion =
523
		container_of(work, struct intel_opregion, asle_work);
534
		container_of(work, struct intel_opregion, asle_work);
524
	struct drm_i915_private *dev_priv =
535
	struct drm_i915_private *dev_priv =
525
		container_of(opregion, struct drm_i915_private, opregion);
536
		container_of(opregion, struct drm_i915_private, opregion);
526
	struct drm_device *dev = dev_priv->dev;
537
	struct drm_device *dev = dev_priv->dev;
527
	struct opregion_asle *asle = dev_priv->opregion.asle;
538
	struct opregion_asle *asle = dev_priv->opregion.asle;
528
	u32 aslc_stat = 0;
539
	u32 aslc_stat = 0;
529
	u32 aslc_req;
540
	u32 aslc_req;
530
 
541
 
531
	if (!asle)
542
	if (!asle)
532
		return;
543
		return;
533
 
544
 
534
	aslc_req = asle->aslc;
545
	aslc_req = asle->aslc;
535
 
546
 
536
	if (!(aslc_req & ASLC_REQ_MSK)) {
547
	if (!(aslc_req & ASLC_REQ_MSK)) {
537
		DRM_DEBUG_DRIVER("No request on ASLC interrupt 0x%08x\n",
548
		DRM_DEBUG_DRIVER("No request on ASLC interrupt 0x%08x\n",
538
				 aslc_req);
549
				 aslc_req);
539
		return;
550
		return;
540
	}
551
	}
541
 
552
 
542
	if (aslc_req & ASLC_SET_ALS_ILLUM)
553
	if (aslc_req & ASLC_SET_ALS_ILLUM)
543
		aslc_stat |= asle_set_als_illum(dev, asle->alsi);
554
		aslc_stat |= asle_set_als_illum(dev, asle->alsi);
544
 
555
 
545
	if (aslc_req & ASLC_SET_BACKLIGHT)
556
	if (aslc_req & ASLC_SET_BACKLIGHT)
546
		aslc_stat |= asle_set_backlight(dev, asle->bclp);
557
		aslc_stat |= asle_set_backlight(dev, asle->bclp);
547
 
558
 
548
	if (aslc_req & ASLC_SET_PFIT)
559
	if (aslc_req & ASLC_SET_PFIT)
549
		aslc_stat |= asle_set_pfit(dev, asle->pfit);
560
		aslc_stat |= asle_set_pfit(dev, asle->pfit);
550
 
561
 
551
	if (aslc_req & ASLC_SET_PWM_FREQ)
562
	if (aslc_req & ASLC_SET_PWM_FREQ)
552
		aslc_stat |= asle_set_pwm_freq(dev, asle->pfmb);
563
		aslc_stat |= asle_set_pwm_freq(dev, asle->pfmb);
553
 
564
 
554
	if (aslc_req & ASLC_SUPPORTED_ROTATION_ANGLES)
565
	if (aslc_req & ASLC_SUPPORTED_ROTATION_ANGLES)
555
		aslc_stat |= asle_set_supported_rotation_angles(dev,
566
		aslc_stat |= asle_set_supported_rotation_angles(dev,
556
							asle->srot);
567
							asle->srot);
557
 
568
 
558
	if (aslc_req & ASLC_BUTTON_ARRAY)
569
	if (aslc_req & ASLC_BUTTON_ARRAY)
559
		aslc_stat |= asle_set_button_array(dev, asle->iuer);
570
		aslc_stat |= asle_set_button_array(dev, asle->iuer);
560
 
571
 
561
	if (aslc_req & ASLC_CONVERTIBLE_INDICATOR)
572
	if (aslc_req & ASLC_CONVERTIBLE_INDICATOR)
562
		aslc_stat |= asle_set_convertible(dev, asle->iuer);
573
		aslc_stat |= asle_set_convertible(dev, asle->iuer);
563
 
574
 
564
	if (aslc_req & ASLC_DOCKING_INDICATOR)
575
	if (aslc_req & ASLC_DOCKING_INDICATOR)
565
		aslc_stat |= asle_set_docking(dev, asle->iuer);
576
		aslc_stat |= asle_set_docking(dev, asle->iuer);
566
 
577
 
567
	if (aslc_req & ASLC_ISCT_STATE_CHANGE)
578
	if (aslc_req & ASLC_ISCT_STATE_CHANGE)
568
		aslc_stat |= asle_isct_state(dev);
579
		aslc_stat |= asle_isct_state(dev);
569
 
580
 
570
	asle->aslc = aslc_stat;
581
	asle->aslc = aslc_stat;
571
}
582
}
572
 
583
 
573
void intel_opregion_asle_intr(struct drm_device *dev)
584
void intel_opregion_asle_intr(struct drm_device *dev)
574
{
585
{
575
	struct drm_i915_private *dev_priv = dev->dev_private;
586
	struct drm_i915_private *dev_priv = dev->dev_private;
576
 
587
 
577
	if (dev_priv->opregion.asle)
588
	if (dev_priv->opregion.asle)
578
		schedule_work(&dev_priv->opregion.asle_work);
589
		schedule_work(&dev_priv->opregion.asle_work);
579
}
590
}
580
 
591
 
581
#define ACPI_EV_DISPLAY_SWITCH (1<<0)
592
#define ACPI_EV_DISPLAY_SWITCH (1<<0)
582
#define ACPI_EV_LID            (1<<1)
593
#define ACPI_EV_LID            (1<<1)
583
#define ACPI_EV_DOCK           (1<<2)
594
#define ACPI_EV_DOCK           (1<<2)
584
 
595
 
585
static struct intel_opregion *system_opregion;
596
static struct intel_opregion *system_opregion;
586
 
597
 
587
static int intel_opregion_video_event(struct notifier_block *nb,
598
static int intel_opregion_video_event(struct notifier_block *nb,
588
				      unsigned long val, void *data)
599
				      unsigned long val, void *data)
589
{
600
{
590
	/* The only video events relevant to opregion are 0x80. These indicate
601
	/* The only video events relevant to opregion are 0x80. These indicate
591
	   either a docking event, lid switch or display switch request. In
602
	   either a docking event, lid switch or display switch request. In
592
	   Linux, these are handled by the dock, button and video drivers.
603
	   Linux, these are handled by the dock, button and video drivers.
593
	*/
604
	*/
594
 
605
 
595
	struct acpi_bus_event *event = data;
606
	struct acpi_bus_event *event = data;
596
	struct opregion_acpi *acpi;
607
	struct opregion_acpi *acpi;
597
	int ret = NOTIFY_OK;
608
	int ret = NOTIFY_OK;
598
 
609
 
599
	if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0)
610
	if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0)
600
		return NOTIFY_DONE;
611
		return NOTIFY_DONE;
601
 
612
 
602
	if (!system_opregion)
613
	if (!system_opregion)
603
		return NOTIFY_DONE;
614
		return NOTIFY_DONE;
604
 
615
 
605
	acpi = system_opregion->acpi;
616
	acpi = system_opregion->acpi;
606
 
617
 
607
	if (event->type == 0x80 && ((acpi->cevt & 1) == 0))
618
	if (event->type == 0x80 && ((acpi->cevt & 1) == 0))
608
		ret = NOTIFY_BAD;
619
		ret = NOTIFY_BAD;
609
 
620
 
610
	acpi->csts = 0;
621
	acpi->csts = 0;
611
 
622
 
612
	return ret;
623
	return ret;
613
}
624
}
614
 
625
 
615
static struct notifier_block intel_opregion_notifier = {
626
static struct notifier_block intel_opregion_notifier = {
616
	.notifier_call = intel_opregion_video_event,
627
	.notifier_call = intel_opregion_video_event,
617
};
628
};
618
 
629
 
619
/*
630
/*
620
 * Initialise the DIDL field in opregion. This passes a list of devices to
631
 * Initialise the DIDL field in opregion. This passes a list of devices to
621
 * the firmware. Values are defined by section B.4.2 of the ACPI specification
632
 * the firmware. Values are defined by section B.4.2 of the ACPI specification
622
 * (version 3)
633
 * (version 3)
623
 */
634
 */
624
 
635
 
625
static u32 get_did(struct intel_opregion *opregion, int i)
636
static u32 get_did(struct intel_opregion *opregion, int i)
626
{
637
{
627
	u32 did;
638
	u32 did;
628
 
639
 
629
	if (i < ARRAY_SIZE(opregion->acpi->didl)) {
640
	if (i < ARRAY_SIZE(opregion->acpi->didl)) {
630
		did = opregion->acpi->didl[i];
641
		did = opregion->acpi->didl[i];
631
	} else {
642
	} else {
632
		i -= ARRAY_SIZE(opregion->acpi->didl);
643
		i -= ARRAY_SIZE(opregion->acpi->didl);
633
 
644
 
634
		if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
645
		if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
635
			return 0;
646
			return 0;
636
 
647
 
637
		did = opregion->acpi->did2[i];
648
		did = opregion->acpi->did2[i];
638
	}
649
	}
639
 
650
 
640
	return did;
651
	return did;
641
}
652
}
642
 
653
 
643
static void set_did(struct intel_opregion *opregion, int i, u32 val)
654
static void set_did(struct intel_opregion *opregion, int i, u32 val)
644
{
655
{
645
	if (i < ARRAY_SIZE(opregion->acpi->didl)) {
656
	if (i < ARRAY_SIZE(opregion->acpi->didl)) {
646
		opregion->acpi->didl[i] = val;
657
		opregion->acpi->didl[i] = val;
647
	} else {
658
	} else {
648
		i -= ARRAY_SIZE(opregion->acpi->didl);
659
		i -= ARRAY_SIZE(opregion->acpi->didl);
649
 
660
 
650
		if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
661
		if (WARN_ON(i >= ARRAY_SIZE(opregion->acpi->did2)))
651
			return;
662
			return;
652
 
663
 
653
		opregion->acpi->did2[i] = val;
664
		opregion->acpi->did2[i] = val;
654
	}
665
	}
655
}
666
}
656
 
667
 
657
static void intel_didl_outputs(struct drm_device *dev)
668
static void intel_didl_outputs(struct drm_device *dev)
658
{
669
{
659
	struct drm_i915_private *dev_priv = dev->dev_private;
670
	struct drm_i915_private *dev_priv = dev->dev_private;
660
	struct intel_opregion *opregion = &dev_priv->opregion;
671
	struct intel_opregion *opregion = &dev_priv->opregion;
661
	struct drm_connector *connector;
672
	struct drm_connector *connector;
662
	acpi_handle handle;
673
	acpi_handle handle;
663
	struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL;
674
	struct acpi_device *acpi_dev, *acpi_cdev, *acpi_video_bus = NULL;
664
	unsigned long long device_id;
675
	unsigned long long device_id;
665
	acpi_status status;
676
	acpi_status status;
666
	u32 temp, max_outputs;
677
	u32 temp, max_outputs;
667
	int i = 0;
678
	int i = 0;
668
 
679
 
669
	handle = ACPI_HANDLE(&dev->pdev->dev);
680
	handle = ACPI_HANDLE(&dev->pdev->dev);
670
	if (!handle || acpi_bus_get_device(handle, &acpi_dev))
681
	if (!handle || acpi_bus_get_device(handle, &acpi_dev))
671
		return;
682
		return;
672
 
683
 
673
	if (acpi_is_video_device(handle))
684
	if (acpi_is_video_device(handle))
674
		acpi_video_bus = acpi_dev;
685
		acpi_video_bus = acpi_dev;
675
	else {
686
	else {
676
		list_for_each_entry(acpi_cdev, &acpi_dev->children, node) {
687
		list_for_each_entry(acpi_cdev, &acpi_dev->children, node) {
677
			if (acpi_is_video_device(acpi_cdev->handle)) {
688
			if (acpi_is_video_device(acpi_cdev->handle)) {
678
				acpi_video_bus = acpi_cdev;
689
				acpi_video_bus = acpi_cdev;
679
				break;
690
				break;
680
			}
691
			}
681
		}
692
		}
682
	}
693
	}
683
 
694
 
684
	if (!acpi_video_bus) {
695
	if (!acpi_video_bus) {
685
		DRM_DEBUG_KMS("No ACPI video bus found\n");
696
		DRM_DEBUG_KMS("No ACPI video bus found\n");
686
		return;
697
		return;
687
	}
698
	}
688
 
699
 
689
	/*
700
	/*
690
	 * In theory, did2, the extended didl, gets added at opregion version
701
	 * In theory, did2, the extended didl, gets added at opregion version
691
	 * 3.0. In practice, however, we're supposed to set it for earlier
702
	 * 3.0. In practice, however, we're supposed to set it for earlier
692
	 * versions as well, since a BIOS that doesn't understand did2 should
703
	 * versions as well, since a BIOS that doesn't understand did2 should
693
	 * not look at it anyway. Use a variable so we can tweak this if a need
704
	 * not look at it anyway. Use a variable so we can tweak this if a need
694
	 * arises later.
705
	 * arises later.
695
	 */
706
	 */
696
	max_outputs = ARRAY_SIZE(opregion->acpi->didl) +
707
	max_outputs = ARRAY_SIZE(opregion->acpi->didl) +
697
		ARRAY_SIZE(opregion->acpi->did2);
708
		ARRAY_SIZE(opregion->acpi->did2);
698
 
709
 
699
	list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) {
710
	list_for_each_entry(acpi_cdev, &acpi_video_bus->children, node) {
700
		if (i >= max_outputs) {
711
		if (i >= max_outputs) {
701
			DRM_DEBUG_KMS("More than %u outputs detected via ACPI\n",
712
			DRM_DEBUG_KMS("More than %u outputs detected via ACPI\n",
702
				      max_outputs);
713
				      max_outputs);
703
			return;
714
			return;
704
		}
715
		}
705
		status = acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
716
		status = acpi_evaluate_integer(acpi_cdev->handle, "_ADR",
706
					       NULL, &device_id);
717
					       NULL, &device_id);
707
		if (ACPI_SUCCESS(status)) {
718
		if (ACPI_SUCCESS(status)) {
708
			if (!device_id)
719
			if (!device_id)
709
				goto blind_set;
720
				goto blind_set;
710
			set_did(opregion, i++, (u32)(device_id & 0x0f0f));
721
			set_did(opregion, i++, (u32)(device_id & 0x0f0f));
711
		}
722
		}
712
	}
723
	}
713
 
724
 
714
end:
725
end:
715
	DRM_DEBUG_KMS("%d outputs detected\n", i);
726
	DRM_DEBUG_KMS("%d outputs detected\n", i);
716
 
727
 
717
	/* If fewer than max outputs, the list must be null terminated */
728
	/* If fewer than max outputs, the list must be null terminated */
718
	if (i < max_outputs)
729
	if (i < max_outputs)
719
		set_did(opregion, i, 0);
730
		set_did(opregion, i, 0);
720
	return;
731
	return;
721
 
732
 
722
blind_set:
733
blind_set:
723
	i = 0;
734
	i = 0;
724
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
735
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
725
		int output_type = ACPI_OTHER_OUTPUT;
736
		int output_type = ACPI_OTHER_OUTPUT;
726
		if (i >= max_outputs) {
737
		if (i >= max_outputs) {
727
			DRM_DEBUG_KMS("More than %u outputs in connector list\n",
738
			DRM_DEBUG_KMS("More than %u outputs in connector list\n",
728
				      max_outputs);
739
				      max_outputs);
729
			return;
740
			return;
730
		}
741
		}
731
		switch (connector->connector_type) {
742
		switch (connector->connector_type) {
732
		case DRM_MODE_CONNECTOR_VGA:
743
		case DRM_MODE_CONNECTOR_VGA:
733
		case DRM_MODE_CONNECTOR_DVIA:
744
		case DRM_MODE_CONNECTOR_DVIA:
734
			output_type = ACPI_VGA_OUTPUT;
745
			output_type = ACPI_VGA_OUTPUT;
735
			break;
746
			break;
736
		case DRM_MODE_CONNECTOR_Composite:
747
		case DRM_MODE_CONNECTOR_Composite:
737
		case DRM_MODE_CONNECTOR_SVIDEO:
748
		case DRM_MODE_CONNECTOR_SVIDEO:
738
		case DRM_MODE_CONNECTOR_Component:
749
		case DRM_MODE_CONNECTOR_Component:
739
		case DRM_MODE_CONNECTOR_9PinDIN:
750
		case DRM_MODE_CONNECTOR_9PinDIN:
740
			output_type = ACPI_TV_OUTPUT;
751
			output_type = ACPI_TV_OUTPUT;
741
			break;
752
			break;
742
		case DRM_MODE_CONNECTOR_DVII:
753
		case DRM_MODE_CONNECTOR_DVII:
743
		case DRM_MODE_CONNECTOR_DVID:
754
		case DRM_MODE_CONNECTOR_DVID:
744
		case DRM_MODE_CONNECTOR_DisplayPort:
755
		case DRM_MODE_CONNECTOR_DisplayPort:
745
		case DRM_MODE_CONNECTOR_HDMIA:
756
		case DRM_MODE_CONNECTOR_HDMIA:
746
		case DRM_MODE_CONNECTOR_HDMIB:
757
		case DRM_MODE_CONNECTOR_HDMIB:
747
			output_type = ACPI_DIGITAL_OUTPUT;
758
			output_type = ACPI_DIGITAL_OUTPUT;
748
			break;
759
			break;
749
		case DRM_MODE_CONNECTOR_LVDS:
760
		case DRM_MODE_CONNECTOR_LVDS:
750
			output_type = ACPI_LVDS_OUTPUT;
761
			output_type = ACPI_LVDS_OUTPUT;
751
			break;
762
			break;
752
		}
763
		}
753
		temp = get_did(opregion, i);
764
		temp = get_did(opregion, i);
754
		set_did(opregion, i, temp | (1 << 31) | output_type | i);
765
		set_did(opregion, i, temp | (1 << 31) | output_type | i);
755
		i++;
766
		i++;
756
	}
767
	}
757
	goto end;
768
	goto end;
758
}
769
}
759
 
770
 
760
static void intel_setup_cadls(struct drm_device *dev)
771
static void intel_setup_cadls(struct drm_device *dev)
761
{
772
{
762
	struct drm_i915_private *dev_priv = dev->dev_private;
773
	struct drm_i915_private *dev_priv = dev->dev_private;
763
	struct intel_opregion *opregion = &dev_priv->opregion;
774
	struct intel_opregion *opregion = &dev_priv->opregion;
764
	int i = 0;
775
	int i = 0;
765
	u32 disp_id;
776
	u32 disp_id;
766
 
777
 
767
	/* Initialize the CADL field by duplicating the DIDL values.
778
	/* Initialize the CADL field by duplicating the DIDL values.
768
	 * Technically, this is not always correct as display outputs may exist,
779
	 * Technically, this is not always correct as display outputs may exist,
769
	 * but not active. This initialization is necessary for some Clevo
780
	 * but not active. This initialization is necessary for some Clevo
770
	 * laptops that check this field before processing the brightness and
781
	 * laptops that check this field before processing the brightness and
771
	 * display switching hotkeys. Just like DIDL, CADL is NULL-terminated if
782
	 * display switching hotkeys. Just like DIDL, CADL is NULL-terminated if
772
	 * there are less than eight devices. */
783
	 * there are less than eight devices. */
773
	do {
784
	do {
774
		disp_id = get_did(opregion, i);
785
		disp_id = get_did(opregion, i);
775
		opregion->acpi->cadl[i] = disp_id;
786
		opregion->acpi->cadl[i] = disp_id;
776
	} while (++i < 8 && disp_id != 0);
787
	} while (++i < 8 && disp_id != 0);
777
}
788
}
778
 
789
 
779
void intel_opregion_init(struct drm_device *dev)
790
void intel_opregion_init(struct drm_device *dev)
780
{
791
{
781
	struct drm_i915_private *dev_priv = dev->dev_private;
792
	struct drm_i915_private *dev_priv = dev->dev_private;
782
	struct intel_opregion *opregion = &dev_priv->opregion;
793
	struct intel_opregion *opregion = &dev_priv->opregion;
783
 
794
 
784
	if (!opregion->header)
795
	if (!opregion->header)
785
		return;
796
		return;
786
 
797
 
787
	if (opregion->acpi) {
798
	if (opregion->acpi) {
788
		intel_didl_outputs(dev);
799
		intel_didl_outputs(dev);
789
		intel_setup_cadls(dev);
800
		intel_setup_cadls(dev);
790
 
801
 
791
		/* Notify BIOS we are ready to handle ACPI video ext notifs.
802
		/* Notify BIOS we are ready to handle ACPI video ext notifs.
792
		 * Right now, all the events are handled by the ACPI video module.
803
		 * Right now, all the events are handled by the ACPI video module.
793
		 * We don't actually need to do anything with them. */
804
		 * We don't actually need to do anything with them. */
794
		opregion->acpi->csts = 0;
805
		opregion->acpi->csts = 0;
795
		opregion->acpi->drdy = 1;
806
		opregion->acpi->drdy = 1;
796
 
807
 
797
		system_opregion = opregion;
808
		system_opregion = opregion;
798
		register_acpi_notifier(&intel_opregion_notifier);
809
		register_acpi_notifier(&intel_opregion_notifier);
799
	}
810
	}
800
 
811
 
801
	if (opregion->asle) {
812
	if (opregion->asle) {
802
		opregion->asle->tche = ASLE_TCHE_BLC_EN;
813
		opregion->asle->tche = ASLE_TCHE_BLC_EN;
803
		opregion->asle->ardy = ASLE_ARDY_READY;
814
		opregion->asle->ardy = ASLE_ARDY_READY;
804
	}
815
	}
805
}
816
}
806
 
817
 
807
void intel_opregion_fini(struct drm_device *dev)
818
void intel_opregion_fini(struct drm_device *dev)
808
{
819
{
809
	struct drm_i915_private *dev_priv = dev->dev_private;
820
	struct drm_i915_private *dev_priv = dev->dev_private;
810
	struct intel_opregion *opregion = &dev_priv->opregion;
821
	struct intel_opregion *opregion = &dev_priv->opregion;
811
 
822
 
812
	if (!opregion->header)
823
	if (!opregion->header)
813
		return;
824
		return;
814
 
825
 
815
	if (opregion->asle)
826
	if (opregion->asle)
816
		opregion->asle->ardy = ASLE_ARDY_NOT_READY;
827
		opregion->asle->ardy = ASLE_ARDY_NOT_READY;
817
 
828
 
818
	cancel_work_sync(&dev_priv->opregion.asle_work);
829
	cancel_work_sync(&dev_priv->opregion.asle_work);
819
 
830
 
820
	if (opregion->acpi) {
831
	if (opregion->acpi) {
821
		opregion->acpi->drdy = 0;
832
		opregion->acpi->drdy = 0;
822
 
833
 
823
		system_opregion = NULL;
834
		system_opregion = NULL;
824
		unregister_acpi_notifier(&intel_opregion_notifier);
835
		unregister_acpi_notifier(&intel_opregion_notifier);
825
	}
836
	}
826
 
837
 
827
	/* just clear all opregion memory pointers now */
838
	/* just clear all opregion memory pointers now */
828
	memunmap(opregion->header);
839
	memunmap(opregion->header);
-
 
840
	if (opregion->rvda) {
-
 
841
		memunmap(opregion->rvda);
-
 
842
		opregion->rvda = NULL;
-
 
843
	}
829
	opregion->header = NULL;
844
	opregion->header = NULL;
830
	opregion->acpi = NULL;
845
	opregion->acpi = NULL;
831
	opregion->swsci = NULL;
846
	opregion->swsci = NULL;
832
	opregion->asle = NULL;
847
	opregion->asle = NULL;
833
	opregion->vbt = NULL;
848
	opregion->vbt = NULL;
834
	opregion->lid_state = NULL;
849
	opregion->lid_state = NULL;
835
}
850
}
836
 
851
 
837
static void swsci_setup(struct drm_device *dev)
852
static void swsci_setup(struct drm_device *dev)
838
{
853
{
839
	struct drm_i915_private *dev_priv = dev->dev_private;
854
	struct drm_i915_private *dev_priv = dev->dev_private;
840
	struct intel_opregion *opregion = &dev_priv->opregion;
855
	struct intel_opregion *opregion = &dev_priv->opregion;
841
	bool requested_callbacks = false;
856
	bool requested_callbacks = false;
842
	u32 tmp;
857
	u32 tmp;
843
 
858
 
844
	/* Sub-function code 0 is okay, let's allow them. */
859
	/* Sub-function code 0 is okay, let's allow them. */
845
	opregion->swsci_gbda_sub_functions = 1;
860
	opregion->swsci_gbda_sub_functions = 1;
846
	opregion->swsci_sbcb_sub_functions = 1;
861
	opregion->swsci_sbcb_sub_functions = 1;
847
 
862
 
848
	/* We use GBDA to ask for supported GBDA calls. */
863
	/* We use GBDA to ask for supported GBDA calls. */
849
	if (swsci(dev, SWSCI_GBDA_SUPPORTED_CALLS, 0, &tmp) == 0) {
864
	if (swsci(dev, SWSCI_GBDA_SUPPORTED_CALLS, 0, &tmp) == 0) {
850
		/* make the bits match the sub-function codes */
865
		/* make the bits match the sub-function codes */
851
		tmp <<= 1;
866
		tmp <<= 1;
852
		opregion->swsci_gbda_sub_functions |= tmp;
867
		opregion->swsci_gbda_sub_functions |= tmp;
853
	}
868
	}
854
 
869
 
855
	/*
870
	/*
856
	 * We also use GBDA to ask for _requested_ SBCB callbacks. The driver
871
	 * We also use GBDA to ask for _requested_ SBCB callbacks. The driver
857
	 * must not call interfaces that are not specifically requested by the
872
	 * must not call interfaces that are not specifically requested by the
858
	 * bios.
873
	 * bios.
859
	 */
874
	 */
860
	if (swsci(dev, SWSCI_GBDA_REQUESTED_CALLBACKS, 0, &tmp) == 0) {
875
	if (swsci(dev, SWSCI_GBDA_REQUESTED_CALLBACKS, 0, &tmp) == 0) {
861
		/* here, the bits already match sub-function codes */
876
		/* here, the bits already match sub-function codes */
862
		opregion->swsci_sbcb_sub_functions |= tmp;
877
		opregion->swsci_sbcb_sub_functions |= tmp;
863
		requested_callbacks = true;
878
		requested_callbacks = true;
864
	}
879
	}
865
 
880
 
866
	/*
881
	/*
867
	 * But we use SBCB to ask for _supported_ SBCB calls. This does not mean
882
	 * But we use SBCB to ask for _supported_ SBCB calls. This does not mean
868
	 * the callback is _requested_. But we still can't call interfaces that
883
	 * the callback is _requested_. But we still can't call interfaces that
869
	 * are not requested.
884
	 * are not requested.
870
	 */
885
	 */
871
	if (swsci(dev, SWSCI_SBCB_SUPPORTED_CALLBACKS, 0, &tmp) == 0) {
886
	if (swsci(dev, SWSCI_SBCB_SUPPORTED_CALLBACKS, 0, &tmp) == 0) {
872
		/* make the bits match the sub-function codes */
887
		/* make the bits match the sub-function codes */
873
		u32 low = tmp & 0x7ff;
888
		u32 low = tmp & 0x7ff;
874
		u32 high = tmp & ~0xfff; /* bit 11 is reserved */
889
		u32 high = tmp & ~0xfff; /* bit 11 is reserved */
875
		tmp = (high << 4) | (low << 1) | 1;
890
		tmp = (high << 4) | (low << 1) | 1;
876
 
891
 
877
		/* best guess what to do with supported wrt requested */
892
		/* best guess what to do with supported wrt requested */
878
		if (requested_callbacks) {
893
		if (requested_callbacks) {
879
			u32 req = opregion->swsci_sbcb_sub_functions;
894
			u32 req = opregion->swsci_sbcb_sub_functions;
880
			if ((req & tmp) != req)
895
			if ((req & tmp) != req)
881
				DRM_DEBUG_DRIVER("SWSCI BIOS requested (%08x) SBCB callbacks that are not supported (%08x)\n", req, tmp);
896
				DRM_DEBUG_DRIVER("SWSCI BIOS requested (%08x) SBCB callbacks that are not supported (%08x)\n", req, tmp);
882
			/* XXX: for now, trust the requested callbacks */
897
			/* XXX: for now, trust the requested callbacks */
883
			/* opregion->swsci_sbcb_sub_functions &= tmp; */
898
			/* opregion->swsci_sbcb_sub_functions &= tmp; */
884
		} else {
899
		} else {
885
			opregion->swsci_sbcb_sub_functions |= tmp;
900
			opregion->swsci_sbcb_sub_functions |= tmp;
886
		}
901
		}
887
	}
902
	}
888
 
903
 
889
	DRM_DEBUG_DRIVER("SWSCI GBDA callbacks %08x, SBCB callbacks %08x\n",
904
	DRM_DEBUG_DRIVER("SWSCI GBDA callbacks %08x, SBCB callbacks %08x\n",
890
			 opregion->swsci_gbda_sub_functions,
905
			 opregion->swsci_gbda_sub_functions,
891
			 opregion->swsci_sbcb_sub_functions);
906
			 opregion->swsci_sbcb_sub_functions);
892
}
907
}
893
#else /* CONFIG_ACPI */
908
#else /* CONFIG_ACPI */
894
static inline void swsci_setup(struct drm_device *dev) {}
909
static inline void swsci_setup(struct drm_device *dev) {}
895
#endif  /* CONFIG_ACPI */
910
#endif  /* CONFIG_ACPI */
-
 
911
 
-
 
912
static int intel_no_opregion_vbt_callback(const struct dmi_system_id *id)
-
 
913
{
-
 
914
	DRM_DEBUG_KMS("Falling back to manually reading VBT from "
-
 
915
		      "VBIOS ROM for %s\n", id->ident);
-
 
916
	return 1;
-
 
917
}
-
 
918
 
-
 
919
static const struct dmi_system_id intel_no_opregion_vbt[] = {
-
 
920
	{
-
 
921
		.callback = intel_no_opregion_vbt_callback,
-
 
922
		.ident = "ThinkCentre A57",
-
 
923
		.matches = {
-
 
924
			DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
-
 
925
			DMI_MATCH(DMI_PRODUCT_NAME, "97027RG"),
-
 
926
		},
-
 
927
	},
-
 
928
	{ }
-
 
929
};
896
 
930
 
897
int intel_opregion_setup(struct drm_device *dev)
931
int intel_opregion_setup(struct drm_device *dev)
898
{
932
{
899
	struct drm_i915_private *dev_priv = dev->dev_private;
933
	struct drm_i915_private *dev_priv = dev->dev_private;
900
	struct intel_opregion *opregion = &dev_priv->opregion;
934
	struct intel_opregion *opregion = &dev_priv->opregion;
901
	u32 asls, mboxes;
935
	u32 asls, mboxes;
902
	char buf[sizeof(OPREGION_SIGNATURE)];
936
	char buf[sizeof(OPREGION_SIGNATURE)];
903
	int err = 0;
937
	int err = 0;
904
	void *base;
938
	void *base;
905
 
939
 
906
	BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
940
	BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
907
	BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
941
	BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
908
	BUILD_BUG_ON(sizeof(struct opregion_swsci) != 0x100);
942
	BUILD_BUG_ON(sizeof(struct opregion_swsci) != 0x100);
909
	BUILD_BUG_ON(sizeof(struct opregion_asle) != 0x100);
943
	BUILD_BUG_ON(sizeof(struct opregion_asle) != 0x100);
-
 
944
	BUILD_BUG_ON(sizeof(struct opregion_asle_ext) != 0x400);
910
 
945
 
911
	pci_read_config_dword(dev->pdev, PCI_ASLS, &asls);
946
	pci_read_config_dword(dev->pdev, PCI_ASLS, &asls);
912
	DRM_DEBUG_DRIVER("graphic opregion physical addr: 0x%x\n", asls);
947
	DRM_DEBUG_DRIVER("graphic opregion physical addr: 0x%x\n", asls);
913
	if (asls == 0) {
948
	if (asls == 0) {
914
		DRM_DEBUG_DRIVER("ACPI OpRegion not supported!\n");
949
		DRM_DEBUG_DRIVER("ACPI OpRegion not supported!\n");
915
		return -ENOTSUPP;
950
		return -ENOTSUPP;
916
	}
951
	}
917
 
952
 
918
#ifdef CONFIG_ACPI
953
#ifdef CONFIG_ACPI
919
	INIT_WORK(&opregion->asle_work, asle_work);
954
	INIT_WORK(&opregion->asle_work, asle_work);
920
#endif
955
#endif
921
 
956
 
922
	base = memremap(asls, OPREGION_SIZE, MEMREMAP_WB);
957
	base = memremap(asls, OPREGION_SIZE, MEMREMAP_WB);
923
	if (!base)
958
	if (!base)
924
		return -ENOMEM;
959
		return -ENOMEM;
925
 
960
 
926
	memcpy(buf, base, sizeof(buf));
961
	memcpy(buf, base, sizeof(buf));
927
 
962
 
928
	if (memcmp(buf, OPREGION_SIGNATURE, 16)) {
963
	if (memcmp(buf, OPREGION_SIGNATURE, 16)) {
929
		DRM_DEBUG_DRIVER("opregion signature mismatch\n");
964
		DRM_DEBUG_DRIVER("opregion signature mismatch\n");
930
		err = -EINVAL;
965
		err = -EINVAL;
931
		goto err_out;
966
		goto err_out;
932
	}
967
	}
933
	opregion->header = base;
968
	opregion->header = base;
934
	opregion->vbt = base + OPREGION_VBT_OFFSET;
-
 
935
 
-
 
936
	opregion->lid_state = base + ACPI_CLID;
969
	opregion->lid_state = base + ACPI_CLID;
937
 
970
 
938
	mboxes = opregion->header->mboxes;
971
	mboxes = opregion->header->mboxes;
939
	if (mboxes & MBOX_ACPI) {
972
	if (mboxes & MBOX_ACPI) {
940
		DRM_DEBUG_DRIVER("Public ACPI methods supported\n");
973
		DRM_DEBUG_DRIVER("Public ACPI methods supported\n");
941
		opregion->acpi = base + OPREGION_ACPI_OFFSET;
974
		opregion->acpi = base + OPREGION_ACPI_OFFSET;
942
	}
975
	}
943
 
976
 
944
	if (mboxes & MBOX_SWSCI) {
977
	if (mboxes & MBOX_SWSCI) {
945
		DRM_DEBUG_DRIVER("SWSCI supported\n");
978
		DRM_DEBUG_DRIVER("SWSCI supported\n");
946
		opregion->swsci = base + OPREGION_SWSCI_OFFSET;
979
		opregion->swsci = base + OPREGION_SWSCI_OFFSET;
947
		swsci_setup(dev);
980
		swsci_setup(dev);
948
	}
981
	}
-
 
982
 
949
	if (mboxes & MBOX_ASLE) {
983
	if (mboxes & MBOX_ASLE) {
950
		DRM_DEBUG_DRIVER("ASLE supported\n");
984
		DRM_DEBUG_DRIVER("ASLE supported\n");
951
		opregion->asle = base + OPREGION_ASLE_OFFSET;
985
		opregion->asle = base + OPREGION_ASLE_OFFSET;
952
 
986
 
953
		opregion->asle->ardy = ASLE_ARDY_NOT_READY;
987
		opregion->asle->ardy = ASLE_ARDY_NOT_READY;
954
	}
988
	}
-
 
989
 
-
 
990
	if (mboxes & MBOX_ASLE_EXT)
-
 
991
		DRM_DEBUG_DRIVER("ASLE extension supported\n");
-
 
992
 
-
 
993
	if (!dmi_check_system(intel_no_opregion_vbt)) {
-
 
994
		const void *vbt = NULL;
-
 
995
		u32 vbt_size = 0;
-
 
996
 
-
 
997
		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
-
 
998
		    opregion->asle->rvda && opregion->asle->rvds) {
-
 
999
			opregion->rvda = memremap(opregion->asle->rvda,
-
 
1000
						  opregion->asle->rvds,
-
 
1001
						  MEMREMAP_WB);
-
 
1002
			vbt = opregion->rvda;
-
 
1003
			vbt_size = opregion->asle->rvds;
-
 
1004
		}
-
 
1005
 
-
 
1006
		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
-
 
1007
			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
-
 
1008
			opregion->vbt = vbt;
-
 
1009
			opregion->vbt_size = vbt_size;
-
 
1010
		} else {
-
 
1011
			vbt = base + OPREGION_VBT_OFFSET;
-
 
1012
			vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
-
 
1013
			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
-
 
1014
				DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
-
 
1015
				opregion->vbt = vbt;
-
 
1016
				opregion->vbt_size = vbt_size;
-
 
1017
			}
-
 
1018
		}
-
 
1019
	}
955
 
1020
 
956
	return 0;
1021
	return 0;
957
 
1022
 
958
err_out:
1023
err_out:
959
	memunmap(base);
1024
	memunmap(base);
960
	return err;
1025
	return err;
961
}
1026
}
962
 
1027
 
963
static>
1028
static>
964
 
1029
 
965
static>
1030
static>
966
#define>
1031
#define>
967
#define>
1032
#define>
968
#define>
1033
#define>
969
#define>
1034
#define>
970
 
1035
 
971
#define>
1036
#define>
972
 
1037
 
973
#define>
1038
#define>
974
#define>
1039
#define>
975
#define>
1040
#define>
976
#define>
1041
#define>
977
#define>
1042
#define>
978
#define>
1043
#define>
979
#define>
1044
#define>
980
#define>
1045
#define>
981
#define>
1046
#define>
982
 
1047
 
983
/*>
1048
/*>
984
 
1049
 
985
/*>
1050
/*>
986
 
1051
 
987
#define>
1052
#define>
988
 
1053
 
989
#define>
1054
#define>
990
#define>
1055
#define>
991
#define>
1056
#define>
992
 
1057
 
993
/*>
1058
/*>
994
 
1059
 
995
/*>
1060
/*>
996
#define>
1061
#define>
997
#define>
1062
#define>
998
#define>
1063
#define>
999
#define>
1064
#define>
1000
#define>
1065
#define>
1001
#define>
1066
#define>
1002
 
1067
 
1003
/*>
1068
/*>
1004
 
1069
 
1005
/*>
1070
/*>
1006
#define>
1071
#define>
1007
#define>
1072
#define>
1008
 
1073
 
1009
struct>
1074
struct>
1010
 
1075
 
1011
struct>
1076
struct>
1012
#define>
1077
#define>
1013
#define>
1078
#define>
1014
#define>
1079
#define>
1015
#define>
1080
#define>
1016
#define>
1081
#define>
1017
#define>
1082
#define>