linux/drivers/gpu/drm/radeon/radeon_acpi.c
<<
>>
Prefs
   1/*
   2 * Copyright 2012 Advanced Micro Devices, Inc.
   3 *
   4 * Permission is hereby granted, free of charge, to any person obtaining a
   5 * copy of this software and associated documentation files (the "Software"),
   6 * to deal in the Software without restriction, including without limitation
   7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   8 * and/or sell copies of the Software, and to permit persons to whom the
   9 * Software is furnished to do so, subject to the following conditions:
  10 *
  11 * The above copyright notice and this permission notice shall be included in
  12 * all copies or substantial portions of the Software.
  13 *
  14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  20 * OTHER DEALINGS IN THE SOFTWARE.
  21 *
  22 */
  23
  24#include <linux/pci.h>
  25#include <linux/acpi.h>
  26#include <linux/slab.h>
  27#include <linux/power_supply.h>
  28#include <linux/vga_switcheroo.h>
  29#include <acpi/video.h>
  30#include <drm/drmP.h>
  31#include <drm/drm_crtc_helper.h>
  32#include "radeon.h"
  33#include "radeon_acpi.h"
  34#include "atom.h"
  35
  36#define ACPI_AC_CLASS           "ac_adapter"
  37
  38extern void radeon_pm_acpi_event_handler(struct radeon_device *rdev);
  39
  40struct atif_verify_interface {
  41        u16 size;               /* structure size in bytes (includes size field) */
  42        u16 version;            /* version */
  43        u32 notification_mask;  /* supported notifications mask */
  44        u32 function_bits;      /* supported functions bit vector */
  45} __packed;
  46
  47struct atif_system_params {
  48        u16 size;               /* structure size in bytes (includes size field) */
  49        u32 valid_mask;         /* valid flags mask */
  50        u32 flags;              /* flags */
  51        u8 command_code;        /* notify command code */
  52} __packed;
  53
  54struct atif_sbios_requests {
  55        u16 size;               /* structure size in bytes (includes size field) */
  56        u32 pending;            /* pending sbios requests */
  57        u8 panel_exp_mode;      /* panel expansion mode */
  58        u8 thermal_gfx;         /* thermal state: target gfx controller */
  59        u8 thermal_state;       /* thermal state: state id (0: exit state, non-0: state) */
  60        u8 forced_power_gfx;    /* forced power state: target gfx controller */
  61        u8 forced_power_state;  /* forced power state: state id */
  62        u8 system_power_src;    /* system power source */
  63        u8 backlight_level;     /* panel backlight level (0-255) */
  64} __packed;
  65
  66#define ATIF_NOTIFY_MASK        0x3
  67#define ATIF_NOTIFY_NONE        0
  68#define ATIF_NOTIFY_81          1
  69#define ATIF_NOTIFY_N           2
  70
  71struct atcs_verify_interface {
  72        u16 size;               /* structure size in bytes (includes size field) */
  73        u16 version;            /* version */
  74        u32 function_bits;      /* supported functions bit vector */
  75} __packed;
  76
  77#define ATCS_VALID_FLAGS_MASK   0x3
  78
  79struct atcs_pref_req_input {
  80        u16 size;               /* structure size in bytes (includes size field) */
  81        u16 client_id;          /* client id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */
  82        u16 valid_flags_mask;   /* valid flags mask */
  83        u16 flags;              /* flags */
  84        u8 req_type;            /* request type */
  85        u8 perf_req;            /* performance request */
  86} __packed;
  87
  88struct atcs_pref_req_output {
  89        u16 size;               /* structure size in bytes (includes size field) */
  90        u8 ret_val;             /* return value */
  91} __packed;
  92
  93/* Call the ATIF method
  94 */
  95/**
  96 * radeon_atif_call - call an ATIF method
  97 *
  98 * @handle: acpi handle
  99 * @function: the ATIF function to execute
 100 * @params: ATIF function params
 101 *
 102 * Executes the requested ATIF function (all asics).
 103 * Returns a pointer to the acpi output buffer.
 104 */
 105static union acpi_object *radeon_atif_call(acpi_handle handle, int function,
 106                struct acpi_buffer *params)
 107{
 108        acpi_status status;
 109        union acpi_object atif_arg_elements[2];
 110        struct acpi_object_list atif_arg;
 111        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 112
 113        atif_arg.count = 2;
 114        atif_arg.pointer = &atif_arg_elements[0];
 115
 116        atif_arg_elements[0].type = ACPI_TYPE_INTEGER;
 117        atif_arg_elements[0].integer.value = function;
 118
 119        if (params) {
 120                atif_arg_elements[1].type = ACPI_TYPE_BUFFER;
 121                atif_arg_elements[1].buffer.length = params->length;
 122                atif_arg_elements[1].buffer.pointer = params->pointer;
 123        } else {
 124                /* We need a second fake parameter */
 125                atif_arg_elements[1].type = ACPI_TYPE_INTEGER;
 126                atif_arg_elements[1].integer.value = 0;
 127        }
 128
 129        status = acpi_evaluate_object(handle, "ATIF", &atif_arg, &buffer);
 130
 131        /* Fail only if calling the method fails and ATIF is supported */
 132        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
 133                DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
 134                                 acpi_format_exception(status));
 135                kfree(buffer.pointer);
 136                return NULL;
 137        }
 138
 139        return buffer.pointer;
 140}
 141
 142/**
 143 * radeon_atif_parse_notification - parse supported notifications
 144 *
 145 * @n: supported notifications struct
 146 * @mask: supported notifications mask from ATIF
 147 *
 148 * Use the supported notifications mask from ATIF function
 149 * ATIF_FUNCTION_VERIFY_INTERFACE to determine what notifications
 150 * are supported (all asics).
 151 */
 152static void radeon_atif_parse_notification(struct radeon_atif_notifications *n, u32 mask)
 153{
 154        n->display_switch = mask & ATIF_DISPLAY_SWITCH_REQUEST_SUPPORTED;
 155        n->expansion_mode_change = mask & ATIF_EXPANSION_MODE_CHANGE_REQUEST_SUPPORTED;
 156        n->thermal_state = mask & ATIF_THERMAL_STATE_CHANGE_REQUEST_SUPPORTED;
 157        n->forced_power_state = mask & ATIF_FORCED_POWER_STATE_CHANGE_REQUEST_SUPPORTED;
 158        n->system_power_state = mask & ATIF_SYSTEM_POWER_SOURCE_CHANGE_REQUEST_SUPPORTED;
 159        n->display_conf_change = mask & ATIF_DISPLAY_CONF_CHANGE_REQUEST_SUPPORTED;
 160        n->px_gfx_switch = mask & ATIF_PX_GFX_SWITCH_REQUEST_SUPPORTED;
 161        n->brightness_change = mask & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST_SUPPORTED;
 162        n->dgpu_display_event = mask & ATIF_DGPU_DISPLAY_EVENT_SUPPORTED;
 163}
 164
 165/**
 166 * radeon_atif_parse_functions - parse supported functions
 167 *
 168 * @f: supported functions struct
 169 * @mask: supported functions mask from ATIF
 170 *
 171 * Use the supported functions mask from ATIF function
 172 * ATIF_FUNCTION_VERIFY_INTERFACE to determine what functions
 173 * are supported (all asics).
 174 */
 175static void radeon_atif_parse_functions(struct radeon_atif_functions *f, u32 mask)
 176{
 177        f->system_params = mask & ATIF_GET_SYSTEM_PARAMETERS_SUPPORTED;
 178        f->sbios_requests = mask & ATIF_GET_SYSTEM_BIOS_REQUESTS_SUPPORTED;
 179        f->select_active_disp = mask & ATIF_SELECT_ACTIVE_DISPLAYS_SUPPORTED;
 180        f->lid_state = mask & ATIF_GET_LID_STATE_SUPPORTED;
 181        f->get_tv_standard = mask & ATIF_GET_TV_STANDARD_FROM_CMOS_SUPPORTED;
 182        f->set_tv_standard = mask & ATIF_SET_TV_STANDARD_IN_CMOS_SUPPORTED;
 183        f->get_panel_expansion_mode = mask & ATIF_GET_PANEL_EXPANSION_MODE_FROM_CMOS_SUPPORTED;
 184        f->set_panel_expansion_mode = mask & ATIF_SET_PANEL_EXPANSION_MODE_IN_CMOS_SUPPORTED;
 185        f->temperature_change = mask & ATIF_TEMPERATURE_CHANGE_NOTIFICATION_SUPPORTED;
 186        f->graphics_device_types = mask & ATIF_GET_GRAPHICS_DEVICE_TYPES_SUPPORTED;
 187}
 188
 189/**
 190 * radeon_atif_verify_interface - verify ATIF
 191 *
 192 * @handle: acpi handle
 193 * @atif: radeon atif struct
 194 *
 195 * Execute the ATIF_FUNCTION_VERIFY_INTERFACE ATIF function
 196 * to initialize ATIF and determine what features are supported
 197 * (all asics).
 198 * returns 0 on success, error on failure.
 199 */
 200static int radeon_atif_verify_interface(acpi_handle handle,
 201                struct radeon_atif *atif)
 202{
 203        union acpi_object *info;
 204        struct atif_verify_interface output;
 205        size_t size;
 206        int err = 0;
 207
 208        info = radeon_atif_call(handle, ATIF_FUNCTION_VERIFY_INTERFACE, NULL);
 209        if (!info)
 210                return -EIO;
 211
 212        memset(&output, 0, sizeof(output));
 213
 214        size = *(u16 *) info->buffer.pointer;
 215        if (size < 12) {
 216                DRM_INFO("ATIF buffer is too small: %zu\n", size);
 217                err = -EINVAL;
 218                goto out;
 219        }
 220        size = min(sizeof(output), size);
 221
 222        memcpy(&output, info->buffer.pointer, size);
 223
 224        /* TODO: check version? */
 225        DRM_DEBUG_DRIVER("ATIF version %u\n", output.version);
 226
 227        radeon_atif_parse_notification(&atif->notifications, output.notification_mask);
 228        radeon_atif_parse_functions(&atif->functions, output.function_bits);
 229
 230out:
 231        kfree(info);
 232        return err;
 233}
 234
 235/**
 236 * radeon_atif_get_notification_params - determine notify configuration
 237 *
 238 * @handle: acpi handle
 239 * @n: atif notification configuration struct
 240 *
 241 * Execute the ATIF_FUNCTION_GET_SYSTEM_PARAMETERS ATIF function
 242 * to determine if a notifier is used and if so which one
 243 * (all asics).  This is either Notify(VGA, 0x81) or Notify(VGA, n)
 244 * where n is specified in the result if a notifier is used.
 245 * Returns 0 on success, error on failure.
 246 */
 247static int radeon_atif_get_notification_params(acpi_handle handle,
 248                struct radeon_atif_notification_cfg *n)
 249{
 250        union acpi_object *info;
 251        struct atif_system_params params;
 252        size_t size;
 253        int err = 0;
 254
 255        info = radeon_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_PARAMETERS, NULL);
 256        if (!info) {
 257                err = -EIO;
 258                goto out;
 259        }
 260
 261        size = *(u16 *) info->buffer.pointer;
 262        if (size < 10) {
 263                err = -EINVAL;
 264                goto out;
 265        }
 266
 267        memset(&params, 0, sizeof(params));
 268        size = min(sizeof(params), size);
 269        memcpy(&params, info->buffer.pointer, size);
 270
 271        DRM_DEBUG_DRIVER("SYSTEM_PARAMS: mask = %#x, flags = %#x\n",
 272                        params.flags, params.valid_mask);
 273        params.flags = params.flags & params.valid_mask;
 274
 275        if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_NONE) {
 276                n->enabled = false;
 277                n->command_code = 0;
 278        } else if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_81) {
 279                n->enabled = true;
 280                n->command_code = 0x81;
 281        } else {
 282                if (size < 11) {
 283                        err = -EINVAL;
 284                        goto out;
 285                }
 286                n->enabled = true;
 287                n->command_code = params.command_code;
 288        }
 289
 290out:
 291        DRM_DEBUG_DRIVER("Notification %s, command code = %#x\n",
 292                        (n->enabled ? "enabled" : "disabled"),
 293                        n->command_code);
 294        kfree(info);
 295        return err;
 296}
 297
 298/**
 299 * radeon_atif_get_sbios_requests - get requested sbios event
 300 *
 301 * @handle: acpi handle
 302 * @req: atif sbios request struct
 303 *
 304 * Execute the ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS ATIF function
 305 * to determine what requests the sbios is making to the driver
 306 * (all asics).
 307 * Returns 0 on success, error on failure.
 308 */
 309static int radeon_atif_get_sbios_requests(acpi_handle handle,
 310                struct atif_sbios_requests *req)
 311{
 312        union acpi_object *info;
 313        size_t size;
 314        int count = 0;
 315
 316        info = radeon_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS, NULL);
 317        if (!info)
 318                return -EIO;
 319
 320        size = *(u16 *)info->buffer.pointer;
 321        if (size < 0xd) {
 322                count = -EINVAL;
 323                goto out;
 324        }
 325        memset(req, 0, sizeof(*req));
 326
 327        size = min(sizeof(*req), size);
 328        memcpy(req, info->buffer.pointer, size);
 329        DRM_DEBUG_DRIVER("SBIOS pending requests: %#x\n", req->pending);
 330
 331        count = hweight32(req->pending);
 332
 333out:
 334        kfree(info);
 335        return count;
 336}
 337
 338/**
 339 * radeon_atif_handler - handle ATIF notify requests
 340 *
 341 * @rdev: radeon_device pointer
 342 * @event: atif sbios request struct
 343 *
 344 * Checks the acpi event and if it matches an atif event,
 345 * handles it.
 346 * Returns NOTIFY code
 347 */
 348int radeon_atif_handler(struct radeon_device *rdev,
 349                struct acpi_bus_event *event)
 350{
 351        struct radeon_atif *atif = &rdev->atif;
 352        struct atif_sbios_requests req;
 353        acpi_handle handle;
 354        int count;
 355
 356        DRM_DEBUG_DRIVER("event, device_class = %s, type = %#x\n",
 357                        event->device_class, event->type);
 358
 359        if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0)
 360                return NOTIFY_DONE;
 361
 362        if (!atif->notification_cfg.enabled ||
 363                        event->type != atif->notification_cfg.command_code)
 364                /* Not our event */
 365                return NOTIFY_DONE;
 366
 367        /* Check pending SBIOS requests */
 368        handle = ACPI_HANDLE(&rdev->pdev->dev);
 369        count = radeon_atif_get_sbios_requests(handle, &req);
 370
 371        if (count <= 0)
 372                return NOTIFY_DONE;
 373
 374        DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count);
 375
 376        if (req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) {
 377                struct radeon_encoder *enc = atif->encoder_for_bl;
 378
 379                if (enc) {
 380                        DRM_DEBUG_DRIVER("Changing brightness to %d\n",
 381                                        req.backlight_level);
 382
 383                        radeon_set_backlight_level(rdev, enc, req.backlight_level);
 384
 385#if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
 386                        if (rdev->is_atom_bios) {
 387                                struct radeon_encoder_atom_dig *dig = enc->enc_priv;
 388                                backlight_force_update(dig->bl_dev,
 389                                                       BACKLIGHT_UPDATE_HOTKEY);
 390                        } else {
 391                                struct radeon_encoder_lvds *dig = enc->enc_priv;
 392                                backlight_force_update(dig->bl_dev,
 393                                                       BACKLIGHT_UPDATE_HOTKEY);
 394                        }
 395#endif
 396                }
 397        }
 398        /* TODO: check other events */
 399
 400        /* We've handled the event, stop the notifier chain. The ACPI interface
 401         * overloads ACPI_VIDEO_NOTIFY_PROBE, we don't want to send that to
 402         * userspace if the event was generated only to signal a SBIOS
 403         * request.
 404         */
 405        return NOTIFY_BAD;
 406}
 407
 408/* Call the ATCS method
 409 */
 410/**
 411 * radeon_atcs_call - call an ATCS method
 412 *
 413 * @handle: acpi handle
 414 * @function: the ATCS function to execute
 415 * @params: ATCS function params
 416 *
 417 * Executes the requested ATCS function (all asics).
 418 * Returns a pointer to the acpi output buffer.
 419 */
 420static union acpi_object *radeon_atcs_call(acpi_handle handle, int function,
 421                                           struct acpi_buffer *params)
 422{
 423        acpi_status status;
 424        union acpi_object atcs_arg_elements[2];
 425        struct acpi_object_list atcs_arg;
 426        struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 427
 428        atcs_arg.count = 2;
 429        atcs_arg.pointer = &atcs_arg_elements[0];
 430
 431        atcs_arg_elements[0].type = ACPI_TYPE_INTEGER;
 432        atcs_arg_elements[0].integer.value = function;
 433
 434        if (params) {
 435                atcs_arg_elements[1].type = ACPI_TYPE_BUFFER;
 436                atcs_arg_elements[1].buffer.length = params->length;
 437                atcs_arg_elements[1].buffer.pointer = params->pointer;
 438        } else {
 439                /* We need a second fake parameter */
 440                atcs_arg_elements[1].type = ACPI_TYPE_INTEGER;
 441                atcs_arg_elements[1].integer.value = 0;
 442        }
 443
 444        status = acpi_evaluate_object(handle, "ATCS", &atcs_arg, &buffer);
 445
 446        /* Fail only if calling the method fails and ATIF is supported */
 447        if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
 448                DRM_DEBUG_DRIVER("failed to evaluate ATCS got %s\n",
 449                                 acpi_format_exception(status));
 450                kfree(buffer.pointer);
 451                return NULL;
 452        }
 453
 454        return buffer.pointer;
 455}
 456
 457/**
 458 * radeon_atcs_parse_functions - parse supported functions
 459 *
 460 * @f: supported functions struct
 461 * @mask: supported functions mask from ATCS
 462 *
 463 * Use the supported functions mask from ATCS function
 464 * ATCS_FUNCTION_VERIFY_INTERFACE to determine what functions
 465 * are supported (all asics).
 466 */
 467static void radeon_atcs_parse_functions(struct radeon_atcs_functions *f, u32 mask)
 468{
 469        f->get_ext_state = mask & ATCS_GET_EXTERNAL_STATE_SUPPORTED;
 470        f->pcie_perf_req = mask & ATCS_PCIE_PERFORMANCE_REQUEST_SUPPORTED;
 471        f->pcie_dev_rdy = mask & ATCS_PCIE_DEVICE_READY_NOTIFICATION_SUPPORTED;
 472        f->pcie_bus_width = mask & ATCS_SET_PCIE_BUS_WIDTH_SUPPORTED;
 473}
 474
 475/**
 476 * radeon_atcs_verify_interface - verify ATCS
 477 *
 478 * @handle: acpi handle
 479 * @atcs: radeon atcs struct
 480 *
 481 * Execute the ATCS_FUNCTION_VERIFY_INTERFACE ATCS function
 482 * to initialize ATCS and determine what features are supported
 483 * (all asics).
 484 * returns 0 on success, error on failure.
 485 */
 486static int radeon_atcs_verify_interface(acpi_handle handle,
 487                                        struct radeon_atcs *atcs)
 488{
 489        union acpi_object *info;
 490        struct atcs_verify_interface output;
 491        size_t size;
 492        int err = 0;
 493
 494        info = radeon_atcs_call(handle, ATCS_FUNCTION_VERIFY_INTERFACE, NULL);
 495        if (!info)
 496                return -EIO;
 497
 498        memset(&output, 0, sizeof(output));
 499
 500        size = *(u16 *) info->buffer.pointer;
 501        if (size < 8) {
 502                DRM_INFO("ATCS buffer is too small: %zu\n", size);
 503                err = -EINVAL;
 504                goto out;
 505        }
 506        size = min(sizeof(output), size);
 507
 508        memcpy(&output, info->buffer.pointer, size);
 509
 510        /* TODO: check version? */
 511        DRM_DEBUG_DRIVER("ATCS version %u\n", output.version);
 512
 513        radeon_atcs_parse_functions(&atcs->functions, output.function_bits);
 514
 515out:
 516        kfree(info);
 517        return err;
 518}
 519
 520/**
 521 * radeon_acpi_is_pcie_performance_request_supported
 522 *
 523 * @rdev: radeon_device pointer
 524 *
 525 * Check if the ATCS pcie_perf_req and pcie_dev_rdy methods
 526 * are supported (all asics).
 527 * returns true if supported, false if not.
 528 */
 529bool radeon_acpi_is_pcie_performance_request_supported(struct radeon_device *rdev)
 530{
 531        struct radeon_atcs *atcs = &rdev->atcs;
 532
 533        if (atcs->functions.pcie_perf_req && atcs->functions.pcie_dev_rdy)
 534                return true;
 535
 536        return false;
 537}
 538
 539/**
 540 * radeon_acpi_pcie_notify_device_ready
 541 *
 542 * @rdev: radeon_device pointer
 543 *
 544 * Executes the PCIE_DEVICE_READY_NOTIFICATION method
 545 * (all asics).
 546 * returns 0 on success, error on failure.
 547 */
 548int radeon_acpi_pcie_notify_device_ready(struct radeon_device *rdev)
 549{
 550        acpi_handle handle;
 551        union acpi_object *info;
 552        struct radeon_atcs *atcs = &rdev->atcs;
 553
 554        /* Get the device handle */
 555        handle = ACPI_HANDLE(&rdev->pdev->dev);
 556        if (!handle)
 557                return -EINVAL;
 558
 559        if (!atcs->functions.pcie_dev_rdy)
 560                return -EINVAL;
 561
 562        info = radeon_atcs_call(handle, ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, NULL);
 563        if (!info)
 564                return -EIO;
 565
 566        kfree(info);
 567
 568        return 0;
 569}
 570
 571/**
 572 * radeon_acpi_pcie_performance_request
 573 *
 574 * @rdev: radeon_device pointer
 575 * @perf_req: requested perf level (pcie gen speed)
 576 * @advertise: set advertise caps flag if set
 577 *
 578 * Executes the PCIE_PERFORMANCE_REQUEST method to
 579 * change the pcie gen speed (all asics).
 580 * returns 0 on success, error on failure.
 581 */
 582int radeon_acpi_pcie_performance_request(struct radeon_device *rdev,
 583                                         u8 perf_req, bool advertise)
 584{
 585        acpi_handle handle;
 586        union acpi_object *info;
 587        struct radeon_atcs *atcs = &rdev->atcs;
 588        struct atcs_pref_req_input atcs_input;
 589        struct atcs_pref_req_output atcs_output;
 590        struct acpi_buffer params;
 591        size_t size;
 592        u32 retry = 3;
 593
 594        /* Get the device handle */
 595        handle = ACPI_HANDLE(&rdev->pdev->dev);
 596        if (!handle)
 597                return -EINVAL;
 598
 599        if (!atcs->functions.pcie_perf_req)
 600                return -EINVAL;
 601
 602        atcs_input.size = sizeof(struct atcs_pref_req_input);
 603        /* client id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */
 604        atcs_input.client_id = rdev->pdev->devfn | (rdev->pdev->bus->number << 8);
 605        atcs_input.valid_flags_mask = ATCS_VALID_FLAGS_MASK;
 606        atcs_input.flags = ATCS_WAIT_FOR_COMPLETION;
 607        if (advertise)
 608                atcs_input.flags |= ATCS_ADVERTISE_CAPS;
 609        atcs_input.req_type = ATCS_PCIE_LINK_SPEED;
 610        atcs_input.perf_req = perf_req;
 611
 612        params.length = sizeof(struct atcs_pref_req_input);
 613        params.pointer = &atcs_input;
 614
 615        while (retry--) {
 616                info = radeon_atcs_call(handle, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, &params);
 617                if (!info)
 618                        return -EIO;
 619
 620                memset(&atcs_output, 0, sizeof(atcs_output));
 621
 622                size = *(u16 *) info->buffer.pointer;
 623                if (size < 3) {
 624                        DRM_INFO("ATCS buffer is too small: %zu\n", size);
 625                        kfree(info);
 626                        return -EINVAL;
 627                }
 628                size = min(sizeof(atcs_output), size);
 629
 630                memcpy(&atcs_output, info->buffer.pointer, size);
 631
 632                kfree(info);
 633
 634                switch (atcs_output.ret_val) {
 635                case ATCS_REQUEST_REFUSED:
 636                default:
 637                        return -EINVAL;
 638                case ATCS_REQUEST_COMPLETE:
 639                        return 0;
 640                case ATCS_REQUEST_IN_PROGRESS:
 641                        udelay(10);
 642                        break;
 643                }
 644        }
 645
 646        return 0;
 647}
 648
 649/**
 650 * radeon_acpi_event - handle notify events
 651 *
 652 * @nb: notifier block
 653 * @val: val
 654 * @data: acpi event
 655 *
 656 * Calls relevant radeon functions in response to various
 657 * acpi events.
 658 * Returns NOTIFY code
 659 */
 660static int radeon_acpi_event(struct notifier_block *nb,
 661                             unsigned long val,
 662                             void *data)
 663{
 664        struct radeon_device *rdev = container_of(nb, struct radeon_device, acpi_nb);
 665        struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
 666
 667        if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {
 668                if (power_supply_is_system_supplied() > 0)
 669                        DRM_DEBUG_DRIVER("pm: AC\n");
 670                else
 671                        DRM_DEBUG_DRIVER("pm: DC\n");
 672
 673                radeon_pm_acpi_event_handler(rdev);
 674        }
 675
 676        /* Check for pending SBIOS requests */
 677        return radeon_atif_handler(rdev, entry);
 678}
 679
 680/* Call all ACPI methods here */
 681/**
 682 * radeon_acpi_init - init driver acpi support
 683 *
 684 * @rdev: radeon_device pointer
 685 *
 686 * Verifies the AMD ACPI interfaces and registers with the acpi
 687 * notifier chain (all asics).
 688 * Returns 0 on success, error on failure.
 689 */
 690int radeon_acpi_init(struct radeon_device *rdev)
 691{
 692        acpi_handle handle;
 693        struct radeon_atif *atif = &rdev->atif;
 694        struct radeon_atcs *atcs = &rdev->atcs;
 695        int ret;
 696
 697        /* Get the device handle */
 698        handle = ACPI_HANDLE(&rdev->pdev->dev);
 699
 700        /* No need to proceed if we're sure that ATIF is not supported */
 701        if (!ASIC_IS_AVIVO(rdev) || !rdev->bios || !handle)
 702                return 0;
 703
 704        /* Call the ATCS method */
 705        ret = radeon_atcs_verify_interface(handle, atcs);
 706        if (ret) {
 707                DRM_DEBUG_DRIVER("Call to ATCS verify_interface failed: %d\n", ret);
 708        }
 709
 710        /* Call the ATIF method */
 711        ret = radeon_atif_verify_interface(handle, atif);
 712        if (ret) {
 713                DRM_DEBUG_DRIVER("Call to ATIF verify_interface failed: %d\n", ret);
 714                goto out;
 715        }
 716
 717        if (atif->notifications.brightness_change) {
 718                struct drm_encoder *tmp;
 719                struct radeon_encoder *target = NULL;
 720
 721                /* Find the encoder controlling the brightness */
 722                list_for_each_entry(tmp, &rdev->ddev->mode_config.encoder_list,
 723                                head) {
 724                        struct radeon_encoder *enc = to_radeon_encoder(tmp);
 725
 726                        if ((enc->devices & (ATOM_DEVICE_LCD_SUPPORT)) &&
 727                            enc->enc_priv) {
 728                                if (rdev->is_atom_bios) {
 729                                        struct radeon_encoder_atom_dig *dig = enc->enc_priv;
 730                                        if (dig->bl_dev) {
 731                                                target = enc;
 732                                                break;
 733                                        }
 734                                } else {
 735                                        struct radeon_encoder_lvds *dig = enc->enc_priv;
 736                                        if (dig->bl_dev) {
 737                                                target = enc;
 738                                                break;
 739                                        }
 740                                }
 741                        }
 742                }
 743
 744                atif->encoder_for_bl = target;
 745                if (!target) {
 746                        /* Brightness change notification is enabled, but we
 747                         * didn't find a backlight controller, this should
 748                         * never happen.
 749                         */
 750                        DRM_ERROR("Cannot find a backlight controller\n");
 751                }
 752        }
 753
 754        if (atif->functions.sbios_requests && !atif->functions.system_params) {
 755                /* XXX check this workraround, if sbios request function is
 756                 * present we have to see how it's configured in the system
 757                 * params
 758                 */
 759                atif->functions.system_params = true;
 760        }
 761
 762        if (atif->functions.system_params) {
 763                ret = radeon_atif_get_notification_params(handle,
 764                                &atif->notification_cfg);
 765                if (ret) {
 766                        DRM_DEBUG_DRIVER("Call to GET_SYSTEM_PARAMS failed: %d\n",
 767                                        ret);
 768                        /* Disable notification */
 769                        atif->notification_cfg.enabled = false;
 770                }
 771        }
 772
 773out:
 774        rdev->acpi_nb.notifier_call = radeon_acpi_event;
 775        register_acpi_notifier(&rdev->acpi_nb);
 776
 777        return ret;
 778}
 779
 780/**
 781 * radeon_acpi_fini - tear down driver acpi support
 782 *
 783 * @rdev: radeon_device pointer
 784 *
 785 * Unregisters with the acpi notifier chain (all asics).
 786 */
 787void radeon_acpi_fini(struct radeon_device *rdev)
 788{
 789        unregister_acpi_notifier(&rdev->acpi_nb);
 790}
 791