linux/drivers/acpi/bus.c
<<
>>
Prefs
   1/*
   2 *  acpi_bus.c - ACPI Bus Driver ($Revision: 80 $)
   3 *
   4 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   5 *
   6 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   7 *
   8 *  This program is free software; you can redistribute it and/or modify
   9 *  it under the terms of the GNU General Public License as published by
  10 *  the Free Software Foundation; either version 2 of the License, or (at
  11 *  your option) any later version.
  12 *
  13 *  This program is distributed in the hope that it will be useful, but
  14 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  15 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  16 *  General Public License for more details.
  17 *
  18 *  You should have received a copy of the GNU General Public License along
  19 *  with this program; if not, write to the Free Software Foundation, Inc.,
  20 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  21 *
  22 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  23 */
  24
  25#include <linux/module.h>
  26#include <linux/init.h>
  27#include <linux/ioport.h>
  28#include <linux/kernel.h>
  29#include <linux/list.h>
  30#include <linux/sched.h>
  31#include <linux/pm.h>
  32#include <linux/device.h>
  33#include <linux/proc_fs.h>
  34#include <linux/acpi.h>
  35#include <linux/slab.h>
  36#include <linux/regulator/machine.h>
  37#ifdef CONFIG_X86
  38#include <asm/mpspec.h>
  39#endif
  40#include <linux/pci.h>
  41#include <acpi/apei.h>
  42#include <linux/dmi.h>
  43#include <linux/suspend.h>
  44
  45#include "internal.h"
  46
  47#define _COMPONENT              ACPI_BUS_COMPONENT
  48ACPI_MODULE_NAME("bus");
  49
  50struct acpi_device *acpi_root;
  51struct proc_dir_entry *acpi_root_dir;
  52EXPORT_SYMBOL(acpi_root_dir);
  53
  54#ifdef CONFIG_X86
  55#ifdef CONFIG_ACPI_CUSTOM_DSDT
  56static inline int set_copy_dsdt(const struct dmi_system_id *id)
  57{
  58        return 0;
  59}
  60#else
  61static int set_copy_dsdt(const struct dmi_system_id *id)
  62{
  63        printk(KERN_NOTICE "%s detected - "
  64                "force copy of DSDT to local memory\n", id->ident);
  65        acpi_gbl_copy_dsdt_locally = 1;
  66        return 0;
  67}
  68#endif
  69
  70static struct dmi_system_id dsdt_dmi_table[] __initdata = {
  71        /*
  72         * Invoke DSDT corruption work-around on all Toshiba Satellite.
  73         * https://bugzilla.kernel.org/show_bug.cgi?id=14679
  74         */
  75        {
  76         .callback = set_copy_dsdt,
  77         .ident = "TOSHIBA Satellite",
  78         .matches = {
  79                DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
  80                DMI_MATCH(DMI_PRODUCT_NAME, "Satellite"),
  81                },
  82        },
  83        {}
  84};
  85#else
  86static struct dmi_system_id dsdt_dmi_table[] __initdata = {
  87        {}
  88};
  89#endif
  90
  91/* --------------------------------------------------------------------------
  92                                Device Management
  93   -------------------------------------------------------------------------- */
  94
  95acpi_status acpi_bus_get_status_handle(acpi_handle handle,
  96                                       unsigned long long *sta)
  97{
  98        acpi_status status;
  99
 100        status = acpi_evaluate_integer(handle, "_STA", NULL, sta);
 101        if (ACPI_SUCCESS(status))
 102                return AE_OK;
 103
 104        if (status == AE_NOT_FOUND) {
 105                *sta = ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED |
 106                       ACPI_STA_DEVICE_UI      | ACPI_STA_DEVICE_FUNCTIONING;
 107                return AE_OK;
 108        }
 109        return status;
 110}
 111
 112int acpi_bus_get_status(struct acpi_device *device)
 113{
 114        acpi_status status;
 115        unsigned long long sta;
 116
 117        status = acpi_bus_get_status_handle(device->handle, &sta);
 118        if (ACPI_FAILURE(status))
 119                return -ENODEV;
 120
 121        acpi_set_device_status(device, sta);
 122
 123        if (device->status.functional && !device->status.present) {
 124                ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: "
 125                       "functional but not present;\n",
 126                        device->pnp.bus_id, (u32)sta));
 127        }
 128
 129        ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n",
 130                          device->pnp.bus_id, (u32)sta));
 131        return 0;
 132}
 133EXPORT_SYMBOL(acpi_bus_get_status);
 134
 135void acpi_bus_private_data_handler(acpi_handle handle,
 136                                   void *context)
 137{
 138        return;
 139}
 140EXPORT_SYMBOL(acpi_bus_private_data_handler);
 141
 142int acpi_bus_attach_private_data(acpi_handle handle, void *data)
 143{
 144        acpi_status status;
 145
 146        status = acpi_attach_data(handle,
 147                        acpi_bus_private_data_handler, data);
 148        if (ACPI_FAILURE(status)) {
 149                acpi_handle_debug(handle, "Error attaching device data\n");
 150                return -ENODEV;
 151        }
 152
 153        return 0;
 154}
 155EXPORT_SYMBOL_GPL(acpi_bus_attach_private_data);
 156
 157int acpi_bus_get_private_data(acpi_handle handle, void **data)
 158{
 159        acpi_status status;
 160
 161        if (!*data)
 162                return -EINVAL;
 163
 164        status = acpi_get_data(handle, acpi_bus_private_data_handler, data);
 165        if (ACPI_FAILURE(status)) {
 166                acpi_handle_debug(handle, "No context for object\n");
 167                return -ENODEV;
 168        }
 169
 170        return 0;
 171}
 172EXPORT_SYMBOL_GPL(acpi_bus_get_private_data);
 173
 174void acpi_bus_detach_private_data(acpi_handle handle)
 175{
 176        acpi_detach_data(handle, acpi_bus_private_data_handler);
 177}
 178EXPORT_SYMBOL_GPL(acpi_bus_detach_private_data);
 179
 180static void acpi_print_osc_error(acpi_handle handle,
 181        struct acpi_osc_context *context, char *error)
 182{
 183        struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER};
 184        int i;
 185
 186        if (ACPI_FAILURE(acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer)))
 187                printk(KERN_DEBUG "%s\n", error);
 188        else {
 189                printk(KERN_DEBUG "%s:%s\n", (char *)buffer.pointer, error);
 190                kfree(buffer.pointer);
 191        }
 192        printk(KERN_DEBUG"_OSC request data:");
 193        for (i = 0; i < context->cap.length; i += sizeof(u32))
 194                printk("%x ", *((u32 *)(context->cap.pointer + i)));
 195        printk("\n");
 196}
 197
 198acpi_status acpi_str_to_uuid(char *str, u8 *uuid)
 199{
 200        int i;
 201        static int opc_map_to_uuid[16] = {6, 4, 2, 0, 11, 9, 16, 14, 19, 21,
 202                24, 26, 28, 30, 32, 34};
 203
 204        if (strlen(str) != 36)
 205                return AE_BAD_PARAMETER;
 206        for (i = 0; i < 36; i++) {
 207                if (i == 8 || i == 13 || i == 18 || i == 23) {
 208                        if (str[i] != '-')
 209                                return AE_BAD_PARAMETER;
 210                } else if (!isxdigit(str[i]))
 211                        return AE_BAD_PARAMETER;
 212        }
 213        for (i = 0; i < 16; i++) {
 214                uuid[i] = hex_to_bin(str[opc_map_to_uuid[i]]) << 4;
 215                uuid[i] |= hex_to_bin(str[opc_map_to_uuid[i] + 1]);
 216        }
 217        return AE_OK;
 218}
 219EXPORT_SYMBOL_GPL(acpi_str_to_uuid);
 220
 221acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context)
 222{
 223        acpi_status status;
 224        struct acpi_object_list input;
 225        union acpi_object in_params[4];
 226        union acpi_object *out_obj;
 227        u8 uuid[16];
 228        u32 errors;
 229        struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
 230
 231        if (!context)
 232                return AE_ERROR;
 233        if (ACPI_FAILURE(acpi_str_to_uuid(context->uuid_str, uuid)))
 234                return AE_ERROR;
 235        context->ret.length = ACPI_ALLOCATE_BUFFER;
 236        context->ret.pointer = NULL;
 237
 238        /* Setting up input parameters */
 239        input.count = 4;
 240        input.pointer = in_params;
 241        in_params[0].type               = ACPI_TYPE_BUFFER;
 242        in_params[0].buffer.length      = 16;
 243        in_params[0].buffer.pointer     = uuid;
 244        in_params[1].type               = ACPI_TYPE_INTEGER;
 245        in_params[1].integer.value      = context->rev;
 246        in_params[2].type               = ACPI_TYPE_INTEGER;
 247        in_params[2].integer.value      = context->cap.length/sizeof(u32);
 248        in_params[3].type               = ACPI_TYPE_BUFFER;
 249        in_params[3].buffer.length      = context->cap.length;
 250        in_params[3].buffer.pointer     = context->cap.pointer;
 251
 252        status = acpi_evaluate_object(handle, "_OSC", &input, &output);
 253        if (ACPI_FAILURE(status))
 254                return status;
 255
 256        if (!output.length)
 257                return AE_NULL_OBJECT;
 258
 259        out_obj = output.pointer;
 260        if (out_obj->type != ACPI_TYPE_BUFFER
 261                || out_obj->buffer.length != context->cap.length) {
 262                acpi_print_osc_error(handle, context,
 263                        "_OSC evaluation returned wrong type");
 264                status = AE_TYPE;
 265                goto out_kfree;
 266        }
 267        /* Need to ignore the bit0 in result code */
 268        errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
 269        if (errors) {
 270                if (errors & OSC_REQUEST_ERROR)
 271                        acpi_print_osc_error(handle, context,
 272                                "_OSC request failed");
 273                if (errors & OSC_INVALID_UUID_ERROR)
 274                        acpi_print_osc_error(handle, context,
 275                                "_OSC invalid UUID");
 276                if (errors & OSC_INVALID_REVISION_ERROR)
 277                        acpi_print_osc_error(handle, context,
 278                                "_OSC invalid revision");
 279                if (errors & OSC_CAPABILITIES_MASK_ERROR) {
 280                        if (((u32 *)context->cap.pointer)[OSC_QUERY_DWORD]
 281                            & OSC_QUERY_ENABLE)
 282                                goto out_success;
 283                        status = AE_SUPPORT;
 284                        goto out_kfree;
 285                }
 286                status = AE_ERROR;
 287                goto out_kfree;
 288        }
 289out_success:
 290        context->ret.length = out_obj->buffer.length;
 291        context->ret.pointer = kmemdup(out_obj->buffer.pointer,
 292                                       context->ret.length, GFP_KERNEL);
 293        if (!context->ret.pointer) {
 294                status =  AE_NO_MEMORY;
 295                goto out_kfree;
 296        }
 297        status =  AE_OK;
 298
 299out_kfree:
 300        kfree(output.pointer);
 301        if (status != AE_OK)
 302                context->ret.pointer = NULL;
 303        return status;
 304}
 305EXPORT_SYMBOL(acpi_run_osc);
 306
 307bool osc_sb_apei_support_acked;
 308static u8 sb_uuid_str[] = "0811B06E-4A27-44F9-8D60-3CBBC22E7B48";
 309static void acpi_bus_osc_support(void)
 310{
 311        u32 capbuf[2];
 312        struct acpi_osc_context context = {
 313                .uuid_str = sb_uuid_str,
 314                .rev = 1,
 315                .cap.length = 8,
 316                .cap.pointer = capbuf,
 317        };
 318        acpi_handle handle;
 319
 320        capbuf[OSC_QUERY_DWORD] = OSC_QUERY_ENABLE;
 321        capbuf[OSC_SUPPORT_DWORD] = OSC_SB_PR3_SUPPORT; /* _PR3 is in use */
 322#if defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR) ||\
 323                        defined(CONFIG_ACPI_PROCESSOR_AGGREGATOR_MODULE)
 324        capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PAD_SUPPORT;
 325#endif
 326
 327#if defined(CONFIG_ACPI_PROCESSOR) || defined(CONFIG_ACPI_PROCESSOR_MODULE)
 328        capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PPC_OST_SUPPORT;
 329#endif
 330
 331        capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_HOTPLUG_OST_SUPPORT;
 332
 333        if (!ghes_disable)
 334                capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_APEI_SUPPORT;
 335        if (ACPI_FAILURE(acpi_get_handle(NULL, "\\_SB", &handle)))
 336                return;
 337        if (ACPI_SUCCESS(acpi_run_osc(handle, &context))) {
 338                u32 *capbuf_ret = context.ret.pointer;
 339                if (context.ret.length > OSC_SUPPORT_DWORD)
 340                        osc_sb_apei_support_acked =
 341                                capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_APEI_SUPPORT;
 342                kfree(context.ret.pointer);
 343        }
 344        /* do we need to check other returned cap? Sounds no */
 345}
 346
 347/* --------------------------------------------------------------------------
 348                             Notification Handling
 349   -------------------------------------------------------------------------- */
 350
 351/**
 352 * acpi_bus_notify
 353 * ---------------
 354 * Callback for all 'system-level' device notifications (values 0x00-0x7F).
 355 */
 356static void acpi_bus_notify(acpi_handle handle, u32 type, void *data)
 357{
 358        struct acpi_device *adev;
 359        struct acpi_driver *driver;
 360        u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
 361        bool hotplug_event = false;
 362
 363        switch (type) {
 364        case ACPI_NOTIFY_BUS_CHECK:
 365                acpi_handle_debug(handle, "ACPI_NOTIFY_BUS_CHECK event\n");
 366                hotplug_event = true;
 367                break;
 368
 369        case ACPI_NOTIFY_DEVICE_CHECK:
 370                acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_CHECK event\n");
 371                hotplug_event = true;
 372                break;
 373
 374        case ACPI_NOTIFY_DEVICE_WAKE:
 375                acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_WAKE event\n");
 376                break;
 377
 378        case ACPI_NOTIFY_EJECT_REQUEST:
 379                acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n");
 380                hotplug_event = true;
 381                break;
 382
 383        case ACPI_NOTIFY_DEVICE_CHECK_LIGHT:
 384                acpi_handle_debug(handle, "ACPI_NOTIFY_DEVICE_CHECK_LIGHT event\n");
 385                /* TBD: Exactly what does 'light' mean? */
 386                break;
 387
 388        case ACPI_NOTIFY_FREQUENCY_MISMATCH:
 389                acpi_handle_err(handle, "Device cannot be configured due "
 390                                "to a frequency mismatch\n");
 391                break;
 392
 393        case ACPI_NOTIFY_BUS_MODE_MISMATCH:
 394                acpi_handle_err(handle, "Device cannot be configured due "
 395                                "to a bus mode mismatch\n");
 396                break;
 397
 398        case ACPI_NOTIFY_POWER_FAULT:
 399                acpi_handle_err(handle, "Device has suffered a power fault\n");
 400                break;
 401
 402        default:
 403                acpi_handle_debug(handle, "Unknown event type 0x%x\n", type);
 404                break;
 405        }
 406
 407        adev = acpi_bus_get_acpi_device(handle);
 408        if (!adev)
 409                goto err;
 410
 411        driver = adev->driver;
 412        if (driver && driver->ops.notify &&
 413            (driver->flags & ACPI_DRIVER_ALL_NOTIFY_EVENTS))
 414                driver->ops.notify(adev, type);
 415
 416        if (hotplug_event && ACPI_SUCCESS(acpi_hotplug_schedule(adev, type)))
 417                return;
 418
 419        acpi_bus_put_acpi_device(adev);
 420        return;
 421
 422 err:
 423        acpi_evaluate_ost(handle, type, ost_code, NULL);
 424}
 425
 426/* --------------------------------------------------------------------------
 427                             Initialization/Cleanup
 428   -------------------------------------------------------------------------- */
 429
 430static int __init acpi_bus_init_irq(void)
 431{
 432        acpi_status status;
 433        char *message = NULL;
 434
 435
 436        /*
 437         * Let the system know what interrupt model we are using by
 438         * evaluating the \_PIC object, if exists.
 439         */
 440
 441        switch (acpi_irq_model) {
 442        case ACPI_IRQ_MODEL_PIC:
 443                message = "PIC";
 444                break;
 445        case ACPI_IRQ_MODEL_IOAPIC:
 446                message = "IOAPIC";
 447                break;
 448        case ACPI_IRQ_MODEL_IOSAPIC:
 449                message = "IOSAPIC";
 450                break;
 451        case ACPI_IRQ_MODEL_PLATFORM:
 452                message = "platform specific model";
 453                break;
 454        default:
 455                printk(KERN_WARNING PREFIX "Unknown interrupt routing model\n");
 456                return -ENODEV;
 457        }
 458
 459        printk(KERN_INFO PREFIX "Using %s for interrupt routing\n", message);
 460
 461        status = acpi_execute_simple_method(NULL, "\\_PIC", acpi_irq_model);
 462        if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) {
 463                ACPI_EXCEPTION((AE_INFO, status, "Evaluating _PIC"));
 464                return -ENODEV;
 465        }
 466
 467        return 0;
 468}
 469
 470void __init acpi_early_init(void)
 471{
 472        acpi_status status;
 473
 474        if (acpi_disabled)
 475                return;
 476
 477        printk(KERN_INFO PREFIX "Core revision %08x\n", ACPI_CA_VERSION);
 478
 479        /* It's safe to verify table checksums during late stage */
 480        acpi_gbl_verify_table_checksum = TRUE;
 481
 482        /* enable workarounds, unless strict ACPI spec. compliance */
 483        if (!acpi_strict)
 484                acpi_gbl_enable_interpreter_slack = TRUE;
 485
 486        acpi_gbl_permanent_mmap = 1;
 487
 488        /*
 489         * If the machine falls into the DMI check table,
 490         * DSDT will be copied to memory
 491         */
 492        dmi_check_system(dsdt_dmi_table);
 493
 494        status = acpi_reallocate_root_table();
 495        if (ACPI_FAILURE(status)) {
 496                printk(KERN_ERR PREFIX
 497                       "Unable to reallocate ACPI tables\n");
 498                goto error0;
 499        }
 500
 501        status = acpi_initialize_subsystem();
 502        if (ACPI_FAILURE(status)) {
 503                printk(KERN_ERR PREFIX
 504                       "Unable to initialize the ACPI Interpreter\n");
 505                goto error0;
 506        }
 507
 508        status = acpi_load_tables();
 509        if (ACPI_FAILURE(status)) {
 510                printk(KERN_ERR PREFIX
 511                       "Unable to load the System Description Tables\n");
 512                goto error0;
 513        }
 514
 515#ifdef CONFIG_X86
 516        if (!acpi_ioapic) {
 517                /* compatible (0) means level (3) */
 518                if (!(acpi_sci_flags & ACPI_MADT_TRIGGER_MASK)) {
 519                        acpi_sci_flags &= ~ACPI_MADT_TRIGGER_MASK;
 520                        acpi_sci_flags |= ACPI_MADT_TRIGGER_LEVEL;
 521                }
 522                /* Set PIC-mode SCI trigger type */
 523                acpi_pic_sci_set_trigger(acpi_gbl_FADT.sci_interrupt,
 524                                         (acpi_sci_flags & ACPI_MADT_TRIGGER_MASK) >> 2);
 525        } else {
 526                /*
 527                 * now that acpi_gbl_FADT is initialized,
 528                 * update it with result from INT_SRC_OVR parsing
 529                 */
 530                acpi_gbl_FADT.sci_interrupt = acpi_sci_override_gsi;
 531        }
 532#endif
 533
 534        status = acpi_enable_subsystem(~ACPI_NO_ACPI_ENABLE);
 535        if (ACPI_FAILURE(status)) {
 536                printk(KERN_ERR PREFIX "Unable to enable ACPI\n");
 537                goto error0;
 538        }
 539
 540        /*
 541         * If the system is using ACPI then we can be reasonably
 542         * confident that any regulators are managed by the firmware
 543         * so tell the regulator core it has everything it needs to
 544         * know.
 545         */
 546        regulator_has_full_constraints();
 547
 548        return;
 549
 550      error0:
 551        disable_acpi();
 552        return;
 553}
 554
 555static int __init acpi_bus_init(void)
 556{
 557        int result;
 558        acpi_status status;
 559
 560        acpi_os_initialize1();
 561
 562        status = acpi_enable_subsystem(ACPI_NO_ACPI_ENABLE);
 563        if (ACPI_FAILURE(status)) {
 564                printk(KERN_ERR PREFIX
 565                       "Unable to start the ACPI Interpreter\n");
 566                goto error1;
 567        }
 568
 569        /*
 570         * ACPI 2.0 requires the EC driver to be loaded and work before
 571         * the EC device is found in the namespace (i.e. before acpi_initialize_objects()
 572         * is called).
 573         *
 574         * This is accomplished by looking for the ECDT table, and getting
 575         * the EC parameters out of that.
 576         */
 577        status = acpi_ec_ecdt_probe();
 578        /* Ignore result. Not having an ECDT is not fatal. */
 579
 580        status = acpi_initialize_objects(ACPI_FULL_INITIALIZATION);
 581        if (ACPI_FAILURE(status)) {
 582                printk(KERN_ERR PREFIX "Unable to initialize ACPI objects\n");
 583                goto error1;
 584        }
 585
 586        /*
 587         * _OSC method may exist in module level code,
 588         * so it must be run after ACPI_FULL_INITIALIZATION
 589         */
 590        acpi_bus_osc_support();
 591
 592        /*
 593         * _PDC control method may load dynamic SSDT tables,
 594         * and we need to install the table handler before that.
 595         */
 596        acpi_sysfs_init();
 597
 598        acpi_early_processor_set_pdc();
 599
 600        /*
 601         * Maybe EC region is required at bus_scan/acpi_get_devices. So it
 602         * is necessary to enable it as early as possible.
 603         */
 604        acpi_boot_ec_enable();
 605
 606        printk(KERN_INFO PREFIX "Interpreter enabled\n");
 607
 608        /* Initialize sleep structures */
 609        acpi_sleep_init();
 610
 611        /*
 612         * Get the system interrupt model and evaluate \_PIC.
 613         */
 614        result = acpi_bus_init_irq();
 615        if (result)
 616                goto error1;
 617
 618        /*
 619         * Register the for all standard device notifications.
 620         */
 621        status =
 622            acpi_install_notify_handler(ACPI_ROOT_OBJECT, ACPI_SYSTEM_NOTIFY,
 623                                        &acpi_bus_notify, NULL);
 624        if (ACPI_FAILURE(status)) {
 625                printk(KERN_ERR PREFIX
 626                       "Unable to register for device notifications\n");
 627                goto error1;
 628        }
 629
 630        /*
 631         * Create the top ACPI proc directory
 632         */
 633        acpi_root_dir = proc_mkdir(ACPI_BUS_FILE_ROOT, NULL);
 634
 635        return 0;
 636
 637        /* Mimic structured exception handling */
 638      error1:
 639        acpi_terminate();
 640        return -ENODEV;
 641}
 642
 643struct kobject *acpi_kobj;
 644EXPORT_SYMBOL_GPL(acpi_kobj);
 645
 646static int __init acpi_init(void)
 647{
 648        int result;
 649
 650        if (acpi_disabled) {
 651                printk(KERN_INFO PREFIX "Interpreter disabled.\n");
 652                return -ENODEV;
 653        }
 654
 655        acpi_kobj = kobject_create_and_add("acpi", firmware_kobj);
 656        if (!acpi_kobj) {
 657                printk(KERN_WARNING "%s: kset create error\n", __func__);
 658                acpi_kobj = NULL;
 659        }
 660
 661        init_acpi_device_notify();
 662        result = acpi_bus_init();
 663        if (result) {
 664                disable_acpi();
 665                return result;
 666        }
 667
 668        pci_mmcfg_late_init();
 669        acpi_scan_init();
 670        acpi_ec_init();
 671        acpi_debugfs_init();
 672        acpi_sleep_proc_init();
 673        acpi_wakeup_device_init();
 674        return 0;
 675}
 676
 677subsys_initcall(acpi_init);
 678