This source file includes following definitions.
- radeon_atpx_dgpu_req_power_for_displays
- radeon_atif_call
- radeon_atif_parse_notification
- radeon_atif_parse_functions
- radeon_atif_verify_interface
- radeon_atif_get_notification_params
- radeon_atif_get_sbios_requests
- radeon_atif_handler
- radeon_atcs_call
- radeon_atcs_parse_functions
- radeon_atcs_verify_interface
- radeon_acpi_is_pcie_performance_request_supported
- radeon_acpi_pcie_notify_device_ready
- radeon_acpi_pcie_performance_request
- radeon_acpi_event
- radeon_acpi_init
- radeon_acpi_fini
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 #include <linux/acpi.h>
  25 #include <linux/pci.h>
  26 #include <linux/pm_runtime.h>
  27 #include <linux/power_supply.h>
  28 #include <linux/slab.h>
  29 
  30 #include <acpi/acpi_bus.h>
  31 #include <acpi/video.h>
  32 
  33 #include <drm/drm_crtc_helper.h>
  34 #include <drm/drm_probe_helper.h>
  35 
  36 #include "atom.h"
  37 #include "radeon.h"
  38 #include "radeon_acpi.h"
  39 
  40 #if defined(CONFIG_VGA_SWITCHEROO)
  41 bool radeon_atpx_dgpu_req_power_for_displays(void);
  42 #else
  43 static inline bool radeon_atpx_dgpu_req_power_for_displays(void) { return false; }
  44 #endif
  45 
  46 #define ACPI_AC_CLASS           "ac_adapter"
  47 
  48 extern void radeon_pm_acpi_event_handler(struct radeon_device *rdev);
  49 
  50 struct atif_verify_interface {
  51         u16 size;               
  52         u16 version;            
  53         u32 notification_mask;  
  54         u32 function_bits;      
  55 } __packed;
  56 
  57 struct atif_system_params {
  58         u16 size;               
  59         u32 valid_mask;         
  60         u32 flags;              
  61         u8 command_code;        
  62 } __packed;
  63 
  64 struct atif_sbios_requests {
  65         u16 size;               
  66         u32 pending;            
  67         u8 panel_exp_mode;      
  68         u8 thermal_gfx;         
  69         u8 thermal_state;       
  70         u8 forced_power_gfx;    
  71         u8 forced_power_state;  
  72         u8 system_power_src;    
  73         u8 backlight_level;     
  74 } __packed;
  75 
  76 #define ATIF_NOTIFY_MASK        0x3
  77 #define ATIF_NOTIFY_NONE        0
  78 #define ATIF_NOTIFY_81          1
  79 #define ATIF_NOTIFY_N           2
  80 
  81 struct atcs_verify_interface {
  82         u16 size;               
  83         u16 version;            
  84         u32 function_bits;      
  85 } __packed;
  86 
  87 #define ATCS_VALID_FLAGS_MASK   0x3
  88 
  89 struct atcs_pref_req_input {
  90         u16 size;               
  91         u16 client_id;          
  92         u16 valid_flags_mask;   
  93         u16 flags;              
  94         u8 req_type;            
  95         u8 perf_req;            
  96 } __packed;
  97 
  98 struct atcs_pref_req_output {
  99         u16 size;               
 100         u8 ret_val;             
 101 } __packed;
 102 
 103 
 104 
 105 
 106 
 107 
 108 
 109 
 110 
 111 
 112 
 113 
 114 
 115 static union acpi_object *radeon_atif_call(acpi_handle handle, int function,
 116                 struct acpi_buffer *params)
 117 {
 118         acpi_status status;
 119         union acpi_object atif_arg_elements[2];
 120         struct acpi_object_list atif_arg;
 121         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 122 
 123         atif_arg.count = 2;
 124         atif_arg.pointer = &atif_arg_elements[0];
 125 
 126         atif_arg_elements[0].type = ACPI_TYPE_INTEGER;
 127         atif_arg_elements[0].integer.value = function;
 128 
 129         if (params) {
 130                 atif_arg_elements[1].type = ACPI_TYPE_BUFFER;
 131                 atif_arg_elements[1].buffer.length = params->length;
 132                 atif_arg_elements[1].buffer.pointer = params->pointer;
 133         } else {
 134                 
 135                 atif_arg_elements[1].type = ACPI_TYPE_INTEGER;
 136                 atif_arg_elements[1].integer.value = 0;
 137         }
 138 
 139         status = acpi_evaluate_object(handle, "ATIF", &atif_arg, &buffer);
 140 
 141         
 142         if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
 143                 DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n",
 144                                  acpi_format_exception(status));
 145                 kfree(buffer.pointer);
 146                 return NULL;
 147         }
 148 
 149         return buffer.pointer;
 150 }
 151 
 152 
 153 
 154 
 155 
 156 
 157 
 158 
 159 
 160 
 161 
 162 static void radeon_atif_parse_notification(struct radeon_atif_notifications *n, u32 mask)
 163 {
 164         n->display_switch = mask & ATIF_DISPLAY_SWITCH_REQUEST_SUPPORTED;
 165         n->expansion_mode_change = mask & ATIF_EXPANSION_MODE_CHANGE_REQUEST_SUPPORTED;
 166         n->thermal_state = mask & ATIF_THERMAL_STATE_CHANGE_REQUEST_SUPPORTED;
 167         n->forced_power_state = mask & ATIF_FORCED_POWER_STATE_CHANGE_REQUEST_SUPPORTED;
 168         n->system_power_state = mask & ATIF_SYSTEM_POWER_SOURCE_CHANGE_REQUEST_SUPPORTED;
 169         n->display_conf_change = mask & ATIF_DISPLAY_CONF_CHANGE_REQUEST_SUPPORTED;
 170         n->px_gfx_switch = mask & ATIF_PX_GFX_SWITCH_REQUEST_SUPPORTED;
 171         n->brightness_change = mask & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST_SUPPORTED;
 172         n->dgpu_display_event = mask & ATIF_DGPU_DISPLAY_EVENT_SUPPORTED;
 173 }
 174 
 175 
 176 
 177 
 178 
 179 
 180 
 181 
 182 
 183 
 184 
 185 static void radeon_atif_parse_functions(struct radeon_atif_functions *f, u32 mask)
 186 {
 187         f->system_params = mask & ATIF_GET_SYSTEM_PARAMETERS_SUPPORTED;
 188         f->sbios_requests = mask & ATIF_GET_SYSTEM_BIOS_REQUESTS_SUPPORTED;
 189         f->select_active_disp = mask & ATIF_SELECT_ACTIVE_DISPLAYS_SUPPORTED;
 190         f->lid_state = mask & ATIF_GET_LID_STATE_SUPPORTED;
 191         f->get_tv_standard = mask & ATIF_GET_TV_STANDARD_FROM_CMOS_SUPPORTED;
 192         f->set_tv_standard = mask & ATIF_SET_TV_STANDARD_IN_CMOS_SUPPORTED;
 193         f->get_panel_expansion_mode = mask & ATIF_GET_PANEL_EXPANSION_MODE_FROM_CMOS_SUPPORTED;
 194         f->set_panel_expansion_mode = mask & ATIF_SET_PANEL_EXPANSION_MODE_IN_CMOS_SUPPORTED;
 195         f->temperature_change = mask & ATIF_TEMPERATURE_CHANGE_NOTIFICATION_SUPPORTED;
 196         f->graphics_device_types = mask & ATIF_GET_GRAPHICS_DEVICE_TYPES_SUPPORTED;
 197 }
 198 
 199 
 200 
 201 
 202 
 203 
 204 
 205 
 206 
 207 
 208 
 209 
 210 static int radeon_atif_verify_interface(acpi_handle handle,
 211                 struct radeon_atif *atif)
 212 {
 213         union acpi_object *info;
 214         struct atif_verify_interface output;
 215         size_t size;
 216         int err = 0;
 217 
 218         info = radeon_atif_call(handle, ATIF_FUNCTION_VERIFY_INTERFACE, NULL);
 219         if (!info)
 220                 return -EIO;
 221 
 222         memset(&output, 0, sizeof(output));
 223 
 224         size = *(u16 *) info->buffer.pointer;
 225         if (size < 12) {
 226                 DRM_INFO("ATIF buffer is too small: %zu\n", size);
 227                 err = -EINVAL;
 228                 goto out;
 229         }
 230         size = min(sizeof(output), size);
 231 
 232         memcpy(&output, info->buffer.pointer, size);
 233 
 234         
 235         DRM_DEBUG_DRIVER("ATIF version %u\n", output.version);
 236 
 237         radeon_atif_parse_notification(&atif->notifications, output.notification_mask);
 238         radeon_atif_parse_functions(&atif->functions, output.function_bits);
 239 
 240 out:
 241         kfree(info);
 242         return err;
 243 }
 244 
 245 
 246 
 247 
 248 
 249 
 250 
 251 
 252 
 253 
 254 
 255 
 256 
 257 static int radeon_atif_get_notification_params(acpi_handle handle,
 258                 struct radeon_atif_notification_cfg *n)
 259 {
 260         union acpi_object *info;
 261         struct atif_system_params params;
 262         size_t size;
 263         int err = 0;
 264 
 265         info = radeon_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_PARAMETERS, NULL);
 266         if (!info) {
 267                 err = -EIO;
 268                 goto out;
 269         }
 270 
 271         size = *(u16 *) info->buffer.pointer;
 272         if (size < 10) {
 273                 err = -EINVAL;
 274                 goto out;
 275         }
 276 
 277         memset(¶ms, 0, sizeof(params));
 278         size = min(sizeof(params), size);
 279         memcpy(¶ms, info->buffer.pointer, size);
 280 
 281         DRM_DEBUG_DRIVER("SYSTEM_PARAMS: mask = %#x, flags = %#x\n",
 282                         params.flags, params.valid_mask);
 283         params.flags = params.flags & params.valid_mask;
 284 
 285         if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_NONE) {
 286                 n->enabled = false;
 287                 n->command_code = 0;
 288         } else if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_81) {
 289                 n->enabled = true;
 290                 n->command_code = 0x81;
 291         } else {
 292                 if (size < 11) {
 293                         err = -EINVAL;
 294                         goto out;
 295                 }
 296                 n->enabled = true;
 297                 n->command_code = params.command_code;
 298         }
 299 
 300 out:
 301         DRM_DEBUG_DRIVER("Notification %s, command code = %#x\n",
 302                         (n->enabled ? "enabled" : "disabled"),
 303                         n->command_code);
 304         kfree(info);
 305         return err;
 306 }
 307 
 308 
 309 
 310 
 311 
 312 
 313 
 314 
 315 
 316 
 317 
 318 
 319 static int radeon_atif_get_sbios_requests(acpi_handle handle,
 320                 struct atif_sbios_requests *req)
 321 {
 322         union acpi_object *info;
 323         size_t size;
 324         int count = 0;
 325 
 326         info = radeon_atif_call(handle, ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS, NULL);
 327         if (!info)
 328                 return -EIO;
 329 
 330         size = *(u16 *)info->buffer.pointer;
 331         if (size < 0xd) {
 332                 count = -EINVAL;
 333                 goto out;
 334         }
 335         memset(req, 0, sizeof(*req));
 336 
 337         size = min(sizeof(*req), size);
 338         memcpy(req, info->buffer.pointer, size);
 339         DRM_DEBUG_DRIVER("SBIOS pending requests: %#x\n", req->pending);
 340 
 341         count = hweight32(req->pending);
 342 
 343 out:
 344         kfree(info);
 345         return count;
 346 }
 347 
 348 
 349 
 350 
 351 
 352 
 353 
 354 
 355 
 356 
 357 
 358 static int radeon_atif_handler(struct radeon_device *rdev,
 359                 struct acpi_bus_event *event)
 360 {
 361         struct radeon_atif *atif = &rdev->atif;
 362         struct atif_sbios_requests req;
 363         acpi_handle handle;
 364         int count;
 365 
 366         DRM_DEBUG_DRIVER("event, device_class = %s, type = %#x\n",
 367                         event->device_class, event->type);
 368 
 369         if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0)
 370                 return NOTIFY_DONE;
 371 
 372         if (!atif->notification_cfg.enabled ||
 373                         event->type != atif->notification_cfg.command_code)
 374                 
 375                 return NOTIFY_DONE;
 376 
 377         
 378         handle = ACPI_HANDLE(&rdev->pdev->dev);
 379         count = radeon_atif_get_sbios_requests(handle, &req);
 380 
 381         if (count <= 0)
 382                 return NOTIFY_DONE;
 383 
 384         DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count);
 385 
 386         if (req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) {
 387                 struct radeon_encoder *enc = atif->encoder_for_bl;
 388 
 389                 if (enc) {
 390                         DRM_DEBUG_DRIVER("Changing brightness to %d\n",
 391                                         req.backlight_level);
 392 
 393                         radeon_set_backlight_level(rdev, enc, req.backlight_level);
 394 
 395 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE)
 396                         if (rdev->is_atom_bios) {
 397                                 struct radeon_encoder_atom_dig *dig = enc->enc_priv;
 398                                 backlight_force_update(dig->bl_dev,
 399                                                        BACKLIGHT_UPDATE_HOTKEY);
 400                         } else {
 401                                 struct radeon_encoder_lvds *dig = enc->enc_priv;
 402                                 backlight_force_update(dig->bl_dev,
 403                                                        BACKLIGHT_UPDATE_HOTKEY);
 404                         }
 405 #endif
 406                 }
 407         }
 408         if (req.pending & ATIF_DGPU_DISPLAY_EVENT) {
 409                 if ((rdev->flags & RADEON_IS_PX) &&
 410                     radeon_atpx_dgpu_req_power_for_displays()) {
 411                         pm_runtime_get_sync(rdev->ddev->dev);
 412                         
 413                         drm_helper_hpd_irq_event(rdev->ddev);
 414                         pm_runtime_mark_last_busy(rdev->ddev->dev);
 415                         pm_runtime_put_autosuspend(rdev->ddev->dev);
 416                 }
 417         }
 418         
 419 
 420         
 421 
 422 
 423 
 424 
 425         return NOTIFY_BAD;
 426 }
 427 
 428 
 429 
 430 
 431 
 432 
 433 
 434 
 435 
 436 
 437 
 438 
 439 
 440 static union acpi_object *radeon_atcs_call(acpi_handle handle, int function,
 441                                            struct acpi_buffer *params)
 442 {
 443         acpi_status status;
 444         union acpi_object atcs_arg_elements[2];
 445         struct acpi_object_list atcs_arg;
 446         struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
 447 
 448         atcs_arg.count = 2;
 449         atcs_arg.pointer = &atcs_arg_elements[0];
 450 
 451         atcs_arg_elements[0].type = ACPI_TYPE_INTEGER;
 452         atcs_arg_elements[0].integer.value = function;
 453 
 454         if (params) {
 455                 atcs_arg_elements[1].type = ACPI_TYPE_BUFFER;
 456                 atcs_arg_elements[1].buffer.length = params->length;
 457                 atcs_arg_elements[1].buffer.pointer = params->pointer;
 458         } else {
 459                 
 460                 atcs_arg_elements[1].type = ACPI_TYPE_INTEGER;
 461                 atcs_arg_elements[1].integer.value = 0;
 462         }
 463 
 464         status = acpi_evaluate_object(handle, "ATCS", &atcs_arg, &buffer);
 465 
 466         
 467         if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) {
 468                 DRM_DEBUG_DRIVER("failed to evaluate ATCS got %s\n",
 469                                  acpi_format_exception(status));
 470                 kfree(buffer.pointer);
 471                 return NULL;
 472         }
 473 
 474         return buffer.pointer;
 475 }
 476 
 477 
 478 
 479 
 480 
 481 
 482 
 483 
 484 
 485 
 486 
 487 static void radeon_atcs_parse_functions(struct radeon_atcs_functions *f, u32 mask)
 488 {
 489         f->get_ext_state = mask & ATCS_GET_EXTERNAL_STATE_SUPPORTED;
 490         f->pcie_perf_req = mask & ATCS_PCIE_PERFORMANCE_REQUEST_SUPPORTED;
 491         f->pcie_dev_rdy = mask & ATCS_PCIE_DEVICE_READY_NOTIFICATION_SUPPORTED;
 492         f->pcie_bus_width = mask & ATCS_SET_PCIE_BUS_WIDTH_SUPPORTED;
 493 }
 494 
 495 
 496 
 497 
 498 
 499 
 500 
 501 
 502 
 503 
 504 
 505 
 506 static int radeon_atcs_verify_interface(acpi_handle handle,
 507                                         struct radeon_atcs *atcs)
 508 {
 509         union acpi_object *info;
 510         struct atcs_verify_interface output;
 511         size_t size;
 512         int err = 0;
 513 
 514         info = radeon_atcs_call(handle, ATCS_FUNCTION_VERIFY_INTERFACE, NULL);
 515         if (!info)
 516                 return -EIO;
 517 
 518         memset(&output, 0, sizeof(output));
 519 
 520         size = *(u16 *) info->buffer.pointer;
 521         if (size < 8) {
 522                 DRM_INFO("ATCS buffer is too small: %zu\n", size);
 523                 err = -EINVAL;
 524                 goto out;
 525         }
 526         size = min(sizeof(output), size);
 527 
 528         memcpy(&output, info->buffer.pointer, size);
 529 
 530         
 531         DRM_DEBUG_DRIVER("ATCS version %u\n", output.version);
 532 
 533         radeon_atcs_parse_functions(&atcs->functions, output.function_bits);
 534 
 535 out:
 536         kfree(info);
 537         return err;
 538 }
 539 
 540 
 541 
 542 
 543 
 544 
 545 
 546 
 547 
 548 
 549 bool radeon_acpi_is_pcie_performance_request_supported(struct radeon_device *rdev)
 550 {
 551         struct radeon_atcs *atcs = &rdev->atcs;
 552 
 553         if (atcs->functions.pcie_perf_req && atcs->functions.pcie_dev_rdy)
 554                 return true;
 555 
 556         return false;
 557 }
 558 
 559 
 560 
 561 
 562 
 563 
 564 
 565 
 566 
 567 
 568 int radeon_acpi_pcie_notify_device_ready(struct radeon_device *rdev)
 569 {
 570         acpi_handle handle;
 571         union acpi_object *info;
 572         struct radeon_atcs *atcs = &rdev->atcs;
 573 
 574         
 575         handle = ACPI_HANDLE(&rdev->pdev->dev);
 576         if (!handle)
 577                 return -EINVAL;
 578 
 579         if (!atcs->functions.pcie_dev_rdy)
 580                 return -EINVAL;
 581 
 582         info = radeon_atcs_call(handle, ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, NULL);
 583         if (!info)
 584                 return -EIO;
 585 
 586         kfree(info);
 587 
 588         return 0;
 589 }
 590 
 591 
 592 
 593 
 594 
 595 
 596 
 597 
 598 
 599 
 600 
 601 
 602 int radeon_acpi_pcie_performance_request(struct radeon_device *rdev,
 603                                          u8 perf_req, bool advertise)
 604 {
 605         acpi_handle handle;
 606         union acpi_object *info;
 607         struct radeon_atcs *atcs = &rdev->atcs;
 608         struct atcs_pref_req_input atcs_input;
 609         struct atcs_pref_req_output atcs_output;
 610         struct acpi_buffer params;
 611         size_t size;
 612         u32 retry = 3;
 613 
 614         
 615         handle = ACPI_HANDLE(&rdev->pdev->dev);
 616         if (!handle)
 617                 return -EINVAL;
 618 
 619         if (!atcs->functions.pcie_perf_req)
 620                 return -EINVAL;
 621 
 622         atcs_input.size = sizeof(struct atcs_pref_req_input);
 623         
 624         atcs_input.client_id = rdev->pdev->devfn | (rdev->pdev->bus->number << 8);
 625         atcs_input.valid_flags_mask = ATCS_VALID_FLAGS_MASK;
 626         atcs_input.flags = ATCS_WAIT_FOR_COMPLETION;
 627         if (advertise)
 628                 atcs_input.flags |= ATCS_ADVERTISE_CAPS;
 629         atcs_input.req_type = ATCS_PCIE_LINK_SPEED;
 630         atcs_input.perf_req = perf_req;
 631 
 632         params.length = sizeof(struct atcs_pref_req_input);
 633         params.pointer = &atcs_input;
 634 
 635         while (retry--) {
 636                 info = radeon_atcs_call(handle, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, ¶ms);
 637                 if (!info)
 638                         return -EIO;
 639 
 640                 memset(&atcs_output, 0, sizeof(atcs_output));
 641 
 642                 size = *(u16 *) info->buffer.pointer;
 643                 if (size < 3) {
 644                         DRM_INFO("ATCS buffer is too small: %zu\n", size);
 645                         kfree(info);
 646                         return -EINVAL;
 647                 }
 648                 size = min(sizeof(atcs_output), size);
 649 
 650                 memcpy(&atcs_output, info->buffer.pointer, size);
 651 
 652                 kfree(info);
 653 
 654                 switch (atcs_output.ret_val) {
 655                 case ATCS_REQUEST_REFUSED:
 656                 default:
 657                         return -EINVAL;
 658                 case ATCS_REQUEST_COMPLETE:
 659                         return 0;
 660                 case ATCS_REQUEST_IN_PROGRESS:
 661                         udelay(10);
 662                         break;
 663                 }
 664         }
 665 
 666         return 0;
 667 }
 668 
 669 
 670 
 671 
 672 
 673 
 674 
 675 
 676 
 677 
 678 
 679 
 680 static int radeon_acpi_event(struct notifier_block *nb,
 681                              unsigned long val,
 682                              void *data)
 683 {
 684         struct radeon_device *rdev = container_of(nb, struct radeon_device, acpi_nb);
 685         struct acpi_bus_event *entry = (struct acpi_bus_event *)data;
 686 
 687         if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) {
 688                 if (power_supply_is_system_supplied() > 0)
 689                         DRM_DEBUG_DRIVER("pm: AC\n");
 690                 else
 691                         DRM_DEBUG_DRIVER("pm: DC\n");
 692 
 693                 radeon_pm_acpi_event_handler(rdev);
 694         }
 695 
 696         
 697         return radeon_atif_handler(rdev, entry);
 698 }
 699 
 700 
 701 
 702 
 703 
 704 
 705 
 706 
 707 
 708 
 709 
 710 int radeon_acpi_init(struct radeon_device *rdev)
 711 {
 712         acpi_handle handle;
 713         struct radeon_atif *atif = &rdev->atif;
 714         struct radeon_atcs *atcs = &rdev->atcs;
 715         int ret;
 716 
 717         
 718         handle = ACPI_HANDLE(&rdev->pdev->dev);
 719 
 720         
 721         if (!ASIC_IS_AVIVO(rdev) || !rdev->bios || !handle)
 722                 return 0;
 723 
 724         
 725         ret = radeon_atcs_verify_interface(handle, atcs);
 726         if (ret) {
 727                 DRM_DEBUG_DRIVER("Call to ATCS verify_interface failed: %d\n", ret);
 728         }
 729 
 730         
 731         ret = radeon_atif_verify_interface(handle, atif);
 732         if (ret) {
 733                 DRM_DEBUG_DRIVER("Call to ATIF verify_interface failed: %d\n", ret);
 734                 goto out;
 735         }
 736 
 737         if (atif->notifications.brightness_change) {
 738                 struct drm_encoder *tmp;
 739                 struct radeon_encoder *target = NULL;
 740 
 741                 
 742                 list_for_each_entry(tmp, &rdev->ddev->mode_config.encoder_list,
 743                                 head) {
 744                         struct radeon_encoder *enc = to_radeon_encoder(tmp);
 745 
 746                         if ((enc->devices & (ATOM_DEVICE_LCD_SUPPORT)) &&
 747                             enc->enc_priv) {
 748                                 if (rdev->is_atom_bios) {
 749                                         struct radeon_encoder_atom_dig *dig = enc->enc_priv;
 750                                         if (dig->bl_dev) {
 751                                                 target = enc;
 752                                                 break;
 753                                         }
 754                                 } else {
 755                                         struct radeon_encoder_lvds *dig = enc->enc_priv;
 756                                         if (dig->bl_dev) {
 757                                                 target = enc;
 758                                                 break;
 759                                         }
 760                                 }
 761                         }
 762                 }
 763 
 764                 atif->encoder_for_bl = target;
 765         }
 766 
 767         if (atif->functions.sbios_requests && !atif->functions.system_params) {
 768                 
 769 
 770 
 771 
 772                 atif->functions.system_params = true;
 773         }
 774 
 775         if (atif->functions.system_params) {
 776                 ret = radeon_atif_get_notification_params(handle,
 777                                 &atif->notification_cfg);
 778                 if (ret) {
 779                         DRM_DEBUG_DRIVER("Call to GET_SYSTEM_PARAMS failed: %d\n",
 780                                         ret);
 781                         
 782                         atif->notification_cfg.enabled = false;
 783                 }
 784         }
 785 
 786 out:
 787         rdev->acpi_nb.notifier_call = radeon_acpi_event;
 788         register_acpi_notifier(&rdev->acpi_nb);
 789 
 790         return ret;
 791 }
 792 
 793 
 794 
 795 
 796 
 797 
 798 
 799 
 800 void radeon_acpi_fini(struct radeon_device *rdev)
 801 {
 802         unregister_acpi_notifier(&rdev->acpi_nb);
 803 }