linux/drivers/acpi/pci_root.c
<<
>>
Prefs
   1/*
   2 *  pci_root.c - ACPI PCI Root Bridge Driver ($Revision: 40 $)
   3 *
   4 *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
   5 *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
   6 *
   7 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   8 *
   9 *  This program is free software; you can redistribute it and/or modify
  10 *  it under the terms of the GNU General Public License as published by
  11 *  the Free Software Foundation; either version 2 of the License, or (at
  12 *  your option) any later version.
  13 *
  14 *  This program is distributed in the hope that it will be useful, but
  15 *  WITHOUT ANY WARRANTY; without even the implied warranty of
  16 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 *  General Public License for more details.
  18 *
  19 *  You should have received a copy of the GNU General Public License along
  20 *  with this program; if not, write to the Free Software Foundation, Inc.,
  21 *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
  22 *
  23 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24 */
  25
  26#include <linux/kernel.h>
  27#include <linux/module.h>
  28#include <linux/init.h>
  29#include <linux/types.h>
  30#include <linux/proc_fs.h>
  31#include <linux/spinlock.h>
  32#include <linux/pm.h>
  33#include <linux/pci.h>
  34#include <linux/pci-acpi.h>
  35#include <linux/acpi.h>
  36#include <acpi/acpi_bus.h>
  37#include <acpi/acpi_drivers.h>
  38
  39#define _COMPONENT              ACPI_PCI_COMPONENT
  40ACPI_MODULE_NAME("pci_root");
  41#define ACPI_PCI_ROOT_CLASS             "pci_bridge"
  42#define ACPI_PCI_ROOT_DEVICE_NAME       "PCI Root Bridge"
  43static int acpi_pci_root_add(struct acpi_device *device);
  44static int acpi_pci_root_remove(struct acpi_device *device, int type);
  45static int acpi_pci_root_start(struct acpi_device *device);
  46
  47static struct acpi_device_id root_device_ids[] = {
  48        {"PNP0A03", 0},
  49        {"", 0},
  50};
  51MODULE_DEVICE_TABLE(acpi, root_device_ids);
  52
  53static struct acpi_driver acpi_pci_root_driver = {
  54        .name = "pci_root",
  55        .class = ACPI_PCI_ROOT_CLASS,
  56        .ids = root_device_ids,
  57        .ops = {
  58                .add = acpi_pci_root_add,
  59                .remove = acpi_pci_root_remove,
  60                .start = acpi_pci_root_start,
  61                },
  62};
  63
  64struct acpi_pci_root {
  65        struct list_head node;
  66        struct acpi_device *device;
  67        struct pci_bus *bus;
  68        u16 segment;
  69        u8 bus_nr;
  70
  71        u32 osc_support_set;    /* _OSC state of support bits */
  72        u32 osc_control_set;    /* _OSC state of control bits */
  73        u32 osc_control_qry;    /* the latest _OSC query result */
  74
  75        u32 osc_queried:1;      /* has _OSC control been queried? */
  76};
  77
  78static LIST_HEAD(acpi_pci_roots);
  79
  80static struct acpi_pci_driver *sub_driver;
  81static DEFINE_MUTEX(osc_lock);
  82
  83int acpi_pci_register_driver(struct acpi_pci_driver *driver)
  84{
  85        int n = 0;
  86        struct acpi_pci_root *root;
  87
  88        struct acpi_pci_driver **pptr = &sub_driver;
  89        while (*pptr)
  90                pptr = &(*pptr)->next;
  91        *pptr = driver;
  92
  93        if (!driver->add)
  94                return 0;
  95
  96        list_for_each_entry(root, &acpi_pci_roots, node) {
  97                driver->add(root->device->handle);
  98                n++;
  99        }
 100
 101        return n;
 102}
 103
 104EXPORT_SYMBOL(acpi_pci_register_driver);
 105
 106void acpi_pci_unregister_driver(struct acpi_pci_driver *driver)
 107{
 108        struct acpi_pci_root *root;
 109
 110        struct acpi_pci_driver **pptr = &sub_driver;
 111        while (*pptr) {
 112                if (*pptr == driver)
 113                        break;
 114                pptr = &(*pptr)->next;
 115        }
 116        BUG_ON(!*pptr);
 117        *pptr = (*pptr)->next;
 118
 119        if (!driver->remove)
 120                return;
 121
 122        list_for_each_entry(root, &acpi_pci_roots, node)
 123                driver->remove(root->device->handle);
 124}
 125
 126EXPORT_SYMBOL(acpi_pci_unregister_driver);
 127
 128acpi_handle acpi_get_pci_rootbridge_handle(unsigned int seg, unsigned int bus)
 129{
 130        struct acpi_pci_root *root;
 131        
 132        list_for_each_entry(root, &acpi_pci_roots, node)
 133                if ((root->segment == (u16) seg) && (root->bus_nr == (u16) bus))
 134                        return root->device->handle;
 135        return NULL;            
 136}
 137
 138EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle);
 139
 140/**
 141 * acpi_is_root_bridge - determine whether an ACPI CA node is a PCI root bridge
 142 * @handle - the ACPI CA node in question.
 143 *
 144 * Note: we could make this API take a struct acpi_device * instead, but
 145 * for now, it's more convenient to operate on an acpi_handle.
 146 */
 147int acpi_is_root_bridge(acpi_handle handle)
 148{
 149        int ret;
 150        struct acpi_device *device;
 151
 152        ret = acpi_bus_get_device(handle, &device);
 153        if (ret)
 154                return 0;
 155
 156        ret = acpi_match_device_ids(device, root_device_ids);
 157        if (ret)
 158                return 0;
 159        else
 160                return 1;
 161}
 162EXPORT_SYMBOL_GPL(acpi_is_root_bridge);
 163
 164static acpi_status
 165get_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
 166{
 167        int *busnr = data;
 168        struct acpi_resource_address64 address;
 169
 170        if (resource->type != ACPI_RESOURCE_TYPE_ADDRESS16 &&
 171            resource->type != ACPI_RESOURCE_TYPE_ADDRESS32 &&
 172            resource->type != ACPI_RESOURCE_TYPE_ADDRESS64)
 173                return AE_OK;
 174
 175        acpi_resource_to_address64(resource, &address);
 176        if ((address.address_length > 0) &&
 177            (address.resource_type == ACPI_BUS_NUMBER_RANGE))
 178                *busnr = address.minimum;
 179
 180        return AE_OK;
 181}
 182
 183static acpi_status try_get_root_bridge_busnr(acpi_handle handle,
 184                                             unsigned long long *bus)
 185{
 186        acpi_status status;
 187        int busnum;
 188
 189        busnum = -1;
 190        status =
 191            acpi_walk_resources(handle, METHOD_NAME__CRS,
 192                                get_root_bridge_busnr_callback, &busnum);
 193        if (ACPI_FAILURE(status))
 194                return status;
 195        /* Check if we really get a bus number from _CRS */
 196        if (busnum == -1)
 197                return AE_ERROR;
 198        *bus = busnum;
 199        return AE_OK;
 200}
 201
 202static void acpi_pci_bridge_scan(struct acpi_device *device)
 203{
 204        int status;
 205        struct acpi_device *child = NULL;
 206
 207        if (device->flags.bus_address)
 208                if (device->parent && device->parent->ops.bind) {
 209                        status = device->parent->ops.bind(device);
 210                        if (!status) {
 211                                list_for_each_entry(child, &device->children, node)
 212                                        acpi_pci_bridge_scan(child);
 213                        }
 214                }
 215}
 216
 217static u8 OSC_UUID[16] = {0x5B, 0x4D, 0xDB, 0x33, 0xF7, 0x1F, 0x1C, 0x40,
 218                          0x96, 0x57, 0x74, 0x41, 0xC0, 0x3D, 0xD7, 0x66};
 219
 220static acpi_status acpi_pci_run_osc(acpi_handle handle,
 221                                    const u32 *capbuf, u32 *retval)
 222{
 223        acpi_status status;
 224        struct acpi_object_list input;
 225        union acpi_object in_params[4];
 226        struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
 227        union acpi_object *out_obj;
 228        u32 errors;
 229
 230        /* Setting up input parameters */
 231        input.count = 4;
 232        input.pointer = in_params;
 233        in_params[0].type               = ACPI_TYPE_BUFFER;
 234        in_params[0].buffer.length      = 16;
 235        in_params[0].buffer.pointer     = OSC_UUID;
 236        in_params[1].type               = ACPI_TYPE_INTEGER;
 237        in_params[1].integer.value      = 1;
 238        in_params[2].type               = ACPI_TYPE_INTEGER;
 239        in_params[2].integer.value      = 3;
 240        in_params[3].type               = ACPI_TYPE_BUFFER;
 241        in_params[3].buffer.length      = 12;
 242        in_params[3].buffer.pointer     = (u8 *)capbuf;
 243
 244        status = acpi_evaluate_object(handle, "_OSC", &input, &output);
 245        if (ACPI_FAILURE(status))
 246                return status;
 247
 248        if (!output.length)
 249                return AE_NULL_OBJECT;
 250
 251        out_obj = output.pointer;
 252        if (out_obj->type != ACPI_TYPE_BUFFER) {
 253                printk(KERN_DEBUG "_OSC evaluation returned wrong type\n");
 254                status = AE_TYPE;
 255                goto out_kfree;
 256        }
 257        /* Need to ignore the bit0 in result code */
 258        errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0);
 259        if (errors) {
 260                if (errors & OSC_REQUEST_ERROR)
 261                        printk(KERN_DEBUG "_OSC request failed\n");
 262                if (errors & OSC_INVALID_UUID_ERROR)
 263                        printk(KERN_DEBUG "_OSC invalid UUID\n");
 264                if (errors & OSC_INVALID_REVISION_ERROR)
 265                        printk(KERN_DEBUG "_OSC invalid revision\n");
 266                if (errors & OSC_CAPABILITIES_MASK_ERROR) {
 267                        if (capbuf[OSC_QUERY_TYPE] & OSC_QUERY_ENABLE)
 268                                goto out_success;
 269                        printk(KERN_DEBUG
 270                               "Firmware did not grant requested _OSC control\n");
 271                        status = AE_SUPPORT;
 272                        goto out_kfree;
 273                }
 274                status = AE_ERROR;
 275                goto out_kfree;
 276        }
 277out_success:
 278        *retval = *((u32 *)(out_obj->buffer.pointer + 8));
 279        status = AE_OK;
 280
 281out_kfree:
 282        kfree(output.pointer);
 283        return status;
 284}
 285
 286static acpi_status acpi_pci_query_osc(struct acpi_pci_root *root, u32 flags)
 287{
 288        acpi_status status;
 289        u32 support_set, result, capbuf[3];
 290
 291        /* do _OSC query for all possible controls */
 292        support_set = root->osc_support_set | (flags & OSC_SUPPORT_MASKS);
 293        capbuf[OSC_QUERY_TYPE] = OSC_QUERY_ENABLE;
 294        capbuf[OSC_SUPPORT_TYPE] = support_set;
 295        capbuf[OSC_CONTROL_TYPE] = OSC_CONTROL_MASKS;
 296
 297        status = acpi_pci_run_osc(root->device->handle, capbuf, &result);
 298        if (ACPI_SUCCESS(status)) {
 299                root->osc_support_set = support_set;
 300                root->osc_control_qry = result;
 301                root->osc_queried = 1;
 302        }
 303        return status;
 304}
 305
 306static acpi_status acpi_pci_osc_support(struct acpi_pci_root *root, u32 flags)
 307{
 308        acpi_status status;
 309        acpi_handle tmp;
 310
 311        status = acpi_get_handle(root->device->handle, "_OSC", &tmp);
 312        if (ACPI_FAILURE(status))
 313                return status;
 314        mutex_lock(&osc_lock);
 315        status = acpi_pci_query_osc(root, flags);
 316        mutex_unlock(&osc_lock);
 317        return status;
 318}
 319
 320static struct acpi_pci_root *acpi_pci_find_root(acpi_handle handle)
 321{
 322        struct acpi_pci_root *root;
 323
 324        list_for_each_entry(root, &acpi_pci_roots, node) {
 325                if (root->device->handle == handle)
 326                        return root;
 327        }
 328        return NULL;
 329}
 330
 331struct acpi_handle_node {
 332        struct list_head node;
 333        acpi_handle handle;
 334};
 335
 336/**
 337 * acpi_get_pci_dev - convert ACPI CA handle to struct pci_dev
 338 * @handle: the handle in question
 339 *
 340 * Given an ACPI CA handle, the desired PCI device is located in the
 341 * list of PCI devices.
 342 *
 343 * If the device is found, its reference count is increased and this
 344 * function returns a pointer to its data structure.  The caller must
 345 * decrement the reference count by calling pci_dev_put().
 346 * If no device is found, %NULL is returned.
 347 */
 348struct pci_dev *acpi_get_pci_dev(acpi_handle handle)
 349{
 350        int dev, fn;
 351        unsigned long long adr;
 352        acpi_status status;
 353        acpi_handle phandle;
 354        struct pci_bus *pbus;
 355        struct pci_dev *pdev = NULL;
 356        struct acpi_handle_node *node, *tmp;
 357        struct acpi_pci_root *root;
 358        LIST_HEAD(device_list);
 359
 360        /*
 361         * Walk up the ACPI CA namespace until we reach a PCI root bridge.
 362         */
 363        phandle = handle;
 364        while (!acpi_is_root_bridge(phandle)) {
 365                node = kzalloc(sizeof(struct acpi_handle_node), GFP_KERNEL);
 366                if (!node)
 367                        goto out;
 368
 369                INIT_LIST_HEAD(&node->node);
 370                node->handle = phandle;
 371                list_add(&node->node, &device_list);
 372
 373                status = acpi_get_parent(phandle, &phandle);
 374                if (ACPI_FAILURE(status))
 375                        goto out;
 376        }
 377
 378        root = acpi_pci_find_root(phandle);
 379        if (!root)
 380                goto out;
 381
 382        pbus = root->bus;
 383
 384        /*
 385         * Now, walk back down the PCI device tree until we return to our
 386         * original handle. Assumes that everything between the PCI root
 387         * bridge and the device we're looking for must be a P2P bridge.
 388         */
 389        list_for_each_entry(node, &device_list, node) {
 390                acpi_handle hnd = node->handle;
 391                status = acpi_evaluate_integer(hnd, "_ADR", NULL, &adr);
 392                if (ACPI_FAILURE(status))
 393                        goto out;
 394                dev = (adr >> 16) & 0xffff;
 395                fn  = adr & 0xffff;
 396
 397                pdev = pci_get_slot(pbus, PCI_DEVFN(dev, fn));
 398                if (!pdev || hnd == handle)
 399                        break;
 400
 401                pbus = pdev->subordinate;
 402                pci_dev_put(pdev);
 403        }
 404out:
 405        list_for_each_entry_safe(node, tmp, &device_list, node)
 406                kfree(node);
 407
 408        return pdev;
 409}
 410EXPORT_SYMBOL_GPL(acpi_get_pci_dev);
 411
 412/**
 413 * acpi_pci_osc_control_set - commit requested control to Firmware
 414 * @handle: acpi_handle for the target ACPI object
 415 * @flags: driver's requested control bits
 416 *
 417 * Attempt to take control from Firmware on requested control bits.
 418 **/
 419acpi_status acpi_pci_osc_control_set(acpi_handle handle, u32 flags)
 420{
 421        acpi_status status;
 422        u32 control_req, result, capbuf[3];
 423        acpi_handle tmp;
 424        struct acpi_pci_root *root;
 425
 426        status = acpi_get_handle(handle, "_OSC", &tmp);
 427        if (ACPI_FAILURE(status))
 428                return status;
 429
 430        control_req = (flags & OSC_CONTROL_MASKS);
 431        if (!control_req)
 432                return AE_TYPE;
 433
 434        root = acpi_pci_find_root(handle);
 435        if (!root)
 436                return AE_NOT_EXIST;
 437
 438        mutex_lock(&osc_lock);
 439        /* No need to evaluate _OSC if the control was already granted. */
 440        if ((root->osc_control_set & control_req) == control_req)
 441                goto out;
 442
 443        /* Need to query controls first before requesting them */
 444        if (!root->osc_queried) {
 445                status = acpi_pci_query_osc(root, root->osc_support_set);
 446                if (ACPI_FAILURE(status))
 447                        goto out;
 448        }
 449        if ((root->osc_control_qry & control_req) != control_req) {
 450                printk(KERN_DEBUG
 451                       "Firmware did not grant requested _OSC control\n");
 452                status = AE_SUPPORT;
 453                goto out;
 454        }
 455
 456        capbuf[OSC_QUERY_TYPE] = 0;
 457        capbuf[OSC_SUPPORT_TYPE] = root->osc_support_set;
 458        capbuf[OSC_CONTROL_TYPE] = root->osc_control_set | control_req;
 459        status = acpi_pci_run_osc(handle, capbuf, &result);
 460        if (ACPI_SUCCESS(status))
 461                root->osc_control_set = result;
 462out:
 463        mutex_unlock(&osc_lock);
 464        return status;
 465}
 466EXPORT_SYMBOL(acpi_pci_osc_control_set);
 467
 468static int __devinit acpi_pci_root_add(struct acpi_device *device)
 469{
 470        unsigned long long segment, bus;
 471        acpi_status status;
 472        int result;
 473        struct acpi_pci_root *root;
 474        acpi_handle handle;
 475        struct acpi_device *child;
 476        u32 flags, base_flags;
 477
 478        segment = 0;
 479        status = acpi_evaluate_integer(device->handle, METHOD_NAME__SEG, NULL,
 480                                       &segment);
 481        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
 482                printk(KERN_ERR PREFIX "can't evaluate _SEG\n");
 483                return -ENODEV;
 484        }
 485
 486        /* Check _CRS first, then _BBN.  If no _BBN, default to zero. */
 487        bus = 0;
 488        status = try_get_root_bridge_busnr(device->handle, &bus);
 489        if (ACPI_FAILURE(status)) {
 490                status = acpi_evaluate_integer(device->handle, METHOD_NAME__BBN,                                               NULL, &bus);
 491                if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
 492                        printk(KERN_ERR PREFIX
 493                             "no bus number in _CRS and can't evaluate _BBN\n");
 494                        return -ENODEV;
 495                }
 496        }
 497
 498        root = kzalloc(sizeof(struct acpi_pci_root), GFP_KERNEL);
 499        if (!root)
 500                return -ENOMEM;
 501
 502        INIT_LIST_HEAD(&root->node);
 503        root->device = device;
 504        root->segment = segment & 0xFFFF;
 505        root->bus_nr = bus & 0xFF;
 506        strcpy(acpi_device_name(device), ACPI_PCI_ROOT_DEVICE_NAME);
 507        strcpy(acpi_device_class(device), ACPI_PCI_ROOT_CLASS);
 508        device->driver_data = root;
 509
 510        /*
 511         * All supported architectures that use ACPI have support for
 512         * PCI domains, so we indicate this in _OSC support capabilities.
 513         */
 514        flags = base_flags = OSC_PCI_SEGMENT_GROUPS_SUPPORT;
 515        acpi_pci_osc_support(root, flags);
 516
 517        /*
 518         * TBD: Need PCI interface for enumeration/configuration of roots.
 519         */
 520
 521        /* TBD: Locking */
 522        list_add_tail(&root->node, &acpi_pci_roots);
 523
 524        printk(KERN_INFO PREFIX "%s [%s] (%04x:%02x)\n",
 525               acpi_device_name(device), acpi_device_bid(device),
 526               root->segment, root->bus_nr);
 527
 528        /*
 529         * Scan the Root Bridge
 530         * --------------------
 531         * Must do this prior to any attempt to bind the root device, as the
 532         * PCI namespace does not get created until this call is made (and 
 533         * thus the root bridge's pci_dev does not exist).
 534         */
 535        root->bus = pci_acpi_scan_root(device, segment, bus);
 536        if (!root->bus) {
 537                printk(KERN_ERR PREFIX
 538                            "Bus %04x:%02x not present in PCI namespace\n",
 539                            root->segment, root->bus_nr);
 540                result = -ENODEV;
 541                goto end;
 542        }
 543
 544        /*
 545         * Attach ACPI-PCI Context
 546         * -----------------------
 547         * Thus binding the ACPI and PCI devices.
 548         */
 549        result = acpi_pci_bind_root(device);
 550        if (result)
 551                goto end;
 552
 553        /*
 554         * PCI Routing Table
 555         * -----------------
 556         * Evaluate and parse _PRT, if exists.
 557         */
 558        status = acpi_get_handle(device->handle, METHOD_NAME__PRT, &handle);
 559        if (ACPI_SUCCESS(status))
 560                result = acpi_pci_irq_add_prt(device->handle, root->bus);
 561
 562        /*
 563         * Scan and bind all _ADR-Based Devices
 564         */
 565        list_for_each_entry(child, &device->children, node)
 566                acpi_pci_bridge_scan(child);
 567
 568        /* Indicate support for various _OSC capabilities. */
 569        if (pci_ext_cfg_avail(root->bus->self))
 570                flags |= OSC_EXT_PCI_CONFIG_SUPPORT;
 571        if (pcie_aspm_enabled())
 572                flags |= OSC_ACTIVE_STATE_PWR_SUPPORT |
 573                        OSC_CLOCK_PWR_CAPABILITY_SUPPORT;
 574        if (pci_msi_enabled())
 575                flags |= OSC_MSI_SUPPORT;
 576        if (flags != base_flags)
 577                acpi_pci_osc_support(root, flags);
 578
 579        return 0;
 580
 581end:
 582        if (!list_empty(&root->node))
 583                list_del(&root->node);
 584        kfree(root);
 585        return result;
 586}
 587
 588static int acpi_pci_root_start(struct acpi_device *device)
 589{
 590        struct acpi_pci_root *root = acpi_driver_data(device);
 591
 592        pci_bus_add_devices(root->bus);
 593        return 0;
 594}
 595
 596static int acpi_pci_root_remove(struct acpi_device *device, int type)
 597{
 598        struct acpi_pci_root *root = acpi_driver_data(device);
 599
 600        kfree(root);
 601        return 0;
 602}
 603
 604static int __init acpi_pci_root_init(void)
 605{
 606        if (acpi_pci_disabled)
 607                return 0;
 608
 609        if (acpi_bus_register_driver(&acpi_pci_root_driver) < 0)
 610                return -ENODEV;
 611
 612        return 0;
 613}
 614
 615subsys_initcall(acpi_pci_root_init);
 616
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.