]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/acpi/acpica/hwxface.c
ACPICA: hide private headers
[linux-2.6-omap-h63xx.git] / drivers / acpi / acpica / hwxface.c
1
2 /******************************************************************************
3  *
4  * Module Name: hwxface - Public ACPICA hardware interfaces
5  *
6  *****************************************************************************/
7
8 /*
9  * Copyright (C) 2000 - 2008, Intel Corp.
10  * All rights reserved.
11  *
12  * Redistribution and use in source and binary forms, with or without
13  * modification, are permitted provided that the following conditions
14  * are met:
15  * 1. Redistributions of source code must retain the above copyright
16  *    notice, this list of conditions, and the following disclaimer,
17  *    without modification.
18  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
19  *    substantially similar to the "NO WARRANTY" disclaimer below
20  *    ("Disclaimer") and any redistribution must be conditioned upon
21  *    including a substantially similar Disclaimer requirement for further
22  *    binary redistribution.
23  * 3. Neither the names of the above-listed copyright holders nor the names
24  *    of any contributors may be used to endorse or promote products derived
25  *    from this software without specific prior written permission.
26  *
27  * Alternatively, this software may be distributed under the terms of the
28  * GNU General Public License ("GPL") version 2 as published by the Free
29  * Software Foundation.
30  *
31  * NO WARRANTY
32  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
33  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
34  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
35  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
36  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
37  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
38  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
39  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
40  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
41  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42  * POSSIBILITY OF SUCH DAMAGES.
43  */
44
45 #include <acpi/acpi.h>
46 #include "accommon.h"
47 #include "acnamesp.h"
48
49 #define _COMPONENT          ACPI_HARDWARE
50 ACPI_MODULE_NAME("hwxface")
51
52 /******************************************************************************
53  *
54  * FUNCTION:    acpi_reset
55  *
56  * PARAMETERS:  None
57  *
58  * RETURN:      Status
59  *
60  * DESCRIPTION: Set reset register in memory or IO space. Note: Does not
61  *              support reset register in PCI config space, this must be
62  *              handled separately.
63  *
64  ******************************************************************************/
65 acpi_status acpi_reset(void)
66 {
67         struct acpi_generic_address *reset_reg;
68         acpi_status status;
69
70         ACPI_FUNCTION_TRACE(acpi_reset);
71
72         reset_reg = &acpi_gbl_FADT.reset_register;
73
74         /* Check if the reset register is supported */
75
76         if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) ||
77             !reset_reg->address) {
78                 return_ACPI_STATUS(AE_NOT_EXIST);
79         }
80
81         /* Write the reset value to the reset register */
82
83         status = acpi_write(acpi_gbl_FADT.reset_value, reset_reg);
84         return_ACPI_STATUS(status);
85 }
86
87 ACPI_EXPORT_SYMBOL(acpi_reset)
88
89 /******************************************************************************
90  *
91  * FUNCTION:    acpi_read
92  *
93  * PARAMETERS:  Value               - Where the value is returned
94  *              Reg                 - GAS register structure
95  *
96  * RETURN:      Status
97  *
98  * DESCRIPTION: Read from either memory or IO space.
99  *
100  ******************************************************************************/
101 acpi_status acpi_read(u32 *value, struct acpi_generic_address *reg)
102 {
103         u32 width;
104         u64 address;
105         acpi_status status;
106
107         ACPI_FUNCTION_NAME(acpi_read);
108
109         /*
110          * Must have a valid pointer to a GAS structure, and
111          * a non-zero address within. However, don't return an error
112          * because the PM1A/B code must not fail if B isn't present.
113          */
114         if (!reg) {
115                 return (AE_OK);
116         }
117
118         /* Get a local copy of the address. Handles possible alignment issues */
119
120         ACPI_MOVE_64_TO_64(&address, &reg->address);
121         if (!address) {
122                 return (AE_OK);
123         }
124
125         /* Supported widths are 8/16/32 */
126
127         width = reg->bit_width;
128         if ((width != 8) && (width != 16) && (width != 32)) {
129                 return (AE_SUPPORT);
130         }
131
132         /* Initialize entire 32-bit return value to zero */
133
134         *value = 0;
135
136         /*
137          * Two address spaces supported: Memory or IO.
138          * PCI_Config is not supported here because the GAS struct is insufficient
139          */
140         switch (reg->space_id) {
141         case ACPI_ADR_SPACE_SYSTEM_MEMORY:
142
143                 status = acpi_os_read_memory((acpi_physical_address) address,
144                                              value, width);
145                 break;
146
147         case ACPI_ADR_SPACE_SYSTEM_IO:
148
149                 status =
150                     acpi_os_read_port((acpi_io_address) address, value, width);
151                 break;
152
153         default:
154                 ACPI_ERROR((AE_INFO,
155                             "Unsupported address space: %X", reg->space_id));
156                 return (AE_BAD_PARAMETER);
157         }
158
159         ACPI_DEBUG_PRINT((ACPI_DB_IO,
160                           "Read:  %8.8X width %2d from %8.8X%8.8X (%s)\n",
161                           *value, width, ACPI_FORMAT_UINT64(address),
162                           acpi_ut_get_region_name(reg->space_id)));
163
164         return (status);
165 }
166
167 ACPI_EXPORT_SYMBOL(acpi_read)
168
169 /******************************************************************************
170  *
171  * FUNCTION:    acpi_write
172  *
173  * PARAMETERS:  Value               - To be written
174  *              Reg                 - GAS register structure
175  *
176  * RETURN:      Status
177  *
178  * DESCRIPTION: Write to either memory or IO space.
179  *
180  ******************************************************************************/
181 acpi_status acpi_write(u32 value, struct acpi_generic_address *reg)
182 {
183         u32 width;
184         u64 address;
185         acpi_status status;
186
187         ACPI_FUNCTION_NAME(acpi_write);
188
189         /*
190          * Must have a valid pointer to a GAS structure, and
191          * a non-zero address within. However, don't return an error
192          * because the PM1A/B code must not fail if B isn't present.
193          */
194         if (!reg) {
195                 return (AE_OK);
196         }
197
198         /* Get a local copy of the address. Handles possible alignment issues */
199
200         ACPI_MOVE_64_TO_64(&address, &reg->address);
201         if (!address) {
202                 return (AE_OK);
203         }
204
205         /* Supported widths are 8/16/32 */
206
207         width = reg->bit_width;
208         if ((width != 8) && (width != 16) && (width != 32)) {
209                 return (AE_SUPPORT);
210         }
211
212         /*
213          * Two address spaces supported: Memory or IO.
214          * PCI_Config is not supported here because the GAS struct is insufficient
215          */
216         switch (reg->space_id) {
217         case ACPI_ADR_SPACE_SYSTEM_MEMORY:
218
219                 status = acpi_os_write_memory((acpi_physical_address) address,
220                                               value, width);
221                 break;
222
223         case ACPI_ADR_SPACE_SYSTEM_IO:
224
225                 status = acpi_os_write_port((acpi_io_address) address, value,
226                                             width);
227                 break;
228
229         default:
230                 ACPI_ERROR((AE_INFO,
231                             "Unsupported address space: %X", reg->space_id));
232                 return (AE_BAD_PARAMETER);
233         }
234
235         ACPI_DEBUG_PRINT((ACPI_DB_IO,
236                           "Wrote: %8.8X width %2d   to %8.8X%8.8X (%s)\n",
237                           value, width, ACPI_FORMAT_UINT64(address),
238                           acpi_ut_get_region_name(reg->space_id)));
239
240         return (status);
241 }
242
243 ACPI_EXPORT_SYMBOL(acpi_write)
244
245 /*******************************************************************************
246  *
247  * FUNCTION:    acpi_get_register_unlocked
248  *
249  * PARAMETERS:  register_id     - ID of ACPI bit_register to access
250  *              return_value    - Value that was read from the register
251  *
252  * RETURN:      Status and the value read from specified Register. Value
253  *              returned is normalized to bit0 (is shifted all the way right)
254  *
255  * DESCRIPTION: ACPI bit_register read function. Does not acquire the HW lock.
256  *
257  ******************************************************************************/
258 acpi_status acpi_get_register_unlocked(u32 register_id, u32 *return_value)
259 {
260         u32 register_value = 0;
261         struct acpi_bit_register_info *bit_reg_info;
262         acpi_status status;
263
264         ACPI_FUNCTION_TRACE(acpi_get_register_unlocked);
265
266         /* Get the info structure corresponding to the requested ACPI Register */
267
268         bit_reg_info = acpi_hw_get_bit_register_info(register_id);
269         if (!bit_reg_info) {
270                 return_ACPI_STATUS(AE_BAD_PARAMETER);
271         }
272
273         /* Read from the register */
274
275         status = acpi_hw_register_read(bit_reg_info->parent_register,
276                                        &register_value);
277
278         if (ACPI_SUCCESS(status)) {
279
280                 /* Normalize the value that was read */
281
282                 register_value =
283                     ((register_value & bit_reg_info->access_bit_mask)
284                      >> bit_reg_info->bit_position);
285
286                 *return_value = register_value;
287
288                 ACPI_DEBUG_PRINT((ACPI_DB_IO, "Read value %8.8X register %X\n",
289                                   register_value,
290                                   bit_reg_info->parent_register));
291         }
292
293         return_ACPI_STATUS(status);
294 }
295
296 ACPI_EXPORT_SYMBOL(acpi_get_register_unlocked)
297
298 /*******************************************************************************
299  *
300  * FUNCTION:    acpi_get_register
301  *
302  * PARAMETERS:  register_id     - ID of ACPI bit_register to access
303  *              return_value    - Value that was read from the register
304  *
305  * RETURN:      Status and the value read from specified Register. Value
306  *              returned is normalized to bit0 (is shifted all the way right)
307  *
308  * DESCRIPTION: ACPI bit_register read function.
309  *
310  ******************************************************************************/
311 acpi_status acpi_get_register(u32 register_id, u32 *return_value)
312 {
313         acpi_status status;
314         acpi_cpu_flags flags;
315
316         flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
317         status = acpi_get_register_unlocked(register_id, return_value);
318         acpi_os_release_lock(acpi_gbl_hardware_lock, flags);
319
320         return (status);
321 }
322
323 ACPI_EXPORT_SYMBOL(acpi_get_register)
324
325 /*******************************************************************************
326  *
327  * FUNCTION:    acpi_set_register
328  *
329  * PARAMETERS:  register_id     - ID of ACPI bit_register to access
330  *              Value           - (only used on write) value to write to the
331  *                                Register, NOT pre-normalized to the bit pos
332  *
333  * RETURN:      Status
334  *
335  * DESCRIPTION: ACPI Bit Register write function.
336  *
337  ******************************************************************************/
338 acpi_status acpi_set_register(u32 register_id, u32 value)
339 {
340         u32 register_value = 0;
341         struct acpi_bit_register_info *bit_reg_info;
342         acpi_status status;
343         acpi_cpu_flags lock_flags;
344
345         ACPI_FUNCTION_TRACE_U32(acpi_set_register, register_id);
346
347         /* Get the info structure corresponding to the requested ACPI Register */
348
349         bit_reg_info = acpi_hw_get_bit_register_info(register_id);
350         if (!bit_reg_info) {
351                 ACPI_ERROR((AE_INFO, "Bad ACPI HW RegisterId: %X",
352                             register_id));
353                 return_ACPI_STATUS(AE_BAD_PARAMETER);
354         }
355
356         lock_flags = acpi_os_acquire_lock(acpi_gbl_hardware_lock);
357
358         /* Always do a register read first so we can insert the new bits  */
359
360         status = acpi_hw_register_read(bit_reg_info->parent_register,
361                                        &register_value);
362         if (ACPI_FAILURE(status)) {
363                 goto unlock_and_exit;
364         }
365
366         /*
367          * Decode the Register ID
368          * Register ID = [Register block ID] | [bit ID]
369          *
370          * Check bit ID to fine locate Register offset.
371          * Check Mask to determine Register offset, and then read-write.
372          */
373         switch (bit_reg_info->parent_register) {
374         case ACPI_REGISTER_PM1_STATUS:
375
376                 /*
377                  * Status Registers are different from the rest. Clear by
378                  * writing 1, and writing 0 has no effect. So, the only relevant
379                  * information is the single bit we're interested in, all others should
380                  * be written as 0 so they will be left unchanged.
381                  */
382                 value = ACPI_REGISTER_PREPARE_BITS(value,
383                                                    bit_reg_info->bit_position,
384                                                    bit_reg_info->
385                                                    access_bit_mask);
386                 if (value) {
387                         status =
388                             acpi_hw_register_write(ACPI_REGISTER_PM1_STATUS,
389                                                    (u16) value);
390                         register_value = 0;
391                 }
392                 break;
393
394         case ACPI_REGISTER_PM1_ENABLE:
395
396                 ACPI_REGISTER_INSERT_VALUE(register_value,
397                                            bit_reg_info->bit_position,
398                                            bit_reg_info->access_bit_mask,
399                                            value);
400
401                 status = acpi_hw_register_write(ACPI_REGISTER_PM1_ENABLE,
402                                                 (u16) register_value);
403                 break;
404
405         case ACPI_REGISTER_PM1_CONTROL:
406
407                 /*
408                  * Write the PM1 Control register.
409                  * Note that at this level, the fact that there are actually TWO
410                  * registers (A and B - and B may not exist) is abstracted.
411                  */
412                 ACPI_DEBUG_PRINT((ACPI_DB_IO, "PM1 control: Read %X\n",
413                                   register_value));
414
415                 ACPI_REGISTER_INSERT_VALUE(register_value,
416                                            bit_reg_info->bit_position,
417                                            bit_reg_info->access_bit_mask,
418                                            value);
419
420                 status = acpi_hw_register_write(ACPI_REGISTER_PM1_CONTROL,
421                                                 (u16) register_value);
422                 break;
423
424         case ACPI_REGISTER_PM2_CONTROL:
425
426                 status = acpi_hw_register_read(ACPI_REGISTER_PM2_CONTROL,
427                                                &register_value);
428                 if (ACPI_FAILURE(status)) {
429                         goto unlock_and_exit;
430                 }
431
432                 ACPI_DEBUG_PRINT((ACPI_DB_IO,
433                                   "PM2 control: Read %X from %8.8X%8.8X\n",
434                                   register_value,
435                                   ACPI_FORMAT_UINT64(acpi_gbl_FADT.
436                                                      xpm2_control_block.
437                                                      address)));
438
439                 ACPI_REGISTER_INSERT_VALUE(register_value,
440                                            bit_reg_info->bit_position,
441                                            bit_reg_info->access_bit_mask,
442                                            value);
443
444                 ACPI_DEBUG_PRINT((ACPI_DB_IO,
445                                   "About to write %4.4X to %8.8X%8.8X\n",
446                                   register_value,
447                                   ACPI_FORMAT_UINT64(acpi_gbl_FADT.
448                                                      xpm2_control_block.
449                                                      address)));
450
451                 status = acpi_hw_register_write(ACPI_REGISTER_PM2_CONTROL,
452                                                 (u8) (register_value));
453                 break;
454
455         default:
456                 break;
457         }
458
459       unlock_and_exit:
460
461         acpi_os_release_lock(acpi_gbl_hardware_lock, lock_flags);
462
463         /* Normalize the value that was read */
464
465         ACPI_DEBUG_EXEC(register_value =
466                         ((register_value & bit_reg_info->access_bit_mask) >>
467                          bit_reg_info->bit_position));
468
469         ACPI_DEBUG_PRINT((ACPI_DB_IO,
470                           "Set bits: %8.8X actual %8.8X register %X\n", value,
471                           register_value, bit_reg_info->parent_register));
472         return_ACPI_STATUS(status);
473 }
474
475 ACPI_EXPORT_SYMBOL(acpi_set_register)
476
477 /*******************************************************************************
478  *
479  * FUNCTION:    acpi_get_sleep_type_data
480  *
481  * PARAMETERS:  sleep_state         - Numeric sleep state
482  *              *sleep_type_a        - Where SLP_TYPa is returned
483  *              *sleep_type_b        - Where SLP_TYPb is returned
484  *
485  * RETURN:      Status - ACPI status
486  *
487  * DESCRIPTION: Obtain the SLP_TYPa and SLP_TYPb values for the requested sleep
488  *              state.
489  *
490  ******************************************************************************/
491 acpi_status
492 acpi_get_sleep_type_data(u8 sleep_state, u8 *sleep_type_a, u8 *sleep_type_b)
493 {
494         acpi_status status = AE_OK;
495         struct acpi_evaluate_info *info;
496
497         ACPI_FUNCTION_TRACE(acpi_get_sleep_type_data);
498
499         /* Validate parameters */
500
501         if ((sleep_state > ACPI_S_STATES_MAX) || !sleep_type_a || !sleep_type_b) {
502                 return_ACPI_STATUS(AE_BAD_PARAMETER);
503         }
504
505         /* Allocate the evaluation information block */
506
507         info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
508         if (!info) {
509                 return_ACPI_STATUS(AE_NO_MEMORY);
510         }
511
512         info->pathname =
513             ACPI_CAST_PTR(char, acpi_gbl_sleep_state_names[sleep_state]);
514
515         /* Evaluate the namespace object containing the values for this state */
516
517         status = acpi_ns_evaluate(info);
518         if (ACPI_FAILURE(status)) {
519                 ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
520                                   "%s while evaluating SleepState [%s]\n",
521                                   acpi_format_exception(status),
522                                   info->pathname));
523
524                 goto cleanup;
525         }
526
527         /* Must have a return object */
528
529         if (!info->return_object) {
530                 ACPI_ERROR((AE_INFO, "No Sleep State object returned from [%s]",
531                             info->pathname));
532                 status = AE_NOT_EXIST;
533         }
534
535         /* It must be of type Package */
536
537         else if (ACPI_GET_OBJECT_TYPE(info->return_object) != ACPI_TYPE_PACKAGE) {
538                 ACPI_ERROR((AE_INFO,
539                             "Sleep State return object is not a Package"));
540                 status = AE_AML_OPERAND_TYPE;
541         }
542
543         /*
544          * The package must have at least two elements. NOTE (March 2005): This
545          * goes against the current ACPI spec which defines this object as a
546          * package with one encoded DWORD element. However, existing practice
547          * by BIOS vendors seems to be to have 2 or more elements, at least
548          * one per sleep type (A/B).
549          */
550         else if (info->return_object->package.count < 2) {
551                 ACPI_ERROR((AE_INFO,
552                             "Sleep State return package does not have at least two elements"));
553                 status = AE_AML_NO_OPERAND;
554         }
555
556         /* The first two elements must both be of type Integer */
557
558         else if ((ACPI_GET_OBJECT_TYPE(info->return_object->package.elements[0])
559                   != ACPI_TYPE_INTEGER) ||
560                  (ACPI_GET_OBJECT_TYPE(info->return_object->package.elements[1])
561                   != ACPI_TYPE_INTEGER)) {
562                 ACPI_ERROR((AE_INFO,
563                             "Sleep State return package elements are not both Integers (%s, %s)",
564                             acpi_ut_get_object_type_name(info->return_object->
565                                                          package.elements[0]),
566                             acpi_ut_get_object_type_name(info->return_object->
567                                                          package.elements[1])));
568                 status = AE_AML_OPERAND_TYPE;
569         } else {
570                 /* Valid _Sx_ package size, type, and value */
571
572                 *sleep_type_a = (u8)
573                     (info->return_object->package.elements[0])->integer.value;
574                 *sleep_type_b = (u8)
575                     (info->return_object->package.elements[1])->integer.value;
576         }
577
578         if (ACPI_FAILURE(status)) {
579                 ACPI_EXCEPTION((AE_INFO, status,
580                                 "While evaluating SleepState [%s], bad Sleep object %p type %s",
581                                 info->pathname, info->return_object,
582                                 acpi_ut_get_object_type_name(info->
583                                                              return_object)));
584         }
585
586         acpi_ut_remove_reference(info->return_object);
587
588       cleanup:
589         ACPI_FREE(info);
590         return_ACPI_STATUS(status);
591 }
592
593 ACPI_EXPORT_SYMBOL(acpi_get_sleep_type_data)