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/pm_runtime.h> 29 #include <linux/suspend.h> 30 #include <acpi/video.h> 31 #include <acpi/actbl.h> 32 33 #include <drm/drm_crtc_helper.h> 34 #include "amdgpu.h" 35 #include "amdgpu_pm.h" 36 #include "amdgpu_display.h" 37 #include "amd_acpi.h" 38 #include "atom.h" 39 40 struct amdgpu_atif_notification_cfg { 41 bool enabled; 42 int command_code; 43 }; 44 45 struct amdgpu_atif_notifications { 46 bool thermal_state; 47 bool forced_power_state; 48 bool system_power_state; 49 bool brightness_change; 50 bool dgpu_display_event; 51 bool gpu_package_power_limit; 52 }; 53 54 struct amdgpu_atif_functions { 55 bool system_params; 56 bool sbios_requests; 57 bool temperature_change; 58 bool query_backlight_transfer_characteristics; 59 bool ready_to_undock; 60 bool external_gpu_information; 61 }; 62 63 struct amdgpu_atif { 64 acpi_handle handle; 65 66 struct amdgpu_atif_notifications notifications; 67 struct amdgpu_atif_functions functions; 68 struct amdgpu_atif_notification_cfg notification_cfg; 69 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 70 struct backlight_device *bd; 71 #endif 72 struct amdgpu_dm_backlight_caps backlight_caps; 73 }; 74 75 struct amdgpu_atcs_functions { 76 bool get_ext_state; 77 bool pcie_perf_req; 78 bool pcie_dev_rdy; 79 bool pcie_bus_width; 80 bool power_shift_control; 81 }; 82 83 struct amdgpu_atcs { 84 acpi_handle handle; 85 86 struct amdgpu_atcs_functions functions; 87 }; 88 89 static struct amdgpu_acpi_priv { 90 struct amdgpu_atif atif; 91 struct amdgpu_atcs atcs; 92 } amdgpu_acpi_priv; 93 94 /* Call the ATIF method 95 */ 96 /** 97 * amdgpu_atif_call - call an ATIF method 98 * 99 * @atif: atif structure 100 * @function: the ATIF function to execute 101 * @params: ATIF function params 102 * 103 * Executes the requested ATIF function (all asics). 104 * Returns a pointer to the acpi output buffer. 105 */ 106 static union acpi_object *amdgpu_atif_call(struct amdgpu_atif *atif, 107 int function, 108 struct acpi_buffer *params) 109 { 110 acpi_status status; 111 union acpi_object atif_arg_elements[2]; 112 struct acpi_object_list atif_arg; 113 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 114 115 atif_arg.count = 2; 116 atif_arg.pointer = &atif_arg_elements[0]; 117 118 atif_arg_elements[0].type = ACPI_TYPE_INTEGER; 119 atif_arg_elements[0].integer.value = function; 120 121 if (params) { 122 atif_arg_elements[1].type = ACPI_TYPE_BUFFER; 123 atif_arg_elements[1].buffer.length = params->length; 124 atif_arg_elements[1].buffer.pointer = params->pointer; 125 } else { 126 /* We need a second fake parameter */ 127 atif_arg_elements[1].type = ACPI_TYPE_INTEGER; 128 atif_arg_elements[1].integer.value = 0; 129 } 130 131 status = acpi_evaluate_object(atif->handle, NULL, &atif_arg, 132 &buffer); 133 134 /* Fail only if calling the method fails and ATIF is supported */ 135 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 136 DRM_DEBUG_DRIVER("failed to evaluate ATIF got %s\n", 137 acpi_format_exception(status)); 138 kfree(buffer.pointer); 139 return NULL; 140 } 141 142 return buffer.pointer; 143 } 144 145 /** 146 * amdgpu_atif_parse_notification - parse supported notifications 147 * 148 * @n: supported notifications struct 149 * @mask: supported notifications mask from ATIF 150 * 151 * Use the supported notifications mask from ATIF function 152 * ATIF_FUNCTION_VERIFY_INTERFACE to determine what notifications 153 * are supported (all asics). 154 */ 155 static void amdgpu_atif_parse_notification(struct amdgpu_atif_notifications *n, u32 mask) 156 { 157 n->thermal_state = mask & ATIF_THERMAL_STATE_CHANGE_REQUEST_SUPPORTED; 158 n->forced_power_state = mask & ATIF_FORCED_POWER_STATE_CHANGE_REQUEST_SUPPORTED; 159 n->system_power_state = mask & ATIF_SYSTEM_POWER_SOURCE_CHANGE_REQUEST_SUPPORTED; 160 n->brightness_change = mask & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST_SUPPORTED; 161 n->dgpu_display_event = mask & ATIF_DGPU_DISPLAY_EVENT_SUPPORTED; 162 n->gpu_package_power_limit = mask & ATIF_GPU_PACKAGE_POWER_LIMIT_REQUEST_SUPPORTED; 163 } 164 165 /** 166 * amdgpu_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 */ 175 static void amdgpu_atif_parse_functions(struct amdgpu_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->temperature_change = mask & ATIF_TEMPERATURE_CHANGE_NOTIFICATION_SUPPORTED; 180 f->query_backlight_transfer_characteristics = 181 mask & ATIF_QUERY_BACKLIGHT_TRANSFER_CHARACTERISTICS_SUPPORTED; 182 f->ready_to_undock = mask & ATIF_READY_TO_UNDOCK_NOTIFICATION_SUPPORTED; 183 f->external_gpu_information = mask & ATIF_GET_EXTERNAL_GPU_INFORMATION_SUPPORTED; 184 } 185 186 /** 187 * amdgpu_atif_verify_interface - verify ATIF 188 * 189 * @atif: amdgpu atif struct 190 * 191 * Execute the ATIF_FUNCTION_VERIFY_INTERFACE ATIF function 192 * to initialize ATIF and determine what features are supported 193 * (all asics). 194 * returns 0 on success, error on failure. 195 */ 196 static int amdgpu_atif_verify_interface(struct amdgpu_atif *atif) 197 { 198 union acpi_object *info; 199 struct atif_verify_interface output; 200 size_t size; 201 int err = 0; 202 203 info = amdgpu_atif_call(atif, ATIF_FUNCTION_VERIFY_INTERFACE, NULL); 204 if (!info) 205 return -EIO; 206 207 memset(&output, 0, sizeof(output)); 208 209 size = *(u16 *) info->buffer.pointer; 210 if (size < 12) { 211 DRM_INFO("ATIF buffer is too small: %zu\n", size); 212 err = -EINVAL; 213 goto out; 214 } 215 size = min(sizeof(output), size); 216 217 memcpy(&output, info->buffer.pointer, size); 218 219 /* TODO: check version? */ 220 DRM_DEBUG_DRIVER("ATIF version %u\n", output.version); 221 222 amdgpu_atif_parse_notification(&atif->notifications, output.notification_mask); 223 amdgpu_atif_parse_functions(&atif->functions, output.function_bits); 224 225 out: 226 kfree(info); 227 return err; 228 } 229 230 /** 231 * amdgpu_atif_get_notification_params - determine notify configuration 232 * 233 * @atif: acpi handle 234 * 235 * Execute the ATIF_FUNCTION_GET_SYSTEM_PARAMETERS ATIF function 236 * to determine if a notifier is used and if so which one 237 * (all asics). This is either Notify(VGA, 0x81) or Notify(VGA, n) 238 * where n is specified in the result if a notifier is used. 239 * Returns 0 on success, error on failure. 240 */ 241 static int amdgpu_atif_get_notification_params(struct amdgpu_atif *atif) 242 { 243 union acpi_object *info; 244 struct amdgpu_atif_notification_cfg *n = &atif->notification_cfg; 245 struct atif_system_params params; 246 size_t size; 247 int err = 0; 248 249 info = amdgpu_atif_call(atif, ATIF_FUNCTION_GET_SYSTEM_PARAMETERS, 250 NULL); 251 if (!info) { 252 err = -EIO; 253 goto out; 254 } 255 256 size = *(u16 *) info->buffer.pointer; 257 if (size < 10) { 258 err = -EINVAL; 259 goto out; 260 } 261 262 memset(¶ms, 0, sizeof(params)); 263 size = min(sizeof(params), size); 264 memcpy(¶ms, info->buffer.pointer, size); 265 266 DRM_DEBUG_DRIVER("SYSTEM_PARAMS: mask = %#x, flags = %#x\n", 267 params.flags, params.valid_mask); 268 params.flags = params.flags & params.valid_mask; 269 270 if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_NONE) { 271 n->enabled = false; 272 n->command_code = 0; 273 } else if ((params.flags & ATIF_NOTIFY_MASK) == ATIF_NOTIFY_81) { 274 n->enabled = true; 275 n->command_code = 0x81; 276 } else { 277 if (size < 11) { 278 err = -EINVAL; 279 goto out; 280 } 281 n->enabled = true; 282 n->command_code = params.command_code; 283 } 284 285 out: 286 DRM_DEBUG_DRIVER("Notification %s, command code = %#x\n", 287 (n->enabled ? "enabled" : "disabled"), 288 n->command_code); 289 kfree(info); 290 return err; 291 } 292 293 /** 294 * amdgpu_atif_query_backlight_caps - get min and max backlight input signal 295 * 296 * @atif: acpi handle 297 * 298 * Execute the QUERY_BRIGHTNESS_TRANSFER_CHARACTERISTICS ATIF function 299 * to determine the acceptable range of backlight values 300 * 301 * Backlight_caps.caps_valid will be set to true if the query is successful 302 * 303 * The input signals are in range 0-255 304 * 305 * This function assumes the display with backlight is the first LCD 306 * 307 * Returns 0 on success, error on failure. 308 */ 309 static int amdgpu_atif_query_backlight_caps(struct amdgpu_atif *atif) 310 { 311 union acpi_object *info; 312 struct atif_qbtc_output characteristics; 313 struct atif_qbtc_arguments arguments; 314 struct acpi_buffer params; 315 size_t size; 316 int err = 0; 317 318 arguments.size = sizeof(arguments); 319 arguments.requested_display = ATIF_QBTC_REQUEST_LCD1; 320 321 params.length = sizeof(arguments); 322 params.pointer = (void *)&arguments; 323 324 info = amdgpu_atif_call(atif, 325 ATIF_FUNCTION_QUERY_BRIGHTNESS_TRANSFER_CHARACTERISTICS, 326 ¶ms); 327 if (!info) { 328 err = -EIO; 329 goto out; 330 } 331 332 size = *(u16 *) info->buffer.pointer; 333 if (size < 10) { 334 err = -EINVAL; 335 goto out; 336 } 337 338 memset(&characteristics, 0, sizeof(characteristics)); 339 size = min(sizeof(characteristics), size); 340 memcpy(&characteristics, info->buffer.pointer, size); 341 342 atif->backlight_caps.caps_valid = true; 343 atif->backlight_caps.min_input_signal = 344 characteristics.min_input_signal; 345 atif->backlight_caps.max_input_signal = 346 characteristics.max_input_signal; 347 out: 348 kfree(info); 349 return err; 350 } 351 352 /** 353 * amdgpu_atif_get_sbios_requests - get requested sbios event 354 * 355 * @atif: acpi handle 356 * @req: atif sbios request struct 357 * 358 * Execute the ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS ATIF function 359 * to determine what requests the sbios is making to the driver 360 * (all asics). 361 * Returns 0 on success, error on failure. 362 */ 363 static int amdgpu_atif_get_sbios_requests(struct amdgpu_atif *atif, 364 struct atif_sbios_requests *req) 365 { 366 union acpi_object *info; 367 size_t size; 368 int count = 0; 369 370 info = amdgpu_atif_call(atif, ATIF_FUNCTION_GET_SYSTEM_BIOS_REQUESTS, 371 NULL); 372 if (!info) 373 return -EIO; 374 375 size = *(u16 *)info->buffer.pointer; 376 if (size < 0xd) { 377 count = -EINVAL; 378 goto out; 379 } 380 memset(req, 0, sizeof(*req)); 381 382 size = min(sizeof(*req), size); 383 memcpy(req, info->buffer.pointer, size); 384 DRM_DEBUG_DRIVER("SBIOS pending requests: %#x\n", req->pending); 385 386 count = hweight32(req->pending); 387 388 out: 389 kfree(info); 390 return count; 391 } 392 393 /** 394 * amdgpu_atif_handler - handle ATIF notify requests 395 * 396 * @adev: amdgpu_device pointer 397 * @event: atif sbios request struct 398 * 399 * Checks the acpi event and if it matches an atif event, 400 * handles it. 401 * 402 * Returns: 403 * NOTIFY_BAD or NOTIFY_DONE, depending on the event. 404 */ 405 static int amdgpu_atif_handler(struct amdgpu_device *adev, 406 struct acpi_bus_event *event) 407 { 408 struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 409 int count; 410 411 DRM_DEBUG_DRIVER("event, device_class = %s, type = %#x\n", 412 event->device_class, event->type); 413 414 if (strcmp(event->device_class, ACPI_VIDEO_CLASS) != 0) 415 return NOTIFY_DONE; 416 417 /* Is this actually our event? */ 418 if (!atif->notification_cfg.enabled || 419 event->type != atif->notification_cfg.command_code) { 420 /* These events will generate keypresses otherwise */ 421 if (event->type == ACPI_VIDEO_NOTIFY_PROBE) 422 return NOTIFY_BAD; 423 else 424 return NOTIFY_DONE; 425 } 426 427 if (atif->functions.sbios_requests) { 428 struct atif_sbios_requests req; 429 430 /* Check pending SBIOS requests */ 431 count = amdgpu_atif_get_sbios_requests(atif, &req); 432 433 if (count <= 0) 434 return NOTIFY_BAD; 435 436 DRM_DEBUG_DRIVER("ATIF: %d pending SBIOS requests\n", count); 437 438 if (req.pending & ATIF_PANEL_BRIGHTNESS_CHANGE_REQUEST) { 439 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 440 if (atif->bd) { 441 DRM_DEBUG_DRIVER("Changing brightness to %d\n", 442 req.backlight_level); 443 /* 444 * XXX backlight_device_set_brightness() is 445 * hardwired to post BACKLIGHT_UPDATE_SYSFS. 446 * It probably should accept 'reason' parameter. 447 */ 448 backlight_device_set_brightness(atif->bd, req.backlight_level); 449 } 450 #endif 451 } 452 453 if (req.pending & ATIF_DGPU_DISPLAY_EVENT) { 454 if (adev->flags & AMD_IS_PX) { 455 pm_runtime_get_sync(adev_to_drm(adev)->dev); 456 /* Just fire off a uevent and let userspace tell us what to do */ 457 drm_helper_hpd_irq_event(adev_to_drm(adev)); 458 pm_runtime_mark_last_busy(adev_to_drm(adev)->dev); 459 pm_runtime_put_autosuspend(adev_to_drm(adev)->dev); 460 } 461 } 462 /* TODO: check other events */ 463 } 464 465 /* We've handled the event, stop the notifier chain. The ACPI interface 466 * overloads ACPI_VIDEO_NOTIFY_PROBE, we don't want to send that to 467 * userspace if the event was generated only to signal a SBIOS 468 * request. 469 */ 470 return NOTIFY_BAD; 471 } 472 473 /* Call the ATCS method 474 */ 475 /** 476 * amdgpu_atcs_call - call an ATCS method 477 * 478 * @atcs: atcs structure 479 * @function: the ATCS function to execute 480 * @params: ATCS function params 481 * 482 * Executes the requested ATCS function (all asics). 483 * Returns a pointer to the acpi output buffer. 484 */ 485 static union acpi_object *amdgpu_atcs_call(struct amdgpu_atcs *atcs, 486 int function, 487 struct acpi_buffer *params) 488 { 489 acpi_status status; 490 union acpi_object atcs_arg_elements[2]; 491 struct acpi_object_list atcs_arg; 492 struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; 493 494 atcs_arg.count = 2; 495 atcs_arg.pointer = &atcs_arg_elements[0]; 496 497 atcs_arg_elements[0].type = ACPI_TYPE_INTEGER; 498 atcs_arg_elements[0].integer.value = function; 499 500 if (params) { 501 atcs_arg_elements[1].type = ACPI_TYPE_BUFFER; 502 atcs_arg_elements[1].buffer.length = params->length; 503 atcs_arg_elements[1].buffer.pointer = params->pointer; 504 } else { 505 /* We need a second fake parameter */ 506 atcs_arg_elements[1].type = ACPI_TYPE_INTEGER; 507 atcs_arg_elements[1].integer.value = 0; 508 } 509 510 status = acpi_evaluate_object(atcs->handle, NULL, &atcs_arg, &buffer); 511 512 /* Fail only if calling the method fails and ATIF is supported */ 513 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { 514 DRM_DEBUG_DRIVER("failed to evaluate ATCS got %s\n", 515 acpi_format_exception(status)); 516 kfree(buffer.pointer); 517 return NULL; 518 } 519 520 return buffer.pointer; 521 } 522 523 /** 524 * amdgpu_atcs_parse_functions - parse supported functions 525 * 526 * @f: supported functions struct 527 * @mask: supported functions mask from ATCS 528 * 529 * Use the supported functions mask from ATCS function 530 * ATCS_FUNCTION_VERIFY_INTERFACE to determine what functions 531 * are supported (all asics). 532 */ 533 static void amdgpu_atcs_parse_functions(struct amdgpu_atcs_functions *f, u32 mask) 534 { 535 f->get_ext_state = mask & ATCS_GET_EXTERNAL_STATE_SUPPORTED; 536 f->pcie_perf_req = mask & ATCS_PCIE_PERFORMANCE_REQUEST_SUPPORTED; 537 f->pcie_dev_rdy = mask & ATCS_PCIE_DEVICE_READY_NOTIFICATION_SUPPORTED; 538 f->pcie_bus_width = mask & ATCS_SET_PCIE_BUS_WIDTH_SUPPORTED; 539 f->power_shift_control = mask & ATCS_SET_POWER_SHIFT_CONTROL_SUPPORTED; 540 } 541 542 /** 543 * amdgpu_atcs_verify_interface - verify ATCS 544 * 545 * @atcs: amdgpu atcs struct 546 * 547 * Execute the ATCS_FUNCTION_VERIFY_INTERFACE ATCS function 548 * to initialize ATCS and determine what features are supported 549 * (all asics). 550 * returns 0 on success, error on failure. 551 */ 552 static int amdgpu_atcs_verify_interface(struct amdgpu_atcs *atcs) 553 { 554 union acpi_object *info; 555 struct atcs_verify_interface output; 556 size_t size; 557 int err = 0; 558 559 info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_VERIFY_INTERFACE, NULL); 560 if (!info) 561 return -EIO; 562 563 memset(&output, 0, sizeof(output)); 564 565 size = *(u16 *) info->buffer.pointer; 566 if (size < 8) { 567 DRM_INFO("ATCS buffer is too small: %zu\n", size); 568 err = -EINVAL; 569 goto out; 570 } 571 size = min(sizeof(output), size); 572 573 memcpy(&output, info->buffer.pointer, size); 574 575 /* TODO: check version? */ 576 DRM_DEBUG_DRIVER("ATCS version %u\n", output.version); 577 578 amdgpu_atcs_parse_functions(&atcs->functions, output.function_bits); 579 580 out: 581 kfree(info); 582 return err; 583 } 584 585 /** 586 * amdgpu_acpi_is_pcie_performance_request_supported 587 * 588 * @adev: amdgpu_device pointer 589 * 590 * Check if the ATCS pcie_perf_req and pcie_dev_rdy methods 591 * are supported (all asics). 592 * returns true if supported, false if not. 593 */ 594 bool amdgpu_acpi_is_pcie_performance_request_supported(struct amdgpu_device *adev) 595 { 596 struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 597 598 if (atcs->functions.pcie_perf_req && atcs->functions.pcie_dev_rdy) 599 return true; 600 601 return false; 602 } 603 604 /** 605 * amdgpu_acpi_is_power_shift_control_supported 606 * 607 * Check if the ATCS power shift control method 608 * is supported. 609 * returns true if supported, false if not. 610 */ 611 bool amdgpu_acpi_is_power_shift_control_supported(void) 612 { 613 return amdgpu_acpi_priv.atcs.functions.power_shift_control; 614 } 615 616 /** 617 * amdgpu_acpi_pcie_notify_device_ready 618 * 619 * @adev: amdgpu_device pointer 620 * 621 * Executes the PCIE_DEVICE_READY_NOTIFICATION method 622 * (all asics). 623 * returns 0 on success, error on failure. 624 */ 625 int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev) 626 { 627 union acpi_object *info; 628 struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 629 630 if (!atcs->functions.pcie_dev_rdy) 631 return -EINVAL; 632 633 info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, NULL); 634 if (!info) 635 return -EIO; 636 637 kfree(info); 638 639 return 0; 640 } 641 642 /** 643 * amdgpu_acpi_pcie_performance_request 644 * 645 * @adev: amdgpu_device pointer 646 * @perf_req: requested perf level (pcie gen speed) 647 * @advertise: set advertise caps flag if set 648 * 649 * Executes the PCIE_PERFORMANCE_REQUEST method to 650 * change the pcie gen speed (all asics). 651 * returns 0 on success, error on failure. 652 */ 653 int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev, 654 u8 perf_req, bool advertise) 655 { 656 union acpi_object *info; 657 struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 658 struct atcs_pref_req_input atcs_input; 659 struct atcs_pref_req_output atcs_output; 660 struct acpi_buffer params; 661 size_t size; 662 u32 retry = 3; 663 664 if (amdgpu_acpi_pcie_notify_device_ready(adev)) 665 return -EINVAL; 666 667 if (!atcs->functions.pcie_perf_req) 668 return -EINVAL; 669 670 atcs_input.size = sizeof(struct atcs_pref_req_input); 671 /* client id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */ 672 atcs_input.client_id = adev->pdev->devfn | (adev->pdev->bus->number << 8); 673 atcs_input.valid_flags_mask = ATCS_VALID_FLAGS_MASK; 674 atcs_input.flags = ATCS_WAIT_FOR_COMPLETION; 675 if (advertise) 676 atcs_input.flags |= ATCS_ADVERTISE_CAPS; 677 atcs_input.req_type = ATCS_PCIE_LINK_SPEED; 678 atcs_input.perf_req = perf_req; 679 680 params.length = sizeof(struct atcs_pref_req_input); 681 params.pointer = &atcs_input; 682 683 while (retry--) { 684 info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, ¶ms); 685 if (!info) 686 return -EIO; 687 688 memset(&atcs_output, 0, sizeof(atcs_output)); 689 690 size = *(u16 *) info->buffer.pointer; 691 if (size < 3) { 692 DRM_INFO("ATCS buffer is too small: %zu\n", size); 693 kfree(info); 694 return -EINVAL; 695 } 696 size = min(sizeof(atcs_output), size); 697 698 memcpy(&atcs_output, info->buffer.pointer, size); 699 700 kfree(info); 701 702 switch (atcs_output.ret_val) { 703 case ATCS_REQUEST_REFUSED: 704 default: 705 return -EINVAL; 706 case ATCS_REQUEST_COMPLETE: 707 return 0; 708 case ATCS_REQUEST_IN_PROGRESS: 709 udelay(10); 710 break; 711 } 712 } 713 714 return 0; 715 } 716 717 /** 718 * amdgpu_acpi_power_shift_control 719 * 720 * @adev: amdgpu_device pointer 721 * @dev_state: device acpi state 722 * @drv_state: driver state 723 * 724 * Executes the POWER_SHIFT_CONTROL method to 725 * communicate current dGPU device state and 726 * driver state to APU/SBIOS. 727 * returns 0 on success, error on failure. 728 */ 729 int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 730 u8 dev_state, bool drv_state) 731 { 732 union acpi_object *info; 733 struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 734 struct atcs_pwr_shift_input atcs_input; 735 struct acpi_buffer params; 736 737 if (!amdgpu_acpi_is_power_shift_control_supported()) 738 return -EINVAL; 739 740 atcs_input.size = sizeof(struct atcs_pwr_shift_input); 741 /* dGPU id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */ 742 atcs_input.dgpu_id = adev->pdev->devfn | (adev->pdev->bus->number << 8); 743 atcs_input.dev_acpi_state = dev_state; 744 atcs_input.drv_state = drv_state; 745 746 params.length = sizeof(struct atcs_pwr_shift_input); 747 params.pointer = &atcs_input; 748 749 info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_POWER_SHIFT_CONTROL, ¶ms); 750 if (!info) { 751 DRM_ERROR("ATCS PSC update failed\n"); 752 return -EIO; 753 } 754 755 return 0; 756 } 757 758 /** 759 * amdgpu_acpi_smart_shift_update - update dGPU device state to SBIOS 760 * 761 * @dev: drm_device pointer 762 * @ss_state: current smart shift event 763 * 764 * returns 0 on success, 765 * otherwise return error number. 766 */ 767 int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state) 768 { 769 struct amdgpu_device *adev = drm_to_adev(dev); 770 int r; 771 772 if (!amdgpu_device_supports_smart_shift(dev)) 773 return 0; 774 775 switch (ss_state) { 776 /* SBIOS trigger “stop”, “enable” and “start” at D0, Driver Operational. 777 * SBIOS trigger “stop” at D3, Driver Not Operational. 778 * SBIOS trigger “stop” and “disable” at D0, Driver NOT operational. 779 */ 780 case AMDGPU_SS_DRV_LOAD: 781 r = amdgpu_acpi_power_shift_control(adev, 782 AMDGPU_ATCS_PSC_DEV_STATE_D0, 783 AMDGPU_ATCS_PSC_DRV_STATE_OPR); 784 break; 785 case AMDGPU_SS_DEV_D0: 786 r = amdgpu_acpi_power_shift_control(adev, 787 AMDGPU_ATCS_PSC_DEV_STATE_D0, 788 AMDGPU_ATCS_PSC_DRV_STATE_OPR); 789 break; 790 case AMDGPU_SS_DEV_D3: 791 r = amdgpu_acpi_power_shift_control(adev, 792 AMDGPU_ATCS_PSC_DEV_STATE_D3_HOT, 793 AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR); 794 break; 795 case AMDGPU_SS_DRV_UNLOAD: 796 r = amdgpu_acpi_power_shift_control(adev, 797 AMDGPU_ATCS_PSC_DEV_STATE_D0, 798 AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR); 799 break; 800 default: 801 return -EINVAL; 802 } 803 804 return r; 805 } 806 807 /** 808 * amdgpu_acpi_event - handle notify events 809 * 810 * @nb: notifier block 811 * @val: val 812 * @data: acpi event 813 * 814 * Calls relevant amdgpu functions in response to various 815 * acpi events. 816 * Returns NOTIFY code 817 */ 818 static int amdgpu_acpi_event(struct notifier_block *nb, 819 unsigned long val, 820 void *data) 821 { 822 struct amdgpu_device *adev = container_of(nb, struct amdgpu_device, acpi_nb); 823 struct acpi_bus_event *entry = (struct acpi_bus_event *)data; 824 825 if (strcmp(entry->device_class, ACPI_AC_CLASS) == 0) { 826 if (power_supply_is_system_supplied() > 0) 827 DRM_DEBUG_DRIVER("pm: AC\n"); 828 else 829 DRM_DEBUG_DRIVER("pm: DC\n"); 830 831 amdgpu_pm_acpi_event_handler(adev); 832 } 833 834 /* Check for pending SBIOS requests */ 835 return amdgpu_atif_handler(adev, entry); 836 } 837 838 /* Call all ACPI methods here */ 839 /** 840 * amdgpu_acpi_init - init driver acpi support 841 * 842 * @adev: amdgpu_device pointer 843 * 844 * Verifies the AMD ACPI interfaces and registers with the acpi 845 * notifier chain (all asics). 846 * Returns 0 on success, error on failure. 847 */ 848 int amdgpu_acpi_init(struct amdgpu_device *adev) 849 { 850 struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 851 852 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 853 if (atif->notifications.brightness_change) { 854 if (amdgpu_device_has_dc_support(adev)) { 855 #if defined(CONFIG_DRM_AMD_DC) 856 struct amdgpu_display_manager *dm = &adev->dm; 857 if (dm->backlight_dev[0]) 858 atif->bd = dm->backlight_dev[0]; 859 #endif 860 } else { 861 struct drm_encoder *tmp; 862 863 /* Find the encoder controlling the brightness */ 864 list_for_each_entry(tmp, &adev_to_drm(adev)->mode_config.encoder_list, 865 head) { 866 struct amdgpu_encoder *enc = to_amdgpu_encoder(tmp); 867 868 if ((enc->devices & (ATOM_DEVICE_LCD_SUPPORT)) && 869 enc->enc_priv) { 870 struct amdgpu_encoder_atom_dig *dig = enc->enc_priv; 871 if (dig->bl_dev) { 872 atif->bd = dig->bl_dev; 873 break; 874 } 875 } 876 } 877 } 878 } 879 #endif 880 adev->acpi_nb.notifier_call = amdgpu_acpi_event; 881 register_acpi_notifier(&adev->acpi_nb); 882 883 return 0; 884 } 885 886 void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps) 887 { 888 struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 889 890 caps->caps_valid = atif->backlight_caps.caps_valid; 891 caps->min_input_signal = atif->backlight_caps.min_input_signal; 892 caps->max_input_signal = atif->backlight_caps.max_input_signal; 893 } 894 895 /** 896 * amdgpu_acpi_fini - tear down driver acpi support 897 * 898 * @adev: amdgpu_device pointer 899 * 900 * Unregisters with the acpi notifier chain (all asics). 901 */ 902 void amdgpu_acpi_fini(struct amdgpu_device *adev) 903 { 904 unregister_acpi_notifier(&adev->acpi_nb); 905 } 906 907 /** 908 * amdgpu_atif_pci_probe_handle - look up the ATIF handle 909 * 910 * @pdev: pci device 911 * 912 * Look up the ATIF handles (all asics). 913 * Returns true if the handle is found, false if not. 914 */ 915 static bool amdgpu_atif_pci_probe_handle(struct pci_dev *pdev) 916 { 917 char acpi_method_name[255] = { 0 }; 918 struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name}; 919 acpi_handle dhandle, atif_handle; 920 acpi_status status; 921 int ret; 922 923 dhandle = ACPI_HANDLE(&pdev->dev); 924 if (!dhandle) 925 return false; 926 927 status = acpi_get_handle(dhandle, "ATIF", &atif_handle); 928 if (ACPI_FAILURE(status)) { 929 return false; 930 } 931 amdgpu_acpi_priv.atif.handle = atif_handle; 932 acpi_get_name(amdgpu_acpi_priv.atif.handle, ACPI_FULL_PATHNAME, &buffer); 933 DRM_DEBUG_DRIVER("Found ATIF handle %s\n", acpi_method_name); 934 ret = amdgpu_atif_verify_interface(&amdgpu_acpi_priv.atif); 935 if (ret) { 936 amdgpu_acpi_priv.atif.handle = 0; 937 return false; 938 } 939 return true; 940 } 941 942 /** 943 * amdgpu_atcs_pci_probe_handle - look up the ATCS handle 944 * 945 * @pdev: pci device 946 * 947 * Look up the ATCS handles (all asics). 948 * Returns true if the handle is found, false if not. 949 */ 950 static bool amdgpu_atcs_pci_probe_handle(struct pci_dev *pdev) 951 { 952 char acpi_method_name[255] = { 0 }; 953 struct acpi_buffer buffer = { sizeof(acpi_method_name), acpi_method_name }; 954 acpi_handle dhandle, atcs_handle; 955 acpi_status status; 956 int ret; 957 958 dhandle = ACPI_HANDLE(&pdev->dev); 959 if (!dhandle) 960 return false; 961 962 status = acpi_get_handle(dhandle, "ATCS", &atcs_handle); 963 if (ACPI_FAILURE(status)) { 964 return false; 965 } 966 amdgpu_acpi_priv.atcs.handle = atcs_handle; 967 acpi_get_name(amdgpu_acpi_priv.atcs.handle, ACPI_FULL_PATHNAME, &buffer); 968 DRM_DEBUG_DRIVER("Found ATCS handle %s\n", acpi_method_name); 969 ret = amdgpu_atcs_verify_interface(&amdgpu_acpi_priv.atcs); 970 if (ret) { 971 amdgpu_acpi_priv.atcs.handle = 0; 972 return false; 973 } 974 return true; 975 } 976 977 /* 978 * amdgpu_acpi_detect - detect ACPI ATIF/ATCS methods 979 * 980 * Check if we have the ATIF/ATCS methods and populate 981 * the structures in the driver. 982 */ 983 void amdgpu_acpi_detect(void) 984 { 985 struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 986 struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 987 struct pci_dev *pdev = NULL; 988 int ret; 989 990 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { 991 if (!atif->handle) 992 amdgpu_atif_pci_probe_handle(pdev); 993 if (!atcs->handle) 994 amdgpu_atcs_pci_probe_handle(pdev); 995 } 996 997 while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { 998 if (!atif->handle) 999 amdgpu_atif_pci_probe_handle(pdev); 1000 if (!atcs->handle) 1001 amdgpu_atcs_pci_probe_handle(pdev); 1002 } 1003 1004 if (atif->functions.sbios_requests && !atif->functions.system_params) { 1005 /* XXX check this workraround, if sbios request function is 1006 * present we have to see how it's configured in the system 1007 * params 1008 */ 1009 atif->functions.system_params = true; 1010 } 1011 1012 if (atif->functions.system_params) { 1013 ret = amdgpu_atif_get_notification_params(atif); 1014 if (ret) { 1015 DRM_DEBUG_DRIVER("Call to GET_SYSTEM_PARAMS failed: %d\n", 1016 ret); 1017 /* Disable notification */ 1018 atif->notification_cfg.enabled = false; 1019 } 1020 } 1021 1022 if (atif->functions.query_backlight_transfer_characteristics) { 1023 ret = amdgpu_atif_query_backlight_caps(atif); 1024 if (ret) { 1025 DRM_DEBUG_DRIVER("Call to QUERY_BACKLIGHT_TRANSFER_CHARACTERISTICS failed: %d\n", 1026 ret); 1027 atif->backlight_caps.caps_valid = false; 1028 } 1029 } else { 1030 atif->backlight_caps.caps_valid = false; 1031 } 1032 } 1033 1034 /** 1035 * amdgpu_acpi_is_s0ix_active 1036 * 1037 * @adev: amdgpu_device_pointer 1038 * 1039 * returns true if supported, false if not. 1040 */ 1041 bool amdgpu_acpi_is_s0ix_active(struct amdgpu_device *adev) 1042 { 1043 #if IS_ENABLED(CONFIG_AMD_PMC) && IS_ENABLED(CONFIG_PM_SLEEP) 1044 if (acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0) { 1045 if (adev->flags & AMD_IS_APU) 1046 return pm_suspend_target_state == PM_SUSPEND_TO_IDLE; 1047 } 1048 #endif 1049 return false; 1050 } 1051