Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'amd-drm-next-5.14-2021-06-02' of https://gitlab.freedesktop.org/agd5f/linux into drm-next

amd-drm-next-5.14-2021-06-02:

amdgpu:
- GC/MM register access macro clean up for SR-IOV
- Beige Goby updates
- W=1 Fixes
- Aldebaran fixes
- Misc display fixes
- ACPI ATCS/ATIF handling rework
- SR-IOV fixes
- RAS fixes
- 16bpc fixed point format support
- Initial smartshift support
- RV/PCO power tuning fixes for suspend/resume
- More buffer object subclassing work
- Add new INFO query for additional vbios information
- Add new placement for preemptable SG buffers

amdkfd:
- Misc fixes

radeon:
- W=1 Fixes
- Misc cleanups

UAPI:
- Add new INFO query for additional vbios information
Useful for debugging vbios related issues. Proposed umr patch:
https://patchwork.freedesktop.org/patch/433297/
- 16bpc fixed point format support
IGT test:
https://lists.freedesktop.org/archives/igt-dev/2021-May/031507.html
Proposed Vulkan patch:
https://github.com/kleinerm/pal/commit/a25d4802074b13a8d5f7edc96ae45469ecbac3c4
- Add a new GEM flag which is only used internally in the kernel driver. Userspace
is not allowed to set it.

drm:
- 16bpc fixed point format fourcc

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210602214009.4553-1-alexander.deucher@amd.com

+2704 -1497
+4 -3
drivers/gpu/drm/amd/amdgpu/Makefile
··· 51 51 atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ 52 52 amdgpu_dma_buf.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ 53 53 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \ 54 - amdgpu_gtt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o amdgpu_atomfirmware.o \ 55 - amdgpu_vf_error.o amdgpu_sched.o amdgpu_debugfs.o amdgpu_ids.o \ 56 - amdgpu_gmc.o amdgpu_mmhub.o amdgpu_xgmi.o amdgpu_csa.o amdgpu_ras.o amdgpu_vm_cpu.o \ 54 + amdgpu_gtt_mgr.o amdgpu_preempt_mgr.o amdgpu_vram_mgr.o amdgpu_virt.o \ 55 + amdgpu_atomfirmware.o amdgpu_vf_error.o amdgpu_sched.o \ 56 + amdgpu_debugfs.o amdgpu_ids.o amdgpu_gmc.o amdgpu_mmhub.o \ 57 + amdgpu_xgmi.o amdgpu_csa.o amdgpu_ras.o amdgpu_vm_cpu.o \ 57 58 amdgpu_vm_sdma.o amdgpu_discovery.o amdgpu_ras_eeprom.o amdgpu_nbio.o \ 58 59 amdgpu_umc.o smu_v11_0_i2c.o amdgpu_fru_eeprom.o amdgpu_rap.o \ 59 60 amdgpu_fw_attestation.o amdgpu_securedisplay.o amdgpu_hdp.o
+1 -1
drivers/gpu/drm/amd/amdgpu/aldebaran.c
··· 227 227 break; 228 228 default: 229 229 break; 230 - }; 230 + } 231 231 } 232 232 233 233 /* Reinit NBIF block */
+28 -19
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 130 130 bool pending_reset; 131 131 }; 132 132 133 + enum amdgpu_ss { 134 + AMDGPU_SS_DRV_LOAD, 135 + AMDGPU_SS_DEV_D0, 136 + AMDGPU_SS_DEV_D3, 137 + AMDGPU_SS_DRV_UNLOAD 138 + }; 139 + 133 140 struct amdgpu_watchdog_timer 134 141 { 135 142 bool timeout_fatal_disable; ··· 275 268 struct amdgpu_irq_src; 276 269 struct amdgpu_fpriv; 277 270 struct amdgpu_bo_va_mapping; 278 - struct amdgpu_atif; 279 271 struct kfd_vm_fault_info; 280 272 struct amdgpu_hive_info; 281 273 struct amdgpu_reset_context; ··· 689 683 }; 690 684 691 685 /* 692 - * ACPI 693 - */ 694 - struct amdgpu_atcs_functions { 695 - bool get_ext_state; 696 - bool pcie_perf_req; 697 - bool pcie_dev_rdy; 698 - bool pcie_bus_width; 699 - }; 700 - 701 - struct amdgpu_atcs { 702 - struct amdgpu_atcs_functions functions; 703 - }; 704 - 705 - /* 706 686 * CGS 707 687 */ 708 688 struct cgs_device *amdgpu_cgs_create_device(struct amdgpu_device *adev); ··· 817 825 struct notifier_block acpi_nb; 818 826 struct amdgpu_i2c_chan *i2c_bus[AMDGPU_MAX_I2C_BUS]; 819 827 struct debugfs_blob_wrapper debugfs_vbios_blob; 820 - struct amdgpu_atif *atif; 821 - struct amdgpu_atcs atcs; 822 828 struct mutex srbm_mutex; 823 829 /* GRBM index mutex. Protects concurrent access to GRBM index */ 824 830 struct mutex grbm_idx_mutex; ··· 1136 1146 * Registers read & write functions. 1137 1147 */ 1138 1148 #define AMDGPU_REGS_NO_KIQ (1<<1) 1149 + #define AMDGPU_REGS_RLC (1<<2) 1139 1150 1140 1151 #define RREG32_NO_KIQ(reg) amdgpu_device_rreg(adev, (reg), AMDGPU_REGS_NO_KIQ) 1141 1152 #define WREG32_NO_KIQ(reg, v) amdgpu_device_wreg(adev, (reg), (v), AMDGPU_REGS_NO_KIQ) ··· 1273 1282 bool amdgpu_device_supports_atpx(struct drm_device *dev); 1274 1283 bool amdgpu_device_supports_px(struct drm_device *dev); 1275 1284 bool amdgpu_device_supports_boco(struct drm_device *dev); 1285 + bool amdgpu_device_supports_smart_shift(struct drm_device *dev); 1276 1286 bool amdgpu_device_supports_baco(struct drm_device *dev); 1277 1287 bool amdgpu_device_is_peer_accessible(struct amdgpu_device *adev, 1278 1288 struct amdgpu_device *peer_adev); ··· 1348 1356 struct amdgpu_afmt_acr amdgpu_afmt_acr(uint32_t clock); 1349 1357 1350 1358 /* amdgpu_acpi.c */ 1359 + 1360 + /* ATCS Device/Driver State */ 1361 + #define AMDGPU_ATCS_PSC_DEV_STATE_D0 0 1362 + #define AMDGPU_ATCS_PSC_DEV_STATE_D3_HOT 3 1363 + #define AMDGPU_ATCS_PSC_DRV_STATE_OPR 0 1364 + #define AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR 1 1365 + 1351 1366 #if defined(CONFIG_ACPI) 1352 1367 int amdgpu_acpi_init(struct amdgpu_device *adev); 1353 1368 void amdgpu_acpi_fini(struct amdgpu_device *adev); 1354 1369 bool amdgpu_acpi_is_pcie_performance_request_supported(struct amdgpu_device *adev); 1370 + bool amdgpu_acpi_is_power_shift_control_supported(void); 1355 1371 int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev, 1356 1372 u8 perf_req, bool advertise); 1373 + int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 1374 + u8 dev_state, bool drv_state); 1375 + int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state); 1357 1376 int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev); 1358 1377 1359 - void amdgpu_acpi_get_backlight_caps(struct amdgpu_device *adev, 1360 - struct amdgpu_dm_backlight_caps *caps); 1378 + void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps); 1361 1379 bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev); 1380 + void amdgpu_acpi_detect(void); 1362 1381 #else 1363 1382 static inline int amdgpu_acpi_init(struct amdgpu_device *adev) { return 0; } 1364 1383 static inline void amdgpu_acpi_fini(struct amdgpu_device *adev) { } 1365 1384 static inline bool amdgpu_acpi_is_s0ix_supported(struct amdgpu_device *adev) { return false; } 1385 + static inline void amdgpu_acpi_detect(void) { } 1386 + static inline bool amdgpu_acpi_is_power_shift_control_supported(void) { return false; } 1387 + static inline int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 1388 + u8 dev_state, bool drv_state) { return 0; } 1389 + static inline int amdgpu_acpi_smart_shift_update(struct drm_device *dev, 1390 + enum amdgpu_ss ss_state) { return 0; } 1366 1391 #endif 1367 1392 1368 1393 int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
+262 -126
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
··· 71 71 struct amdgpu_dm_backlight_caps backlight_caps; 72 72 }; 73 73 74 + struct amdgpu_atcs_functions { 75 + bool get_ext_state; 76 + bool pcie_perf_req; 77 + bool pcie_dev_rdy; 78 + bool pcie_bus_width; 79 + bool power_shift_control; 80 + }; 81 + 82 + struct amdgpu_atcs { 83 + acpi_handle handle; 84 + 85 + struct amdgpu_atcs_functions functions; 86 + }; 87 + 88 + static struct amdgpu_acpi_priv { 89 + struct amdgpu_atif atif; 90 + struct amdgpu_atcs atcs; 91 + } amdgpu_acpi_priv; 92 + 74 93 /* Call the ATIF method 75 94 */ 76 95 /** 77 96 * amdgpu_atif_call - call an ATIF method 78 97 * 79 - * @atif: acpi handle 98 + * @atif: atif structure 80 99 * @function: the ATIF function to execute 81 100 * @params: ATIF function params 82 101 * ··· 224 205 out: 225 206 kfree(info); 226 207 return err; 227 - } 228 - 229 - static acpi_handle amdgpu_atif_probe_handle(acpi_handle dhandle) 230 - { 231 - acpi_handle handle = NULL; 232 - char acpi_method_name[255] = { 0 }; 233 - struct acpi_buffer buffer = { sizeof(acpi_method_name), acpi_method_name }; 234 - acpi_status status; 235 - 236 - /* For PX/HG systems, ATIF and ATPX are in the iGPU's namespace, on dGPU only 237 - * systems, ATIF is in the dGPU's namespace. 238 - */ 239 - status = acpi_get_handle(dhandle, "ATIF", &handle); 240 - if (ACPI_SUCCESS(status)) 241 - goto out; 242 - 243 - if (amdgpu_has_atpx()) { 244 - status = acpi_get_handle(amdgpu_atpx_get_dhandle(), "ATIF", 245 - &handle); 246 - if (ACPI_SUCCESS(status)) 247 - goto out; 248 - } 249 - 250 - DRM_DEBUG_DRIVER("No ATIF handle found\n"); 251 - return NULL; 252 - out: 253 - acpi_get_name(handle, ACPI_FULL_PATHNAME, &buffer); 254 - DRM_DEBUG_DRIVER("Found ATIF handle %s\n", acpi_method_name); 255 - return handle; 256 208 } 257 209 258 210 /** ··· 404 414 static int amdgpu_atif_handler(struct amdgpu_device *adev, 405 415 struct acpi_bus_event *event) 406 416 { 407 - struct amdgpu_atif *atif = adev->atif; 417 + struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 408 418 int count; 409 419 410 420 DRM_DEBUG_DRIVER("event, device_class = %s, type = %#x\n", ··· 414 424 return NOTIFY_DONE; 415 425 416 426 /* Is this actually our event? */ 417 - if (!atif || 418 - !atif->notification_cfg.enabled || 427 + if (!atif->notification_cfg.enabled || 419 428 event->type != atif->notification_cfg.command_code) { 420 429 /* These events will generate keypresses otherwise */ 421 430 if (event->type == ACPI_VIDEO_NOTIFY_PROBE) ··· 474 485 /** 475 486 * amdgpu_atcs_call - call an ATCS method 476 487 * 477 - * @handle: acpi handle 488 + * @atcs: atcs structure 478 489 * @function: the ATCS function to execute 479 490 * @params: ATCS function params 480 491 * 481 492 * Executes the requested ATCS function (all asics). 482 493 * Returns a pointer to the acpi output buffer. 483 494 */ 484 - static union acpi_object *amdgpu_atcs_call(acpi_handle handle, int function, 495 + static union acpi_object *amdgpu_atcs_call(struct amdgpu_atcs *atcs, 496 + int function, 485 497 struct acpi_buffer *params) 486 498 { 487 499 acpi_status status; ··· 506 516 atcs_arg_elements[1].integer.value = 0; 507 517 } 508 518 509 - status = acpi_evaluate_object(handle, "ATCS", &atcs_arg, &buffer); 519 + status = acpi_evaluate_object(atcs->handle, NULL, &atcs_arg, &buffer); 510 520 511 521 /* Fail only if calling the method fails and ATIF is supported */ 512 522 if (ACPI_FAILURE(status) && status != AE_NOT_FOUND) { ··· 535 545 f->pcie_perf_req = mask & ATCS_PCIE_PERFORMANCE_REQUEST_SUPPORTED; 536 546 f->pcie_dev_rdy = mask & ATCS_PCIE_DEVICE_READY_NOTIFICATION_SUPPORTED; 537 547 f->pcie_bus_width = mask & ATCS_SET_PCIE_BUS_WIDTH_SUPPORTED; 548 + f->power_shift_control = mask & ATCS_SET_POWER_SHIFT_CONTROL_SUPPORTED; 538 549 } 539 550 540 551 /** 541 552 * amdgpu_atcs_verify_interface - verify ATCS 542 553 * 543 - * @handle: acpi handle 544 554 * @atcs: amdgpu atcs struct 545 555 * 546 556 * Execute the ATCS_FUNCTION_VERIFY_INTERFACE ATCS function ··· 548 558 * (all asics). 549 559 * returns 0 on success, error on failure. 550 560 */ 551 - static int amdgpu_atcs_verify_interface(acpi_handle handle, 552 - struct amdgpu_atcs *atcs) 561 + static int amdgpu_atcs_verify_interface(struct amdgpu_atcs *atcs) 553 562 { 554 563 union acpi_object *info; 555 564 struct atcs_verify_interface output; 556 565 size_t size; 557 566 int err = 0; 558 567 559 - info = amdgpu_atcs_call(handle, ATCS_FUNCTION_VERIFY_INTERFACE, NULL); 568 + info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_VERIFY_INTERFACE, NULL); 560 569 if (!info) 561 570 return -EIO; 562 571 ··· 592 603 */ 593 604 bool amdgpu_acpi_is_pcie_performance_request_supported(struct amdgpu_device *adev) 594 605 { 595 - struct amdgpu_atcs *atcs = &adev->atcs; 606 + struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 596 607 597 608 if (atcs->functions.pcie_perf_req && atcs->functions.pcie_dev_rdy) 598 609 return true; 599 610 600 611 return false; 612 + } 613 + 614 + /** 615 + * amdgpu_acpi_is_power_shift_control_supported 616 + * 617 + * Check if the ATCS power shift control method 618 + * is supported. 619 + * returns true if supported, false if not. 620 + */ 621 + bool amdgpu_acpi_is_power_shift_control_supported(void) 622 + { 623 + return amdgpu_acpi_priv.atcs.functions.power_shift_control; 601 624 } 602 625 603 626 /** ··· 623 622 */ 624 623 int amdgpu_acpi_pcie_notify_device_ready(struct amdgpu_device *adev) 625 624 { 626 - acpi_handle handle; 627 625 union acpi_object *info; 628 - struct amdgpu_atcs *atcs = &adev->atcs; 629 - 630 - /* Get the device handle */ 631 - handle = ACPI_HANDLE(&adev->pdev->dev); 632 - if (!handle) 633 - return -EINVAL; 626 + struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 634 627 635 628 if (!atcs->functions.pcie_dev_rdy) 636 629 return -EINVAL; 637 630 638 - info = amdgpu_atcs_call(handle, ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, NULL); 631 + info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_PCIE_DEVICE_READY_NOTIFICATION, NULL); 639 632 if (!info) 640 633 return -EIO; 641 634 ··· 652 657 int amdgpu_acpi_pcie_performance_request(struct amdgpu_device *adev, 653 658 u8 perf_req, bool advertise) 654 659 { 655 - acpi_handle handle; 656 660 union acpi_object *info; 657 - struct amdgpu_atcs *atcs = &adev->atcs; 661 + struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 658 662 struct atcs_pref_req_input atcs_input; 659 663 struct atcs_pref_req_output atcs_output; 660 664 struct acpi_buffer params; ··· 661 667 u32 retry = 3; 662 668 663 669 if (amdgpu_acpi_pcie_notify_device_ready(adev)) 664 - return -EINVAL; 665 - 666 - /* Get the device handle */ 667 - handle = ACPI_HANDLE(&adev->pdev->dev); 668 - if (!handle) 669 670 return -EINVAL; 670 671 671 672 if (!atcs->functions.pcie_perf_req) ··· 680 691 params.pointer = &atcs_input; 681 692 682 693 while (retry--) { 683 - info = amdgpu_atcs_call(handle, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, &params); 694 + info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_PCIE_PERFORMANCE_REQUEST, &params); 684 695 if (!info) 685 696 return -EIO; 686 697 ··· 711 722 } 712 723 713 724 return 0; 725 + } 726 + 727 + /** 728 + * amdgpu_acpi_power_shift_control 729 + * 730 + * @adev: amdgpu_device pointer 731 + * @dev_state: device acpi state 732 + * @drv_state: driver state 733 + * 734 + * Executes the POWER_SHIFT_CONTROL method to 735 + * communicate current dGPU device state and 736 + * driver state to APU/SBIOS. 737 + * returns 0 on success, error on failure. 738 + */ 739 + int amdgpu_acpi_power_shift_control(struct amdgpu_device *adev, 740 + u8 dev_state, bool drv_state) 741 + { 742 + union acpi_object *info; 743 + struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 744 + struct atcs_pwr_shift_input atcs_input; 745 + struct acpi_buffer params; 746 + 747 + if (!amdgpu_acpi_is_power_shift_control_supported()) 748 + return -EINVAL; 749 + 750 + atcs_input.size = sizeof(struct atcs_pwr_shift_input); 751 + /* dGPU id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */ 752 + atcs_input.dgpu_id = adev->pdev->devfn | (adev->pdev->bus->number << 8); 753 + atcs_input.dev_acpi_state = dev_state; 754 + atcs_input.drv_state = drv_state; 755 + 756 + params.length = sizeof(struct atcs_pwr_shift_input); 757 + params.pointer = &atcs_input; 758 + 759 + info = amdgpu_atcs_call(atcs, ATCS_FUNCTION_POWER_SHIFT_CONTROL, &params); 760 + if (!info) { 761 + DRM_ERROR("ATCS PSC update failed\n"); 762 + return -EIO; 763 + } 764 + 765 + return 0; 766 + } 767 + 768 + /** 769 + * amdgpu_acpi_smart_shift_update - update dGPU device state to SBIOS 770 + * 771 + * @dev: drm_device pointer 772 + * @ss_state: current smart shift event 773 + * 774 + * returns 0 on success, 775 + * otherwise return error number. 776 + */ 777 + int amdgpu_acpi_smart_shift_update(struct drm_device *dev, enum amdgpu_ss ss_state) 778 + { 779 + struct amdgpu_device *adev = drm_to_adev(dev); 780 + int r; 781 + 782 + if (!amdgpu_device_supports_smart_shift(dev)) 783 + return 0; 784 + 785 + switch (ss_state) { 786 + /* SBIOS trigger “stop”, “enable” and “start” at D0, Driver Operational. 787 + * SBIOS trigger “stop” at D3, Driver Not Operational. 788 + * SBIOS trigger “stop” and “disable” at D0, Driver NOT operational. 789 + */ 790 + case AMDGPU_SS_DRV_LOAD: 791 + r = amdgpu_acpi_power_shift_control(adev, 792 + AMDGPU_ATCS_PSC_DEV_STATE_D0, 793 + AMDGPU_ATCS_PSC_DRV_STATE_OPR); 794 + break; 795 + case AMDGPU_SS_DEV_D0: 796 + r = amdgpu_acpi_power_shift_control(adev, 797 + AMDGPU_ATCS_PSC_DEV_STATE_D0, 798 + AMDGPU_ATCS_PSC_DRV_STATE_OPR); 799 + break; 800 + case AMDGPU_SS_DEV_D3: 801 + r = amdgpu_acpi_power_shift_control(adev, 802 + AMDGPU_ATCS_PSC_DEV_STATE_D3_HOT, 803 + AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR); 804 + break; 805 + case AMDGPU_SS_DRV_UNLOAD: 806 + r = amdgpu_acpi_power_shift_control(adev, 807 + AMDGPU_ATCS_PSC_DEV_STATE_D0, 808 + AMDGPU_ATCS_PSC_DRV_STATE_NOT_OPR); 809 + break; 810 + default: 811 + return -EINVAL; 812 + } 813 + 814 + return r; 714 815 } 715 816 716 817 /** ··· 846 767 */ 847 768 int amdgpu_acpi_init(struct amdgpu_device *adev) 848 769 { 849 - acpi_handle handle, atif_handle; 850 - struct amdgpu_atif *atif; 851 - struct amdgpu_atcs *atcs = &adev->atcs; 852 - int ret; 853 - 854 - /* Get the device handle */ 855 - handle = ACPI_HANDLE(&adev->pdev->dev); 856 - 857 - if (!adev->bios || !handle) 858 - return 0; 859 - 860 - /* Call the ATCS method */ 861 - ret = amdgpu_atcs_verify_interface(handle, atcs); 862 - if (ret) { 863 - DRM_DEBUG_DRIVER("Call to ATCS verify_interface failed: %d\n", ret); 864 - } 865 - 866 - /* Probe for ATIF, and initialize it if found */ 867 - atif_handle = amdgpu_atif_probe_handle(handle); 868 - if (!atif_handle) 869 - goto out; 870 - 871 - atif = kzalloc(sizeof(*atif), GFP_KERNEL); 872 - if (!atif) { 873 - DRM_WARN("Not enough memory to initialize ATIF\n"); 874 - goto out; 875 - } 876 - atif->handle = atif_handle; 877 - 878 - /* Call the ATIF method */ 879 - ret = amdgpu_atif_verify_interface(atif); 880 - if (ret) { 881 - DRM_DEBUG_DRIVER("Call to ATIF verify_interface failed: %d\n", ret); 882 - kfree(atif); 883 - goto out; 884 - } 885 - adev->atif = atif; 770 + struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 886 771 887 772 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 888 773 if (atif->notifications.brightness_change) { 889 774 if (amdgpu_device_has_dc_support(adev)) { 890 775 #if defined(CONFIG_DRM_AMD_DC) 891 776 struct amdgpu_display_manager *dm = &adev->dm; 892 - atif->bd = dm->backlight_dev; 777 + if (dm->backlight_dev) 778 + atif->bd = dm->backlight_dev; 893 779 #endif 894 780 } else { 895 781 struct drm_encoder *tmp; ··· 876 832 } 877 833 } 878 834 #endif 835 + adev->acpi_nb.notifier_call = amdgpu_acpi_event; 836 + register_acpi_notifier(&adev->acpi_nb); 837 + 838 + return 0; 839 + } 840 + 841 + void amdgpu_acpi_get_backlight_caps(struct amdgpu_dm_backlight_caps *caps) 842 + { 843 + struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 844 + 845 + caps->caps_valid = atif->backlight_caps.caps_valid; 846 + caps->min_input_signal = atif->backlight_caps.min_input_signal; 847 + caps->max_input_signal = atif->backlight_caps.max_input_signal; 848 + } 849 + 850 + /** 851 + * amdgpu_acpi_fini - tear down driver acpi support 852 + * 853 + * @adev: amdgpu_device pointer 854 + * 855 + * Unregisters with the acpi notifier chain (all asics). 856 + */ 857 + void amdgpu_acpi_fini(struct amdgpu_device *adev) 858 + { 859 + unregister_acpi_notifier(&adev->acpi_nb); 860 + } 861 + 862 + /** 863 + * amdgpu_atif_pci_probe_handle - look up the ATIF handle 864 + * 865 + * @pdev: pci device 866 + * 867 + * Look up the ATIF handles (all asics). 868 + * Returns true if the handle is found, false if not. 869 + */ 870 + static bool amdgpu_atif_pci_probe_handle(struct pci_dev *pdev) 871 + { 872 + char acpi_method_name[255] = { 0 }; 873 + struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name}; 874 + acpi_handle dhandle, atif_handle; 875 + acpi_status status; 876 + int ret; 877 + 878 + dhandle = ACPI_HANDLE(&pdev->dev); 879 + if (!dhandle) 880 + return false; 881 + 882 + status = acpi_get_handle(dhandle, "ATIF", &atif_handle); 883 + if (ACPI_FAILURE(status)) { 884 + return false; 885 + } 886 + amdgpu_acpi_priv.atif.handle = atif_handle; 887 + acpi_get_name(amdgpu_acpi_priv.atif.handle, ACPI_FULL_PATHNAME, &buffer); 888 + DRM_DEBUG_DRIVER("Found ATIF handle %s\n", acpi_method_name); 889 + ret = amdgpu_atif_verify_interface(&amdgpu_acpi_priv.atif); 890 + if (ret) { 891 + amdgpu_acpi_priv.atif.handle = 0; 892 + return false; 893 + } 894 + return true; 895 + } 896 + 897 + /** 898 + * amdgpu_atcs_pci_probe_handle - look up the ATCS handle 899 + * 900 + * @pdev: pci device 901 + * 902 + * Look up the ATCS handles (all asics). 903 + * Returns true if the handle is found, false if not. 904 + */ 905 + static bool amdgpu_atcs_pci_probe_handle(struct pci_dev *pdev) 906 + { 907 + char acpi_method_name[255] = { 0 }; 908 + struct acpi_buffer buffer = { sizeof(acpi_method_name), acpi_method_name }; 909 + acpi_handle dhandle, atcs_handle; 910 + acpi_status status; 911 + int ret; 912 + 913 + dhandle = ACPI_HANDLE(&pdev->dev); 914 + if (!dhandle) 915 + return false; 916 + 917 + status = acpi_get_handle(dhandle, "ATCS", &atcs_handle); 918 + if (ACPI_FAILURE(status)) { 919 + return false; 920 + } 921 + amdgpu_acpi_priv.atcs.handle = atcs_handle; 922 + acpi_get_name(amdgpu_acpi_priv.atcs.handle, ACPI_FULL_PATHNAME, &buffer); 923 + DRM_DEBUG_DRIVER("Found ATCS handle %s\n", acpi_method_name); 924 + ret = amdgpu_atcs_verify_interface(&amdgpu_acpi_priv.atcs); 925 + if (ret) { 926 + amdgpu_acpi_priv.atcs.handle = 0; 927 + return false; 928 + } 929 + return true; 930 + } 931 + 932 + /* 933 + * amdgpu_acpi_detect - detect ACPI ATIF/ATCS methods 934 + * 935 + * Check if we have the ATIF/ATCS methods and populate 936 + * the structures in the driver. 937 + */ 938 + void amdgpu_acpi_detect(void) 939 + { 940 + struct amdgpu_atif *atif = &amdgpu_acpi_priv.atif; 941 + struct amdgpu_atcs *atcs = &amdgpu_acpi_priv.atcs; 942 + struct pci_dev *pdev = NULL; 943 + int ret; 944 + 945 + while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_VGA << 8, pdev)) != NULL) { 946 + if (!atif->handle) 947 + amdgpu_atif_pci_probe_handle(pdev); 948 + if (!atcs->handle) 949 + amdgpu_atcs_pci_probe_handle(pdev); 950 + } 951 + 952 + while ((pdev = pci_get_class(PCI_CLASS_DISPLAY_OTHER << 8, pdev)) != NULL) { 953 + if (!atif->handle) 954 + amdgpu_atif_pci_probe_handle(pdev); 955 + if (!atcs->handle) 956 + amdgpu_atcs_pci_probe_handle(pdev); 957 + } 879 958 880 959 if (atif->functions.sbios_requests && !atif->functions.system_params) { 881 960 /* XXX check this workraround, if sbios request function is ··· 1028 861 } else { 1029 862 atif->backlight_caps.caps_valid = false; 1030 863 } 1031 - 1032 - out: 1033 - adev->acpi_nb.notifier_call = amdgpu_acpi_event; 1034 - register_acpi_notifier(&adev->acpi_nb); 1035 - 1036 - return ret; 1037 - } 1038 - 1039 - void amdgpu_acpi_get_backlight_caps(struct amdgpu_device *adev, 1040 - struct amdgpu_dm_backlight_caps *caps) 1041 - { 1042 - if (!adev->atif) { 1043 - caps->caps_valid = false; 1044 - return; 1045 - } 1046 - caps->caps_valid = adev->atif->backlight_caps.caps_valid; 1047 - caps->min_input_signal = adev->atif->backlight_caps.min_input_signal; 1048 - caps->max_input_signal = adev->atif->backlight_caps.max_input_signal; 1049 - } 1050 - 1051 - /** 1052 - * amdgpu_acpi_fini - tear down driver acpi support 1053 - * 1054 - * @adev: amdgpu_device pointer 1055 - * 1056 - * Unregisters with the acpi notifier chain (all asics). 1057 - */ 1058 - void amdgpu_acpi_fini(struct amdgpu_device *adev) 1059 - { 1060 - unregister_acpi_notifier(&adev->acpi_nb); 1061 - kfree(adev->atif); 1062 864 } 1063 865 1064 866 /**
+21 -21
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10.c
··· 96 96 97 97 lock_srbm(kgd, 0, 0, 0, vmid); 98 98 99 - WREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG), sh_mem_config); 100 - WREG32(SOC15_REG_OFFSET(GC, 0, mmSH_MEM_BASES), sh_mem_bases); 99 + WREG32_SOC15(GC, 0, mmSH_MEM_CONFIG, sh_mem_config); 100 + WREG32_SOC15(GC, 0, mmSH_MEM_BASES, sh_mem_bases); 101 101 /* APE1 no longer exists on GFX9 */ 102 102 103 103 unlock_srbm(kgd); ··· 161 161 162 162 lock_srbm(kgd, mec, pipe, 0, 0); 163 163 164 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCPC_INT_CNTL), 164 + WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, 165 165 CP_INT_CNTL_RING0__TIME_STAMP_INT_ENABLE_MASK | 166 166 CP_INT_CNTL_RING0__OPCODE_ERROR_INT_ENABLE_MASK); 167 167 ··· 239 239 240 240 for (reg = hqd_base; 241 241 reg <= SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI); reg++) 242 - WREG32(reg, mqd_hqd[reg - hqd_base]); 242 + WREG32_SOC15_IP(GC, reg, mqd_hqd[reg - hqd_base]); 243 243 244 244 245 245 /* Activate doorbell logic before triggering WPTR poll. */ 246 246 data = REG_SET_FIELD(m->cp_hqd_pq_doorbell_control, 247 247 CP_HQD_PQ_DOORBELL_CONTROL, DOORBELL_EN, 1); 248 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL), data); 248 + WREG32_SOC15(GC, 0, mmCP_HQD_PQ_DOORBELL_CONTROL, data); 249 249 250 250 if (wptr) { 251 251 /* Don't read wptr with get_user because the user ··· 274 274 guessed_wptr += m->cp_hqd_pq_wptr_lo & ~(queue_size - 1); 275 275 guessed_wptr += (uint64_t)m->cp_hqd_pq_wptr_hi << 32; 276 276 277 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_LO), 277 + WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_LO, 278 278 lower_32_bits(guessed_wptr)); 279 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_HI), 279 + WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_HI, 280 280 upper_32_bits(guessed_wptr)); 281 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR), 281 + WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR, 282 282 lower_32_bits((uint64_t)wptr)); 283 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI), 283 + WREG32_SOC15(GC, 0, mmCP_HQD_PQ_WPTR_POLL_ADDR_HI, 284 284 upper_32_bits((uint64_t)wptr)); 285 285 pr_debug("%s setting CP_PQ_WPTR_POLL_CNTL1 to %x\n", __func__, 286 286 (uint32_t)get_queue_mask(adev, pipe_id, queue_id)); 287 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_PQ_WPTR_POLL_CNTL1), 287 + WREG32_SOC15(GC, 0, mmCP_PQ_WPTR_POLL_CNTL1, 288 288 (uint32_t)get_queue_mask(adev, pipe_id, queue_id)); 289 289 } 290 290 291 291 /* Start the EOP fetcher */ 292 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_EOP_RPTR), 292 + WREG32_SOC15(GC, 0, mmCP_HQD_EOP_RPTR, 293 293 REG_SET_FIELD(m->cp_hqd_eop_rptr, 294 294 CP_HQD_EOP_RPTR, INIT_FETCHER, 1)); 295 295 296 296 data = REG_SET_FIELD(m->cp_hqd_active, CP_HQD_ACTIVE, ACTIVE, 1); 297 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE), data); 297 + WREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE, data); 298 298 299 299 release_queue(kgd); 300 300 ··· 365 365 if (WARN_ON_ONCE(i >= HQD_N_REGS)) \ 366 366 break; \ 367 367 (*dump)[i][0] = (addr) << 2; \ 368 - (*dump)[i++][1] = RREG32(addr); \ 368 + (*dump)[i++][1] = RREG32_SOC15_IP(GC, addr); \ 369 369 } while (0) 370 370 371 371 *dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL); ··· 497 497 uint32_t low, high; 498 498 499 499 acquire_queue(kgd, pipe_id, queue_id); 500 - act = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE)); 500 + act = RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE); 501 501 if (act) { 502 502 low = lower_32_bits(queue_address >> 8); 503 503 high = upper_32_bits(queue_address >> 8); 504 504 505 - if (low == RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_BASE)) && 506 - high == RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_PQ_BASE_HI))) 505 + if (low == RREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE) && 506 + high == RREG32_SOC15(GC, 0, mmCP_HQD_PQ_BASE_HI)) 507 507 retval = true; 508 508 } 509 509 release_queue(kgd); ··· 621 621 preempt_enable(); 622 622 #endif 623 623 624 - WREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_DEQUEUE_REQUEST), type); 624 + WREG32_SOC15(GC, 0, mmCP_HQD_DEQUEUE_REQUEST, type); 625 625 626 626 end_jiffies = (utimeout * HZ / 1000) + jiffies; 627 627 while (true) { 628 - temp = RREG32(SOC15_REG_OFFSET(GC, 0, mmCP_HQD_ACTIVE)); 628 + temp = RREG32_SOC15(GC, 0, mmCP_HQD_ACTIVE); 629 629 if (!(temp & CP_HQD_ACTIVE__ACTIVE_MASK)) 630 630 break; 631 631 if (time_after(jiffies, end_jiffies)) { ··· 716 716 717 717 mutex_lock(&adev->grbm_idx_mutex); 718 718 719 - WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX), gfx_index_val); 720 - WREG32(SOC15_REG_OFFSET(GC, 0, mmSQ_CMD), sq_cmd); 719 + WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, gfx_index_val); 720 + WREG32_SOC15(GC, 0, mmSQ_CMD, sq_cmd); 721 721 722 722 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, 723 723 INSTANCE_BROADCAST_WRITES, 1); ··· 726 726 data = REG_SET_FIELD(data, GRBM_GFX_INDEX, 727 727 SE_BROADCAST_WRITES, 1); 728 728 729 - WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX), data); 729 + WREG32_SOC15(GC, 0, mmGRBM_GFX_INDEX, data); 730 730 mutex_unlock(&adev->grbm_idx_mutex); 731 731 732 732 return 0;
+6 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v10_3.c
··· 156 156 mmSDMA0_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL; 157 157 break; 158 158 case 1: 159 - sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA1, 0, 159 + sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0, 160 160 mmSDMA1_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL; 161 161 break; 162 162 case 2: 163 - sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA2, 0, 164 - mmSDMA2_RLC0_RB_CNTL) - mmSDMA2_RLC0_RB_CNTL; 163 + sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0, 164 + mmSDMA2_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL; 165 165 break; 166 166 case 3: 167 - sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA3, 0, 168 - mmSDMA3_RLC0_RB_CNTL) - mmSDMA2_RLC0_RB_CNTL; 167 + sdma_engine_reg_base = SOC15_REG_OFFSET(SDMA0, 0, 168 + mmSDMA3_RLC0_RB_CNTL) - mmSDMA0_RLC0_RB_CNTL; 169 169 break; 170 170 } 171 171 ··· 450 450 engine_id, queue_id); 451 451 uint32_t i = 0, reg; 452 452 #undef HQD_N_REGS 453 - #define HQD_N_REGS (19+6+7+10) 453 + #define HQD_N_REGS (19+6+7+12) 454 454 455 455 *dump = kmalloc(HQD_N_REGS*2*sizeof(uint32_t), GFP_KERNEL); 456 456 if (*dump == NULL)
+8 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
··· 621 621 622 622 ret = amdgpu_gem_object_create(adev, bo_size, 1, 623 623 AMDGPU_GEM_DOMAIN_CPU, 624 - 0, ttm_bo_type_sg, 625 - mem->bo->tbo.base.resv, 624 + AMDGPU_GEM_CREATE_PREEMPTIBLE, 625 + ttm_bo_type_sg, mem->bo->tbo.base.resv, 626 626 &gobj); 627 + amdgpu_bo_unreserve(mem->bo); 627 628 if (ret) 628 629 return ret; 629 - 630 - amdgpu_bo_unreserve(mem->bo); 631 630 632 631 *bo = gem_to_amdgpu_bo(gobj); 633 632 (*bo)->parent = amdgpu_bo_ref(mem->bo); ··· 639 640 struct amdgpu_bo **bo) 640 641 { 641 642 struct drm_gem_object *gobj; 643 + int ret; 642 644 643 645 if (!mem->dmabuf) { 644 646 mem->dmabuf = amdgpu_gem_prime_export(&mem->bo->tbo.base, 645 647 mem->alloc_flags & KFD_IOC_ALLOC_MEM_FLAGS_WRITABLE ? 646 648 DRM_RDWR : 0); 647 649 if (IS_ERR(mem->dmabuf)) { 650 + ret = PTR_ERR(mem->dmabuf); 648 651 mem->dmabuf = NULL; 649 - return PTR_ERR(mem->dmabuf); 652 + return ret; 650 653 } 651 654 } 652 655 ··· 663 662 dma_buf_put(mem->dmabuf); 664 663 665 664 *bo = gem_to_amdgpu_bo(gobj); 665 + (*bo)->flags |= AMDGPU_GEM_CREATE_PREEMPTIBLE; 666 666 (*bo)->parent = amdgpu_bo_ref(mem->bo); 667 667 668 668 return 0; ··· 1412 1410 } else if (flags & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR) { 1413 1411 domain = AMDGPU_GEM_DOMAIN_GTT; 1414 1412 alloc_domain = AMDGPU_GEM_DOMAIN_CPU; 1415 - alloc_flags = 0; 1413 + alloc_flags = AMDGPU_GEM_CREATE_PREEMPTIBLE; 1416 1414 if (!offset || !*offset) 1417 1415 return -EINVAL; 1418 1416 user_addr = untagged_addr(*offset);
+4 -19
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 396 396 spin_unlock(&adev->mm_stats.lock); 397 397 } 398 398 399 - static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p, 400 - struct amdgpu_bo *bo) 399 + static int amdgpu_cs_bo_validate(void *param, struct amdgpu_bo *bo) 401 400 { 402 401 struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 402 + struct amdgpu_cs_parser *p = param; 403 403 struct ttm_operation_ctx ctx = { 404 404 .interruptible = true, 405 405 .no_wait_gpu = false, ··· 451 451 return r; 452 452 } 453 453 454 - static int amdgpu_cs_validate(void *param, struct amdgpu_bo *bo) 455 - { 456 - struct amdgpu_cs_parser *p = param; 457 - int r; 458 - 459 - r = amdgpu_cs_bo_validate(p, bo); 460 - if (r) 461 - return r; 462 - 463 - if (bo->shadow) 464 - r = amdgpu_cs_bo_validate(p, bo->shadow); 465 - 466 - return r; 467 - } 468 - 469 454 static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p, 470 455 struct list_head *validated) 471 456 { ··· 478 493 lobj->user_pages); 479 494 } 480 495 481 - r = amdgpu_cs_validate(p, bo); 496 + r = amdgpu_cs_bo_validate(p, bo); 482 497 if (r) 483 498 return r; 484 499 ··· 578 593 p->bytes_moved_vis = 0; 579 594 580 595 r = amdgpu_vm_validate_pt_bos(p->adev, &fpriv->vm, 581 - amdgpu_cs_validate, p); 596 + amdgpu_cs_bo_validate, p); 582 597 if (r) { 583 598 DRM_ERROR("amdgpu_vm_validate_pt_bos() failed.\n"); 584 599 goto error_validate;
+26 -15
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
··· 331 331 return 0; 332 332 } 333 333 334 + #define AMDGPU_RAS_COUNTE_DELAY_MS 3000 335 + 334 336 static int amdgpu_ctx_query2(struct amdgpu_device *adev, 335 - struct amdgpu_fpriv *fpriv, uint32_t id, 336 - union drm_amdgpu_ctx_out *out) 337 + struct amdgpu_fpriv *fpriv, uint32_t id, 338 + union drm_amdgpu_ctx_out *out) 337 339 { 340 + struct amdgpu_ras *con = amdgpu_ras_get_context(adev); 338 341 struct amdgpu_ctx *ctx; 339 342 struct amdgpu_ctx_mgr *mgr; 340 - unsigned long ras_counter; 341 343 342 344 if (!fpriv) 343 345 return -EINVAL; ··· 364 362 if (atomic_read(&ctx->guilty)) 365 363 out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_GUILTY; 366 364 367 - /*query ue count*/ 368 - ras_counter = amdgpu_ras_query_error_count(adev, false); 369 - /*ras counter is monotonic increasing*/ 370 - if (ras_counter != ctx->ras_counter_ue) { 371 - out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RAS_UE; 372 - ctx->ras_counter_ue = ras_counter; 373 - } 365 + if (adev->ras_enabled && con) { 366 + /* Return the cached values in O(1), 367 + * and schedule delayed work to cache 368 + * new vaues. 369 + */ 370 + int ce_count, ue_count; 374 371 375 - /*query ce count*/ 376 - ras_counter = amdgpu_ras_query_error_count(adev, true); 377 - if (ras_counter != ctx->ras_counter_ce) { 378 - out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RAS_CE; 379 - ctx->ras_counter_ce = ras_counter; 372 + ce_count = atomic_read(&con->ras_ce_count); 373 + ue_count = atomic_read(&con->ras_ue_count); 374 + 375 + if (ce_count != ctx->ras_counter_ce) { 376 + ctx->ras_counter_ce = ce_count; 377 + out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RAS_CE; 378 + } 379 + 380 + if (ue_count != ctx->ras_counter_ue) { 381 + ctx->ras_counter_ue = ue_count; 382 + out->state.flags |= AMDGPU_CTX_QUERY2_FLAGS_RAS_UE; 383 + } 384 + 385 + schedule_delayed_work(&con->ras_counte_delay_work, 386 + msecs_to_jiffies(AMDGPU_RAS_COUNTE_DELAY_MS)); 380 387 } 381 388 382 389 mutex_unlock(&mgr->lock);
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
··· 990 990 } 991 991 992 992 /** 993 - * amdgpu_debugfs_regs_gfxoff_write - Enable/disable GFXOFF 993 + * amdgpu_debugfs_gfxoff_write - Enable/disable GFXOFF 994 994 * 995 995 * @f: open file handle 996 996 * @buf: User buffer to write data from ··· 1041 1041 1042 1042 1043 1043 /** 1044 - * amdgpu_debugfs_regs_gfxoff_status - read gfxoff status 1044 + * amdgpu_debugfs_gfxoff_read - read gfxoff status 1045 1045 * 1046 1046 * @f: open file handle 1047 1047 * @buf: User buffer to store read data in
+29 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 265 265 return amdgpu_asic_supports_baco(adev); 266 266 } 267 267 268 + /** 269 + * amdgpu_device_supports_smart_shift - Is the device dGPU with 270 + * smart shift support 271 + * 272 + * @dev: drm_device pointer 273 + * 274 + * Returns true if the device is a dGPU with Smart Shift support, 275 + * otherwise returns false. 276 + */ 277 + bool amdgpu_device_supports_smart_shift(struct drm_device *dev) 278 + { 279 + return (amdgpu_device_supports_boco(dev) && 280 + amdgpu_acpi_is_power_shift_control_supported()); 281 + } 282 + 268 283 /* 269 284 * VRAM access helper functions 270 285 */ ··· 516 501 adev->gfx.rlc.funcs && 517 502 adev->gfx.rlc.funcs->is_rlcg_access_range) { 518 503 if (adev->gfx.rlc.funcs->is_rlcg_access_range(adev, reg)) 519 - return adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, v, 0); 504 + return adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, v, 0, 0); 520 505 } else { 521 506 writel(v, ((void __iomem *)adev->rmmio) + (reg * 4)); 522 507 } ··· 3166 3151 */ 3167 3152 bool amdgpu_device_has_dc_support(struct amdgpu_device *adev) 3168 3153 { 3169 - if (amdgpu_sriov_vf(adev) || adev->enable_virtual_display) 3154 + if (amdgpu_sriov_vf(adev) || 3155 + adev->enable_virtual_display || 3156 + (adev->harvest_ip_mask & AMD_HARVEST_IP_DMU_MASK)) 3170 3157 return false; 3171 3158 3172 3159 return amdgpu_device_asic_has_dc_support(adev->asic_type); ··· 3826 3809 return 0; 3827 3810 3828 3811 adev->in_suspend = true; 3812 + 3813 + if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D3)) 3814 + DRM_WARN("smart shift update failed\n"); 3815 + 3829 3816 drm_kms_helper_poll_disable(dev); 3830 3817 3831 3818 if (fbcon) ··· 3938 3917 dev->dev->power.disable_depth--; 3939 3918 #endif 3940 3919 adev->in_suspend = false; 3920 + 3921 + if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DEV_D0)) 3922 + DRM_WARN("smart shift update failed\n"); 3941 3923 3942 3924 return 0; 3943 3925 } ··· 4718 4694 return 0; 4719 4695 } 4720 4696 4721 - void amdgpu_device_recheck_guilty_jobs( 4697 + static void amdgpu_device_recheck_guilty_jobs( 4722 4698 struct amdgpu_device *adev, struct list_head *device_list_handle, 4723 4699 struct amdgpu_reset_context *reset_context) 4724 4700 { ··· 5021 4997 amdgpu_vf_error_put(tmp_adev, AMDGIM_ERROR_VF_GPU_RESET_FAIL, 0, r); 5022 4998 } else { 5023 4999 dev_info(tmp_adev->dev, "GPU reset(%d) succeeded!\n", atomic_read(&tmp_adev->gpu_reset_counter)); 5000 + if (amdgpu_acpi_smart_shift_update(adev_to_drm(tmp_adev), AMDGPU_SS_DEV_D0)) 5001 + DRM_WARN("smart shift update failed\n"); 5024 5002 } 5025 5003 } 5026 5004
+3 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 95 95 * - 3.39.0 - DMABUF implicit sync does a full pipeline sync 96 96 * - 3.40.0 - Add AMDGPU_IDS_FLAGS_TMZ 97 97 * - 3.41.0 - Add video codec query 98 + * - 3.42.0 - Add 16bpc fixed point display support 98 99 */ 99 100 #define KMS_DRIVER_MAJOR 3 100 - #define KMS_DRIVER_MINOR 41 101 + #define KMS_DRIVER_MINOR 42 101 102 #define KMS_DRIVER_PATCHLEVEL 0 102 103 103 104 int amdgpu_vram_limit; ··· 1822 1821 1823 1822 DRM_INFO("amdgpu kernel modesetting enabled.\n"); 1824 1823 amdgpu_register_atpx_handler(); 1824 + amdgpu_acpi_detect(); 1825 1825 1826 1826 /* Ignore KFD init failures. Normal when CONFIG_HSA_AMD is not set. */ 1827 1827 amdgpu_amdkfd_init();
+23 -19
drivers/gpu/drm/amd/amdgpu/amdgpu_fru_eeprom.c
··· 101 101 int amdgpu_fru_get_product_info(struct amdgpu_device *adev) 102 102 { 103 103 unsigned char buff[34]; 104 - int addrptr = 0, size = 0; 104 + int addrptr, size; 105 + int len; 105 106 106 107 if (!is_fru_eeprom_supported(adev)) 107 108 return 0; ··· 110 109 /* If algo exists, it means that the i2c_adapter's initialized */ 111 110 if (!adev->pm.smu_i2c.algo) { 112 111 DRM_WARN("Cannot access FRU, EEPROM accessor not initialized"); 113 - return 0; 112 + return -ENODEV; 114 113 } 115 114 116 115 /* There's a lot of repetition here. This is due to the FRU having ··· 129 128 size = amdgpu_fru_read_eeprom(adev, addrptr, buff); 130 129 if (size < 1) { 131 130 DRM_ERROR("Failed to read FRU Manufacturer, ret:%d", size); 132 - return size; 131 + return -EINVAL; 133 132 } 134 133 135 134 /* Increment the addrptr by the size of the field, and 1 due to the ··· 139 138 size = amdgpu_fru_read_eeprom(adev, addrptr, buff); 140 139 if (size < 1) { 141 140 DRM_ERROR("Failed to read FRU product name, ret:%d", size); 142 - return size; 141 + return -EINVAL; 143 142 } 144 143 144 + len = size; 145 145 /* Product name should only be 32 characters. Any more, 146 146 * and something could be wrong. Cap it at 32 to be safe 147 147 */ 148 - if (size > 32) { 148 + if (len >= sizeof(adev->product_name)) { 149 149 DRM_WARN("FRU Product Number is larger than 32 characters. This is likely a mistake"); 150 - size = 32; 150 + len = sizeof(adev->product_name) - 1; 151 151 } 152 152 /* Start at 2 due to buff using fields 0 and 1 for the address */ 153 - memcpy(adev->product_name, &buff[2], size); 154 - adev->product_name[size] = '\0'; 153 + memcpy(adev->product_name, &buff[2], len); 154 + adev->product_name[len] = '\0'; 155 155 156 156 addrptr += size + 1; 157 157 size = amdgpu_fru_read_eeprom(adev, addrptr, buff); 158 158 if (size < 1) { 159 159 DRM_ERROR("Failed to read FRU product number, ret:%d", size); 160 - return size; 160 + return -EINVAL; 161 161 } 162 162 163 + len = size; 163 164 /* Product number should only be 16 characters. Any more, 164 165 * and something could be wrong. Cap it at 16 to be safe 165 166 */ 166 - if (size > 16) { 167 + if (len >= sizeof(adev->product_number)) { 167 168 DRM_WARN("FRU Product Number is larger than 16 characters. This is likely a mistake"); 168 - size = 16; 169 + len = sizeof(adev->product_number) - 1; 169 170 } 170 - memcpy(adev->product_number, &buff[2], size); 171 - adev->product_number[size] = '\0'; 171 + memcpy(adev->product_number, &buff[2], len); 172 + adev->product_number[len] = '\0'; 172 173 173 174 addrptr += size + 1; 174 175 size = amdgpu_fru_read_eeprom(adev, addrptr, buff); 175 176 176 177 if (size < 1) { 177 178 DRM_ERROR("Failed to read FRU product version, ret:%d", size); 178 - return size; 179 + return -EINVAL; 179 180 } 180 181 181 182 addrptr += size + 1; ··· 185 182 186 183 if (size < 1) { 187 184 DRM_ERROR("Failed to read FRU serial number, ret:%d", size); 188 - return size; 185 + return -EINVAL; 189 186 } 190 187 188 + len = size; 191 189 /* Serial number should only be 16 characters. Any more, 192 190 * and something could be wrong. Cap it at 16 to be safe 193 191 */ 194 - if (size > 16) { 192 + if (len >= sizeof(adev->serial)) { 195 193 DRM_WARN("FRU Serial Number is larger than 16 characters. This is likely a mistake"); 196 - size = 16; 194 + len = sizeof(adev->serial) - 1; 197 195 } 198 - memcpy(adev->serial, &buff[2], size); 199 - adev->serial[size] = '\0'; 196 + memcpy(adev->serial, &buff[2], len); 197 + adev->serial[len] = '\0'; 200 198 201 199 return 0; 202 200 }
+15 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
··· 312 312 int pages, struct page **pagelist, dma_addr_t *dma_addr, 313 313 uint64_t flags) 314 314 { 315 - int r, i; 316 - 317 315 if (!adev->gart.ready) { 318 316 WARN(1, "trying to bind memory to uninitialized GART !\n"); 319 317 return -EINVAL; ··· 320 322 if (!adev->gart.ptr) 321 323 return 0; 322 324 323 - r = amdgpu_gart_map(adev, offset, pages, dma_addr, flags, 324 - adev->gart.ptr); 325 - if (r) 326 - return r; 325 + return amdgpu_gart_map(adev, offset, pages, dma_addr, flags, 326 + adev->gart.ptr); 327 + } 328 + 329 + /** 330 + * amdgpu_gart_invalidate_tlb - invalidate gart TLB 331 + * 332 + * @adev: amdgpu device driver pointer 333 + * 334 + * Invalidate gart TLB which can be use as a way to flush gart changes 335 + * 336 + */ 337 + void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev) 338 + { 339 + int i; 327 340 328 341 mb(); 329 342 amdgpu_asic_flush_hdp(adev, NULL); 330 343 for (i = 0; i < adev->num_vmhubs; i++) 331 344 amdgpu_gmc_flush_gpu_tlb(adev, 0, i, 0); 332 - return 0; 333 345 } 334 346 335 347 /**
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.h
··· 66 66 int amdgpu_gart_bind(struct amdgpu_device *adev, uint64_t offset, 67 67 int pages, struct page **pagelist, 68 68 dma_addr_t *dma_addr, uint64_t flags); 69 - 69 + void amdgpu_gart_invalidate_tlb(struct amdgpu_device *adev); 70 70 #endif
+9 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c
··· 537 537 } 538 538 539 539 /** 540 - * amdgpu_tmz_set -- check and set if a device supports TMZ 540 + * amdgpu_gmc_tmz_set -- check and set if a device supports TMZ 541 541 * @adev: amdgpu_device pointer 542 542 * 543 543 * Check and set if an the device @adev supports Trusted Memory ··· 583 583 } 584 584 585 585 /** 586 - * amdgpu_noretry_set -- set per asic noretry defaults 586 + * amdgpu_gmc_noretry_set -- set per asic noretry defaults 587 587 * @adev: amdgpu_device pointer 588 588 * 589 589 * Set a per asic default for the no-retry parameter. ··· 638 638 for (i = 0; i < 16; i++) { 639 639 reg = hub->vm_context0_cntl + hub->ctx_distance * i; 640 640 641 - tmp = RREG32(reg); 641 + tmp = (hub_type == AMDGPU_GFXHUB_0) ? 642 + RREG32_SOC15_IP(GC, reg) : 643 + RREG32_SOC15_IP(MMHUB, reg); 644 + 642 645 if (enable) 643 646 tmp |= hub->vm_cntx_cntl_vm_fault; 644 647 else 645 648 tmp &= ~hub->vm_cntx_cntl_vm_fault; 646 649 647 - WREG32(reg, tmp); 650 + (hub_type == AMDGPU_GFXHUB_0) ? 651 + WREG32_SOC15_IP(GC, reg, tmp) : 652 + WREG32_SOC15_IP(MMHUB, reg, tmp); 648 653 } 649 654 } 650 655
+4
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
··· 216 216 int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man) 217 217 { 218 218 struct amdgpu_gtt_mgr *mgr = to_gtt_mgr(man); 219 + struct amdgpu_device *adev; 219 220 struct amdgpu_gtt_node *node; 220 221 struct drm_mm_node *mm_node; 221 222 int r = 0; 222 223 224 + adev = container_of(mgr, typeof(*adev), mman.gtt_mgr); 223 225 spin_lock(&mgr->lock); 224 226 drm_mm_for_each_node(mm_node, &mgr->mm) { 225 227 node = container_of(mm_node, struct amdgpu_gtt_node, node); ··· 230 228 break; 231 229 } 232 230 spin_unlock(&mgr->lock); 231 + 232 + amdgpu_gart_invalidate_tlb(adev); 233 233 234 234 return r; 235 235 }
+1 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
··· 130 130 struct amdgpu_device *adev = ring->adev; 131 131 struct amdgpu_ib *ib = &ibs[0]; 132 132 struct dma_fence *tmp = NULL; 133 - bool skip_preamble, need_ctx_switch; 133 + bool need_ctx_switch; 134 134 unsigned patch_offset = ~0; 135 135 struct amdgpu_vm *vm; 136 136 uint64_t fence_ctx; ··· 227 227 if (need_ctx_switch) 228 228 status |= AMDGPU_HAVE_CTX_SWITCH; 229 229 230 - skip_preamble = ring->current_ctx == fence_ctx; 231 230 if (job && ring->funcs->emit_cntxcntl) { 232 231 status |= job->preamble_status; 233 232 status |= job->preemption_status; ··· 243 244 244 245 for (i = 0; i < num_ibs; ++i) { 245 246 ib = &ibs[i]; 246 - 247 - /* drop preamble IBs if we don't have a context switch */ 248 - if ((ib->flags & AMDGPU_IB_FLAG_PREAMBLE) && 249 - skip_preamble && 250 - !(status & AMDGPU_PREAMBLE_IB_PRESENT_FIRST) && 251 - !amdgpu_mcbp && 252 - !amdgpu_sriov_vf(adev)) /* for SRIOV preemption, Preamble CE ib must be inserted anyway */ 253 - continue; 254 247 255 248 if (job && ring->funcs->emit_frame_cntl) { 256 249 if (secure != !!(ib->flags & AMDGPU_IB_FLAGS_SECURE)) {
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
··· 183 183 } 184 184 185 185 /** 186 - * amdgpu_vm_grab_idle - grab idle VMID 186 + * amdgpu_vmid_grab_idle - grab idle VMID 187 187 * 188 188 * @vm: vm to allocate id for 189 189 * @ring: ring we want to submit job to ··· 256 256 } 257 257 258 258 /** 259 - * amdgpu_vm_grab_reserved - try to assign reserved VMID 259 + * amdgpu_vmid_grab_reserved - try to assign reserved VMID 260 260 * 261 261 * @vm: vm to allocate id for 262 262 * @ring: ring we want to submit job to ··· 325 325 } 326 326 327 327 /** 328 - * amdgpu_vm_grab_used - try to reuse a VMID 328 + * amdgpu_vmid_grab_used - try to reuse a VMID 329 329 * 330 330 * @vm: vm to allocate id for 331 331 * @ring: ring we want to submit job to ··· 397 397 } 398 398 399 399 /** 400 - * amdgpu_vm_grab_id - allocate the next free VMID 400 + * amdgpu_vmid_grab - allocate the next free VMID 401 401 * 402 402 * @vm: vm to allocate id for 403 403 * @ring: ring we want to submit job to
+21
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
··· 92 92 pm_runtime_forbid(dev->dev); 93 93 } 94 94 95 + if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_UNLOAD)) 96 + DRM_WARN("smart shift update failed\n"); 97 + 95 98 amdgpu_acpi_fini(adev); 96 99 amdgpu_device_fini_hw(adev); 97 100 } ··· 217 214 pm_runtime_mark_last_busy(dev->dev); 218 215 pm_runtime_put_autosuspend(dev->dev); 219 216 } 217 + 218 + if (amdgpu_acpi_smart_shift_update(dev, AMDGPU_SS_DRV_LOAD)) 219 + DRM_WARN("smart shift update failed\n"); 220 220 221 221 out: 222 222 if (r) { ··· 867 861 return copy_to_user(out, bios, 868 862 min((size_t)size, (size_t)(bios_size - bios_offset))) 869 863 ? -EFAULT : 0; 864 + } 865 + case AMDGPU_INFO_VBIOS_INFO: { 866 + struct drm_amdgpu_info_vbios vbios_info = {}; 867 + struct atom_context *atom_context; 868 + 869 + atom_context = adev->mode_info.atom_context; 870 + memcpy(vbios_info.name, atom_context->name, sizeof(atom_context->name)); 871 + memcpy(vbios_info.vbios_pn, atom_context->vbios_pn, sizeof(atom_context->vbios_pn)); 872 + vbios_info.version = atom_context->version; 873 + memcpy(vbios_info.vbios_ver_str, atom_context->vbios_ver_str, 874 + sizeof(atom_context->vbios_ver_str)); 875 + memcpy(vbios_info.date, atom_context->date, sizeof(atom_context->date)); 876 + 877 + return copy_to_user(out, &vbios_info, 878 + min((size_t)size, sizeof(vbios_info))) ? -EFAULT : 0; 870 879 } 871 880 default: 872 881 DRM_DEBUG_KMS("Invalid request %d\n",
+55 -33
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 71 71 } 72 72 amdgpu_bo_unref(&bo->parent); 73 73 74 - if (bo->tbo.type == ttm_bo_type_device) { 74 + if (bo->tbo.type != ttm_bo_type_kernel) { 75 75 ubo = to_amdgpu_bo_user(bo); 76 76 kfree(ubo->metadata); 77 77 } ··· 133 133 if (domain & AMDGPU_GEM_DOMAIN_GTT) { 134 134 places[c].fpfn = 0; 135 135 places[c].lpfn = 0; 136 - places[c].mem_type = TTM_PL_TT; 136 + places[c].mem_type = 137 + abo->flags & AMDGPU_GEM_CREATE_PREEMPTIBLE ? 138 + AMDGPU_PL_PREEMPT : TTM_PL_TT; 137 139 places[c].flags = 0; 138 140 c++; 139 141 } ··· 614 612 return r; 615 613 } 616 614 617 - int amdgpu_bo_create_shadow(struct amdgpu_device *adev, 618 - unsigned long size, 619 - struct amdgpu_bo *bo) 620 - { 621 - struct amdgpu_bo_param bp; 622 - int r; 623 - 624 - if (bo->shadow) 625 - return 0; 626 - 627 - memset(&bp, 0, sizeof(bp)); 628 - bp.size = size; 629 - bp.domain = AMDGPU_GEM_DOMAIN_GTT; 630 - bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC; 631 - bp.type = ttm_bo_type_kernel; 632 - bp.resv = bo->tbo.base.resv; 633 - bp.bo_ptr_size = sizeof(struct amdgpu_bo); 634 - 635 - r = amdgpu_bo_create(adev, &bp, &bo->shadow); 636 - if (!r) { 637 - bo->shadow->parent = amdgpu_bo_ref(bo); 638 - mutex_lock(&adev->shadow_list_lock); 639 - list_add_tail(&bo->shadow->shadow_list, &adev->shadow_list); 640 - mutex_unlock(&adev->shadow_list_lock); 641 - } 642 - 643 - return r; 644 - } 645 - 646 615 /** 647 616 * amdgpu_bo_create_user - create an &amdgpu_bo_user buffer object 648 617 * @adev: amdgpu device object ··· 641 668 *ubo_ptr = to_amdgpu_bo_user(bo_ptr); 642 669 return r; 643 670 } 671 + 672 + /** 673 + * amdgpu_bo_create_vm - create an &amdgpu_bo_vm buffer object 674 + * @adev: amdgpu device object 675 + * @bp: parameters to be used for the buffer object 676 + * @vmbo_ptr: pointer to the buffer object pointer 677 + * 678 + * Create a BO to be for GPUVM. 679 + * 680 + * Returns: 681 + * 0 for success or a negative error code on failure. 682 + */ 683 + 684 + int amdgpu_bo_create_vm(struct amdgpu_device *adev, 685 + struct amdgpu_bo_param *bp, 686 + struct amdgpu_bo_vm **vmbo_ptr) 687 + { 688 + struct amdgpu_bo *bo_ptr; 689 + int r; 690 + 691 + /* bo_ptr_size will be determined by the caller and it depends on 692 + * num of amdgpu_vm_pt entries. 693 + */ 694 + BUG_ON(bp->bo_ptr_size < sizeof(struct amdgpu_bo_vm)); 695 + r = amdgpu_bo_create(adev, bp, &bo_ptr); 696 + if (r) 697 + return r; 698 + 699 + *vmbo_ptr = to_amdgpu_bo_vm(bo_ptr); 700 + return r; 701 + } 702 + 644 703 /** 645 704 * amdgpu_bo_validate - validate an &amdgpu_bo buffer object 646 705 * @bo: pointer to the buffer object ··· 705 700 } 706 701 707 702 return r; 703 + } 704 + 705 + /** 706 + * amdgpu_bo_add_to_shadow_list - add a BO to the shadow list 707 + * 708 + * @bo: BO that will be inserted into the shadow list 709 + * 710 + * Insert a BO to the shadow list. 711 + */ 712 + void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo *bo) 713 + { 714 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 715 + 716 + mutex_lock(&adev->shadow_list_lock); 717 + list_add_tail(&bo->shadow_list, &adev->shadow_list); 718 + mutex_unlock(&adev->shadow_list_lock); 708 719 } 709 720 710 721 /** ··· 1212 1191 1213 1192 BUG_ON(bo->tbo.type == ttm_bo_type_kernel); 1214 1193 ubo = to_amdgpu_bo_user(bo); 1194 + if (metadata_size) 1195 + *metadata_size = ubo->metadata_size; 1196 + 1215 1197 if (buffer) { 1216 1198 if (buffer_size < ubo->metadata_size) 1217 1199 return -EINVAL; ··· 1223 1199 memcpy(buffer, ubo->metadata, ubo->metadata_size); 1224 1200 } 1225 1201 1226 - if (metadata_size) 1227 - *metadata_size = ubo->metadata_size; 1228 1202 if (flags) 1229 1203 *flags = ubo->metadata_flags; 1230 1204
+27 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
··· 44 44 #define AMDGPU_AMDKFD_CREATE_SVM_BO (1ULL << 62) 45 45 46 46 #define to_amdgpu_bo_user(abo) container_of((abo), struct amdgpu_bo_user, bo) 47 + #define to_amdgpu_bo_vm(abo) container_of((abo), struct amdgpu_bo_vm, bo) 47 48 48 49 struct amdgpu_bo_param { 49 50 unsigned long size; ··· 104 103 struct amdgpu_vm_bo_base *vm_bo; 105 104 /* Constant after initialization */ 106 105 struct amdgpu_bo *parent; 107 - struct amdgpu_bo *shadow; 108 - 109 - 110 106 111 107 #ifdef CONFIG_MMU_NOTIFIER 112 108 struct mmu_interval_notifier notifier; ··· 121 123 void *metadata; 122 124 u32 metadata_size; 123 125 126 + }; 127 + 128 + struct amdgpu_bo_vm { 129 + struct amdgpu_bo bo; 130 + struct amdgpu_bo *shadow; 131 + struct amdgpu_vm_pt entries[]; 124 132 }; 125 133 126 134 static inline struct amdgpu_bo *ttm_to_amdgpu_bo(struct ttm_buffer_object *tbo) ··· 256 252 return bo->flags & AMDGPU_GEM_CREATE_ENCRYPTED; 257 253 } 258 254 255 + /** 256 + * amdgpu_bo_shadowed - check if the BO is shadowed 257 + * 258 + * @bo: BO to be tested. 259 + * 260 + * Returns: 261 + * NULL if not shadowed or else return a BO pointer. 262 + */ 263 + static inline struct amdgpu_bo *amdgpu_bo_shadowed(struct amdgpu_bo *bo) 264 + { 265 + if (bo->tbo.type == ttm_bo_type_kernel) 266 + return to_amdgpu_bo_vm(bo)->shadow; 267 + 268 + return NULL; 269 + } 270 + 259 271 bool amdgpu_bo_is_amdgpu_bo(struct ttm_buffer_object *bo); 260 272 void amdgpu_bo_placement_from_domain(struct amdgpu_bo *abo, u32 domain); 261 273 ··· 292 272 int amdgpu_bo_create_user(struct amdgpu_device *adev, 293 273 struct amdgpu_bo_param *bp, 294 274 struct amdgpu_bo_user **ubo_ptr); 275 + int amdgpu_bo_create_vm(struct amdgpu_device *adev, 276 + struct amdgpu_bo_param *bp, 277 + struct amdgpu_bo_vm **ubo_ptr); 295 278 void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr, 296 279 void **cpu_addr); 297 - int amdgpu_bo_create_shadow(struct amdgpu_device *adev, 298 - unsigned long size, 299 - struct amdgpu_bo *bo); 300 280 int amdgpu_bo_kmap(struct amdgpu_bo *bo, void **ptr); 301 281 void *amdgpu_bo_kptr(struct amdgpu_bo *bo); 302 282 void amdgpu_bo_kunmap(struct amdgpu_bo *bo); ··· 332 312 int amdgpu_bo_validate(struct amdgpu_bo *bo); 333 313 void amdgpu_bo_get_memory(struct amdgpu_bo *bo, uint64_t *vram_mem, 334 314 uint64_t *gtt_mem, uint64_t *cpu_mem); 315 + void amdgpu_bo_add_to_shadow_list(struct amdgpu_bo *bo); 335 316 int amdgpu_bo_restore_shadow(struct amdgpu_bo *shadow, 336 317 struct dma_fence **fence); 337 318 uint32_t amdgpu_bo_get_preferred_pin_domain(struct amdgpu_device *adev,
+190
drivers/gpu/drm/amd/amdgpu/amdgpu_preempt_mgr.c
··· 1 + // SPDX-License-Identifier: GPL-2.0 OR MIT 2 + /* 3 + * Copyright 2016-2021 Advanced Micro Devices, Inc. 4 + * 5 + * Permission is hereby granted, free of charge, to any person obtaining a 6 + * copy of this software and associated documentation files (the "Software"), 7 + * to deal in the Software without restriction, including without limitation 8 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 + * and/or sell copies of the Software, and to permit persons to whom the 10 + * Software is furnished to do so, subject to the following conditions: 11 + * 12 + * The above copyright notice and this permission notice shall be included in 13 + * all copies or substantial portions of the Software. 14 + * 15 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 + * OTHER DEALINGS IN THE SOFTWARE. 22 + * 23 + * Authors: Christian König, Felix Kuehling 24 + */ 25 + 26 + #include "amdgpu.h" 27 + 28 + static inline struct amdgpu_preempt_mgr * 29 + to_preempt_mgr(struct ttm_resource_manager *man) 30 + { 31 + return container_of(man, struct amdgpu_preempt_mgr, manager); 32 + } 33 + 34 + /** 35 + * DOC: mem_info_preempt_used 36 + * 37 + * The amdgpu driver provides a sysfs API for reporting current total amount of 38 + * used preemptible memory. 39 + * The file mem_info_preempt_used is used for this, and returns the current 40 + * used size of the preemptible block, in bytes 41 + */ 42 + static ssize_t mem_info_preempt_used_show(struct device *dev, 43 + struct device_attribute *attr, 44 + char *buf) 45 + { 46 + struct drm_device *ddev = dev_get_drvdata(dev); 47 + struct amdgpu_device *adev = drm_to_adev(ddev); 48 + struct ttm_resource_manager *man; 49 + 50 + man = ttm_manager_type(&adev->mman.bdev, AMDGPU_PL_PREEMPT); 51 + return sysfs_emit(buf, "%llu\n", amdgpu_preempt_mgr_usage(man)); 52 + } 53 + 54 + static DEVICE_ATTR_RO(mem_info_preempt_used); 55 + 56 + /** 57 + * amdgpu_preempt_mgr_new - allocate a new node 58 + * 59 + * @man: TTM memory type manager 60 + * @tbo: TTM BO we need this range for 61 + * @place: placement flags and restrictions 62 + * @mem: the resulting mem object 63 + * 64 + * Dummy, just count the space used without allocating resources or any limit. 65 + */ 66 + static int amdgpu_preempt_mgr_new(struct ttm_resource_manager *man, 67 + struct ttm_buffer_object *tbo, 68 + const struct ttm_place *place, 69 + struct ttm_resource *mem) 70 + { 71 + struct amdgpu_preempt_mgr *mgr = to_preempt_mgr(man); 72 + 73 + atomic64_add(mem->num_pages, &mgr->used); 74 + 75 + mem->mm_node = NULL; 76 + mem->start = AMDGPU_BO_INVALID_OFFSET; 77 + return 0; 78 + } 79 + 80 + /** 81 + * amdgpu_preempt_mgr_del - free ranges 82 + * 83 + * @man: TTM memory type manager 84 + * @mem: TTM memory object 85 + * 86 + * Free the allocated GTT again. 87 + */ 88 + static void amdgpu_preempt_mgr_del(struct ttm_resource_manager *man, 89 + struct ttm_resource *mem) 90 + { 91 + struct amdgpu_preempt_mgr *mgr = to_preempt_mgr(man); 92 + 93 + atomic64_sub(mem->num_pages, &mgr->used); 94 + } 95 + 96 + /** 97 + * amdgpu_preempt_mgr_usage - return usage of PREEMPT domain 98 + * 99 + * @man: TTM memory type manager 100 + * 101 + * Return how many bytes are used in the GTT domain 102 + */ 103 + uint64_t amdgpu_preempt_mgr_usage(struct ttm_resource_manager *man) 104 + { 105 + struct amdgpu_preempt_mgr *mgr = to_preempt_mgr(man); 106 + s64 result = atomic64_read(&mgr->used); 107 + 108 + return (result > 0 ? result : 0) * PAGE_SIZE; 109 + } 110 + 111 + /** 112 + * amdgpu_preempt_mgr_debug - dump VRAM table 113 + * 114 + * @man: TTM memory type manager 115 + * @printer: DRM printer to use 116 + * 117 + * Dump the table content using printk. 118 + */ 119 + static void amdgpu_preempt_mgr_debug(struct ttm_resource_manager *man, 120 + struct drm_printer *printer) 121 + { 122 + struct amdgpu_preempt_mgr *mgr = to_preempt_mgr(man); 123 + 124 + drm_printf(printer, "man size:%llu pages, preempt used:%lld pages\n", 125 + man->size, (u64)atomic64_read(&mgr->used)); 126 + } 127 + 128 + static const struct ttm_resource_manager_func amdgpu_preempt_mgr_func = { 129 + .alloc = amdgpu_preempt_mgr_new, 130 + .free = amdgpu_preempt_mgr_del, 131 + .debug = amdgpu_preempt_mgr_debug 132 + }; 133 + 134 + /** 135 + * amdgpu_preempt_mgr_init - init PREEMPT manager and DRM MM 136 + * 137 + * @adev: amdgpu_device pointer 138 + * 139 + * Allocate and initialize the GTT manager. 140 + */ 141 + int amdgpu_preempt_mgr_init(struct amdgpu_device *adev) 142 + { 143 + struct amdgpu_preempt_mgr *mgr = &adev->mman.preempt_mgr; 144 + struct ttm_resource_manager *man = &mgr->manager; 145 + int ret; 146 + 147 + man->use_tt = true; 148 + man->func = &amdgpu_preempt_mgr_func; 149 + 150 + ttm_resource_manager_init(man, (1 << 30)); 151 + 152 + atomic64_set(&mgr->used, 0); 153 + 154 + ret = device_create_file(adev->dev, &dev_attr_mem_info_preempt_used); 155 + if (ret) { 156 + DRM_ERROR("Failed to create device file mem_info_preempt_used\n"); 157 + return ret; 158 + } 159 + 160 + ttm_set_driver_manager(&adev->mman.bdev, AMDGPU_PL_PREEMPT, 161 + &mgr->manager); 162 + ttm_resource_manager_set_used(man, true); 163 + return 0; 164 + } 165 + 166 + /** 167 + * amdgpu_preempt_mgr_fini - free and destroy GTT manager 168 + * 169 + * @adev: amdgpu_device pointer 170 + * 171 + * Destroy and free the GTT manager, returns -EBUSY if ranges are still 172 + * allocated inside it. 173 + */ 174 + void amdgpu_preempt_mgr_fini(struct amdgpu_device *adev) 175 + { 176 + struct amdgpu_preempt_mgr *mgr = &adev->mman.preempt_mgr; 177 + struct ttm_resource_manager *man = &mgr->manager; 178 + int ret; 179 + 180 + ttm_resource_manager_set_used(man, false); 181 + 182 + ret = ttm_resource_manager_evict_all(&adev->mman.bdev, man); 183 + if (ret) 184 + return; 185 + 186 + device_remove_file(adev->dev, &dev_attr_mem_info_preempt_used); 187 + 188 + ttm_resource_manager_cleanup(man); 189 + ttm_set_driver_manager(&adev->mman.bdev, AMDGPU_PL_PREEMPT, NULL); 190 + }
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
··· 76 76 uint64_t ring_mem_mc_addr; 77 77 void *ring_mem_handle; 78 78 uint32_t ring_size; 79 + uint32_t ring_wptr; 79 80 }; 80 81 81 82 /* More registers may will be supported */
+55 -8
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.c
··· 27 27 #include <linux/uaccess.h> 28 28 #include <linux/reboot.h> 29 29 #include <linux/syscalls.h> 30 + #include <linux/pm_runtime.h> 30 31 31 32 #include "amdgpu.h" 32 33 #include "amdgpu_ras.h" ··· 1044 1043 } 1045 1044 1046 1045 /* get the total error counts on all IPs */ 1047 - unsigned long amdgpu_ras_query_error_count(struct amdgpu_device *adev, 1048 - bool is_ce) 1046 + void amdgpu_ras_query_error_count(struct amdgpu_device *adev, 1047 + unsigned long *ce_count, 1048 + unsigned long *ue_count) 1049 1049 { 1050 1050 struct amdgpu_ras *con = amdgpu_ras_get_context(adev); 1051 1051 struct ras_manager *obj; 1052 - struct ras_err_data data = {0, 0}; 1052 + unsigned long ce, ue; 1053 1053 1054 1054 if (!adev->ras_enabled || !con) 1055 - return 0; 1055 + return; 1056 1056 1057 + ce = 0; 1058 + ue = 0; 1057 1059 list_for_each_entry(obj, &con->head, node) { 1058 1060 struct ras_query_if info = { 1059 1061 .head = obj->head, 1060 1062 }; 1061 1063 1062 1064 if (amdgpu_ras_query_error_status(adev, &info)) 1063 - return 0; 1065 + return; 1064 1066 1065 - data.ce_count += info.ce_count; 1066 - data.ue_count += info.ue_count; 1067 + ce += info.ce_count; 1068 + ue += info.ue_count; 1067 1069 } 1068 1070 1069 - return is_ce ? data.ce_count : data.ue_count; 1071 + if (ce_count) 1072 + *ce_count = ce; 1073 + 1074 + if (ue_count) 1075 + *ue_count = ue; 1070 1076 } 1071 1077 /* query/inject/cure end */ 1072 1078 ··· 2117 2109 adev->ras_hw_enabled & amdgpu_ras_mask; 2118 2110 } 2119 2111 2112 + static void amdgpu_ras_counte_dw(struct work_struct *work) 2113 + { 2114 + struct amdgpu_ras *con = container_of(work, struct amdgpu_ras, 2115 + ras_counte_delay_work.work); 2116 + struct amdgpu_device *adev = con->adev; 2117 + struct drm_device *dev = &adev->ddev; 2118 + unsigned long ce_count, ue_count; 2119 + int res; 2120 + 2121 + res = pm_runtime_get_sync(dev->dev); 2122 + if (res < 0) 2123 + goto Out; 2124 + 2125 + /* Cache new values. 2126 + */ 2127 + amdgpu_ras_query_error_count(adev, &ce_count, &ue_count); 2128 + atomic_set(&con->ras_ce_count, ce_count); 2129 + atomic_set(&con->ras_ue_count, ue_count); 2130 + 2131 + pm_runtime_mark_last_busy(dev->dev); 2132 + Out: 2133 + pm_runtime_put_autosuspend(dev->dev); 2134 + } 2135 + 2120 2136 int amdgpu_ras_init(struct amdgpu_device *adev) 2121 2137 { 2122 2138 struct amdgpu_ras *con = amdgpu_ras_get_context(adev); ··· 2154 2122 GFP_KERNEL|__GFP_ZERO); 2155 2123 if (!con) 2156 2124 return -ENOMEM; 2125 + 2126 + con->adev = adev; 2127 + INIT_DELAYED_WORK(&con->ras_counte_delay_work, amdgpu_ras_counte_dw); 2128 + atomic_set(&con->ras_ce_count, 0); 2129 + atomic_set(&con->ras_ue_count, 0); 2157 2130 2158 2131 con->objs = (struct ras_manager *)(con + 1); 2159 2132 ··· 2263 2226 struct ras_fs_if *fs_info, 2264 2227 struct ras_ih_if *ih_info) 2265 2228 { 2229 + struct amdgpu_ras *con = amdgpu_ras_get_context(adev); 2230 + unsigned long ue_count, ce_count; 2266 2231 int r; 2267 2232 2268 2233 /* disable RAS feature per IP block if it is not supported */ ··· 2304 2265 r = amdgpu_ras_sysfs_create(adev, fs_info); 2305 2266 if (r) 2306 2267 goto sysfs; 2268 + 2269 + /* Those are the cached values at init. 2270 + */ 2271 + amdgpu_ras_query_error_count(adev, &ce_count, &ue_count); 2272 + atomic_set(&con->ras_ce_count, ce_count); 2273 + atomic_set(&con->ras_ue_count, ue_count); 2307 2274 2308 2275 return 0; 2309 2276 cleanup: ··· 2428 2383 2429 2384 if (con->features) 2430 2385 amdgpu_ras_disable_all_features(adev, 1); 2386 + 2387 + cancel_delayed_work_sync(&con->ras_counte_delay_work); 2431 2388 2432 2389 amdgpu_ras_set_context(adev, NULL); 2433 2390 kfree(con);
+8 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_ras.h
··· 340 340 341 341 /* disable ras error count harvest in recovery */ 342 342 bool disable_ras_err_cnt_harvest; 343 + 344 + /* RAS count errors delayed work */ 345 + struct delayed_work ras_counte_delay_work; 346 + atomic_t ras_ue_count; 347 + atomic_t ras_ce_count; 343 348 }; 344 349 345 350 struct ras_fs_data { ··· 490 485 void amdgpu_ras_resume(struct amdgpu_device *adev); 491 486 void amdgpu_ras_suspend(struct amdgpu_device *adev); 492 487 493 - unsigned long amdgpu_ras_query_error_count(struct amdgpu_device *adev, 494 - bool is_ce); 488 + void amdgpu_ras_query_error_count(struct amdgpu_device *adev, 489 + unsigned long *ce_count, 490 + unsigned long *ue_count); 495 491 496 492 /* error handling functions */ 497 493 int amdgpu_ras_add_bad_pages(struct amdgpu_device *adev,
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_rlc.h
··· 127 127 void (*reset)(struct amdgpu_device *adev); 128 128 void (*start)(struct amdgpu_device *adev); 129 129 void (*update_spm_vmid)(struct amdgpu_device *adev, unsigned vmid); 130 - void (*rlcg_wreg)(struct amdgpu_device *adev, u32 offset, u32 v, u32 flag); 131 - u32 (*rlcg_rreg)(struct amdgpu_device *adev, u32 offset, u32 flag); 130 + void (*rlcg_wreg)(struct amdgpu_device *adev, u32 offset, u32 v, u32 acc_flags, u32 hwip); 131 + u32 (*rlcg_rreg)(struct amdgpu_device *adev, u32 offset, u32 acc_flags, u32 hwip); 132 132 bool (*is_rlcg_access_range)(struct amdgpu_device *adev, uint32_t reg); 133 133 }; 134 134
+34 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 158 158 } 159 159 break; 160 160 case TTM_PL_TT: 161 + case AMDGPU_PL_PREEMPT: 161 162 default: 162 163 amdgpu_bo_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 163 164 break; ··· 199 198 200 199 BUG_ON(adev->mman.buffer_funcs->copy_max_bytes < 201 200 AMDGPU_GTT_MAX_TRANSFER_SIZE * 8); 201 + BUG_ON(mem->mem_type == AMDGPU_PL_PREEMPT); 202 202 203 203 /* Map only what can't be accessed directly */ 204 204 if (!tmz && mem->start != AMDGPU_BO_INVALID_OFFSET) { ··· 463 461 struct ttm_resource *old_mem = &bo->mem; 464 462 int r; 465 463 466 - if (new_mem->mem_type == TTM_PL_TT) { 464 + if (new_mem->mem_type == TTM_PL_TT || 465 + new_mem->mem_type == AMDGPU_PL_PREEMPT) { 467 466 r = amdgpu_ttm_backend_bind(bo->bdev, bo->ttm, new_mem); 468 467 if (r) 469 468 return r; ··· 482 479 goto out; 483 480 } 484 481 if (old_mem->mem_type == TTM_PL_SYSTEM && 485 - new_mem->mem_type == TTM_PL_TT) { 482 + (new_mem->mem_type == TTM_PL_TT || 483 + new_mem->mem_type == AMDGPU_PL_PREEMPT)) { 486 484 ttm_bo_move_null(bo, new_mem); 487 485 goto out; 488 486 } 489 - if (old_mem->mem_type == TTM_PL_TT && 487 + if ((old_mem->mem_type == TTM_PL_TT || 488 + old_mem->mem_type == AMDGPU_PL_PREEMPT) && 490 489 new_mem->mem_type == TTM_PL_SYSTEM) { 491 490 r = ttm_bo_wait_ctx(bo, ctx); 492 491 if (r) ··· 573 568 /* system memory */ 574 569 return 0; 575 570 case TTM_PL_TT: 571 + case AMDGPU_PL_PREEMPT: 576 572 break; 577 573 case TTM_PL_VRAM: 578 574 mem->bus.offset = mem->start << PAGE_SHIFT; ··· 993 987 return r; 994 988 } 995 989 990 + amdgpu_gart_invalidate_tlb(adev); 996 991 ttm_resource_free(bo, &bo->mem); 997 992 bo->mem = tmp; 998 993 } ··· 1280 1273 if (mem && mem->mem_type != TTM_PL_SYSTEM) 1281 1274 flags |= AMDGPU_PTE_VALID; 1282 1275 1283 - if (mem && mem->mem_type == TTM_PL_TT) { 1276 + if (mem && (mem->mem_type == TTM_PL_TT || 1277 + mem->mem_type == AMDGPU_PL_PREEMPT)) { 1284 1278 flags |= AMDGPU_PTE_SYSTEM; 1285 1279 1286 1280 if (ttm->caching == ttm_cached) ··· 1355 1347 } 1356 1348 1357 1349 switch (bo->mem.mem_type) { 1350 + case AMDGPU_PL_PREEMPT: 1351 + /* Preemptible BOs don't own system resources managed by the 1352 + * driver (pages, VRAM, GART space). They point to resources 1353 + * owned by someone else (e.g. pageable memory in user mode 1354 + * or a DMABuf). They are used in a preemptible context so we 1355 + * can guarantee no deadlocks and good QoS in case of MMU 1356 + * notifiers or DMABuf move notifiers from the resource owner. 1357 + */ 1358 + return false; 1358 1359 case TTM_PL_TT: 1359 1360 if (amdgpu_bo_is_amdgpu_bo(bo) && 1360 1361 amdgpu_bo_encrypted(ttm_to_amdgpu_bo(bo))) ··· 1744 1727 DRM_INFO("amdgpu: %uM of GTT memory ready.\n", 1745 1728 (unsigned)(gtt_size / (1024 * 1024))); 1746 1729 1730 + /* Initialize preemptible memory pool */ 1731 + r = amdgpu_preempt_mgr_init(adev); 1732 + if (r) { 1733 + DRM_ERROR("Failed initializing PREEMPT heap.\n"); 1734 + return r; 1735 + } 1736 + 1747 1737 /* Initialize various on-chip memory pools */ 1748 1738 r = amdgpu_ttm_init_on_chip(adev, AMDGPU_PL_GDS, adev->gds.gds_size); 1749 1739 if (r) { ··· 1791 1767 1792 1768 amdgpu_vram_mgr_fini(adev); 1793 1769 amdgpu_gtt_mgr_fini(adev); 1770 + amdgpu_preempt_mgr_fini(adev); 1794 1771 ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GDS); 1795 1772 ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_GWS); 1796 1773 ttm_range_man_fini(&adev->mman.bdev, AMDGPU_PL_OA); ··· 1939 1914 1940 1915 if (!adev->mman.buffer_funcs_enabled) { 1941 1916 DRM_ERROR("Trying to clear memory with ring turned off.\n"); 1917 + return -EINVAL; 1918 + } 1919 + 1920 + if (bo->tbo.mem.mem_type == AMDGPU_PL_PREEMPT) { 1921 + DRM_ERROR("Trying to clear preemptible memory.\n"); 1942 1922 return -EINVAL; 1943 1923 } 1944 1924
+11
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
··· 31 31 #define AMDGPU_PL_GDS (TTM_PL_PRIV + 0) 32 32 #define AMDGPU_PL_GWS (TTM_PL_PRIV + 1) 33 33 #define AMDGPU_PL_OA (TTM_PL_PRIV + 2) 34 + #define AMDGPU_PL_PREEMPT (TTM_PL_PRIV + 3) 34 35 35 36 #define AMDGPU_GTT_MAX_TRANSFER_SIZE 512 36 37 #define AMDGPU_GTT_NUM_TRANSFER_WINDOWS 2 ··· 55 54 atomic64_t available; 56 55 }; 57 56 57 + struct amdgpu_preempt_mgr { 58 + struct ttm_resource_manager manager; 59 + atomic64_t used; 60 + }; 61 + 58 62 struct amdgpu_mman { 59 63 struct ttm_device bdev; 60 64 bool initialized; ··· 76 70 77 71 struct amdgpu_vram_mgr vram_mgr; 78 72 struct amdgpu_gtt_mgr gtt_mgr; 73 + struct amdgpu_preempt_mgr preempt_mgr; 79 74 80 75 uint64_t stolen_vga_size; 81 76 struct amdgpu_bo *stolen_vga_memory; ··· 104 97 105 98 int amdgpu_gtt_mgr_init(struct amdgpu_device *adev, uint64_t gtt_size); 106 99 void amdgpu_gtt_mgr_fini(struct amdgpu_device *adev); 100 + int amdgpu_preempt_mgr_init(struct amdgpu_device *adev); 101 + void amdgpu_preempt_mgr_fini(struct amdgpu_device *adev); 107 102 int amdgpu_vram_mgr_init(struct amdgpu_device *adev); 108 103 void amdgpu_vram_mgr_fini(struct amdgpu_device *adev); 109 104 110 105 bool amdgpu_gtt_mgr_has_gart_addr(struct ttm_resource *mem); 111 106 uint64_t amdgpu_gtt_mgr_usage(struct ttm_resource_manager *man); 112 107 int amdgpu_gtt_mgr_recover(struct ttm_resource_manager *man); 108 + 109 + uint64_t amdgpu_preempt_mgr_usage(struct ttm_resource_manager *man); 113 110 114 111 u64 amdgpu_vram_mgr_bo_visible_size(struct amdgpu_bo *bo); 115 112 int amdgpu_vram_mgr_alloc_sgt(struct amdgpu_device *adev,
+1 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
··· 840 840 841 841 default: 842 842 DRM_ERROR("Illegal UVD message type (%d)!\n", msg_type); 843 - return -EINVAL; 844 843 } 845 - BUG(); 844 + 846 845 return -EINVAL; 847 846 } 848 847
+5 -5
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 88 88 bool direct, struct dma_fence **fence); 89 89 90 90 /** 91 - * amdgpu_vce_init - allocate memory, load vce firmware 91 + * amdgpu_vce_sw_init - allocate memory, load vce firmware 92 92 * 93 93 * @adev: amdgpu_device pointer 94 94 * @size: size for the new BO ··· 205 205 } 206 206 207 207 /** 208 - * amdgpu_vce_fini - free memory 208 + * amdgpu_vce_sw_fini - free memory 209 209 * 210 210 * @adev: amdgpu_device pointer 211 211 * ··· 579 579 } 580 580 581 581 /** 582 - * amdgpu_vce_cs_validate_bo - make sure not to cross 4GB boundary 582 + * amdgpu_vce_validate_bo - make sure not to cross 4GB boundary 583 583 * 584 584 * @p: parser context 585 585 * @ib_idx: indirect buffer to use ··· 720 720 } 721 721 722 722 /** 723 - * amdgpu_vce_cs_parse - parse and validate the command stream 723 + * amdgpu_vce_ring_parse_cs - parse and validate the command stream 724 724 * 725 725 * @p: parser context 726 726 * @ib_idx: indirect buffer to use ··· 956 956 } 957 957 958 958 /** 959 - * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode 959 + * amdgpu_vce_ring_parse_cs_vm - parse the command stream in VM mode 960 960 * 961 961 * @p: parser context 962 962 * @ib_idx: indirect buffer to use
+105 -61
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 653 653 spin_lock(&adev->mman.bdev.lru_lock); 654 654 list_for_each_entry(bo_base, &vm->idle, vm_status) { 655 655 struct amdgpu_bo *bo = bo_base->bo; 656 + struct amdgpu_bo *shadow = amdgpu_bo_shadowed(bo); 656 657 657 658 if (!bo->parent) 658 659 continue; 659 660 660 661 ttm_bo_move_to_lru_tail(&bo->tbo, &bo->tbo.mem, 661 662 &vm->lru_bulk_move); 662 - if (bo->shadow) 663 - ttm_bo_move_to_lru_tail(&bo->shadow->tbo, 664 - &bo->shadow->tbo.mem, 663 + if (shadow) 664 + ttm_bo_move_to_lru_tail(&shadow->tbo, &shadow->tbo.mem, 665 665 &vm->lru_bulk_move); 666 666 } 667 667 spin_unlock(&adev->mman.bdev.lru_lock); ··· 693 693 694 694 list_for_each_entry_safe(bo_base, tmp, &vm->evicted, vm_status) { 695 695 struct amdgpu_bo *bo = bo_base->bo; 696 + struct amdgpu_bo *shadow = amdgpu_bo_shadowed(bo); 696 697 697 698 r = validate(param, bo); 698 699 if (r) 699 700 return r; 701 + if (shadow) { 702 + r = validate(param, shadow); 703 + if (r) 704 + return r; 705 + } 700 706 701 707 if (bo->tbo.type != ttm_bo_type_kernel) { 702 708 amdgpu_vm_bo_moved(bo_base); 703 709 } else { 704 - vm->update_funcs->map_table(bo); 710 + vm->update_funcs->map_table(to_amdgpu_bo_vm(bo)); 705 711 amdgpu_vm_bo_relocated(bo_base); 706 712 } 707 713 } ··· 739 733 * 740 734 * @adev: amdgpu_device pointer 741 735 * @vm: VM to clear BO from 742 - * @bo: BO to clear 736 + * @vmbo: BO to clear 743 737 * @immediate: use an immediate update 744 738 * 745 739 * Root PD needs to be reserved when calling this. ··· 749 743 */ 750 744 static int amdgpu_vm_clear_bo(struct amdgpu_device *adev, 751 745 struct amdgpu_vm *vm, 752 - struct amdgpu_bo *bo, 746 + struct amdgpu_bo_vm *vmbo, 753 747 bool immediate) 754 748 { 755 749 struct ttm_operation_ctx ctx = { true, false }; 756 750 unsigned level = adev->vm_manager.root_level; 757 751 struct amdgpu_vm_update_params params; 758 - struct amdgpu_bo *ancestor = bo; 752 + struct amdgpu_bo *ancestor = &vmbo->bo; 753 + struct amdgpu_bo *bo = &vmbo->bo; 759 754 unsigned entries, ats_entries; 760 755 uint64_t addr; 761 756 int r; ··· 796 789 if (r) 797 790 return r; 798 791 799 - if (bo->shadow) { 800 - r = ttm_bo_validate(&bo->shadow->tbo, &bo->shadow->placement, 801 - &ctx); 792 + if (vmbo->shadow) { 793 + struct amdgpu_bo *shadow = vmbo->shadow; 794 + 795 + r = ttm_bo_validate(&shadow->tbo, &shadow->placement, &ctx); 802 796 if (r) 803 797 return r; 804 798 } 805 799 806 - r = vm->update_funcs->map_table(bo); 800 + r = vm->update_funcs->map_table(vmbo); 807 801 if (r) 808 802 return r; 809 803 ··· 828 820 amdgpu_gmc_get_vm_pde(adev, level, &value, &flags); 829 821 } 830 822 831 - r = vm->update_funcs->update(&params, bo, addr, 0, ats_entries, 823 + r = vm->update_funcs->update(&params, vmbo, addr, 0, ats_entries, 832 824 value, flags); 833 825 if (r) 834 826 return r; ··· 851 843 } 852 844 } 853 845 854 - r = vm->update_funcs->update(&params, bo, addr, 0, entries, 846 + r = vm->update_funcs->update(&params, vmbo, addr, 0, entries, 855 847 value, flags); 856 848 if (r) 857 849 return r; ··· 867 859 * @vm: requesting vm 868 860 * @level: the page table level 869 861 * @immediate: use a immediate update 870 - * @bo: pointer to the buffer object pointer 862 + * @vmbo: pointer to the buffer object pointer 871 863 */ 872 864 static int amdgpu_vm_pt_create(struct amdgpu_device *adev, 873 865 struct amdgpu_vm *vm, 874 866 int level, bool immediate, 875 - struct amdgpu_bo **bo) 867 + struct amdgpu_bo_vm **vmbo) 876 868 { 877 869 struct amdgpu_bo_param bp; 870 + struct amdgpu_bo *bo; 871 + struct dma_resv *resv; 872 + unsigned int num_entries; 878 873 int r; 879 874 880 875 memset(&bp, 0, sizeof(bp)); ··· 888 877 bp.domain = amdgpu_bo_get_preferred_pin_domain(adev, bp.domain); 889 878 bp.flags = AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS | 890 879 AMDGPU_GEM_CREATE_CPU_GTT_USWC; 891 - bp.bo_ptr_size = sizeof(struct amdgpu_bo); 880 + 881 + if (level < AMDGPU_VM_PTB) 882 + num_entries = amdgpu_vm_num_entries(adev, level); 883 + else 884 + num_entries = 0; 885 + 886 + bp.bo_ptr_size = struct_size((*vmbo), entries, num_entries); 887 + 892 888 if (vm->use_cpu_for_update) 893 889 bp.flags |= AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; 894 890 ··· 904 886 if (vm->root.base.bo) 905 887 bp.resv = vm->root.base.bo->tbo.base.resv; 906 888 907 - r = amdgpu_bo_create(adev, &bp, bo); 889 + r = amdgpu_bo_create_vm(adev, &bp, vmbo); 908 890 if (r) 909 891 return r; 910 892 911 - if (vm->is_compute_context && (adev->flags & AMD_IS_APU)) 893 + bo = &(*vmbo)->bo; 894 + if (vm->is_compute_context && (adev->flags & AMD_IS_APU)) { 895 + (*vmbo)->shadow = NULL; 912 896 return 0; 897 + } 913 898 914 899 if (!bp.resv) 915 - WARN_ON(dma_resv_lock((*bo)->tbo.base.resv, 900 + WARN_ON(dma_resv_lock(bo->tbo.base.resv, 916 901 NULL)); 917 - r = amdgpu_bo_create_shadow(adev, bp.size, *bo); 902 + resv = bp.resv; 903 + memset(&bp, 0, sizeof(bp)); 904 + bp.size = amdgpu_vm_bo_size(adev, level); 905 + bp.domain = AMDGPU_GEM_DOMAIN_GTT; 906 + bp.flags = AMDGPU_GEM_CREATE_CPU_GTT_USWC; 907 + bp.type = ttm_bo_type_kernel; 908 + bp.resv = bo->tbo.base.resv; 909 + bp.bo_ptr_size = sizeof(struct amdgpu_bo); 918 910 919 - if (!bp.resv) 920 - dma_resv_unlock((*bo)->tbo.base.resv); 911 + r = amdgpu_bo_create(adev, &bp, &(*vmbo)->shadow); 912 + 913 + if (!resv) 914 + dma_resv_unlock(bo->tbo.base.resv); 921 915 922 916 if (r) { 923 - amdgpu_bo_unref(bo); 917 + amdgpu_bo_unref(&bo); 924 918 return r; 925 919 } 920 + 921 + (*vmbo)->shadow->parent = amdgpu_bo_ref(bo); 922 + amdgpu_bo_add_to_shadow_list((*vmbo)->shadow); 926 923 927 924 return 0; 928 925 } ··· 962 929 bool immediate) 963 930 { 964 931 struct amdgpu_vm_pt *entry = cursor->entry; 965 - struct amdgpu_bo *pt; 932 + struct amdgpu_bo *pt_bo; 933 + struct amdgpu_bo_vm *pt; 966 934 int r; 967 935 968 - if (cursor->level < AMDGPU_VM_PTB && !entry->entries) { 969 - unsigned num_entries; 970 - 971 - num_entries = amdgpu_vm_num_entries(adev, cursor->level); 972 - entry->entries = kvmalloc_array(num_entries, 973 - sizeof(*entry->entries), 974 - GFP_KERNEL | __GFP_ZERO); 975 - if (!entry->entries) 976 - return -ENOMEM; 977 - } 978 - 979 - if (entry->base.bo) 936 + if (entry->base.bo) { 937 + if (cursor->level < AMDGPU_VM_PTB) 938 + entry->entries = 939 + to_amdgpu_bo_vm(entry->base.bo)->entries; 940 + else 941 + entry->entries = NULL; 980 942 return 0; 943 + } 981 944 982 945 r = amdgpu_vm_pt_create(adev, vm, cursor->level, immediate, &pt); 983 946 if (r) ··· 982 953 /* Keep a reference to the root directory to avoid 983 954 * freeing them up in the wrong order. 984 955 */ 985 - pt->parent = amdgpu_bo_ref(cursor->parent->base.bo); 986 - amdgpu_vm_bo_base_init(&entry->base, vm, pt); 956 + pt_bo = &pt->bo; 957 + pt_bo->parent = amdgpu_bo_ref(cursor->parent->base.bo); 958 + amdgpu_vm_bo_base_init(&entry->base, vm, pt_bo); 959 + if (cursor->level < AMDGPU_VM_PTB) 960 + entry->entries = pt->entries; 961 + else 962 + entry->entries = NULL; 987 963 988 964 r = amdgpu_vm_clear_bo(adev, vm, pt, immediate); 989 965 if (r) ··· 998 964 999 965 error_free_pt: 1000 966 amdgpu_bo_unref(&pt->shadow); 1001 - amdgpu_bo_unref(&pt); 967 + amdgpu_bo_unref(&pt_bo); 1002 968 return r; 1003 969 } 1004 970 ··· 1009 975 */ 1010 976 static void amdgpu_vm_free_table(struct amdgpu_vm_pt *entry) 1011 977 { 978 + struct amdgpu_bo *shadow; 979 + 1012 980 if (entry->base.bo) { 981 + shadow = amdgpu_bo_shadowed(entry->base.bo); 1013 982 entry->base.bo->vm_bo = NULL; 1014 983 list_del(&entry->base.vm_status); 1015 - amdgpu_bo_unref(&entry->base.bo->shadow); 984 + amdgpu_bo_unref(&shadow); 1016 985 amdgpu_bo_unref(&entry->base.bo); 1017 986 } 1018 - kvfree(entry->entries); 1019 987 entry->entries = NULL; 1020 988 } 1021 989 ··· 1316 1280 level += params->adev->vm_manager.root_level; 1317 1281 amdgpu_gmc_get_pde_for_bo(entry->base.bo, level, &pt, &flags); 1318 1282 pde = (entry - parent->entries) * 8; 1319 - return vm->update_funcs->update(params, bo, pde, pt, 1, 0, flags); 1283 + return vm->update_funcs->update(params, to_amdgpu_bo_vm(bo), pde, pt, 1284 + 1, 0, flags); 1320 1285 } 1321 1286 1322 1287 /** ··· 1397 1360 * Make sure to set the right flags for the PTEs at the desired level. 1398 1361 */ 1399 1362 static void amdgpu_vm_update_flags(struct amdgpu_vm_update_params *params, 1400 - struct amdgpu_bo *bo, unsigned level, 1363 + struct amdgpu_bo_vm *pt, unsigned int level, 1401 1364 uint64_t pe, uint64_t addr, 1402 - unsigned count, uint32_t incr, 1365 + unsigned int count, uint32_t incr, 1403 1366 uint64_t flags) 1404 1367 1405 1368 { ··· 1415 1378 flags |= AMDGPU_PTE_EXECUTABLE; 1416 1379 } 1417 1380 1418 - params->vm->update_funcs->update(params, bo, pe, addr, count, incr, 1381 + params->vm->update_funcs->update(params, pt, pe, addr, count, incr, 1419 1382 flags); 1420 1383 } 1421 1384 ··· 1595 1558 nptes, dst, incr, upd_flags, 1596 1559 vm->task_info.pid, 1597 1560 vm->immediate.fence_context); 1598 - amdgpu_vm_update_flags(params, pt, cursor.level, 1599 - pe_start, dst, nptes, incr, 1600 - upd_flags); 1561 + amdgpu_vm_update_flags(params, to_amdgpu_bo_vm(pt), 1562 + cursor.level, pe_start, dst, 1563 + nptes, incr, upd_flags); 1601 1564 1602 1565 pe_start += nptes * 8; 1603 1566 dst += nptes * incr; ··· 1620 1583 * completely covered by the range and so potentially still in use. 1621 1584 */ 1622 1585 while (cursor.pfn < frag_start) { 1623 - amdgpu_vm_free_pts(adev, params->vm, &cursor); 1586 + /* Make sure previous mapping is freed */ 1587 + if (cursor.entry->base.bo) { 1588 + params->table_freed = true; 1589 + amdgpu_vm_free_pts(adev, params->vm, &cursor); 1590 + } 1624 1591 amdgpu_vm_pt_next(adev, &cursor); 1625 - params->table_freed = true; 1626 1592 } 1627 1593 1628 1594 } else if (frag >= shift) { ··· 1862 1822 bo = gem_to_amdgpu_bo(gobj); 1863 1823 } 1864 1824 mem = &bo->tbo.mem; 1865 - if (mem->mem_type == TTM_PL_TT) 1825 + if (mem->mem_type == TTM_PL_TT || 1826 + mem->mem_type == AMDGPU_PL_PREEMPT) 1866 1827 pages_addr = bo->tbo.ttm->dma_address; 1867 1828 } 1868 1829 ··· 2714 2673 struct amdgpu_vm_bo_base *bo_base; 2715 2674 2716 2675 /* shadow bo doesn't have bo base, its validation needs its parent */ 2717 - if (bo->parent && bo->parent->shadow == bo) 2676 + if (bo->parent && (amdgpu_bo_shadowed(bo->parent) == bo)) 2718 2677 bo = bo->parent; 2719 2678 2720 2679 for (bo_base = bo->vm_bo; bo_base; bo_base = bo_base->next) { ··· 2883 2842 */ 2884 2843 int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, u32 pasid) 2885 2844 { 2886 - struct amdgpu_bo *root; 2845 + struct amdgpu_bo *root_bo; 2846 + struct amdgpu_bo_vm *root; 2887 2847 int r, i; 2888 2848 2889 2849 vm->va = RB_ROOT_CACHED; ··· 2938 2896 false, &root); 2939 2897 if (r) 2940 2898 goto error_free_delayed; 2941 - 2942 - r = amdgpu_bo_reserve(root, true); 2899 + root_bo = &root->bo; 2900 + r = amdgpu_bo_reserve(root_bo, true); 2943 2901 if (r) 2944 2902 goto error_free_root; 2945 2903 2946 - r = dma_resv_reserve_shared(root->tbo.base.resv, 1); 2904 + r = dma_resv_reserve_shared(root_bo->tbo.base.resv, 1); 2947 2905 if (r) 2948 2906 goto error_unreserve; 2949 2907 2950 - amdgpu_vm_bo_base_init(&vm->root.base, vm, root); 2908 + amdgpu_vm_bo_base_init(&vm->root.base, vm, root_bo); 2951 2909 2952 2910 r = amdgpu_vm_clear_bo(adev, vm, root, false); 2953 2911 if (r) ··· 2976 2934 amdgpu_bo_unreserve(vm->root.base.bo); 2977 2935 2978 2936 error_free_root: 2979 - amdgpu_bo_unref(&vm->root.base.bo->shadow); 2980 - amdgpu_bo_unref(&vm->root.base.bo); 2937 + amdgpu_bo_unref(&root->shadow); 2938 + amdgpu_bo_unref(&root_bo); 2981 2939 vm->root.base.bo = NULL; 2982 2940 2983 2941 error_free_delayed: ··· 3075 3033 */ 3076 3034 if (pte_support_ats != vm->pte_support_ats) { 3077 3035 vm->pte_support_ats = pte_support_ats; 3078 - r = amdgpu_vm_clear_bo(adev, vm, vm->root.base.bo, false); 3036 + r = amdgpu_vm_clear_bo(adev, vm, 3037 + to_amdgpu_bo_vm(vm->root.base.bo), 3038 + false); 3079 3039 if (r) 3080 3040 goto free_idr; 3081 3041 } ··· 3121 3077 } 3122 3078 3123 3079 /* Free the shadow bo for compute VM */ 3124 - amdgpu_bo_unref(&vm->root.base.bo->shadow); 3080 + amdgpu_bo_unref(&to_amdgpu_bo_vm(vm->root.base.bo)->shadow); 3125 3081 3126 3082 if (pasid) 3127 3083 vm->pasid = pasid;
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
··· 39 39 struct amdgpu_bo_va; 40 40 struct amdgpu_job; 41 41 struct amdgpu_bo_list_entry; 42 + struct amdgpu_bo_vm; 42 43 43 44 /* 44 45 * GPUVM handling ··· 240 239 }; 241 240 242 241 struct amdgpu_vm_update_funcs { 243 - int (*map_table)(struct amdgpu_bo *bo); 242 + int (*map_table)(struct amdgpu_bo_vm *bo); 244 243 int (*prepare)(struct amdgpu_vm_update_params *p, struct dma_resv *resv, 245 244 enum amdgpu_sync_mode sync_mode); 246 245 int (*update)(struct amdgpu_vm_update_params *p, 247 - struct amdgpu_bo *bo, uint64_t pe, uint64_t addr, 246 + struct amdgpu_bo_vm *bo, uint64_t pe, uint64_t addr, 248 247 unsigned count, uint32_t incr, uint64_t flags); 249 248 int (*commit)(struct amdgpu_vm_update_params *p, 250 249 struct dma_fence **fence);
+7 -7
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_cpu.c
··· 29 29 * 30 30 * @table: newly allocated or validated PD/PT 31 31 */ 32 - static int amdgpu_vm_cpu_map_table(struct amdgpu_bo *table) 32 + static int amdgpu_vm_cpu_map_table(struct amdgpu_bo_vm *table) 33 33 { 34 - return amdgpu_bo_kmap(table, NULL); 34 + return amdgpu_bo_kmap(&table->bo, NULL); 35 35 } 36 36 37 37 /** ··· 58 58 * amdgpu_vm_cpu_update - helper to update page tables via CPU 59 59 * 60 60 * @p: see amdgpu_vm_update_params definition 61 - * @bo: PD/PT to update 61 + * @vmbo: PD/PT to update 62 62 * @pe: byte offset of the PDE/PTE, relative to start of PDB/PTB 63 63 * @addr: dst addr to write into pe 64 64 * @count: number of page entries to update ··· 68 68 * Write count number of PT/PD entries directly. 69 69 */ 70 70 static int amdgpu_vm_cpu_update(struct amdgpu_vm_update_params *p, 71 - struct amdgpu_bo *bo, uint64_t pe, 71 + struct amdgpu_bo_vm *vmbo, uint64_t pe, 72 72 uint64_t addr, unsigned count, uint32_t incr, 73 73 uint64_t flags) 74 74 { ··· 76 76 uint64_t value; 77 77 int r; 78 78 79 - if (bo->tbo.moving) { 80 - r = dma_fence_wait(bo->tbo.moving, true); 79 + if (vmbo->bo.tbo.moving) { 80 + r = dma_fence_wait(vmbo->bo.tbo.moving, true); 81 81 if (r) 82 82 return r; 83 83 } 84 84 85 - pe += (unsigned long)amdgpu_bo_kptr(bo); 85 + pe += (unsigned long)amdgpu_bo_kptr(&vmbo->bo); 86 86 87 87 trace_amdgpu_vm_set_ptes(pe, addr, count, incr, flags, p->immediate); 88 88
+10 -9
drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c
··· 33 33 * 34 34 * @table: newly allocated or validated PD/PT 35 35 */ 36 - static int amdgpu_vm_sdma_map_table(struct amdgpu_bo *table) 36 + static int amdgpu_vm_sdma_map_table(struct amdgpu_bo_vm *table) 37 37 { 38 38 int r; 39 39 40 - r = amdgpu_ttm_alloc_gart(&table->tbo); 40 + r = amdgpu_ttm_alloc_gart(&table->bo.tbo); 41 41 if (r) 42 42 return r; 43 43 ··· 186 186 * amdgpu_vm_sdma_update - execute VM update 187 187 * 188 188 * @p: see amdgpu_vm_update_params definition 189 - * @bo: PD/PT to update 189 + * @vmbo: PD/PT to update 190 190 * @pe: byte offset of the PDE/PTE, relative to start of PDB/PTB 191 191 * @addr: dst addr to write into pe 192 192 * @count: number of page entries to update ··· 197 197 * the IB. 198 198 */ 199 199 static int amdgpu_vm_sdma_update(struct amdgpu_vm_update_params *p, 200 - struct amdgpu_bo *bo, uint64_t pe, 200 + struct amdgpu_bo_vm *vmbo, uint64_t pe, 201 201 uint64_t addr, unsigned count, uint32_t incr, 202 202 uint64_t flags) 203 203 { 204 + struct amdgpu_bo *bo = &vmbo->bo; 204 205 enum amdgpu_ib_pool_type pool = p->immediate ? AMDGPU_IB_POOL_IMMEDIATE 205 206 : AMDGPU_IB_POOL_DELAYED; 206 207 unsigned int i, ndw, nptes; ··· 239 238 240 239 if (!p->pages_addr) { 241 240 /* set page commands needed */ 242 - if (bo->shadow) 243 - amdgpu_vm_sdma_set_ptes(p, bo->shadow, pe, addr, 241 + if (vmbo->shadow) 242 + amdgpu_vm_sdma_set_ptes(p, vmbo->shadow, pe, addr, 244 243 count, incr, flags); 245 244 amdgpu_vm_sdma_set_ptes(p, bo, pe, addr, count, 246 245 incr, flags); ··· 249 248 250 249 /* copy commands needed */ 251 250 ndw -= p->adev->vm_manager.vm_pte_funcs->copy_pte_num_dw * 252 - (bo->shadow ? 2 : 1); 251 + (vmbo->shadow ? 2 : 1); 253 252 254 253 /* for padding */ 255 254 ndw -= 7; ··· 264 263 pte[i] |= flags; 265 264 } 266 265 267 - if (bo->shadow) 268 - amdgpu_vm_sdma_copy_ptes(p, bo->shadow, pe, nptes); 266 + if (vmbo->shadow) 267 + amdgpu_vm_sdma_copy_ptes(p, vmbo->shadow, pe, nptes); 269 268 amdgpu_vm_sdma_copy_ptes(p, bo, pe, nptes); 270 269 271 270 pe += nptes * 8;
+172
drivers/gpu/drm/amd/amdgpu/atom.c
··· 31 31 32 32 #define ATOM_DEBUG 33 33 34 + #include "atomfirmware.h" 34 35 #include "atom.h" 35 36 #include "atom-names.h" 36 37 #include "atom-bits.h" ··· 1300 1299 } 1301 1300 } 1302 1301 1302 + static void atom_get_vbios_name(struct atom_context *ctx) 1303 + { 1304 + unsigned char *p_rom; 1305 + unsigned char str_num; 1306 + unsigned short off_to_vbios_str; 1307 + unsigned char *c_ptr; 1308 + int name_size; 1309 + int i; 1310 + 1311 + const char *na = "--N/A--"; 1312 + char *back; 1313 + 1314 + p_rom = ctx->bios; 1315 + 1316 + str_num = *(p_rom + OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS); 1317 + if (str_num != 0) { 1318 + off_to_vbios_str = 1319 + *(unsigned short *)(p_rom + OFFSET_TO_GET_ATOMBIOS_STRING_START); 1320 + 1321 + c_ptr = (unsigned char *)(p_rom + off_to_vbios_str); 1322 + } else { 1323 + /* do not know where to find name */ 1324 + memcpy(ctx->name, na, 7); 1325 + ctx->name[7] = 0; 1326 + return; 1327 + } 1328 + 1329 + /* 1330 + * skip the atombios strings, usually 4 1331 + * 1st is P/N, 2nd is ASIC, 3rd is PCI type, 4th is Memory type 1332 + */ 1333 + for (i = 0; i < str_num; i++) { 1334 + while (*c_ptr != 0) 1335 + c_ptr++; 1336 + c_ptr++; 1337 + } 1338 + 1339 + /* skip the following 2 chars: 0x0D 0x0A */ 1340 + c_ptr += 2; 1341 + 1342 + name_size = strnlen(c_ptr, STRLEN_LONG - 1); 1343 + memcpy(ctx->name, c_ptr, name_size); 1344 + back = ctx->name + name_size; 1345 + while ((*--back) == ' ') 1346 + ; 1347 + *(back + 1) = '\0'; 1348 + } 1349 + 1350 + static void atom_get_vbios_date(struct atom_context *ctx) 1351 + { 1352 + unsigned char *p_rom; 1353 + unsigned char *date_in_rom; 1354 + 1355 + p_rom = ctx->bios; 1356 + 1357 + date_in_rom = p_rom + OFFSET_TO_VBIOS_DATE; 1358 + 1359 + ctx->date[0] = '2'; 1360 + ctx->date[1] = '0'; 1361 + ctx->date[2] = date_in_rom[6]; 1362 + ctx->date[3] = date_in_rom[7]; 1363 + ctx->date[4] = '/'; 1364 + ctx->date[5] = date_in_rom[0]; 1365 + ctx->date[6] = date_in_rom[1]; 1366 + ctx->date[7] = '/'; 1367 + ctx->date[8] = date_in_rom[3]; 1368 + ctx->date[9] = date_in_rom[4]; 1369 + ctx->date[10] = ' '; 1370 + ctx->date[11] = date_in_rom[9]; 1371 + ctx->date[12] = date_in_rom[10]; 1372 + ctx->date[13] = date_in_rom[11]; 1373 + ctx->date[14] = date_in_rom[12]; 1374 + ctx->date[15] = date_in_rom[13]; 1375 + ctx->date[16] = '\0'; 1376 + } 1377 + 1378 + static unsigned char *atom_find_str_in_rom(struct atom_context *ctx, char *str, int start, 1379 + int end, int maxlen) 1380 + { 1381 + unsigned long str_off; 1382 + unsigned char *p_rom; 1383 + unsigned short str_len; 1384 + 1385 + str_off = 0; 1386 + str_len = strnlen(str, maxlen); 1387 + p_rom = ctx->bios; 1388 + 1389 + for (; start <= end; ++start) { 1390 + for (str_off = 0; str_off < str_len; ++str_off) { 1391 + if (str[str_off] != *(p_rom + start + str_off)) 1392 + break; 1393 + } 1394 + 1395 + if (str_off == str_len || str[str_off] == 0) 1396 + return p_rom + start; 1397 + } 1398 + return NULL; 1399 + } 1400 + 1401 + static void atom_get_vbios_pn(struct atom_context *ctx) 1402 + { 1403 + unsigned char *p_rom; 1404 + unsigned short off_to_vbios_str; 1405 + unsigned char *vbios_str; 1406 + int count; 1407 + 1408 + off_to_vbios_str = 0; 1409 + p_rom = ctx->bios; 1410 + 1411 + if (*(p_rom + OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS) != 0) { 1412 + off_to_vbios_str = 1413 + *(unsigned short *)(p_rom + OFFSET_TO_GET_ATOMBIOS_STRING_START); 1414 + 1415 + vbios_str = (unsigned char *)(p_rom + off_to_vbios_str); 1416 + } else { 1417 + vbios_str = p_rom + OFFSET_TO_VBIOS_PART_NUMBER; 1418 + } 1419 + 1420 + if (*vbios_str == 0) { 1421 + vbios_str = atom_find_str_in_rom(ctx, BIOS_ATOM_PREFIX, 3, 1024, 64); 1422 + if (vbios_str == NULL) 1423 + vbios_str += sizeof(BIOS_ATOM_PREFIX) - 1; 1424 + } 1425 + if (vbios_str != NULL && *vbios_str == 0) 1426 + vbios_str++; 1427 + 1428 + if (vbios_str != NULL) { 1429 + count = 0; 1430 + while ((count < BIOS_STRING_LENGTH) && vbios_str[count] >= ' ' && 1431 + vbios_str[count] <= 'z') { 1432 + ctx->vbios_pn[count] = vbios_str[count]; 1433 + count++; 1434 + } 1435 + 1436 + ctx->vbios_pn[count] = 0; 1437 + } 1438 + } 1439 + 1440 + static void atom_get_vbios_version(struct atom_context *ctx) 1441 + { 1442 + unsigned char *vbios_ver; 1443 + 1444 + /* find anchor ATOMBIOSBK-AMD */ 1445 + vbios_ver = atom_find_str_in_rom(ctx, BIOS_VERSION_PREFIX, 3, 1024, 64); 1446 + if (vbios_ver != NULL) { 1447 + /* skip ATOMBIOSBK-AMD VER */ 1448 + vbios_ver += 18; 1449 + memcpy(ctx->vbios_ver_str, vbios_ver, STRLEN_NORMAL); 1450 + } else { 1451 + ctx->vbios_ver_str[0] = '\0'; 1452 + } 1453 + } 1454 + 1303 1455 struct atom_context *amdgpu_atom_parse(struct card_info *card, void *bios) 1304 1456 { 1305 1457 int base; 1306 1458 struct atom_context *ctx = 1307 1459 kzalloc(sizeof(struct atom_context), GFP_KERNEL); 1308 1460 char *str; 1461 + struct _ATOM_ROM_HEADER *atom_rom_header; 1462 + struct _ATOM_MASTER_DATA_TABLE *master_table; 1463 + struct _ATOM_FIRMWARE_INFO *atom_fw_info; 1309 1464 u16 idx; 1310 1465 1311 1466 if (!ctx) ··· 1510 1353 strlcpy(ctx->vbios_version, str, sizeof(ctx->vbios_version)); 1511 1354 } 1512 1355 1356 + atom_rom_header = (struct _ATOM_ROM_HEADER *)CSTR(base); 1357 + if (atom_rom_header->usMasterDataTableOffset != 0) { 1358 + master_table = (struct _ATOM_MASTER_DATA_TABLE *) 1359 + CSTR(atom_rom_header->usMasterDataTableOffset); 1360 + if (master_table->ListOfDataTables.FirmwareInfo != 0) { 1361 + atom_fw_info = (struct _ATOM_FIRMWARE_INFO *) 1362 + CSTR(master_table->ListOfDataTables.FirmwareInfo); 1363 + ctx->version = atom_fw_info->ulFirmwareRevision; 1364 + } 1365 + } 1366 + 1367 + atom_get_vbios_name(ctx); 1368 + atom_get_vbios_pn(ctx); 1369 + atom_get_vbios_date(ctx); 1370 + atom_get_vbios_version(ctx); 1513 1371 1514 1372 return ctx; 1515 1373 }
+10
drivers/gpu/drm/amd/amdgpu/atom.h
··· 112 112 #define ATOM_IO_SYSIO 2 113 113 #define ATOM_IO_IIO 0x80 114 114 115 + #define STRLEN_NORMAL 32 116 + #define STRLEN_LONG 64 117 + #define STRLEN_VERYLONG 254 118 + 115 119 struct card_info { 116 120 struct drm_device *dev; 117 121 void (* reg_write)(struct card_info *, uint32_t, uint32_t); /* filled by driver */ ··· 144 140 uint32_t *scratch; 145 141 int scratch_size_bytes; 146 142 char vbios_version[20]; 143 + 144 + uint8_t name[STRLEN_LONG]; 145 + uint8_t vbios_pn[STRLEN_LONG]; 146 + uint32_t version; 147 + uint8_t vbios_ver_str[STRLEN_NORMAL]; 148 + uint8_t date[STRLEN_NORMAL]; 147 149 }; 148 150 149 151 extern int amdgpu_atom_debug;
+4 -4
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
··· 720 720 } 721 721 722 722 /** 723 - * cik_sdma_vm_copy_pages - update PTEs by copying them from the GART 723 + * cik_sdma_vm_copy_pte - update PTEs by copying them from the GART 724 724 * 725 725 * @ib: indirect buffer to fill with commands 726 726 * @pe: addr of the page entry ··· 746 746 } 747 747 748 748 /** 749 - * cik_sdma_vm_write_pages - update PTEs by writing them manually 749 + * cik_sdma_vm_write_pte - update PTEs by writing them manually 750 750 * 751 751 * @ib: indirect buffer to fill with commands 752 752 * @pe: addr of the page entry ··· 775 775 } 776 776 777 777 /** 778 - * cik_sdma_vm_set_pages - update the page tables using sDMA 778 + * cik_sdma_vm_set_pte_pde - update the page tables using sDMA 779 779 * 780 780 * @ib: indirect buffer to fill with commands 781 781 * @pe: addr of the page entry ··· 804 804 } 805 805 806 806 /** 807 - * cik_sdma_vm_pad_ib - pad the IB to the required number of dw 807 + * cik_sdma_ring_pad_ib - pad the IB to the required number of dw 808 808 * 809 809 * @ring: amdgpu_ring structure holding ring information 810 810 * @ib: indirect buffer to fill with padding
+1 -1
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
··· 456 456 } 457 457 458 458 /** 459 - * cik_get_number_of_dram_channels - get the number of dram channels 459 + * si_get_number_of_dram_channels - get the number of dram channels 460 460 * 461 461 * @adev: amdgpu_device pointer 462 462 *
+56 -61
drivers/gpu/drm/amd/amdgpu/gfx_v10_0.c
··· 47 47 #include "gfx_v10_0.h" 48 48 #include "nbio_v2_3.h" 49 49 50 - /** 50 + /* 51 51 * Navi10 has two graphic rings to share each graphic pipe. 52 52 * 1. Primary ring 53 53 * 2. Async ring ··· 1432 1432 SOC15_REG_GOLDEN_VALUE(GC, 0, mmUTCL1_CTRL, 0xffffffff, 0x00c00000) 1433 1433 }; 1434 1434 1435 - static bool gfx_v10_is_rlcg_rw(struct amdgpu_device *adev, u32 offset, uint32_t *flag, bool write) 1435 + static bool gfx_v10_get_rlcg_flag(struct amdgpu_device *adev, u32 acc_flags, u32 hwip, 1436 + int write, u32 *rlcg_flag) 1436 1437 { 1437 - /* always programed by rlcg, only for gc */ 1438 - if (offset == SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_HI) || 1439 - offset == SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_LO) || 1440 - offset == SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_LENGTH) || 1441 - offset == SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_CNTL) || 1442 - offset == SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_INDEX) || 1443 - offset == SOC15_REG_OFFSET(GC, 0, mmCP_ME_CNTL)) { 1444 - if (!amdgpu_sriov_reg_indirect_gc(adev)) 1445 - *flag = GFX_RLCG_GC_WRITE_OLD; 1446 - else 1447 - *flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ; 1438 + switch (hwip) { 1439 + case GC_HWIP: 1440 + if (amdgpu_sriov_reg_indirect_gc(adev)) { 1441 + *rlcg_flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ; 1448 1442 1449 - return true; 1443 + return true; 1444 + /* only in new version, AMDGPU_REGS_NO_KIQ and AMDGPU_REGS_RLC enabled simultaneously */ 1445 + } else if ((acc_flags & AMDGPU_REGS_RLC) && !(acc_flags & AMDGPU_REGS_NO_KIQ)) { 1446 + *rlcg_flag = GFX_RLCG_GC_WRITE_OLD; 1447 + 1448 + return true; 1449 + } 1450 + 1451 + break; 1452 + case MMHUB_HWIP: 1453 + if (amdgpu_sriov_reg_indirect_mmhub(adev) && 1454 + (acc_flags & AMDGPU_REGS_RLC) && write) { 1455 + *rlcg_flag = GFX_RLCG_MMHUB_WRITE; 1456 + return true; 1457 + } 1458 + 1459 + break; 1460 + default: 1461 + DRM_DEBUG("Not program register by RLCG\n"); 1450 1462 } 1451 1463 1452 - /* currently support gc read/write, mmhub write */ 1453 - if (offset >= SOC15_REG_OFFSET(GC, 0, mmSDMA0_DEC_START) && 1454 - offset <= SOC15_REG_OFFSET(GC, 0, mmRLC_GTS_OFFSET_MSB)) { 1455 - if (amdgpu_sriov_reg_indirect_gc(adev)) 1456 - *flag = write ? GFX_RLCG_GC_WRITE : GFX_RLCG_GC_READ; 1457 - else 1458 - return false; 1459 - } else { 1460 - if (amdgpu_sriov_reg_indirect_mmhub(adev)) 1461 - *flag = GFX_RLCG_MMHUB_WRITE; 1462 - else 1463 - return false; 1464 - } 1465 - 1466 - return true; 1464 + return false; 1467 1465 } 1468 1466 1469 1467 static u32 gfx_v10_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, uint32_t flag) ··· 1521 1523 return ret; 1522 1524 } 1523 1525 1524 - static void gfx_v10_rlcg_wreg(struct amdgpu_device *adev, u32 offset, u32 value, u32 flag) 1526 + static void gfx_v10_rlcg_wreg(struct amdgpu_device *adev, u32 offset, u32 value, u32 acc_flags, u32 hwip) 1525 1527 { 1526 - uint32_t rlcg_flag; 1528 + u32 rlcg_flag; 1527 1529 1528 - if (amdgpu_sriov_fullaccess(adev) && 1529 - gfx_v10_is_rlcg_rw(adev, offset, &rlcg_flag, 1)) { 1530 + if (!amdgpu_sriov_runtime(adev) && 1531 + gfx_v10_get_rlcg_flag(adev, acc_flags, hwip, 1, &rlcg_flag)) { 1530 1532 gfx_v10_rlcg_rw(adev, offset, value, rlcg_flag); 1531 - 1532 1533 return; 1533 1534 } 1534 - if (flag & AMDGPU_REGS_NO_KIQ) 1535 + 1536 + if (acc_flags & AMDGPU_REGS_NO_KIQ) 1535 1537 WREG32_NO_KIQ(offset, value); 1536 1538 else 1537 1539 WREG32(offset, value); 1538 1540 } 1539 1541 1540 - static u32 gfx_v10_rlcg_rreg(struct amdgpu_device *adev, u32 offset, u32 flag) 1542 + static u32 gfx_v10_rlcg_rreg(struct amdgpu_device *adev, u32 offset, u32 acc_flags, u32 hwip) 1541 1543 { 1542 - uint32_t rlcg_flag; 1544 + u32 rlcg_flag; 1543 1545 1544 - if (amdgpu_sriov_fullaccess(adev) && 1545 - gfx_v10_is_rlcg_rw(adev, offset, &rlcg_flag, 0)) 1546 + if (!amdgpu_sriov_runtime(adev) && 1547 + gfx_v10_get_rlcg_flag(adev, acc_flags, hwip, 0, &rlcg_flag)) 1546 1548 return gfx_v10_rlcg_rw(adev, offset, 0, rlcg_flag); 1547 1549 1548 - if (flag & AMDGPU_REGS_NO_KIQ) 1550 + if (acc_flags & AMDGPU_REGS_NO_KIQ) 1549 1551 return RREG32_NO_KIQ(offset); 1550 1552 else 1551 1553 return RREG32(offset); 1552 - 1553 - return 0; 1554 1554 } 1555 1555 1556 1556 static const struct soc15_reg_golden golden_settings_gc_10_1_nv14[] = ··· 3931 3935 { 3932 3936 const char *chip_name; 3933 3937 char fw_name[40]; 3934 - char wks[10]; 3938 + char *wks = ""; 3935 3939 int err; 3936 3940 struct amdgpu_firmware_info *info = NULL; 3937 3941 const struct common_firmware_header *header = NULL; ··· 3944 3948 3945 3949 DRM_DEBUG("\n"); 3946 3950 3947 - memset(wks, 0, sizeof(wks)); 3948 3951 switch (adev->asic_type) { 3949 3952 case CHIP_NAVI10: 3950 3953 chip_name = "navi10"; ··· 3952 3957 chip_name = "navi14"; 3953 3958 if (!(adev->pdev->device == 0x7340 && 3954 3959 adev->pdev->revision != 0x00)) 3955 - snprintf(wks, sizeof(wks), "_wks"); 3960 + wks = "_wks"; 3956 3961 break; 3957 3962 case CHIP_NAVI12: 3958 3963 chip_name = "navi12"; ··· 5228 5233 uint32_t tmp; 5229 5234 5230 5235 /* enable Save Restore Machine */ 5231 - tmp = RREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL)); 5236 + tmp = RREG32_SOC15(GC, 0, mmRLC_SRM_CNTL); 5232 5237 tmp |= RLC_SRM_CNTL__AUTO_INCR_ADDR_MASK; 5233 5238 tmp |= RLC_SRM_CNTL__SRM_ENABLE_MASK; 5234 - WREG32(SOC15_REG_OFFSET(GC, 0, mmRLC_SRM_CNTL), tmp); 5239 + WREG32_SOC15(GC, 0, mmRLC_SRM_CNTL, tmp); 5235 5240 } 5236 5241 5237 5242 static int gfx_v10_0_rlc_load_microcode(struct amdgpu_device *adev) ··· 7936 7941 static void gfx_v10_0_update_spm_vmid(struct amdgpu_device *adev, unsigned vmid) 7937 7942 { 7938 7943 u32 reg, data; 7939 - 7944 + /* not for *_SOC15 */ 7940 7945 reg = SOC15_REG_OFFSET(GC, 0, mmRLC_SPM_MC_CNTL); 7941 7946 if (amdgpu_sriov_is_pp_one_vf(adev)) 7942 7947 data = RREG32_NO_KIQ(reg); 7943 7948 else 7944 - data = RREG32(reg); 7949 + data = RREG32_SOC15(GC, 0, mmRLC_SPM_MC_CNTL); 7945 7950 7946 7951 data &= ~RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK; 7947 7952 data |= (vmid & RLC_SPM_MC_CNTL__RLC_SPM_VMID_MASK) << RLC_SPM_MC_CNTL__RLC_SPM_VMID__SHIFT; ··· 8683 8688 8684 8689 switch (state) { 8685 8690 case AMDGPU_IRQ_STATE_DISABLE: 8686 - cp_int_cntl = RREG32(cp_int_cntl_reg); 8691 + cp_int_cntl = RREG32_SOC15_IP(GC, cp_int_cntl_reg); 8687 8692 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, 8688 8693 TIME_STAMP_INT_ENABLE, 0); 8689 - WREG32(cp_int_cntl_reg, cp_int_cntl); 8694 + WREG32_SOC15_IP(GC, cp_int_cntl_reg, cp_int_cntl); 8690 8695 break; 8691 8696 case AMDGPU_IRQ_STATE_ENABLE: 8692 - cp_int_cntl = RREG32(cp_int_cntl_reg); 8697 + cp_int_cntl = RREG32_SOC15_IP(GC, cp_int_cntl_reg); 8693 8698 cp_int_cntl = REG_SET_FIELD(cp_int_cntl, CP_INT_CNTL_RING0, 8694 8699 TIME_STAMP_INT_ENABLE, 1); 8695 - WREG32(cp_int_cntl_reg, cp_int_cntl); 8700 + WREG32_SOC15_IP(GC, cp_int_cntl_reg, cp_int_cntl); 8696 8701 break; 8697 8702 default: 8698 8703 break; ··· 8736 8741 8737 8742 switch (state) { 8738 8743 case AMDGPU_IRQ_STATE_DISABLE: 8739 - mec_int_cntl = RREG32(mec_int_cntl_reg); 8744 + mec_int_cntl = RREG32_SOC15_IP(GC, mec_int_cntl_reg); 8740 8745 mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL, 8741 8746 TIME_STAMP_INT_ENABLE, 0); 8742 - WREG32(mec_int_cntl_reg, mec_int_cntl); 8747 + WREG32_SOC15_IP(GC, mec_int_cntl_reg, mec_int_cntl); 8743 8748 break; 8744 8749 case AMDGPU_IRQ_STATE_ENABLE: 8745 - mec_int_cntl = RREG32(mec_int_cntl_reg); 8750 + mec_int_cntl = RREG32_SOC15_IP(GC, mec_int_cntl_reg); 8746 8751 mec_int_cntl = REG_SET_FIELD(mec_int_cntl, CP_ME1_PIPE0_INT_CNTL, 8747 8752 TIME_STAMP_INT_ENABLE, 1); 8748 - WREG32(mec_int_cntl_reg, mec_int_cntl); 8753 + WREG32_SOC15_IP(GC, mec_int_cntl_reg, mec_int_cntl); 8749 8754 break; 8750 8755 default: 8751 8756 break; ··· 8941 8946 GENERIC2_INT_ENABLE, 0); 8942 8947 WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, tmp); 8943 8948 8944 - tmp = RREG32(target); 8949 + tmp = RREG32_SOC15_IP(GC, target); 8945 8950 tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL, 8946 8951 GENERIC2_INT_ENABLE, 0); 8947 - WREG32(target, tmp); 8952 + WREG32_SOC15_IP(GC, target, tmp); 8948 8953 } else { 8949 8954 tmp = RREG32_SOC15(GC, 0, mmCPC_INT_CNTL); 8950 8955 tmp = REG_SET_FIELD(tmp, CPC_INT_CNTL, 8951 8956 GENERIC2_INT_ENABLE, 1); 8952 8957 WREG32_SOC15(GC, 0, mmCPC_INT_CNTL, tmp); 8953 8958 8954 - tmp = RREG32(target); 8959 + tmp = RREG32_SOC15_IP(GC, target); 8955 8960 tmp = REG_SET_FIELD(tmp, CP_ME2_PIPE0_INT_CNTL, 8956 8961 GENERIC2_INT_ENABLE, 1); 8957 - WREG32(target, tmp); 8962 + WREG32_SOC15_IP(GC, target, tmp); 8958 8963 } 8959 8964 break; 8960 8965 default:
+3 -3
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 2116 2116 } 2117 2117 2118 2118 /** 2119 - * gfx_v7_0_ring_emit_hdp - emit an hdp flush on the cp 2119 + * gfx_v7_0_ring_emit_hdp_flush - emit an hdp flush on the cp 2120 2120 * 2121 2121 * @ring: amdgpu_ring structure holding ring information 2122 2122 * ··· 2242 2242 * IB stuff 2243 2243 */ 2244 2244 /** 2245 - * gfx_v7_0_ring_emit_ib - emit an IB (Indirect Buffer) on the ring 2245 + * gfx_v7_0_ring_emit_ib_gfx - emit an IB (Indirect Buffer) on the ring 2246 2246 * 2247 2247 * @ring: amdgpu_ring structure holding ring information 2248 2248 * @job: job to retrieve vmid from ··· 3196 3196 } 3197 3197 3198 3198 /** 3199 - * gfx_v7_0_ring_emit_vm_flush - cik vm flush using the CP 3199 + * gfx_v7_0_ring_emit_pipeline_sync - cik vm flush using the CP 3200 3200 * 3201 3201 * @ring: the ring to emit the commands to 3202 3202 *
+5 -4
drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c
··· 734 734 mmRLC_SRM_INDEX_CNTL_DATA_7 - mmRLC_SRM_INDEX_CNTL_DATA_0, 735 735 }; 736 736 737 - static void gfx_v9_0_rlcg_rw(struct amdgpu_device *adev, u32 offset, u32 v, u32 flag) 737 + static void gfx_v9_0_rlcg_w(struct amdgpu_device *adev, u32 offset, u32 v, u32 flag) 738 738 { 739 739 static void *scratch_reg0; 740 740 static void *scratch_reg1; ··· 787 787 788 788 } 789 789 790 - static void gfx_v9_0_rlcg_wreg(struct amdgpu_device *adev, u32 offset, u32 v, u32 flag) 790 + static void gfx_v9_0_rlcg_wreg(struct amdgpu_device *adev, u32 offset, 791 + u32 v, u32 acc_flags, u32 hwip) 791 792 { 792 793 if (amdgpu_sriov_fullaccess(adev)) { 793 - gfx_v9_0_rlcg_rw(adev, offset, v, flag); 794 + gfx_v9_0_rlcg_w(adev, offset, v, acc_flags); 794 795 795 796 return; 796 797 } 797 798 798 - if (flag & AMDGPU_REGS_NO_KIQ) 799 + if (acc_flags & AMDGPU_REGS_NO_KIQ) 799 800 WREG32_NO_KIQ(offset, v); 800 801 else 801 802 WREG32(offset, v);
+14 -10
drivers/gpu/drm/amd/amdgpu/gfx_v9_4_2.c
··· 1641 1641 return 0; 1642 1642 } 1643 1643 1644 - int gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev, 1645 - void *ras_error_status) 1644 + static int gfx_v9_4_2_query_ras_error_count(struct amdgpu_device *adev, 1645 + void *ras_error_status) 1646 1646 { 1647 1647 struct ras_err_data *err_data = (struct ras_err_data *)ras_error_status; 1648 1648 uint32_t sec_count = 0, ded_count = 0; ··· 1676 1676 uint32_t i, j; 1677 1677 uint32_t value; 1678 1678 1679 - value = REG_SET_FIELD(0, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1); 1680 - 1681 1679 mutex_lock(&adev->grbm_idx_mutex); 1682 1680 for (i = 0; i < gfx_v9_4_2_ea_err_status_regs.se_num; i++) { 1683 1681 for (j = 0; j < gfx_v9_4_2_ea_err_status_regs.instance; 1684 1682 j++) { 1685 1683 gfx_v9_4_2_select_se_sh(adev, i, 0, j); 1684 + value = RREG32(SOC15_REG_ENTRY_OFFSET( 1685 + gfx_v9_4_2_ea_err_status_regs)); 1686 + value = REG_SET_FIELD(value, GCEA_ERR_STATUS, CLEAR_ERROR_STATUS, 0x1); 1686 1687 WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), value); 1687 1688 } 1688 1689 } ··· 1691 1690 mutex_unlock(&adev->grbm_idx_mutex); 1692 1691 } 1693 1692 1694 - void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev) 1693 + static void gfx_v9_4_2_reset_ras_error_count(struct amdgpu_device *adev) 1695 1694 { 1696 1695 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) 1697 1696 return; ··· 1700 1699 gfx_v9_4_2_query_utc_edc_count(adev, NULL, NULL); 1701 1700 } 1702 1701 1703 - int gfx_v9_4_2_ras_error_inject(struct amdgpu_device *adev, void *inject_if) 1702 + static int gfx_v9_4_2_ras_error_inject(struct amdgpu_device *adev, void *inject_if) 1704 1703 { 1705 1704 struct ras_inject_if *info = (struct ras_inject_if *)inject_if; 1706 1705 int ret; ··· 1735 1734 gfx_v9_4_2_select_se_sh(adev, i, 0, j); 1736 1735 reg_value = RREG32(SOC15_REG_ENTRY_OFFSET( 1737 1736 gfx_v9_4_2_ea_err_status_regs)); 1737 + 1738 1738 if (REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_STATUS) || 1739 1739 REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_WRRSP_STATUS) || 1740 1740 REG_GET_FIELD(reg_value, GCEA_ERR_STATUS, SDP_RDRSP_DATAPARITY_ERROR)) { ··· 1743 1741 j, reg_value); 1744 1742 } 1745 1743 /* clear after read */ 1746 - WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), 0x10); 1744 + reg_value = REG_SET_FIELD(reg_value, GCEA_ERR_STATUS, 1745 + CLEAR_ERROR_STATUS, 0x1); 1746 + WREG32(SOC15_REG_ENTRY_OFFSET(gfx_v9_4_2_ea_err_status_regs), reg_value); 1747 1747 } 1748 1748 } 1749 1749 ··· 1776 1772 } 1777 1773 } 1778 1774 1779 - void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev) 1775 + static void gfx_v9_4_2_query_ras_error_status(struct amdgpu_device *adev) 1780 1776 { 1781 1777 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) 1782 1778 return; ··· 1786 1782 gfx_v9_4_2_query_sq_timeout_status(adev); 1787 1783 } 1788 1784 1789 - void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev) 1785 + static void gfx_v9_4_2_reset_ras_error_status(struct amdgpu_device *adev) 1790 1786 { 1791 1787 if (!amdgpu_ras_is_supported(adev, AMDGPU_RAS_BLOCK__GFX)) 1792 1788 return; ··· 1796 1792 gfx_v9_4_2_reset_sq_timeout_status(adev); 1797 1793 } 1798 1794 1799 - void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev) 1795 + static void gfx_v9_4_2_enable_watchdog_timer(struct amdgpu_device *adev) 1800 1796 { 1801 1797 uint32_t i; 1802 1798 uint32_t data;
+18 -9
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
··· 229 229 /* Use register 17 for GART */ 230 230 const unsigned eng = 17; 231 231 unsigned int i; 232 + unsigned char hub_ip = 0; 233 + 234 + hub_ip = (vmhub == AMDGPU_GFXHUB_0) ? 235 + GC_HWIP : MMHUB_HWIP; 232 236 233 237 spin_lock(&adev->gmc.invalidate_lock); 234 238 /* ··· 246 242 if (use_semaphore) { 247 243 for (i = 0; i < adev->usec_timeout; i++) { 248 244 /* a read return value of 1 means semaphore acuqire */ 249 - tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_sem + 250 - hub->eng_distance * eng); 245 + tmp = RREG32_RLC_NO_KIQ(hub->vm_inv_eng0_sem + 246 + hub->eng_distance * eng, hub_ip); 247 + 251 248 if (tmp & 0x1) 252 249 break; 253 250 udelay(1); ··· 258 253 DRM_ERROR("Timeout waiting for sem acquire in VM flush!\n"); 259 254 } 260 255 261 - WREG32_NO_KIQ(hub->vm_inv_eng0_req + hub->eng_distance * eng, inv_req); 256 + WREG32_RLC_NO_KIQ(hub->vm_inv_eng0_req + 257 + hub->eng_distance * eng, 258 + inv_req, hub_ip); 262 259 263 260 /* 264 261 * Issue a dummy read to wait for the ACK register to be cleared ··· 268 261 */ 269 262 if ((vmhub == AMDGPU_GFXHUB_0) && 270 263 (adev->asic_type < CHIP_SIENNA_CICHLID)) 271 - RREG32_NO_KIQ(hub->vm_inv_eng0_req + hub->eng_distance * eng); 264 + RREG32_RLC_NO_KIQ(hub->vm_inv_eng0_req + 265 + hub->eng_distance * eng, hub_ip); 272 266 273 267 /* Wait for ACK with a delay.*/ 274 268 for (i = 0; i < adev->usec_timeout; i++) { 275 - tmp = RREG32_NO_KIQ(hub->vm_inv_eng0_ack + 276 - hub->eng_distance * eng); 269 + tmp = RREG32_RLC_NO_KIQ(hub->vm_inv_eng0_ack + 270 + hub->eng_distance * eng, hub_ip); 271 + 277 272 tmp &= 1 << vmid; 278 273 if (tmp) 279 274 break; ··· 289 280 * add semaphore release after invalidation, 290 281 * write with 0 means semaphore release 291 282 */ 292 - WREG32_NO_KIQ(hub->vm_inv_eng0_sem + 293 - hub->eng_distance * eng, 0); 283 + WREG32_RLC_NO_KIQ(hub->vm_inv_eng0_sem + 284 + hub->eng_distance * eng, 0, hub_ip); 294 285 295 286 spin_unlock(&adev->gmc.invalidate_lock); 296 287 ··· 956 947 } 957 948 958 949 /** 959 - * gmc_v8_0_gart_fini - vm fini callback 950 + * gmc_v10_0_gart_fini - vm fini callback 960 951 * 961 952 * @adev: amdgpu_device pointer 962 953 *
+1 -1
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 516 516 } 517 517 518 518 /** 519 - * gmc_v8_0_set_fault_enable_default - update VM fault handling 519 + * gmc_v7_0_set_fault_enable_default - update VM fault handling 520 520 * 521 521 * @adev: amdgpu_device pointer 522 522 * @value: true redirects VM faults to the default page
+2
drivers/gpu/drm/amd/amdgpu/jpeg_v2_0.c
··· 172 172 { 173 173 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 174 174 175 + cancel_delayed_work_sync(&adev->vcn.idle_work); 176 + 175 177 if (adev->jpeg.cur_state != AMD_PG_STATE_GATE && 176 178 RREG32_SOC15(JPEG, 0, mmUVD_JRBC_STATUS)) 177 179 jpeg_v2_0_set_powergating_state(adev, AMD_PG_STATE_GATE);
+2 -2
drivers/gpu/drm/amd/amdgpu/jpeg_v2_5.c
··· 187 187 static int jpeg_v2_5_hw_fini(void *handle) 188 188 { 189 189 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 190 - struct amdgpu_ring *ring; 191 190 int i; 191 + 192 + cancel_delayed_work_sync(&adev->vcn.idle_work); 192 193 193 194 for (i = 0; i < adev->jpeg.num_jpeg_inst; ++i) { 194 195 if (adev->jpeg.harvest_config & (1 << i)) 195 196 continue; 196 197 197 - ring = &adev->jpeg.inst[i].ring_dec; 198 198 if (adev->jpeg.cur_state != AMD_PG_STATE_GATE && 199 199 RREG32_SOC15(JPEG, i, mmUVD_JRBC_STATUS)) 200 200 jpeg_v2_5_set_powergating_state(adev, AMD_PG_STATE_GATE);
+2 -2
drivers/gpu/drm/amd/amdgpu/jpeg_v3_0.c
··· 159 159 static int jpeg_v3_0_hw_fini(void *handle) 160 160 { 161 161 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 162 - struct amdgpu_ring *ring; 163 162 164 - ring = &adev->jpeg.inst->ring_dec; 163 + cancel_delayed_work_sync(&adev->vcn.idle_work); 164 + 165 165 if (adev->jpeg.cur_state != AMD_PG_STATE_GATE && 166 166 RREG32_SOC15(JPEG, 0, mmUVD_JRBC_STATUS)) 167 167 jpeg_v3_0_set_powergating_state(adev, AMD_PG_STATE_GATE);
+21 -20
drivers/gpu/drm/amd/amdgpu/mmhub_v2_0.c
··· 29 29 #include "mmhub/mmhub_2_0_0_default.h" 30 30 #include "navi10_enum.h" 31 31 32 + #include "gc/gc_10_1_0_offset.h" 32 33 #include "soc15_common.h" 33 34 34 35 #define mmMM_ATC_L2_MISC_CG_Sienna_Cichlid 0x064d ··· 193 192 { 194 193 struct amdgpu_vmhub *hub = &adev->vmhub[AMDGPU_MMHUB_0]; 195 194 196 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, 195 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32, 197 196 hub->ctx_addr_distance * vmid, 198 197 lower_32_bits(page_table_base)); 199 198 200 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, 199 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32, 201 200 hub->ctx_addr_distance * vmid, 202 201 upper_32_bits(page_table_base)); 203 202 } ··· 208 207 209 208 mmhub_v2_0_setup_vm_pt_regs(adev, 0, pt_base); 210 209 211 - WREG32_SOC15(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, 210 + WREG32_SOC15_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32, 212 211 (u32)(adev->gmc.gart_start >> 12)); 213 - WREG32_SOC15(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, 212 + WREG32_SOC15_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32, 214 213 (u32)(adev->gmc.gart_start >> 44)); 215 214 216 - WREG32_SOC15(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, 215 + WREG32_SOC15_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32, 217 216 (u32)(adev->gmc.gart_end >> 12)); 218 - WREG32_SOC15(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, 217 + WREG32_SOC15_RLC(MMHUB, 0, mmMMVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32, 219 218 (u32)(adev->gmc.gart_end >> 44)); 220 219 } 221 220 ··· 224 223 uint64_t value; 225 224 uint32_t tmp; 226 225 227 - /* Program the AGP BAR */ 228 - WREG32_SOC15(MMHUB, 0, mmMMMC_VM_AGP_BASE, 0); 229 - WREG32_SOC15(MMHUB, 0, mmMMMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); 230 - WREG32_SOC15(MMHUB, 0, mmMMMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); 231 - 232 226 if (!amdgpu_sriov_vf(adev)) { 227 + /* Program the AGP BAR */ 228 + WREG32_SOC15_RLC(MMHUB, 0, mmMMMC_VM_AGP_BASE, 0); 229 + WREG32_SOC15_RLC(MMHUB, 0, mmMMMC_VM_AGP_BOT, adev->gmc.agp_start >> 24); 230 + WREG32_SOC15_RLC(MMHUB, 0, mmMMMC_VM_AGP_TOP, adev->gmc.agp_end >> 24); 231 + 233 232 /* Program the system aperture low logical page number. */ 234 233 WREG32_SOC15(MMHUB, 0, mmMMMC_VM_SYSTEM_APERTURE_LOW_ADDR, 235 234 min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18); ··· 336 335 tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT0_CNTL, PAGE_TABLE_DEPTH, 0); 337 336 tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT0_CNTL, 338 337 RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 0); 339 - WREG32_SOC15(MMHUB, 0, mmMMVM_CONTEXT0_CNTL, tmp); 338 + WREG32_SOC15_RLC(MMHUB, 0, mmMMVM_CONTEXT0_CNTL, tmp); 340 339 } 341 340 342 341 static void mmhub_v2_0_disable_identity_aperture(struct amdgpu_device *adev) ··· 398 397 tmp = REG_SET_FIELD(tmp, MMVM_CONTEXT1_CNTL, 399 398 RETRY_PERMISSION_OR_INVALID_PAGE_FAULT, 400 399 !adev->gmc.noretry); 401 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT1_CNTL, 400 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT1_CNTL, 402 401 i * hub->ctx_distance, tmp); 403 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32, 402 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_LO32, 404 403 i * hub->ctx_addr_distance, 0); 405 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32, 404 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_START_ADDR_HI32, 406 405 i * hub->ctx_addr_distance, 0); 407 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32, 406 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_LO32, 408 407 i * hub->ctx_addr_distance, 409 408 lower_32_bits(adev->vm_manager.max_pfn - 1)); 410 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32, 409 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT1_PAGE_TABLE_END_ADDR_HI32, 411 410 i * hub->ctx_addr_distance, 412 411 upper_32_bits(adev->vm_manager.max_pfn - 1)); 413 412 } ··· 419 418 unsigned i; 420 419 421 420 for (i = 0; i < 18; ++i) { 422 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32, 421 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_INVALIDATE_ENG0_ADDR_RANGE_LO32, 423 422 i * hub->eng_addr_distance, 0xffffffff); 424 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32, 423 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_INVALIDATE_ENG0_ADDR_RANGE_HI32, 425 424 i * hub->eng_addr_distance, 0x1f); 426 425 } 427 426 } ··· 450 449 451 450 /* Disable all tables */ 452 451 for (i = 0; i < AMDGPU_NUM_VMID; i++) 453 - WREG32_SOC15_OFFSET(MMHUB, 0, mmMMVM_CONTEXT0_CNTL, 452 + WREG32_SOC15_OFFSET_RLC(MMHUB, 0, mmMMVM_CONTEXT0_CNTL, 454 453 i * hub->ctx_distance, 0); 455 454 456 455 /* Setup TLB control */
+1 -1
drivers/gpu/drm/amd/amdgpu/mmhub_v9_4.c
··· 436 436 } 437 437 438 438 /** 439 - * mmhub_v1_0_set_fault_enable_default - update GART/VM fault handling 439 + * mmhub_v9_4_set_fault_enable_default - update GART/VM fault handling 440 440 * 441 441 * @adev: amdgpu_device pointer 442 442 * @value: true redirects VM faults to the default page
+8 -3
drivers/gpu/drm/amd/amdgpu/nv.c
··· 466 466 grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, VMID, vmid); 467 467 grbm_gfx_cntl = REG_SET_FIELD(grbm_gfx_cntl, GRBM_GFX_CNTL, QUEUEID, queue); 468 468 469 - WREG32(SOC15_REG_OFFSET(GC, 0, mmGRBM_GFX_CNTL), grbm_gfx_cntl); 469 + WREG32_SOC15(GC, 0, mmGRBM_GFX_CNTL, grbm_gfx_cntl); 470 470 } 471 471 472 472 static void nv_vga_set_state(struct amdgpu_device *adev, bool state) ··· 849 849 case CHIP_NAVI12: 850 850 amdgpu_device_ip_block_add(adev, &nv_common_ip_block); 851 851 amdgpu_device_ip_block_add(adev, &gmc_v10_0_ip_block); 852 - amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block); 853 - amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block); 852 + if (!amdgpu_sriov_vf(adev)) { 853 + amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block); 854 + amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block); 855 + } else { 856 + amdgpu_device_ip_block_add(adev, &psp_v11_0_ip_block); 857 + amdgpu_device_ip_block_add(adev, &navi10_ih_ip_block); 858 + } 854 859 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) 855 860 amdgpu_device_ip_block_add(adev, &smu_v11_0_ip_block); 856 861 if (adev->enable_virtual_display || amdgpu_sriov_vf(adev))
+2 -1
drivers/gpu/drm/amd/amdgpu/psp_v11_0.c
··· 733 733 struct amdgpu_device *adev = psp->adev; 734 734 735 735 if (amdgpu_sriov_vf(adev)) 736 - data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); 736 + data = psp->km_ring.ring_wptr; 737 737 else 738 738 data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 739 739 ··· 747 747 if (amdgpu_sriov_vf(adev)) { 748 748 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102, value); 749 749 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, GFX_CTRL_CMD_ID_CONSUME_CMD); 750 + psp->km_ring.ring_wptr = value; 750 751 } else 751 752 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value); 752 753 }
+2 -1
drivers/gpu/drm/amd/amdgpu/psp_v3_1.c
··· 375 375 struct amdgpu_device *adev = psp->adev; 376 376 377 377 if (amdgpu_sriov_vf(adev)) 378 - data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_102); 378 + data = psp->km_ring.ring_wptr; 379 379 else 380 380 data = RREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67); 381 381 return data; ··· 390 390 /* send interrupt to PSP for SRIOV ring write pointer update */ 391 391 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_101, 392 392 GFX_CTRL_CMD_ID_CONSUME_CMD); 393 + psp->km_ring.ring_wptr = value; 393 394 } else 394 395 WREG32_SOC15(MP0, 0, mmMP0_SMN_C2PMSG_67, value); 395 396 }
+1 -1
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
··· 271 271 } 272 272 273 273 /** 274 - * sdma_v2_4_hdp_flush_ring_emit - emit an hdp flush on the DMA ring 274 + * sdma_v2_4_ring_emit_hdp_flush - emit an hdp flush on the DMA ring 275 275 * 276 276 * @ring: amdgpu ring pointer 277 277 *
+2 -2
drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
··· 754 754 } 755 755 756 756 /** 757 - * sdma_v4_0_page_ring_set_wptr - commit the write pointer 757 + * sdma_v4_0_ring_set_wptr - commit the write pointer 758 758 * 759 759 * @ring: amdgpu ring pointer 760 760 * ··· 820 820 } 821 821 822 822 /** 823 - * sdma_v4_0_ring_set_wptr - commit the write pointer 823 + * sdma_v4_0_page_ring_set_wptr - commit the write pointer 824 824 * 825 825 * @ring: amdgpu ring pointer 826 826 *
+49 -44
drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
··· 328 328 wptr = READ_ONCE(*((u64 *)&adev->wb.wb[ring->wptr_offs])); 329 329 DRM_DEBUG("wptr/doorbell before shift == 0x%016llx\n", wptr); 330 330 } else { 331 - wptr = RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)); 331 + wptr = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI)); 332 332 wptr = wptr << 32; 333 - wptr |= RREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)); 333 + wptr |= RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR)); 334 334 DRM_DEBUG("wptr before shift [%i] wptr == 0x%016llx\n", ring->me, wptr); 335 335 } 336 336 ··· 371 371 lower_32_bits(ring->wptr << 2), 372 372 ring->me, 373 373 upper_32_bits(ring->wptr << 2)); 374 - WREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), 374 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR), 375 375 lower_32_bits(ring->wptr << 2)); 376 - WREG32(sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), 376 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, ring->me, mmSDMA0_GFX_RB_WPTR_HI), 377 377 upper_32_bits(ring->wptr << 2)); 378 378 } 379 379 } ··· 440 440 */ 441 441 static void sdma_v5_0_ring_emit_mem_sync(struct amdgpu_ring *ring) 442 442 { 443 - uint32_t gcr_cntl = 444 - SDMA_GCR_GL2_INV | SDMA_GCR_GL2_WB | SDMA_GCR_GLM_INV | 445 - SDMA_GCR_GL1_INV | SDMA_GCR_GLV_INV | SDMA_GCR_GLK_INV | 446 - SDMA_GCR_GLI_INV(1); 443 + uint32_t gcr_cntl = SDMA_GCR_GL2_INV | SDMA_GCR_GL2_WB | SDMA_GCR_GLM_INV | 444 + SDMA_GCR_GL1_INV | SDMA_GCR_GLV_INV | SDMA_GCR_GLK_INV | 445 + SDMA_GCR_GLI_INV(1); 447 446 448 447 /* flush entire cache L0/L1/L2, this can be optimized by performance requirement */ 449 448 amdgpu_ring_write(ring, SDMA_PKT_HEADER_OP(SDMA_OP_GCR_REQ)); 450 449 amdgpu_ring_write(ring, SDMA_PKT_GCR_REQ_PAYLOAD1_BASE_VA_31_7(0)); 451 450 amdgpu_ring_write(ring, SDMA_PKT_GCR_REQ_PAYLOAD2_GCR_CONTROL_15_0(gcr_cntl) | 452 - SDMA_PKT_GCR_REQ_PAYLOAD2_BASE_VA_47_32(0)); 451 + SDMA_PKT_GCR_REQ_PAYLOAD2_BASE_VA_47_32(0)); 453 452 amdgpu_ring_write(ring, SDMA_PKT_GCR_REQ_PAYLOAD3_LIMIT_VA_31_7(0) | 454 - SDMA_PKT_GCR_REQ_PAYLOAD3_GCR_CONTROL_18_16(gcr_cntl >> 16)); 453 + SDMA_PKT_GCR_REQ_PAYLOAD3_GCR_CONTROL_18_16(gcr_cntl >> 16)); 455 454 amdgpu_ring_write(ring, SDMA_PKT_GCR_REQ_PAYLOAD4_LIMIT_VA_47_32(0) | 456 - SDMA_PKT_GCR_REQ_PAYLOAD4_VMID(0)); 455 + SDMA_PKT_GCR_REQ_PAYLOAD4_VMID(0)); 457 456 } 458 457 459 458 /** ··· 548 549 amdgpu_ttm_set_buffer_funcs_status(adev, false); 549 550 550 551 for (i = 0; i < adev->sdma.num_instances; i++) { 551 - rb_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL)); 552 + rb_cntl = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL)); 552 553 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 0); 553 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 554 - ib_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL)); 554 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 555 + ib_cntl = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL)); 555 556 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 0); 556 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); 557 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); 557 558 } 558 559 } 559 560 ··· 570 571 } 571 572 572 573 /** 573 - * sdma_v_0_ctx_switch_enable - stop the async dma engines context switch 574 + * sdma_v5_0_ctx_switch_enable - stop the async dma engines context switch 574 575 * 575 576 * @adev: amdgpu_device pointer 576 577 * @enable: enable/disable the DMA MEs context switch. ··· 614 615 } 615 616 616 617 if (enable && amdgpu_sdma_phase_quantum) { 617 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE0_QUANTUM), 618 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE0_QUANTUM), 618 619 phase_quantum); 619 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE1_QUANTUM), 620 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE1_QUANTUM), 620 621 phase_quantum); 621 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE2_QUANTUM), 622 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_PHASE2_QUANTUM), 622 623 phase_quantum); 623 624 } 624 625 if (!amdgpu_sriov_vf(adev)) ··· 685 686 686 687 /* Set ring buffer size in dwords */ 687 688 rb_bufsz = order_base_2(ring->ring_size / 4); 688 - rb_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL)); 689 + rb_cntl = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL)); 689 690 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SIZE, rb_bufsz); 690 691 #ifdef __BIG_ENDIAN 691 692 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_SWAP_ENABLE, 1); 692 693 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, 693 694 RPTR_WRITEBACK_SWAP_ENABLE, 1); 694 695 #endif 695 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 696 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 696 697 697 698 /* Initialize the ring buffer's read and write pointers */ 698 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR), 0); 699 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_HI), 0); 700 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), 0); 701 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), 0); 699 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR), 0); 700 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_HI), 0); 701 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), 0); 702 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), 0); 702 703 703 704 /* setup the wptr shadow polling */ 704 705 wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); 705 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO), 706 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_LO), 706 707 lower_32_bits(wptr_gpu_addr)); 707 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI), 708 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_ADDR_HI), 708 709 upper_32_bits(wptr_gpu_addr)); 709 - wptr_poll_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, 710 + wptr_poll_cntl = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, 710 711 mmSDMA0_GFX_RB_WPTR_POLL_CNTL)); 711 712 wptr_poll_cntl = REG_SET_FIELD(wptr_poll_cntl, 712 713 SDMA0_GFX_RB_WPTR_POLL_CNTL, 713 714 F32_POLL_ENABLE, 1); 714 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), 715 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_POLL_CNTL), 715 716 wptr_poll_cntl); 716 717 717 718 /* set the wb address whether it's enabled or not */ 718 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_HI), 719 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_HI), 719 720 upper_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF); 720 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_LO), 721 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_RPTR_ADDR_LO), 721 722 lower_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFC); 722 723 723 724 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RPTR_WRITEBACK_ENABLE, 1); 724 725 725 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE), ring->gpu_addr >> 8); 726 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE_HI), ring->gpu_addr >> 40); 726 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE), 727 + ring->gpu_addr >> 8); 728 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_BASE_HI), 729 + ring->gpu_addr >> 40); 727 730 728 731 ring->wptr = 0; 729 732 730 733 /* before programing wptr to a less value, need set minor_ptr_update first */ 731 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 1); 734 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 1); 732 735 733 736 if (!amdgpu_sriov_vf(adev)) { /* only bare-metal use register write for wptr */ 734 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr) << 2); 735 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr) << 2); 737 + WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), 738 + lower_32_bits(ring->wptr) << 2); 739 + WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), 740 + upper_32_bits(ring->wptr) << 2); 736 741 } 737 742 738 - doorbell = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL)); 739 - doorbell_offset = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET)); 743 + doorbell = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL)); 744 + doorbell_offset = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, 745 + mmSDMA0_GFX_DOORBELL_OFFSET)); 740 746 741 747 if (ring->use_doorbell) { 742 748 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 1); ··· 750 746 } else { 751 747 doorbell = REG_SET_FIELD(doorbell, SDMA0_GFX_DOORBELL, ENABLE, 0); 752 748 } 753 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL), doorbell); 754 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET), doorbell_offset); 749 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL), doorbell); 750 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL_OFFSET), 751 + doorbell_offset); 755 752 756 753 adev->nbio.funcs->sdma_doorbell_range(adev, i, ring->use_doorbell, 757 754 ring->doorbell_index, 20); ··· 761 756 sdma_v5_0_ring_set_wptr(ring); 762 757 763 758 /* set minor_ptr_update to 0 after wptr programed */ 764 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 0); 759 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 0); 765 760 766 761 if (!amdgpu_sriov_vf(adev)) { 767 762 /* set utc l1 enable flag always to 1 */ ··· 795 790 796 791 /* enable DMA RB */ 797 792 rb_cntl = REG_SET_FIELD(rb_cntl, SDMA0_GFX_RB_CNTL, RB_ENABLE, 1); 798 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 793 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_CNTL), rb_cntl); 799 794 800 - ib_cntl = RREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL)); 795 + ib_cntl = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL)); 801 796 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_ENABLE, 1); 802 797 #ifdef __BIG_ENDIAN 803 798 ib_cntl = REG_SET_FIELD(ib_cntl, SDMA0_GFX_IB_CNTL, IB_SWAP_ENABLE, 1); 804 799 #endif 805 800 /* enable DMA IBs */ 806 - WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); 801 + WREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_IB_CNTL), ib_cntl); 807 802 808 803 ring->sched.ready = true; 809 804
+4 -4
drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
··· 147 147 struct amdgpu_firmware_info *info = NULL; 148 148 const struct common_firmware_header *header = NULL; 149 149 150 - if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_SIENNA_CICHLID)) 151 - return 0; 152 - 153 150 DRM_DEBUG("\n"); 154 151 155 152 switch (adev->asic_type) { ··· 183 186 memcpy((void *)&adev->sdma.instance[i], 184 187 (void *)&adev->sdma.instance[0], 185 188 sizeof(struct amdgpu_sdma_instance)); 189 + 190 + if (amdgpu_sriov_vf(adev) && (adev->asic_type == CHIP_SIENNA_CICHLID)) 191 + return 0; 186 192 187 193 DRM_DEBUG("psp_load == '%s'\n", 188 194 adev->firmware.load_type == AMDGPU_FW_LOAD_PSP ? "true" : "false"); ··· 517 517 } 518 518 519 519 /** 520 - * sdma_v_0_ctx_switch_enable - stop the async dma engines context switch 520 + * sdma_v5_2_ctx_switch_enable - stop the async dma engines context switch 521 521 * 522 522 * @adev: amdgpu_device pointer 523 523 * @enable: enable/disable the DMA MEs context switch.
+3 -3
drivers/gpu/drm/amd/amdgpu/si_dma.c
··· 305 305 } 306 306 307 307 /** 308 - * cik_dma_vm_copy_pte - update PTEs by copying them from the GART 308 + * si_dma_vm_copy_pte - update PTEs by copying them from the GART 309 309 * 310 310 * @ib: indirect buffer to fill with commands 311 311 * @pe: addr of the page entry ··· 402 402 } 403 403 404 404 /** 405 - * si_dma_pad_ib - pad the IB to the required number of dw 405 + * si_dma_ring_pad_ib - pad the IB to the required number of dw 406 406 * 407 407 * @ring: amdgpu_ring pointer 408 408 * @ib: indirect buffer to fill with padding ··· 415 415 } 416 416 417 417 /** 418 - * cik_sdma_ring_emit_pipeline_sync - sync the pipeline 418 + * si_dma_ring_emit_pipeline_sync - sync the pipeline 419 419 * 420 420 * @ring: amdgpu_ring pointer 421 421 *
+1 -1
drivers/gpu/drm/amd/amdgpu/smuio_v13_0.c
··· 106 106 } 107 107 108 108 /** 109 - * smuio_v13_0_supports_host_gpu_xgmi - detect xgmi interface between cpu and gpu/s. 109 + * smuio_v13_0_is_host_gpu_xgmi_supported - detect xgmi interface between cpu and gpu/s. 110 110 * 111 111 * @adev: amdgpu device pointer 112 112 *
+5 -2
drivers/gpu/drm/amd/amdgpu/soc15.c
··· 633 633 if (entry->and_mask == 0xffffffff) { 634 634 tmp = entry->or_mask; 635 635 } else { 636 - tmp = RREG32(reg); 636 + tmp = (entry->hwip == GC_HWIP) ? 637 + RREG32_SOC15_IP(GC, reg) : RREG32(reg); 638 + 637 639 tmp &= ~(entry->and_mask); 638 640 tmp |= (entry->or_mask & entry->and_mask); 639 641 } ··· 646 644 reg == SOC15_REG_OFFSET(GC, 0, mmSH_MEM_CONFIG)) 647 645 WREG32_RLC(reg, tmp); 648 646 else 649 - WREG32(reg, tmp); 647 + (entry->hwip == GC_HWIP) ? 648 + WREG32_SOC15_IP(GC, reg, tmp) : WREG32(reg, tmp); 650 649 651 650 } 652 651
+50 -35
drivers/gpu/drm/amd/amdgpu/soc15_common.h
··· 27 27 /* Register Access Macros */ 28 28 #define SOC15_REG_OFFSET(ip, inst, reg) (adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) 29 29 30 + #define __WREG32_SOC15_RLC__(reg, value, flag, hwip) \ 31 + ((amdgpu_sriov_vf(adev) && adev->gfx.rlc.funcs->rlcg_wreg) ? \ 32 + adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, value, flag, hwip) : \ 33 + WREG32(reg, value)) 34 + 35 + #define __RREG32_SOC15_RLC__(reg, flag, hwip) \ 36 + ((amdgpu_sriov_vf(adev) && adev->gfx.rlc.funcs->rlcg_rreg) ? \ 37 + adev->gfx.rlc.funcs->rlcg_rreg(adev, reg, flag, hwip) : \ 38 + RREG32(reg)) 39 + 30 40 #define WREG32_FIELD15(ip, idx, reg, field, val) \ 31 - WREG32(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg, \ 32 - (RREG32(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg) \ 33 - & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) 41 + __WREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg, \ 42 + (__RREG32_SOC15_RLC__( \ 43 + adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg, \ 44 + 0, ip##_HWIP) & \ 45 + ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field), \ 46 + 0, ip##_HWIP) 34 47 35 48 #define RREG32_SOC15(ip, inst, reg) \ 36 - RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) 49 + __RREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg, \ 50 + 0, ip##_HWIP) 51 + 52 + #define RREG32_SOC15_IP(ip, reg) __RREG32_SOC15_RLC__(reg, 0, ip##_HWIP) 37 53 38 54 #define RREG32_SOC15_NO_KIQ(ip, inst, reg) \ 39 - RREG32_NO_KIQ(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) 55 + __RREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg, \ 56 + AMDGPU_REGS_NO_KIQ, ip##_HWIP) 40 57 41 58 #define RREG32_SOC15_OFFSET(ip, inst, reg, offset) \ 42 - RREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset) 59 + __RREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, 0, ip##_HWIP) 43 60 44 61 #define WREG32_SOC15(ip, inst, reg, value) \ 45 - WREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), value) 62 + __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), \ 63 + value, 0, ip##_HWIP) 64 + 65 + #define WREG32_SOC15_IP(ip, reg, value) \ 66 + __WREG32_SOC15_RLC__(reg, value, 0, ip##_HWIP) 46 67 47 68 #define WREG32_SOC15_NO_KIQ(ip, inst, reg, value) \ 48 - WREG32_NO_KIQ((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), value) 69 + __WREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg, \ 70 + value, AMDGPU_REGS_NO_KIQ, ip##_HWIP) 49 71 50 72 #define WREG32_SOC15_OFFSET(ip, inst, reg, offset, value) \ 51 - WREG32((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, value) 73 + __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, \ 74 + value, 0, ip##_HWIP) 52 75 53 76 #define SOC15_WAIT_ON_RREG(ip, inst, reg, expected_value, mask) \ 54 77 ({ int ret = 0; \ ··· 100 77 }) 101 78 102 79 #define WREG32_RLC(reg, value) \ 103 - do { \ 104 - if (adev->gfx.rlc.funcs->rlcg_wreg) \ 105 - adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, value, 0); \ 106 - else \ 107 - WREG32(reg, value); \ 108 - } while (0) 80 + __WREG32_SOC15_RLC__(reg, value, AMDGPU_REGS_RLC, GC_HWIP) 109 81 110 82 #define WREG32_RLC_EX(prefix, reg, value) \ 111 83 do { \ ··· 126 108 } \ 127 109 } while (0) 128 110 111 + /* shadow the registers in the callback function */ 129 112 #define WREG32_SOC15_RLC_SHADOW(ip, inst, reg, value) \ 130 - WREG32_RLC((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), value) 113 + __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg), value, AMDGPU_REGS_RLC, GC_HWIP) 131 114 115 + /* for GC only */ 132 116 #define RREG32_RLC(reg) \ 133 - (adev->gfx.rlc.funcs->rlcg_rreg ? \ 134 - adev->gfx.rlc.funcs->rlcg_rreg(adev, reg, 0) : RREG32(reg)) 117 + __RREG32_SOC15_RLC__(reg, AMDGPU_REGS_RLC, GC_HWIP) 135 118 136 - #define WREG32_RLC_NO_KIQ(reg, value) \ 137 - do { \ 138 - if (adev->gfx.rlc.funcs->rlcg_wreg) \ 139 - adev->gfx.rlc.funcs->rlcg_wreg(adev, reg, value, AMDGPU_REGS_NO_KIQ); \ 140 - else \ 141 - WREG32_NO_KIQ(reg, value); \ 142 - } while (0) 119 + #define WREG32_RLC_NO_KIQ(reg, value, hwip) \ 120 + __WREG32_SOC15_RLC__(reg, value, AMDGPU_REGS_NO_KIQ | AMDGPU_REGS_RLC, hwip) 143 121 144 - #define RREG32_RLC_NO_KIQ(reg) \ 145 - (adev->gfx.rlc.funcs->rlcg_rreg ? \ 146 - adev->gfx.rlc.funcs->rlcg_rreg(adev, reg, AMDGPU_REGS_NO_KIQ) : RREG32_NO_KIQ(reg)) 122 + #define RREG32_RLC_NO_KIQ(reg, hwip) \ 123 + __RREG32_SOC15_RLC__(reg, AMDGPU_REGS_NO_KIQ | AMDGPU_REGS_RLC, hwip) 147 124 148 125 #define WREG32_SOC15_RLC_SHADOW_EX(prefix, ip, inst, reg, value) \ 149 126 do { \ ··· 159 146 } while (0) 160 147 161 148 #define RREG32_SOC15_RLC(ip, inst, reg) \ 162 - RREG32_RLC(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) 149 + __RREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg, AMDGPU_REGS_RLC, ip##_HWIP) 163 150 164 151 #define WREG32_SOC15_RLC(ip, inst, reg, value) \ 165 152 do { \ 166 153 uint32_t target_reg = adev->reg_offset[ip##_HWIP][0][reg##_BASE_IDX] + reg;\ 167 - WREG32_RLC(target_reg, value); \ 154 + __WREG32_SOC15_RLC__(target_reg, value, AMDGPU_REGS_RLC, ip##_HWIP); \ 168 155 } while (0) 169 156 170 157 #define WREG32_SOC15_RLC_EX(prefix, ip, inst, reg, value) \ ··· 174 161 } while (0) 175 162 176 163 #define WREG32_FIELD15_RLC(ip, idx, reg, field, val) \ 177 - WREG32_RLC((adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg), \ 178 - (RREG32_RLC(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg) \ 179 - & ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field)) 164 + __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg), \ 165 + (__RREG32_SOC15_RLC__(adev->reg_offset[ip##_HWIP][idx][mm##reg##_BASE_IDX] + mm##reg, \ 166 + AMDGPU_REGS_RLC, ip##_HWIP) & \ 167 + ~REG_FIELD_MASK(reg, field)) | (val) << REG_FIELD_SHIFT(reg, field), \ 168 + AMDGPU_REGS_RLC, ip##_HWIP) 180 169 181 170 #define WREG32_SOC15_OFFSET_RLC(ip, inst, reg, offset, value) \ 182 - WREG32_RLC(((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset), value) 171 + __WREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, value, AMDGPU_REGS_RLC, ip##_HWIP) 183 172 184 173 #define RREG32_SOC15_OFFSET_RLC(ip, inst, reg, offset) \ 185 - RREG32_RLC(((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset)) 174 + __RREG32_SOC15_RLC__((adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg) + offset, AMDGPU_REGS_RLC, ip##_HWIP) 186 175 187 176 #endif
+2 -2
drivers/gpu/drm/amd/amdgpu/uvd_v3_1.c
··· 340 340 /* enable VCPU clock */ 341 341 WREG32(mmUVD_VCPU_CNTL, 1 << 9); 342 342 343 - /* disable interupt */ 343 + /* disable interrupt */ 344 344 WREG32_P(mmUVD_MASTINT_EN, 0, ~(1 << 1)); 345 345 346 346 #ifdef __BIG_ENDIAN ··· 405 405 return r; 406 406 } 407 407 408 - /* enable interupt */ 408 + /* enable interrupt */ 409 409 WREG32_P(mmUVD_MASTINT_EN, 3<<1, ~(3 << 1)); 410 410 411 411 WREG32_P(mmUVD_STATUS, 0, ~(1<<2));
+1
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
··· 357 357 358 358 error: 359 359 dma_fence_put(fence); 360 + amdgpu_bo_unpin(bo); 360 361 amdgpu_bo_unreserve(bo); 361 362 amdgpu_bo_unref(&bo); 362 363 return r;
+7 -3
drivers/gpu/drm/amd/amdgpu/vcn_v1_0.c
··· 231 231 { 232 232 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 233 233 234 + cancel_delayed_work_sync(&adev->vcn.idle_work); 235 + 234 236 if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) || 235 - RREG32_SOC15(VCN, 0, mmUVD_STATUS)) 237 + (adev->vcn.cur_state != AMD_PG_STATE_GATE && 238 + RREG32_SOC15(VCN, 0, mmUVD_STATUS))) { 236 239 vcn_v1_0_set_powergating_state(adev, AMD_PG_STATE_GATE); 240 + } 237 241 238 242 return 0; 239 243 } ··· 769 765 } 770 766 771 767 /** 772 - * vcn_v1_0_start - start VCN block 768 + * vcn_v1_0_start_spg_mode - start VCN block 773 769 * 774 770 * @adev: amdgpu_device pointer 775 771 * ··· 1105 1101 } 1106 1102 1107 1103 /** 1108 - * vcn_v1_0_stop - stop VCN block 1104 + * vcn_v1_0_stop_spg_mode - stop VCN block 1109 1105 * 1110 1106 * @adev: amdgpu_device pointer 1111 1107 *
+2
drivers/gpu/drm/amd/amdgpu/vcn_v2_0.c
··· 262 262 { 263 263 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 264 264 265 + cancel_delayed_work_sync(&adev->vcn.idle_work); 266 + 265 267 if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) || 266 268 (adev->vcn.cur_state != AMD_PG_STATE_GATE && 267 269 RREG32_SOC15(VCN, 0, mmUVD_STATUS)))
+2
drivers/gpu/drm/amd/amdgpu/vcn_v2_5.c
··· 321 321 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 322 322 int i; 323 323 324 + cancel_delayed_work_sync(&adev->vcn.idle_work); 325 + 324 326 for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 325 327 if (adev->vcn.harvest_config & (1 << i)) 326 328 continue;
+2 -3
drivers/gpu/drm/amd/amdgpu/vcn_v3_0.c
··· 386 386 static int vcn_v3_0_hw_fini(void *handle) 387 387 { 388 388 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 389 - struct amdgpu_ring *ring; 390 389 int i; 390 + 391 + cancel_delayed_work_sync(&adev->vcn.idle_work); 391 392 392 393 for (i = 0; i < adev->vcn.num_vcn_inst; ++i) { 393 394 if (adev->vcn.harvest_config & (1 << i)) 394 395 continue; 395 - 396 - ring = &adev->vcn.inst[i].ring_dec; 397 396 398 397 if (!amdgpu_sriov_vf(adev)) { 399 398 if ((adev->pg_flags & AMD_PG_SUPPORT_VCN_DPG) ||
-2
drivers/gpu/drm/amd/amdkfd/kfd_process.c
··· 110 110 111 111 workarea = container_of(work, struct kfd_sdma_activity_handler_workarea, 112 112 sdma_activity_work); 113 - if (!workarea) 114 - return; 115 113 116 114 pdd = workarea->pdd; 117 115 if (!pdd)
+140 -82
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 28 28 29 29 #include "dm_services_types.h" 30 30 #include "dc.h" 31 + #include "dc_link_dp.h" 31 32 #include "dc/inc/core_types.h" 32 33 #include "dal_asic_id.h" 33 34 #include "dmub/dmub_srv.h" ··· 315 314 struct drm_crtc *crtc; 316 315 struct amdgpu_crtc *amdgpu_crtc; 317 316 318 - if (otg_inst == -1) { 319 - WARN_ON(1); 317 + if (WARN_ON(otg_inst == -1)) 320 318 return adev->mode_info.crtcs[0]; 321 - } 322 319 323 320 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 324 321 amdgpu_crtc = to_amdgpu_crtc(crtc); ··· 395 396 e = amdgpu_crtc->event; 396 397 amdgpu_crtc->event = NULL; 397 398 398 - if (!e) 399 - WARN_ON(1); 399 + WARN_ON(!e); 400 400 401 401 vrr_active = amdgpu_dm_vrr_active_irq(amdgpu_crtc); 402 402 ··· 598 600 } 599 601 600 602 #if defined(CONFIG_DRM_AMD_DC_DCN) 603 + #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) 601 604 /** 602 605 * dm_dcn_vertical_interrupt0_high_irq() - Handles OTG Vertical interrupt0 for 603 606 * DCN generation ASICs 604 - * @interrupt params - interrupt parameters 607 + * @interrupt_params: interrupt parameters 605 608 * 606 609 * Used to set crc window/read out crc value at vertical line 0 position 607 610 */ 608 - #if defined(CONFIG_DRM_AMD_SECURE_DISPLAY) 609 611 static void dm_dcn_vertical_interrupt0_high_irq(void *interrupt_params) 610 612 { 611 613 struct common_irq_params *irq_params = interrupt_params; ··· 979 981 abm->dmcu_is_running = dmcu->funcs->is_dmcu_initialized(dmcu); 980 982 } 981 983 982 - adev->dm.dc->ctx->dmub_srv = dc_dmub_srv_create(adev->dm.dc, dmub_srv); 984 + if (!adev->dm.dc->ctx->dmub_srv) 985 + adev->dm.dc->ctx->dmub_srv = dc_dmub_srv_create(adev->dm.dc, dmub_srv); 983 986 if (!adev->dm.dc->ctx->dmub_srv) { 984 987 DRM_ERROR("Couldn't allocate DC DMUB server!\n"); 985 988 return -ENOMEM; ··· 1334 1335 } 1335 1336 #endif 1336 1337 1337 - if (adev->dm.dc->ctx->dmub_srv) { 1338 - dc_dmub_srv_destroy(&adev->dm.dc->ctx->dmub_srv); 1339 - adev->dm.dc->ctx->dmub_srv = NULL; 1340 - } 1338 + dc_dmub_srv_destroy(&adev->dm.dc->ctx->dmub_srv); 1341 1339 1342 1340 if (dc_enable_dmub_notifications(adev->dm.dc)) { 1343 1341 kfree(adev->dm.dmub_notify); ··· 1711 1715 unsigned int linear_lut[16]; 1712 1716 int i; 1713 1717 struct dmcu *dmcu = NULL; 1714 - bool ret = true; 1715 1718 1716 1719 dmcu = adev->dm.dc->res_pool->dmcu; 1717 1720 ··· 1727 1732 * 0xFFFF x 0.01 = 0x28F 1728 1733 */ 1729 1734 params.min_abm_backlight = 0x28F; 1730 - 1731 1735 /* In the case where abm is implemented on dmcub, 1732 - * dmcu object will be null. 1733 - * ABM 2.4 and up are implemented on dmcub. 1734 - */ 1735 - if (dmcu) 1736 - ret = dmcu_load_iram(dmcu, params); 1737 - else if (adev->dm.dc->ctx->dmub_srv) 1738 - ret = dmub_init_abm_config(adev->dm.dc->res_pool, params); 1736 + * dmcu object will be null. 1737 + * ABM 2.4 and up are implemented on dmcub. 1738 + */ 1739 + if (dmcu) { 1740 + if (!dmcu_load_iram(dmcu, params)) 1741 + return -EINVAL; 1742 + } else if (adev->dm.dc->ctx->dmub_srv) { 1743 + struct dc_link *edp_links[MAX_NUM_EDP]; 1744 + int edp_num; 1739 1745 1740 - if (!ret) 1741 - return -EINVAL; 1746 + get_edp_links(adev->dm.dc, edp_links, &edp_num); 1747 + for (i = 0; i < edp_num; i++) { 1748 + if (!dmub_init_abm_config(adev->dm.dc->res_pool, params, i)) 1749 + return -EINVAL; 1750 + } 1751 + } 1742 1752 1743 1753 return detect_mst_link_for_all_connectors(adev_to_drm(adev)); 1744 1754 } ··· 2007 2007 s3_handle_mst(adev_to_drm(adev), true); 2008 2008 2009 2009 amdgpu_dm_irq_suspend(adev); 2010 - 2011 2010 2012 2011 dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D3); 2013 2012 ··· 2746 2747 enum dc_connection_type new_connection_type = dc_connection_none; 2747 2748 struct amdgpu_device *adev = drm_to_adev(dev); 2748 2749 union hpd_irq_data hpd_irq_data; 2750 + bool lock_flag = 0; 2749 2751 2750 2752 memset(&hpd_irq_data, 0, sizeof(hpd_irq_data)); 2751 2753 ··· 2776 2776 } 2777 2777 } 2778 2778 2779 - if (!amdgpu_in_reset(adev)) { 2779 + /* 2780 + * TODO: We need the lock to avoid touching DC state while it's being 2781 + * modified during automated compliance testing, or when link loss 2782 + * happens. While this should be split into subhandlers and proper 2783 + * interfaces to avoid having to conditionally lock like this in the 2784 + * outer layer, we need this workaround temporarily to allow MST 2785 + * lightup in some scenarios to avoid timeout. 2786 + */ 2787 + if (!amdgpu_in_reset(adev) && 2788 + (hpd_rx_irq_check_link_loss_status(dc_link, &hpd_irq_data) || 2789 + hpd_irq_data.bytes.device_service_irq.bits.AUTOMATED_TEST)) { 2780 2790 mutex_lock(&adev->dm.dc_lock); 2791 + lock_flag = 1; 2792 + } 2793 + 2781 2794 #ifdef CONFIG_DRM_AMD_DC_HDCP 2782 2795 result = dc_link_handle_hpd_rx_irq(dc_link, &hpd_irq_data, NULL); 2783 2796 #else 2784 2797 result = dc_link_handle_hpd_rx_irq(dc_link, NULL, NULL); 2785 2798 #endif 2799 + if (!amdgpu_in_reset(adev) && lock_flag) 2786 2800 mutex_unlock(&adev->dm.dc_lock); 2787 - } 2788 2801 2789 2802 out: 2790 2803 if (result && !is_mst_root_connector) { ··· 3420 3407 if (dm->backlight_caps.caps_valid) 3421 3408 return; 3422 3409 3423 - amdgpu_acpi_get_backlight_caps(dm->adev, &caps); 3410 + amdgpu_acpi_get_backlight_caps(&caps); 3424 3411 if (caps.caps_valid) { 3425 3412 dm->backlight_caps.caps_valid = true; 3426 3413 if (caps.aux_support) ··· 3512 3499 rc = dc_link_set_backlight_level_nits(link[i], true, brightness[i], 3513 3500 AUX_BL_DEFAULT_TRANSITION_TIME_MS); 3514 3501 if (!rc) { 3515 - DRM_ERROR("DM: Failed to update backlight via AUX on eDP[%d]\n", i); 3502 + DRM_DEBUG("DM: Failed to update backlight via AUX on eDP[%d]\n", i); 3516 3503 break; 3517 3504 } 3518 3505 } ··· 3520 3507 for (i = 0; i < dm->num_of_edps; i++) { 3521 3508 rc = dc_link_set_backlight_level(dm->backlight_link[i], brightness[i], 0); 3522 3509 if (!rc) { 3523 - DRM_ERROR("DM: Failed to update backlight on eDP[%d]\n", i); 3510 + DRM_DEBUG("DM: Failed to update backlight on eDP[%d]\n", i); 3524 3511 break; 3525 3512 } 3526 3513 } ··· 4966 4953 case DRM_FORMAT_ABGR16161616F: 4967 4954 plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F; 4968 4955 break; 4956 + case DRM_FORMAT_XRGB16161616: 4957 + case DRM_FORMAT_ARGB16161616: 4958 + plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616; 4959 + break; 4960 + case DRM_FORMAT_XBGR16161616: 4961 + case DRM_FORMAT_ABGR16161616: 4962 + plane_info->format = SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616; 4963 + break; 4969 4964 default: 4970 4965 DRM_ERROR( 4971 4966 "Unsupported screen format %p4cc\n", ··· 5550 5529 } 5551 5530 } 5552 5531 5532 + #if defined(CONFIG_DRM_AMD_DC_DCN) 5533 + static void update_dsc_caps(struct amdgpu_dm_connector *aconnector, 5534 + struct dc_sink *sink, struct dc_stream_state *stream, 5535 + struct dsc_dec_dpcd_caps *dsc_caps) 5536 + { 5537 + stream->timing.flags.DSC = 0; 5538 + 5539 + if (aconnector->dc_link && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT) { 5540 + dc_dsc_parse_dsc_dpcd(aconnector->dc_link->ctx->dc, 5541 + aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw, 5542 + aconnector->dc_link->dpcd_caps.dsc_caps.dsc_branch_decoder_caps.raw, 5543 + dsc_caps); 5544 + } 5545 + } 5546 + 5547 + static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector, 5548 + struct dc_sink *sink, struct dc_stream_state *stream, 5549 + struct dsc_dec_dpcd_caps *dsc_caps) 5550 + { 5551 + struct drm_connector *drm_connector = &aconnector->base; 5552 + uint32_t link_bandwidth_kbps; 5553 + 5554 + link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link, 5555 + dc_link_get_link_cap(aconnector->dc_link)); 5556 + /* Set DSC policy according to dsc_clock_en */ 5557 + dc_dsc_policy_set_enable_dsc_when_not_needed( 5558 + aconnector->dsc_settings.dsc_force_enable == DSC_CLK_FORCE_ENABLE); 5559 + 5560 + if (aconnector->dc_link && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT) { 5561 + 5562 + if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0], 5563 + dsc_caps, 5564 + aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override, 5565 + 0, 5566 + link_bandwidth_kbps, 5567 + &stream->timing, 5568 + &stream->timing.dsc_cfg)) { 5569 + stream->timing.flags.DSC = 1; 5570 + DRM_DEBUG_DRIVER("%s: [%s] DSC is selected from SST RX\n", __func__, drm_connector->name); 5571 + } 5572 + } 5573 + 5574 + /* Overwrite the stream flag if DSC is enabled through debugfs */ 5575 + if (aconnector->dsc_settings.dsc_force_enable == DSC_CLK_FORCE_ENABLE) 5576 + stream->timing.flags.DSC = 1; 5577 + 5578 + if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_num_slices_h) 5579 + stream->timing.dsc_cfg.num_slices_h = aconnector->dsc_settings.dsc_num_slices_h; 5580 + 5581 + if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_num_slices_v) 5582 + stream->timing.dsc_cfg.num_slices_v = aconnector->dsc_settings.dsc_num_slices_v; 5583 + 5584 + if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_bits_per_pixel) 5585 + stream->timing.dsc_cfg.bits_per_pixel = aconnector->dsc_settings.dsc_bits_per_pixel; 5586 + } 5587 + #endif 5588 + 5553 5589 static struct drm_display_mode * 5554 5590 get_highest_refresh_rate_mode(struct amdgpu_dm_connector *aconnector, 5555 5591 bool use_probed_modes) ··· 5703 5625 struct drm_display_mode saved_mode; 5704 5626 struct drm_display_mode *freesync_mode = NULL; 5705 5627 bool native_mode_found = false; 5706 - bool recalculate_timing = dm_state ? (dm_state->scaling != RMX_OFF) : false; 5628 + bool recalculate_timing = false; 5629 + bool scale = dm_state ? (dm_state->scaling != RMX_OFF) : false; 5707 5630 int mode_refresh; 5708 5631 int preferred_refresh = 0; 5709 5632 #if defined(CONFIG_DRM_AMD_DC_DCN) 5710 5633 struct dsc_dec_dpcd_caps dsc_caps; 5711 - uint32_t link_bandwidth_kbps; 5712 5634 #endif 5713 5635 struct dc_sink *sink = NULL; 5714 5636 ··· 5766 5688 */ 5767 5689 DRM_DEBUG_DRIVER("No preferred mode found\n"); 5768 5690 } else { 5769 - recalculate_timing |= amdgpu_freesync_vid_mode && 5691 + recalculate_timing = amdgpu_freesync_vid_mode && 5770 5692 is_freesync_video_mode(&mode, aconnector); 5771 5693 if (recalculate_timing) { 5772 5694 freesync_mode = get_highest_refresh_rate_mode(aconnector, false); ··· 5774 5696 mode = *freesync_mode; 5775 5697 } else { 5776 5698 decide_crtc_timing_for_drm_display_mode( 5777 - &mode, preferred_mode, 5778 - dm_state ? (dm_state->scaling != RMX_OFF) : false); 5779 - } 5699 + &mode, preferred_mode, scale); 5780 5700 5781 - preferred_refresh = drm_mode_vrefresh(preferred_mode); 5701 + preferred_refresh = drm_mode_vrefresh(preferred_mode); 5702 + } 5782 5703 } 5783 5704 5784 5705 if (recalculate_timing) ··· 5789 5712 * If scaling is enabled and refresh rate didn't change 5790 5713 * we copy the vic and polarities of the old timings 5791 5714 */ 5792 - if (!recalculate_timing || mode_refresh != preferred_refresh) 5715 + if (!scale || mode_refresh != preferred_refresh) 5793 5716 fill_stream_properties_from_drm_display_mode( 5794 5717 stream, &mode, &aconnector->base, con_state, NULL, 5795 5718 requested_bpc); ··· 5798 5721 stream, &mode, &aconnector->base, con_state, old_stream, 5799 5722 requested_bpc); 5800 5723 5801 - stream->timing.flags.DSC = 0; 5802 - 5803 - if (aconnector->dc_link && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT) { 5804 5724 #if defined(CONFIG_DRM_AMD_DC_DCN) 5805 - dc_dsc_parse_dsc_dpcd(aconnector->dc_link->ctx->dc, 5806 - aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw, 5807 - aconnector->dc_link->dpcd_caps.dsc_caps.dsc_branch_decoder_caps.raw, 5808 - &dsc_caps); 5809 - link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link, 5810 - dc_link_get_link_cap(aconnector->dc_link)); 5811 - 5812 - if (aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE && dsc_caps.is_dsc_supported) { 5813 - /* Set DSC policy according to dsc_clock_en */ 5814 - dc_dsc_policy_set_enable_dsc_when_not_needed( 5815 - aconnector->dsc_settings.dsc_force_enable == DSC_CLK_FORCE_ENABLE); 5816 - 5817 - if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0], 5818 - &dsc_caps, 5819 - aconnector->dc_link->ctx->dc->debug.dsc_min_slice_height_override, 5820 - 0, 5821 - link_bandwidth_kbps, 5822 - &stream->timing, 5823 - &stream->timing.dsc_cfg)) 5824 - stream->timing.flags.DSC = 1; 5825 - /* Overwrite the stream flag if DSC is enabled through debugfs */ 5826 - if (aconnector->dsc_settings.dsc_force_enable == DSC_CLK_FORCE_ENABLE) 5827 - stream->timing.flags.DSC = 1; 5828 - 5829 - if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_num_slices_h) 5830 - stream->timing.dsc_cfg.num_slices_h = aconnector->dsc_settings.dsc_num_slices_h; 5831 - 5832 - if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_num_slices_v) 5833 - stream->timing.dsc_cfg.num_slices_v = aconnector->dsc_settings.dsc_num_slices_v; 5834 - 5835 - if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_bits_per_pixel) 5836 - stream->timing.dsc_cfg.bits_per_pixel = aconnector->dsc_settings.dsc_bits_per_pixel; 5837 - } 5725 + /* SST DSC determination policy */ 5726 + update_dsc_caps(aconnector, sink, stream, &dsc_caps); 5727 + if (aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE && dsc_caps.is_dsc_supported) 5728 + apply_dsc_policy_for_stream(aconnector, sink, stream, &dsc_caps); 5838 5729 #endif 5839 - } 5840 5730 5841 5731 update_stream_scaling_settings(&mode, dm_state, stream); 5842 5732 ··· 6602 6558 6603 6559 dm_update_crtc_active_planes(crtc, crtc_state); 6604 6560 6605 - if (unlikely(!dm_crtc_state->stream && 6606 - modeset_required(crtc_state, NULL, dm_crtc_state->stream))) { 6607 - WARN_ON(1); 6561 + if (WARN_ON(unlikely(!dm_crtc_state->stream && 6562 + modeset_required(crtc_state, NULL, dm_crtc_state->stream)))) { 6608 6563 return ret; 6609 6564 } 6610 6565 ··· 7102 7059 DRM_FORMAT_XBGR2101010, 7103 7060 DRM_FORMAT_ARGB2101010, 7104 7061 DRM_FORMAT_ABGR2101010, 7062 + DRM_FORMAT_XRGB16161616, 7063 + DRM_FORMAT_XBGR16161616, 7064 + DRM_FORMAT_ARGB16161616, 7065 + DRM_FORMAT_ABGR16161616, 7105 7066 DRM_FORMAT_XBGR8888, 7106 7067 DRM_FORMAT_ABGR8888, 7107 7068 DRM_FORMAT_RGB565, ··· 9014 8967 } 9015 8968 9016 8969 status = dc_stream_get_status(dm_new_crtc_state->stream); 9017 - WARN_ON(!status); 8970 + 8971 + if (WARN_ON(!status)) 8972 + continue; 8973 + 9018 8974 WARN_ON(!status->plane_count); 9019 8975 9020 8976 /* ··· 10024 9974 10025 9975 if (cursor_scale_w != primary_scale_w || 10026 9976 cursor_scale_h != primary_scale_h) { 10027 - DRM_DEBUG_ATOMIC("Cursor plane scaling doesn't match primary plane\n"); 9977 + drm_dbg_atomic(crtc->dev, "Cursor plane scaling doesn't match primary plane\n"); 10028 9978 return -EINVAL; 10029 9979 } 10030 9980 ··· 10060 10010 { 10061 10011 int i; 10062 10012 struct drm_plane *plane; 10063 - struct drm_plane_state *old_plane_state, *new_plane_state; 10064 - struct drm_plane_state *primary_state, *overlay_state = NULL; 10013 + struct drm_plane_state *new_plane_state; 10014 + struct drm_plane_state *primary_state, *cursor_state, *overlay_state = NULL; 10065 10015 10066 10016 /* Check if primary plane is contained inside overlay */ 10067 - for_each_oldnew_plane_in_state_reverse(state, plane, old_plane_state, new_plane_state, i) { 10017 + for_each_new_plane_in_state_reverse(state, plane, new_plane_state, i) { 10068 10018 if (plane->type == DRM_PLANE_TYPE_OVERLAY) { 10069 10019 if (drm_atomic_plane_disabling(plane->state, new_plane_state)) 10070 10020 return 0; ··· 10089 10039 10090 10040 /* check if primary plane is enabled */ 10091 10041 if (!primary_state->crtc) 10042 + return 0; 10043 + 10044 + /* check if cursor plane is enabled */ 10045 + cursor_state = drm_atomic_get_plane_state(state, overlay_state->crtc->cursor); 10046 + if (IS_ERR(cursor_state)) 10047 + return PTR_ERR(cursor_state); 10048 + 10049 + if (drm_atomic_plane_disabling(plane->state, cursor_state)) 10092 10050 return 0; 10093 10051 10094 10052 /* Perform the bounds check to ensure the overlay plane covers the primary */
+8 -2
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_mst_types.c
··· 160 160 struct dc_sink *dc_sink = aconnector->dc_sink; 161 161 struct drm_dp_mst_port *port = aconnector->port; 162 162 u8 dsc_caps[16] = { 0 }; 163 + u8 dsc_branch_dec_caps_raw[3] = { 0 }; // DSC branch decoder caps 0xA0 ~ 0xA2 164 + u8 *dsc_branch_dec_caps = NULL; 163 165 164 166 aconnector->dsc_aux = drm_dp_mst_dsc_aux_for_port(port); 165 167 #if defined(CONFIG_HP_HOOK_WORKAROUND) ··· 184 182 if (drm_dp_dpcd_read(aconnector->dsc_aux, DP_DSC_SUPPORT, dsc_caps, 16) < 0) 185 183 return false; 186 184 185 + if (drm_dp_dpcd_read(aconnector->dsc_aux, 186 + DP_DSC_BRANCH_OVERALL_THROUGHPUT_0, dsc_branch_dec_caps_raw, 3) == 3) 187 + dsc_branch_dec_caps = dsc_branch_dec_caps_raw; 188 + 187 189 if (!dc_dsc_parse_dsc_dpcd(aconnector->dc_link->ctx->dc, 188 - dsc_caps, NULL, 189 - &dc_sink->dsc_caps.dsc_dec_caps)) 190 + dsc_caps, dsc_branch_dec_caps, 191 + &dc_sink->dsc_caps.dsc_dec_caps)) 190 192 return false; 191 193 192 194 return true;
+3 -3
drivers/gpu/drm/amd/display/dc/bios/bios_parser.c
··· 979 979 struct spread_spectrum_info *info); 980 980 981 981 /** 982 - * get_ss_info_from_table 982 + * get_ss_info_from_tbl 983 983 * Get spread sprectrum information from the ASIC_InternalSS_Info Ver 2.1 or 984 984 * SS_Info table from the VBIOS 985 985 * There can not be more than 1 entry for ASIC_InternalSS_Info Ver 2.1 or ··· 1548 1548 uint32_t id); 1549 1549 1550 1550 /** 1551 - * BiosParserObject::GetNumberofSpreadSpectrumEntry 1551 + * bios_parser_get_ss_entry_number 1552 1552 * Get Number of SpreadSpectrum Entry from the ASIC_InternalSS_Info table from 1553 1553 * the VBIOS that match the SSid (to be converted from signal) 1554 1554 * ··· 1725 1725 return 0; 1726 1726 } 1727 1727 /** 1728 - * get_ss_entry_number_from_internal_ss_info_table_V3_1 1728 + * get_ss_entry_number_from_internal_ss_info_tbl_V3_1 1729 1729 * Get Number of SpreadSpectrum Entry from the ASIC_InternalSS_Info table of 1730 1730 * the VBIOS that matches id 1731 1731 *
+1 -1
drivers/gpu/drm/amd/display/dc/bios/command_table_helper.c
··· 114 114 } 115 115 116 116 /** 117 - * translate_transmitter_bp_to_atom - Translate the Transmitter to the 117 + * dal_cmd_table_helper_transmitter_bp_to_atom - Translate the Transmitter to the 118 118 * corresponding ATOM BIOS value 119 119 * @t: transmitter 120 120 * returns: output digitalTransmitter
+1 -1
drivers/gpu/drm/amd/display/dc/bios/command_table_helper2.c
··· 129 129 } 130 130 131 131 /** 132 - * translate_transmitter_bp_to_atom2 - Translate the Transmitter to the 132 + * dal_cmd_table_helper_transmitter_bp_to_atom2 - Translate the Transmitter to the 133 133 * corresponding ATOM BIOS value 134 134 * @t: transmitter 135 135 * returns: digitalTransmitter
+2
drivers/gpu/drm/amd/display/dc/calcs/dce_calcs.c
··· 2863 2863 data->bytes_per_pixel[num_displays + 4] = 4; 2864 2864 break; 2865 2865 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 2866 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 2866 2867 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 2867 2868 data->bytes_per_pixel[num_displays + 4] = 8; 2868 2869 break; ··· 2967 2966 data->bytes_per_pixel[num_displays + 4] = 4; 2968 2967 break; 2969 2968 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 2969 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 2970 2970 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 2971 2971 data->bytes_per_pixel[num_displays + 4] = 8; 2972 2972 break;
+2
drivers/gpu/drm/amd/display/dc/calcs/dcn_calcs.c
··· 236 236 case SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS: 237 237 return dcn_bw_rgb_sub_32; 238 238 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 239 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 239 240 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 240 241 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 241 242 return dcn_bw_rgb_sub_64; ··· 376 375 input->src.viewport_height_c = input->src.viewport_height / 2; 377 376 break; 378 377 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 378 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 379 379 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 380 380 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 381 381 input->src.source_format = dm_444_64;
+19 -44
drivers/gpu/drm/amd/display/dc/core/dc.c
··· 303 303 struct dc_stream_state *stream, 304 304 struct dc_crtc_timing_adjust *adjust) 305 305 { 306 - int i = 0; 306 + int i; 307 307 bool ret = false; 308 308 309 309 stream->adjust.v_total_max = adjust->v_total_max; ··· 331 331 { 332 332 /* TODO: Support multiple streams */ 333 333 const struct dc_stream_state *stream = streams[0]; 334 - int i = 0; 334 + int i; 335 335 bool ret = false; 336 336 struct crtc_position position; 337 337 ··· 538 538 enum dc_dynamic_expansion option) 539 539 { 540 540 /* OPP FMT dyn expansion updates*/ 541 - int i = 0; 541 + int i; 542 542 struct pipe_ctx *pipe_ctx; 543 543 544 544 for (i = 0; i < MAX_PIPES; i++) { ··· 596 596 597 597 bool dc_stream_set_gamut_remap(struct dc *dc, const struct dc_stream_state *stream) 598 598 { 599 - int i = 0; 599 + int i; 600 600 bool ret = false; 601 601 struct pipe_ctx *pipes; 602 602 ··· 613 613 614 614 bool dc_stream_program_csc_matrix(struct dc *dc, struct dc_stream_state *stream) 615 615 { 616 - int i = 0; 616 + int i; 617 617 bool ret = false; 618 618 struct pipe_ctx *pipes; 619 619 ··· 639 639 int num_streams, 640 640 const struct dc_static_screen_params *params) 641 641 { 642 - int i = 0; 643 - int j = 0; 642 + int i, j; 644 643 struct pipe_ctx *pipes_affected[MAX_PIPES]; 645 644 int num_pipes_affected = 0; 646 645 ··· 894 895 static void apply_ctx_interdependent_lock(struct dc *dc, struct dc_state *context, 895 896 struct dc_stream_state *stream, bool lock) 896 897 { 897 - int i = 0; 898 + int i; 898 899 899 900 /* Checks if interdependent update function pointer is NULL or not, takes care of DCE110 case */ 900 901 if (dc->hwss.interdependent_update_lock) ··· 1154 1155 struct dc *dc, 1155 1156 struct dc_state *ctx) 1156 1157 { 1157 - int i = 0, multisync_count = 0; 1158 + int i, multisync_count = 0; 1158 1159 int pipe_count = dc->res_pool->pipe_count; 1159 1160 struct pipe_ctx *multisync_pipes[MAX_PIPES] = { NULL }; 1160 1161 ··· 3334 3335 #endif 3335 3336 3336 3337 /** 3337 - ***************************************************************************** 3338 - * Function: dc_enable_dmub_notifications 3338 + * dc_enable_dmub_notifications - Returns whether dmub notification can be enabled 3339 + * @dc: dc structure 3339 3340 * 3340 - * @brief 3341 - * Returns whether dmub notification can be enabled 3342 - * 3343 - * @param 3344 - * [in] dc: dc structure 3345 - * 3346 - * @return 3347 - * True to enable dmub notifications, False otherwise 3348 - ***************************************************************************** 3341 + * Returns: True to enable dmub notifications, False otherwise 3349 3342 */ 3350 3343 bool dc_enable_dmub_notifications(struct dc *dc) 3351 3344 { ··· 3346 3355 } 3347 3356 3348 3357 /** 3349 - ***************************************************************************** 3350 - * Function: dc_process_dmub_aux_transfer_async 3358 + * dc_process_dmub_aux_transfer_async - Submits aux command to dmub via inbox message 3359 + * Sets port index appropriately for legacy DDC 3360 + * @dc: dc structure 3361 + * @link_index: link index 3362 + * @payload: aux payload 3351 3363 * 3352 - * @brief 3353 - * Submits aux command to dmub via inbox message 3354 - * Sets port index appropriately for legacy DDC 3355 - * 3356 - * @param 3357 - * [in] dc: dc structure 3358 - * [in] link_index: link index 3359 - * [in] payload: aux payload 3360 - * 3361 - * @return 3362 - * True if successful, False if failure 3363 - ***************************************************************************** 3364 + * Returns: True if successful, False if failure 3364 3365 */ 3365 3366 bool dc_process_dmub_aux_transfer_async(struct dc *dc, 3366 3367 uint32_t link_index, ··· 3411 3428 } 3412 3429 3413 3430 /** 3414 - ***************************************************************************** 3415 - * Function: dc_disable_accelerated_mode 3416 - * 3417 - * @brief 3418 - * disable accelerated mode 3419 - * 3420 - * @param 3421 - * [in] dc: dc structure 3422 - * 3423 - ***************************************************************************** 3431 + * dc_disable_accelerated_mode - disable accelerated mode 3432 + * @dc: dc structure 3424 3433 */ 3425 3434 void dc_disable_accelerated_mode(struct dc *dc) 3426 3435 {
+208 -369
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
··· 611 611 dal_pixel_format = PIXEL_FORMAT_420BPP10; 612 612 break; 613 613 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 614 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 614 615 default: 615 616 dal_pixel_format = PIXEL_FORMAT_UNKNOWN; 616 617 break; ··· 702 701 } 703 702 } 704 703 705 - static void calculate_viewport(struct pipe_ctx *pipe_ctx) 704 + /* 705 + * This is a preliminary vp size calculation to allow us to check taps support. 706 + * The result is completely overridden afterwards. 707 + */ 708 + static void calculate_viewport_size(struct pipe_ctx *pipe_ctx) 706 709 { 707 - const struct dc_plane_state *plane_state = pipe_ctx->plane_state; 708 - const struct dc_stream_state *stream = pipe_ctx->stream; 709 710 struct scaler_data *data = &pipe_ctx->plane_res.scl_data; 710 - struct rect surf_src = plane_state->src_rect; 711 - struct rect clip, dest; 712 - int vpc_div = (data->format == PIXEL_FORMAT_420BPP8 713 - || data->format == PIXEL_FORMAT_420BPP10) ? 2 : 1; 714 - int split_count = 0; 715 - int split_idx = 0; 716 - bool orthogonal_rotation, flip_y_start, flip_x_start; 717 711 718 - calculate_split_count_and_index(pipe_ctx, &split_count, &split_idx); 719 - 720 - if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE || 721 - stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) { 722 - split_count = 0; 723 - split_idx = 0; 712 + data->viewport.width = dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.horz, data->recout.width)); 713 + data->viewport.height = dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.vert, data->recout.height)); 714 + data->viewport_c.width = dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.horz_c, data->recout.width)); 715 + data->viewport_c.height = dc_fixpt_ceil(dc_fixpt_mul_int(data->ratios.vert_c, data->recout.height)); 716 + if (pipe_ctx->plane_state->rotation == ROTATION_ANGLE_90 || 717 + pipe_ctx->plane_state->rotation == ROTATION_ANGLE_270) { 718 + swap(data->viewport.width, data->viewport.height); 719 + swap(data->viewport_c.width, data->viewport_c.height); 724 720 } 725 - 726 - /* The actual clip is an intersection between stream 727 - * source and surface clip 728 - */ 729 - dest = plane_state->dst_rect; 730 - clip.x = stream->src.x > plane_state->clip_rect.x ? 731 - stream->src.x : plane_state->clip_rect.x; 732 - 733 - clip.width = stream->src.x + stream->src.width < 734 - plane_state->clip_rect.x + plane_state->clip_rect.width ? 735 - stream->src.x + stream->src.width - clip.x : 736 - plane_state->clip_rect.x + plane_state->clip_rect.width - clip.x ; 737 - 738 - clip.y = stream->src.y > plane_state->clip_rect.y ? 739 - stream->src.y : plane_state->clip_rect.y; 740 - 741 - clip.height = stream->src.y + stream->src.height < 742 - plane_state->clip_rect.y + plane_state->clip_rect.height ? 743 - stream->src.y + stream->src.height - clip.y : 744 - plane_state->clip_rect.y + plane_state->clip_rect.height - clip.y ; 745 - 746 - /* 747 - * Need to calculate how scan origin is shifted in vp space 748 - * to correctly rotate clip and dst 749 - */ 750 - get_vp_scan_direction( 751 - plane_state->rotation, 752 - plane_state->horizontal_mirror, 753 - &orthogonal_rotation, 754 - &flip_y_start, 755 - &flip_x_start); 756 - 757 - if (orthogonal_rotation) { 758 - swap(clip.x, clip.y); 759 - swap(clip.width, clip.height); 760 - swap(dest.x, dest.y); 761 - swap(dest.width, dest.height); 762 - } 763 - if (flip_x_start) { 764 - clip.x = dest.x + dest.width - clip.x - clip.width; 765 - dest.x = 0; 766 - } 767 - if (flip_y_start) { 768 - clip.y = dest.y + dest.height - clip.y - clip.height; 769 - dest.y = 0; 770 - } 771 - 772 - /* offset = surf_src.ofs + (clip.ofs - surface->dst_rect.ofs) * scl_ratio 773 - * num_pixels = clip.num_pix * scl_ratio 774 - */ 775 - data->viewport.x = surf_src.x + (clip.x - dest.x) * surf_src.width / dest.width; 776 - data->viewport.width = clip.width * surf_src.width / dest.width; 777 - 778 - data->viewport.y = surf_src.y + (clip.y - dest.y) * surf_src.height / dest.height; 779 - data->viewport.height = clip.height * surf_src.height / dest.height; 780 - 781 - /* Handle split */ 782 - if (split_count) { 783 - /* extra pixels in the division remainder need to go to pipes after 784 - * the extra pixel index minus one(epimo) defined here as: 785 - */ 786 - int epimo = 0; 787 - 788 - if (orthogonal_rotation) { 789 - if (flip_y_start) 790 - split_idx = split_count - split_idx; 791 - 792 - epimo = split_count - data->viewport.height % (split_count + 1); 793 - 794 - data->viewport.y += (data->viewport.height / (split_count + 1)) * split_idx; 795 - if (split_idx > epimo) 796 - data->viewport.y += split_idx - epimo - 1; 797 - data->viewport.height = data->viewport.height / (split_count + 1) + (split_idx > epimo ? 1 : 0); 798 - } else { 799 - if (flip_x_start) 800 - split_idx = split_count - split_idx; 801 - 802 - epimo = split_count - data->viewport.width % (split_count + 1); 803 - 804 - data->viewport.x += (data->viewport.width / (split_count + 1)) * split_idx; 805 - if (split_idx > epimo) 806 - data->viewport.x += split_idx - epimo - 1; 807 - data->viewport.width = data->viewport.width / (split_count + 1) + (split_idx > epimo ? 1 : 0); 808 - } 809 - } 810 - 811 - /* Round down, compensate in init */ 812 - data->viewport_c.x = data->viewport.x / vpc_div; 813 - data->viewport_c.y = data->viewport.y / vpc_div; 814 - data->inits.h_c = (data->viewport.x % vpc_div) != 0 ? dc_fixpt_half : dc_fixpt_zero; 815 - data->inits.v_c = (data->viewport.y % vpc_div) != 0 ? dc_fixpt_half : dc_fixpt_zero; 816 - 817 - /* Round up, assume original video size always even dimensions */ 818 - data->viewport_c.width = (data->viewport.width + vpc_div - 1) / vpc_div; 819 - data->viewport_c.height = (data->viewport.height + vpc_div - 1) / vpc_div; 820 - 821 - data->viewport_unadjusted = data->viewport; 822 - data->viewport_c_unadjusted = data->viewport_c; 823 721 } 824 722 825 723 static void calculate_recout(struct pipe_ctx *pipe_ctx) ··· 727 827 const struct dc_stream_state *stream = pipe_ctx->stream; 728 828 struct scaler_data *data = &pipe_ctx->plane_res.scl_data; 729 829 struct rect surf_clip = plane_state->clip_rect; 730 - bool pri_split_tb = pipe_ctx->bottom_pipe && 731 - pipe_ctx->bottom_pipe->plane_state == pipe_ctx->plane_state && 732 - stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM; 733 - bool sec_split_tb = pipe_ctx->top_pipe && 734 - pipe_ctx->top_pipe->plane_state == pipe_ctx->plane_state && 735 - stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM; 736 - int split_count = 0; 737 - int split_idx = 0; 830 + bool split_tb = stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM; 831 + int split_count, split_idx; 738 832 739 833 calculate_split_count_and_index(pipe_ctx, &split_count, &split_idx); 834 + if (stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE) 835 + split_idx = 0; 740 836 741 837 /* 742 838 * Only the leftmost ODM pipe should be offset by a nonzero distance 743 839 */ 744 - if (!pipe_ctx->prev_odm_pipe) { 840 + if (!pipe_ctx->prev_odm_pipe || split_idx == split_count) { 745 841 data->recout.x = stream->dst.x; 746 842 if (stream->src.x < surf_clip.x) 747 843 data->recout.x += (surf_clip.x - stream->src.x) * stream->dst.width 748 844 / stream->src.width; 749 - 750 845 } else 751 846 data->recout.x = 0; 752 847 ··· 762 867 if (data->recout.height + data->recout.y > stream->dst.y + stream->dst.height) 763 868 data->recout.height = stream->dst.y + stream->dst.height - data->recout.y; 764 869 765 - /* Handle h & v split, handle rotation using viewport */ 766 - if (sec_split_tb) { 767 - data->recout.y += data->recout.height / 2; 768 - /* Floor primary pipe, ceil 2ndary pipe */ 769 - data->recout.height = (data->recout.height + 1) / 2; 770 - } else if (pri_split_tb) 870 + /* Handle h & v split */ 871 + if (split_tb) { 872 + ASSERT(data->recout.height % 2 == 0); 771 873 data->recout.height /= 2; 772 - else if (split_count) { 773 - /* extra pixels in the division remainder need to go to pipes after 774 - * the extra pixel index minus one(epimo) defined here as: 775 - */ 776 - int epimo = split_count - data->recout.width % (split_count + 1); 777 - 778 - /*no recout offset due to odm */ 874 + } else if (split_count) { 779 875 if (!pipe_ctx->next_odm_pipe && !pipe_ctx->prev_odm_pipe) { 876 + /* extra pixels in the division remainder need to go to pipes after 877 + * the extra pixel index minus one(epimo) defined here as: 878 + */ 879 + int epimo = split_count - data->recout.width % (split_count + 1); 880 + 780 881 data->recout.x += (data->recout.width / (split_count + 1)) * split_idx; 781 882 if (split_idx > epimo) 782 883 data->recout.x += split_idx - epimo - 1; 884 + ASSERT(stream->view_format != VIEW_3D_FORMAT_SIDE_BY_SIDE || data->recout.width % 2 == 0); 885 + data->recout.width = data->recout.width / (split_count + 1) + (split_idx > epimo ? 1 : 0); 886 + } else { 887 + /* odm */ 888 + if (split_idx == split_count) { 889 + /* rightmost pipe is the remainder recout */ 890 + data->recout.width -= data->h_active * split_count - data->recout.x; 891 + data->recout.x = 0; 892 + } else 893 + data->recout.width = data->h_active - data->recout.x; 783 894 } 784 - data->recout.width = data->recout.width / (split_count + 1) + (split_idx > epimo ? 1 : 0); 785 895 } 786 896 } 787 897 ··· 840 940 pipe_ctx->plane_res.scl_data.ratios.vert_c, 19); 841 941 } 842 942 843 - static inline void adjust_vp_and_init_for_seamless_clip( 943 + 944 + /* 945 + * We completely calculate vp offset, size and inits here based entirely on scaling 946 + * ratios and recout for pixel perfect pipe combine. 947 + */ 948 + static void calculate_init_and_vp( 844 949 bool flip_scan_dir, 845 - int recout_skip, 950 + int recout_offset_within_recout_full, 951 + int recout_size, 846 952 int src_size, 847 953 int taps, 848 954 struct fixed31_32 ratio, ··· 856 950 int *vp_offset, 857 951 int *vp_size) 858 952 { 859 - if (!flip_scan_dir) { 860 - /* Adjust for viewport end clip-off */ 861 - if ((*vp_offset + *vp_size) < src_size) { 862 - int vp_clip = src_size - *vp_size - *vp_offset; 863 - int int_part = dc_fixpt_floor(dc_fixpt_sub(*init, ratio)); 953 + struct fixed31_32 temp; 954 + int int_part; 864 955 865 - int_part = int_part > 0 ? int_part : 0; 866 - *vp_size += int_part < vp_clip ? int_part : vp_clip; 867 - } 868 - 869 - /* Adjust for non-0 viewport offset */ 870 - if (*vp_offset) { 871 - int int_part; 872 - 873 - *init = dc_fixpt_add(*init, dc_fixpt_mul_int(ratio, recout_skip)); 874 - int_part = dc_fixpt_floor(*init) - *vp_offset; 875 - if (int_part < taps) { 876 - int int_adj = *vp_offset >= (taps - int_part) ? 877 - (taps - int_part) : *vp_offset; 878 - *vp_offset -= int_adj; 879 - *vp_size += int_adj; 880 - int_part += int_adj; 881 - } else if (int_part > taps) { 882 - *vp_offset += int_part - taps; 883 - *vp_size -= int_part - taps; 884 - int_part = taps; 885 - } 886 - init->value &= 0xffffffff; 887 - *init = dc_fixpt_add_int(*init, int_part); 888 - } 889 - } else { 890 - /* Adjust for non-0 viewport offset */ 891 - if (*vp_offset) { 892 - int int_part = dc_fixpt_floor(dc_fixpt_sub(*init, ratio)); 893 - 894 - int_part = int_part > 0 ? int_part : 0; 895 - *vp_size += int_part < *vp_offset ? int_part : *vp_offset; 896 - *vp_offset -= int_part < *vp_offset ? int_part : *vp_offset; 897 - } 898 - 899 - /* Adjust for viewport end clip-off */ 900 - if ((*vp_offset + *vp_size) < src_size) { 901 - int int_part; 902 - int end_offset = src_size - *vp_offset - *vp_size; 903 - 904 - /* 905 - * this is init if vp had no offset, keep in mind this is from the 906 - * right side of vp due to scan direction 907 - */ 908 - *init = dc_fixpt_add(*init, dc_fixpt_mul_int(ratio, recout_skip)); 909 - /* 910 - * this is the difference between first pixel of viewport available to read 911 - * and init position, takning into account scan direction 912 - */ 913 - int_part = dc_fixpt_floor(*init) - end_offset; 914 - if (int_part < taps) { 915 - int int_adj = end_offset >= (taps - int_part) ? 916 - (taps - int_part) : end_offset; 917 - *vp_size += int_adj; 918 - int_part += int_adj; 919 - } else if (int_part > taps) { 920 - *vp_size += int_part - taps; 921 - int_part = taps; 922 - } 923 - init->value &= 0xffffffff; 924 - *init = dc_fixpt_add_int(*init, int_part); 925 - } 956 + /* 957 + * First of the taps starts sampling pixel number <init_int_part> corresponding to recout 958 + * pixel 1. Next recout pixel samples int part of <init + scaling ratio> and so on. 959 + * All following calculations are based on this logic. 960 + * 961 + * Init calculated according to formula: 962 + * init = (scaling_ratio + number_of_taps + 1) / 2 963 + * init_bot = init + scaling_ratio 964 + * to get pixel perfect combine add the fraction from calculating vp offset 965 + */ 966 + temp = dc_fixpt_mul_int(ratio, recout_offset_within_recout_full); 967 + *vp_offset = dc_fixpt_floor(temp); 968 + temp.value &= 0xffffffff; 969 + *init = dc_fixpt_truncate(dc_fixpt_add(dc_fixpt_div_int( 970 + dc_fixpt_add_int(ratio, taps + 1), 2), temp), 19); 971 + /* 972 + * If viewport has non 0 offset and there are more taps than covered by init then 973 + * we should decrease the offset and increase init so we are never sampling 974 + * outside of viewport. 975 + */ 976 + int_part = dc_fixpt_floor(*init); 977 + if (int_part < taps) { 978 + int_part = taps - int_part; 979 + if (int_part > *vp_offset) 980 + int_part = *vp_offset; 981 + *vp_offset -= int_part; 982 + *init = dc_fixpt_add_int(*init, int_part); 926 983 } 984 + /* 985 + * If taps are sampling outside of viewport at end of recout and there are more pixels 986 + * available in the surface we should increase the viewport size, regardless set vp to 987 + * only what is used. 988 + */ 989 + temp = dc_fixpt_add(*init, dc_fixpt_mul_int(ratio, recout_size - 1)); 990 + *vp_size = dc_fixpt_floor(temp); 991 + if (*vp_size + *vp_offset > src_size) 992 + *vp_size = src_size - *vp_offset; 993 + 994 + /* We did all the math assuming we are scanning same direction as display does, 995 + * however mirror/rotation changes how vp scans vs how it is offset. If scan direction 996 + * is flipped we simply need to calculate offset from the other side of plane. 997 + * Note that outside of viewport all scaling hardware works in recout space. 998 + */ 999 + if (flip_scan_dir) 1000 + *vp_offset = src_size - *vp_offset - *vp_size; 927 1001 } 928 1002 929 - static void calculate_inits_and_adj_vp(struct pipe_ctx *pipe_ctx) 1003 + static void calculate_inits_and_viewports(struct pipe_ctx *pipe_ctx) 930 1004 { 931 1005 const struct dc_plane_state *plane_state = pipe_ctx->plane_state; 932 1006 const struct dc_stream_state *stream = pipe_ctx->stream; 933 - struct pipe_ctx *odm_pipe = pipe_ctx; 934 1007 struct scaler_data *data = &pipe_ctx->plane_res.scl_data; 935 - struct rect src = pipe_ctx->plane_state->src_rect; 936 - int recout_skip_h, recout_skip_v, surf_size_h, surf_size_v; 1008 + struct rect src = plane_state->src_rect; 937 1009 int vpc_div = (data->format == PIXEL_FORMAT_420BPP8 938 - || data->format == PIXEL_FORMAT_420BPP10) ? 2 : 1; 1010 + || data->format == PIXEL_FORMAT_420BPP10) ? 2 : 1; 1011 + int split_count, split_idx, ro_lb, ro_tb, recout_full_x, recout_full_y; 939 1012 bool orthogonal_rotation, flip_vert_scan_dir, flip_horz_scan_dir; 940 - int odm_idx = 0; 1013 + 1014 + calculate_split_count_and_index(pipe_ctx, &split_count, &split_idx); 1015 + /* 1016 + * recout full is what the recout would have been if we didnt clip 1017 + * the source plane at all. We only care about left(ro_lb) and top(ro_tb) 1018 + * offsets of recout within recout full because those are the directions 1019 + * we scan from and therefore the only ones that affect inits. 1020 + */ 1021 + recout_full_x = stream->dst.x + (plane_state->dst_rect.x - stream->src.x) 1022 + * stream->dst.width / stream->src.width; 1023 + recout_full_y = stream->dst.y + (plane_state->dst_rect.y - stream->src.y) 1024 + * stream->dst.height / stream->src.height; 1025 + if (pipe_ctx->prev_odm_pipe && split_idx) 1026 + ro_lb = data->h_active * split_idx - recout_full_x; 1027 + else 1028 + ro_lb = data->recout.x - recout_full_x; 1029 + ro_tb = data->recout.y - recout_full_y; 1030 + ASSERT(ro_lb >= 0 && ro_tb >= 0); 941 1031 942 1032 /* 943 - * Need to calculate the scan direction for viewport to make adjustments 1033 + * Work in recout rotation since that requires less transformations 944 1034 */ 945 1035 get_vp_scan_direction( 946 1036 plane_state->rotation, ··· 945 1043 &flip_vert_scan_dir, 946 1044 &flip_horz_scan_dir); 947 1045 948 - /* Calculate src rect rotation adjusted to recout space */ 949 - surf_size_h = src.x + src.width; 950 - surf_size_v = src.y + src.height; 951 - if (flip_horz_scan_dir) 952 - src.x = 0; 953 - if (flip_vert_scan_dir) 954 - src.y = 0; 955 1046 if (orthogonal_rotation) { 956 - swap(src.x, src.y); 957 1047 swap(src.width, src.height); 1048 + swap(flip_vert_scan_dir, flip_horz_scan_dir); 958 1049 } 959 1050 960 - /*modified recout_skip_h calculation due to odm having no recout offset*/ 961 - while (odm_pipe->prev_odm_pipe) { 962 - odm_idx++; 963 - odm_pipe = odm_pipe->prev_odm_pipe; 964 - } 965 - /*odm_pipe is the leftmost pipe in the ODM group*/ 966 - recout_skip_h = odm_idx * data->recout.width; 967 - 968 - /* Recout matching initial vp offset = recout_offset - (stream dst offset + 969 - * ((surf dst offset - stream src offset) * 1/ stream scaling ratio) 970 - * - (surf surf_src offset * 1/ full scl ratio)) 971 - */ 972 - recout_skip_h += odm_pipe->plane_res.scl_data.recout.x 973 - - (stream->dst.x + (plane_state->dst_rect.x - stream->src.x) 974 - * stream->dst.width / stream->src.width - 975 - src.x * plane_state->dst_rect.width / src.width 976 - * stream->dst.width / stream->src.width); 977 - 978 - 979 - recout_skip_v = data->recout.y - (stream->dst.y + (plane_state->dst_rect.y - stream->src.y) 980 - * stream->dst.height / stream->src.height - 981 - src.y * plane_state->dst_rect.height / src.height 982 - * stream->dst.height / stream->src.height); 983 - if (orthogonal_rotation) 984 - swap(recout_skip_h, recout_skip_v); 985 - /* 986 - * Init calculated according to formula: 987 - * init = (scaling_ratio + number_of_taps + 1) / 2 988 - * init_bot = init + scaling_ratio 989 - * init_c = init + truncated_vp_c_offset(from calculate viewport) 990 - */ 991 - data->inits.h = dc_fixpt_truncate(dc_fixpt_div_int( 992 - dc_fixpt_add_int(data->ratios.horz, data->taps.h_taps + 1), 2), 19); 993 - 994 - data->inits.h_c = dc_fixpt_truncate(dc_fixpt_add(data->inits.h_c, dc_fixpt_div_int( 995 - dc_fixpt_add_int(data->ratios.horz_c, data->taps.h_taps_c + 1), 2)), 19); 996 - 997 - data->inits.v = dc_fixpt_truncate(dc_fixpt_div_int( 998 - dc_fixpt_add_int(data->ratios.vert, data->taps.v_taps + 1), 2), 19); 999 - 1000 - data->inits.v_c = dc_fixpt_truncate(dc_fixpt_add(data->inits.v_c, dc_fixpt_div_int( 1001 - dc_fixpt_add_int(data->ratios.vert_c, data->taps.v_taps_c + 1), 2)), 19); 1002 - 1003 - /* 1004 - * Taps, inits and scaling ratios are in recout space need to rotate 1005 - * to viewport rotation before adjustment 1006 - */ 1007 - adjust_vp_and_init_for_seamless_clip( 1051 + calculate_init_and_vp( 1008 1052 flip_horz_scan_dir, 1009 - recout_skip_h, 1010 - surf_size_h, 1011 - orthogonal_rotation ? data->taps.v_taps : data->taps.h_taps, 1012 - orthogonal_rotation ? data->ratios.vert : data->ratios.horz, 1013 - orthogonal_rotation ? &data->inits.v : &data->inits.h, 1053 + ro_lb, 1054 + data->recout.width, 1055 + src.width, 1056 + data->taps.h_taps, 1057 + data->ratios.horz, 1058 + &data->inits.h, 1014 1059 &data->viewport.x, 1015 1060 &data->viewport.width); 1016 - adjust_vp_and_init_for_seamless_clip( 1061 + calculate_init_and_vp( 1017 1062 flip_horz_scan_dir, 1018 - recout_skip_h, 1019 - surf_size_h / vpc_div, 1020 - orthogonal_rotation ? data->taps.v_taps_c : data->taps.h_taps_c, 1021 - orthogonal_rotation ? data->ratios.vert_c : data->ratios.horz_c, 1022 - orthogonal_rotation ? &data->inits.v_c : &data->inits.h_c, 1063 + ro_lb, 1064 + data->recout.width, 1065 + src.width / vpc_div, 1066 + data->taps.h_taps_c, 1067 + data->ratios.horz_c, 1068 + &data->inits.h_c, 1023 1069 &data->viewport_c.x, 1024 1070 &data->viewport_c.width); 1025 - adjust_vp_and_init_for_seamless_clip( 1071 + calculate_init_and_vp( 1026 1072 flip_vert_scan_dir, 1027 - recout_skip_v, 1028 - surf_size_v, 1029 - orthogonal_rotation ? data->taps.h_taps : data->taps.v_taps, 1030 - orthogonal_rotation ? data->ratios.horz : data->ratios.vert, 1031 - orthogonal_rotation ? &data->inits.h : &data->inits.v, 1073 + ro_tb, 1074 + data->recout.height, 1075 + src.height, 1076 + data->taps.v_taps, 1077 + data->ratios.vert, 1078 + &data->inits.v, 1032 1079 &data->viewport.y, 1033 1080 &data->viewport.height); 1034 - adjust_vp_and_init_for_seamless_clip( 1081 + calculate_init_and_vp( 1035 1082 flip_vert_scan_dir, 1036 - recout_skip_v, 1037 - surf_size_v / vpc_div, 1038 - orthogonal_rotation ? data->taps.h_taps_c : data->taps.v_taps_c, 1039 - orthogonal_rotation ? data->ratios.horz_c : data->ratios.vert_c, 1040 - orthogonal_rotation ? &data->inits.h_c : &data->inits.v_c, 1083 + ro_tb, 1084 + data->recout.height, 1085 + src.height / vpc_div, 1086 + data->taps.v_taps_c, 1087 + data->ratios.vert_c, 1088 + &data->inits.v_c, 1041 1089 &data->viewport_c.y, 1042 1090 &data->viewport_c.height); 1043 - 1044 - /* Interlaced inits based on final vert inits */ 1045 - data->inits.v_bot = dc_fixpt_add(data->inits.v, data->ratios.vert); 1046 - data->inits.v_c_bot = dc_fixpt_add(data->inits.v_c, data->ratios.vert_c); 1047 - 1048 - } 1049 - 1050 - /* 1051 - * When handling 270 rotation in mixed SLS mode, we have 1052 - * stream->timing.h_border_left that is non zero. If we are doing 1053 - * pipe-splitting, this h_border_left value gets added to recout.x and when it 1054 - * calls calculate_inits_and_adj_vp() and 1055 - * adjust_vp_and_init_for_seamless_clip(), it can cause viewport.height for a 1056 - * pipe to be incorrect. 1057 - * 1058 - * To fix this, instead of using stream->timing.h_border_left, we can use 1059 - * stream->dst.x to represent the border instead. So we will set h_border_left 1060 - * to 0 and shift the appropriate amount in stream->dst.x. We will then 1061 - * perform all calculations in resource_build_scaling_params() based on this 1062 - * and then restore the h_border_left and stream->dst.x to their original 1063 - * values. 1064 - * 1065 - * shift_border_left_to_dst() will shift the amount of h_border_left to 1066 - * stream->dst.x and set h_border_left to 0. restore_border_left_from_dst() 1067 - * will restore h_border_left and stream->dst.x back to their original values 1068 - * We also need to make sure pipe_ctx->plane_res.scl_data.h_active uses the 1069 - * original h_border_left value in its calculation. 1070 - */ 1071 - static int shift_border_left_to_dst(struct pipe_ctx *pipe_ctx) 1072 - { 1073 - int store_h_border_left = pipe_ctx->stream->timing.h_border_left; 1074 - 1075 - if (store_h_border_left) { 1076 - pipe_ctx->stream->timing.h_border_left = 0; 1077 - pipe_ctx->stream->dst.x += store_h_border_left; 1091 + if (orthogonal_rotation) { 1092 + swap(data->viewport.x, data->viewport.y); 1093 + swap(data->viewport.width, data->viewport.height); 1094 + swap(data->viewport_c.x, data->viewport_c.y); 1095 + swap(data->viewport_c.width, data->viewport_c.height); 1078 1096 } 1079 - return store_h_border_left; 1080 - } 1081 - 1082 - static void restore_border_left_from_dst(struct pipe_ctx *pipe_ctx, 1083 - int store_h_border_left) 1084 - { 1085 - pipe_ctx->stream->dst.x -= store_h_border_left; 1086 - pipe_ctx->stream->timing.h_border_left = store_h_border_left; 1097 + data->viewport.x += src.x; 1098 + data->viewport.y += src.y; 1099 + ASSERT(src.x % vpc_div == 0 && src.y % vpc_div == 0); 1100 + data->viewport_c.x += src.x / vpc_div; 1101 + data->viewport_c.y += src.y / vpc_div; 1087 1102 } 1088 1103 1089 1104 bool resource_build_scaling_params(struct pipe_ctx *pipe_ctx) ··· 1008 1189 const struct dc_plane_state *plane_state = pipe_ctx->plane_state; 1009 1190 struct dc_crtc_timing *timing = &pipe_ctx->stream->timing; 1010 1191 bool res = false; 1011 - int store_h_border_left = shift_border_left_to_dst(pipe_ctx); 1012 1192 DC_LOGGER_INIT(pipe_ctx->stream->ctx->logger); 1013 - /* Important: scaling ratio calculation requires pixel format, 1014 - * lb depth calculation requires recout and taps require scaling ratios. 1015 - * Inits require viewport, taps, ratios and recout of split pipe 1016 - */ 1193 + 1017 1194 pipe_ctx->plane_res.scl_data.format = convert_pixel_format_to_dalsurface( 1018 1195 pipe_ctx->plane_state->format); 1019 1196 1020 - calculate_scaling_ratios(pipe_ctx); 1021 - 1022 - calculate_viewport(pipe_ctx); 1023 - 1024 - if (pipe_ctx->plane_res.scl_data.viewport.height < MIN_VIEWPORT_SIZE || 1025 - pipe_ctx->plane_res.scl_data.viewport.width < MIN_VIEWPORT_SIZE) { 1026 - if (store_h_border_left) { 1027 - restore_border_left_from_dst(pipe_ctx, 1028 - store_h_border_left); 1029 - } 1030 - return false; 1031 - } 1032 - 1033 - calculate_recout(pipe_ctx); 1034 - 1035 - /** 1036 - * Setting line buffer pixel depth to 24bpp yields banding 1037 - * on certain displays, such as the Sharp 4k 1197 + /* Timing borders are part of vactive that we are also supposed to skip in addition 1198 + * to any stream dst offset. Since dm logic assumes dst is in addressable 1199 + * space we need to add the the left and top borders to dst offsets temporarily. 1200 + * TODO: fix in DM, stream dst is supposed to be in vactive 1038 1201 */ 1039 - pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP; 1040 - pipe_ctx->plane_res.scl_data.lb_params.alpha_en = plane_state->per_pixel_alpha; 1202 + pipe_ctx->stream->dst.x += timing->h_border_left; 1203 + pipe_ctx->stream->dst.y += timing->v_border_top; 1041 1204 1042 - pipe_ctx->plane_res.scl_data.recout.x += timing->h_border_left; 1043 - pipe_ctx->plane_res.scl_data.recout.y += timing->v_border_top; 1044 - 1205 + /* Calculate H and V active size */ 1045 1206 pipe_ctx->plane_res.scl_data.h_active = timing->h_addressable + 1046 - store_h_border_left + timing->h_border_right; 1207 + timing->h_border_left + timing->h_border_right; 1047 1208 pipe_ctx->plane_res.scl_data.v_active = timing->v_addressable + 1048 1209 timing->v_border_top + timing->v_border_bottom; 1049 1210 if (pipe_ctx->next_odm_pipe || pipe_ctx->prev_odm_pipe) 1050 1211 pipe_ctx->plane_res.scl_data.h_active /= get_num_odm_splits(pipe_ctx) + 1; 1051 1212 1052 - /* Taps calculations */ 1213 + /* depends on h_active */ 1214 + calculate_recout(pipe_ctx); 1215 + /* depends on pixel format */ 1216 + calculate_scaling_ratios(pipe_ctx); 1217 + /* depends on scaling ratios and recout, does not calculate offset yet */ 1218 + calculate_viewport_size(pipe_ctx); 1219 + 1220 + /* 1221 + * LB calculations depend on vp size, h/v_active and scaling ratios 1222 + * Setting line buffer pixel depth to 24bpp yields banding 1223 + * on certain displays, such as the Sharp 4k. 36bpp is needed 1224 + * to support SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616 and 1225 + * SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616 with actual > 10 bpc 1226 + * precision on at least DCN display engines. 1227 + */ 1228 + pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_36BPP; 1229 + pipe_ctx->plane_res.scl_data.lb_params.alpha_en = plane_state->per_pixel_alpha; 1230 + 1053 1231 if (pipe_ctx->plane_res.xfm != NULL) 1054 1232 res = pipe_ctx->plane_res.xfm->funcs->transform_get_optimal_number_of_taps( 1055 1233 pipe_ctx->plane_res.xfm, &pipe_ctx->plane_res.scl_data, &plane_state->scaling_quality); ··· 1073 1257 &plane_state->scaling_quality); 1074 1258 } 1075 1259 1260 + /* 1261 + * Depends on recout, scaling ratios, h_active and taps 1262 + * May need to re-check lb size after this in some obscure scenario 1263 + */ 1076 1264 if (res) 1077 - /* May need to re-check lb size after this in some obscure scenario */ 1078 - calculate_inits_and_adj_vp(pipe_ctx); 1265 + calculate_inits_and_viewports(pipe_ctx); 1266 + 1267 + /* 1268 + * Handle side by side and top bottom 3d recout offsets after vp calculation 1269 + * since 3d is special and needs to calculate vp as if there is no recout offset 1270 + * This may break with rotation, good thing we aren't mixing hw rotation and 3d 1271 + */ 1272 + if (pipe_ctx->top_pipe && pipe_ctx->top_pipe->plane_state == plane_state) { 1273 + ASSERT(plane_state->rotation == ROTATION_ANGLE_0 || 1274 + (pipe_ctx->stream->view_format != VIEW_3D_FORMAT_TOP_AND_BOTTOM && 1275 + pipe_ctx->stream->view_format != VIEW_3D_FORMAT_SIDE_BY_SIDE)); 1276 + if (pipe_ctx->stream->view_format == VIEW_3D_FORMAT_TOP_AND_BOTTOM) 1277 + pipe_ctx->plane_res.scl_data.recout.y += pipe_ctx->plane_res.scl_data.recout.height; 1278 + else if (pipe_ctx->stream->view_format == VIEW_3D_FORMAT_SIDE_BY_SIDE) 1279 + pipe_ctx->plane_res.scl_data.recout.x += pipe_ctx->plane_res.scl_data.recout.width; 1280 + } 1281 + 1282 + if (pipe_ctx->plane_res.scl_data.viewport.height < MIN_VIEWPORT_SIZE || 1283 + pipe_ctx->plane_res.scl_data.viewport.width < MIN_VIEWPORT_SIZE) 1284 + res = false; 1079 1285 1080 1286 DC_LOG_SCALER("%s pipe %d:\nViewport: height:%d width:%d x:%d y:%d Recout: height:%d width:%d x:%d y:%d HACTIVE:%d VACTIVE:%d\n" 1081 1287 "src_rect: height:%d width:%d x:%d y:%d dst_rect: height:%d width:%d x:%d y:%d clip_rect: height:%d width:%d x:%d y:%d\n", ··· 1126 1288 plane_state->clip_rect.x, 1127 1289 plane_state->clip_rect.y); 1128 1290 1129 - if (store_h_border_left) 1130 - restore_border_left_from_dst(pipe_ctx, store_h_border_left); 1291 + pipe_ctx->stream->dst.x -= timing->h_border_left; 1292 + pipe_ctx->stream->dst.y -= timing->v_border_top; 1131 1293 1132 1294 return res; 1133 1295 } ··· 2884 3046 #endif 2885 3047 return 32; 2886 3048 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 3049 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 2887 3050 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 2888 3051 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 2889 3052 return 64;
+1 -3
drivers/gpu/drm/amd/display/dc/dc.h
··· 45 45 /* forward declaration */ 46 46 struct aux_payload; 47 47 48 - #define DC_VER "3.2.136" 48 + #define DC_VER "3.2.137" 49 49 50 50 #define MAX_SURFACES 3 51 51 #define MAX_PLANES 6 ··· 1068 1068 * New streams are enabled with blank stream; no memory read. 1069 1069 */ 1070 1070 bool dc_commit_state(struct dc *dc, struct dc_state *context); 1071 - 1072 - void dc_power_down_on_boot(struct dc *dc); 1073 1071 1074 1072 struct dc_state *dc_create_state(struct dc *dc); 1075 1073 struct dc_state *dc_copy_state(struct dc_state *src_ctx);
+9
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.c
··· 110 110 DC_ERROR("Error waiting for DMUB idle: status=%d\n", status); 111 111 } 112 112 113 + void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv, 114 + union dmub_inbox0_data_register data) 115 + { 116 + struct dmub_srv *dmub = dmub_srv->dmub; 117 + if (dmub->hw_funcs.send_inbox0_cmd) 118 + dmub->hw_funcs.send_inbox0_cmd(dmub, data); 119 + // TODO: Add wait command -- poll register for ACK 120 + } 121 + 113 122 bool dc_dmub_srv_cmd_with_reply_data(struct dc_dmub_srv *dc_dmub_srv, union dmub_rb_cmd *cmd) 114 123 { 115 124 struct dmub_srv *dmub;
+2
drivers/gpu/drm/amd/display/dc/dc_dmub_srv.h
··· 66 66 67 67 void dc_dmub_trace_event_control(struct dc *dc, bool enable); 68 68 69 + void dc_dmub_srv_send_inbox0_cmd(struct dc_dmub_srv *dmub_srv, union dmub_inbox0_data_register data); 70 + 69 71 #endif /* _DMUB_DC_SRV_H_ */
+2
drivers/gpu/drm/amd/display/dc/dc_hw_types.h
··· 182 182 SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS, 183 183 /*64 bpp */ 184 184 SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616, 185 + /*swapped*/ 186 + SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616, 185 187 /*float*/ 186 188 SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F, 187 189 /*swaped & float*/
+18 -1
drivers/gpu/drm/amd/display/dc/dc_link.h
··· 216 216 } 217 217 } 218 218 219 + static inline bool dc_get_edp_link_panel_inst(const struct dc *dc, 220 + const struct dc_link *link, 221 + unsigned int *inst_out) 222 + { 223 + struct dc_link *edp_links[MAX_NUM_EDP]; 224 + int edp_num; 225 + 226 + if (link->connector_signal != SIGNAL_TYPE_EDP) 227 + return false; 228 + get_edp_links(dc, edp_links, &edp_num); 229 + if ((edp_num > 1) && (link->link_index > edp_links[0]->link_index)) 230 + *inst_out = 1; 231 + else 232 + *inst_out = 0; 233 + return true; 234 + } 235 + 219 236 /* Set backlight level of an embedded panel (eDP, LVDS). 220 237 * backlight_pwm_u16_16 is unsigned 32 bit with 16 bit integer 221 238 * and 16 bit fractional, where 1.0 is max backlight value. ··· 333 316 334 317 enum link_training_result dc_link_dp_perform_link_training( 335 318 struct dc_link *link, 336 - const struct dc_link_settings *link_setting, 319 + const struct dc_link_settings *link_settings, 337 320 bool skip_video_pattern); 338 321 339 322 bool dc_link_dp_sync_lt_begin(struct dc_link *link);
+3
drivers/gpu/drm/amd/display/dc/dc_stream.h
··· 179 179 180 180 bool use_vsc_sdp_for_colorimetry; 181 181 bool ignore_msa_timing_param; 182 + 183 + bool freesync_on_desktop; 184 + 182 185 bool converter_disable_audio; 183 186 uint8_t qs_bit; 184 187 uint8_t qy_bit;
-5
drivers/gpu/drm/amd/display/dc/dc_types.h
··· 271 271 struct dc_panel_patch panel_patch; 272 272 }; 273 273 274 - struct view { 275 - uint32_t width; 276 - uint32_t height; 277 - }; 278 - 279 274 struct dc_mode_flags { 280 275 /* note: part of refresh rate flag*/ 281 276 uint32_t INTERLACE :1;
+2
drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.c
··· 566 566 * should problem swap endian*/ 567 567 format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010 || 568 568 format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS || 569 + format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616 || 569 570 format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) { 570 571 /* ABGR formats */ 571 572 red_xbar = 2; ··· 607 606 fallthrough; 608 607 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: /* shouldn't this get float too? */ 609 608 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 609 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 610 610 grph_depth = 3; 611 611 grph_format = 0; 612 612 break;
-2
drivers/gpu/drm/amd/display/dc/dce/dce_mem_input.h
··· 181 181 SFB(blk, GRPH_ENABLE, GRPH_ENABLE, mask_sh),\ 182 182 SFB(blk, GRPH_CONTROL, GRPH_DEPTH, mask_sh),\ 183 183 SFB(blk, GRPH_CONTROL, GRPH_FORMAT, mask_sh),\ 184 - SFB(blk, GRPH_CONTROL, GRPH_NUM_BANKS, mask_sh),\ 185 184 SFB(blk, GRPH_X_START, GRPH_X_START, mask_sh),\ 186 185 SFB(blk, GRPH_Y_START, GRPH_Y_START, mask_sh),\ 187 186 SFB(blk, GRPH_X_END, GRPH_X_END, mask_sh),\ ··· 206 207 SFB(blk, GRPH_ENABLE, GRPH_ENABLE, mask_sh),\ 207 208 SFB(blk, GRPH_CONTROL, GRPH_DEPTH, mask_sh),\ 208 209 SFB(blk, GRPH_CONTROL, GRPH_FORMAT, mask_sh),\ 209 - SFB(blk, GRPH_CONTROL, GRPH_NUM_BANKS, mask_sh),\ 210 210 SFB(blk, GRPH_X_START, GRPH_X_START, mask_sh),\ 211 211 SFB(blk, GRPH_Y_START, GRPH_Y_START, mask_sh),\ 212 212 SFB(blk, GRPH_X_END, GRPH_X_END, mask_sh),\
+6 -4
drivers/gpu/drm/amd/display/dc/dce/dce_transform.c
··· 794 794 enum dcp_out_trunc_round_mode trunc_mode; 795 795 bool spatial_dither_enable; 796 796 797 - ASSERT(depth < COLOR_DEPTH_121212); /* Invalid clamp bit depth */ 797 + ASSERT(depth <= COLOR_DEPTH_121212); /* Invalid clamp bit depth */ 798 798 799 799 spatial_dither_enable = bit_depth_params->flags.SPATIAL_DITHER_ENABLED; 800 800 /* Default to 12 bit truncation without rounding */ ··· 854 854 enum dcp_out_trunc_round_mode trunc_mode; 855 855 bool spatial_dither_enable; 856 856 857 - ASSERT(depth < COLOR_DEPTH_121212); /* Invalid clamp bit depth */ 857 + ASSERT(depth <= COLOR_DEPTH_121212); /* Invalid clamp bit depth */ 858 858 859 859 spatial_dither_enable = bit_depth_params->flags.SPATIAL_DITHER_ENABLED; 860 860 /* Default to 12 bit truncation without rounding */ ··· 1647 1647 xfm_dce->lb_pixel_depth_supported = 1648 1648 LB_PIXEL_DEPTH_18BPP | 1649 1649 LB_PIXEL_DEPTH_24BPP | 1650 - LB_PIXEL_DEPTH_30BPP; 1650 + LB_PIXEL_DEPTH_30BPP | 1651 + LB_PIXEL_DEPTH_36BPP; 1651 1652 1652 1653 xfm_dce->lb_bits_per_entry = LB_BITS_PER_ENTRY; 1653 1654 xfm_dce->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x6B0*/ ··· 1676 1675 xfm_dce->lb_pixel_depth_supported = 1677 1676 LB_PIXEL_DEPTH_18BPP | 1678 1677 LB_PIXEL_DEPTH_24BPP | 1679 - LB_PIXEL_DEPTH_30BPP; 1678 + LB_PIXEL_DEPTH_30BPP | 1679 + LB_PIXEL_DEPTH_36BPP; 1680 1680 1681 1681 xfm_dce->lb_bits_per_entry = LB_BITS_PER_ENTRY; 1682 1682 xfm_dce->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x6B0*/
+3 -7
drivers/gpu/drm/amd/display/dc/dce/dmub_abm.c
··· 172 172 173 173 static bool dmub_abm_init_config(struct abm *abm, 174 174 const char *src, 175 - unsigned int bytes) 175 + unsigned int bytes, 176 + unsigned int inst) 176 177 { 177 178 union dmub_rb_cmd cmd; 178 179 struct dc_context *dc = abm->ctx; 179 - uint32_t edp_id_count = dc->dc_edp_id_count; 180 - int i; 181 - uint8_t panel_mask = 0; 182 - 183 - for (i = 0; i < edp_id_count; i++) 184 - panel_mask |= 0x01 << i; 180 + uint8_t panel_mask = 0x01 << inst; 185 181 186 182 // TODO: Optimize by only reading back final 4 bytes 187 183 dmub_flush_buffer_mem(&dc->dmub_srv->dmub->scratch_mem_fb);
+8
drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.c
··· 52 52 dc_dmub_srv_wait_idle(dmub_srv); 53 53 } 54 54 55 + void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv, 56 + union dmub_inbox0_cmd_lock_hw hw_lock_cmd) 57 + { 58 + union dmub_inbox0_data_register data = { 0 }; 59 + data.inbox0_cmd_lock_hw = hw_lock_cmd; 60 + dc_dmub_srv_send_inbox0_cmd(dmub_srv, data); 61 + } 62 + 55 63 bool should_use_dmub_lock(struct dc_link *link) 56 64 { 57 65 return false;
+3
drivers/gpu/drm/amd/display/dc/dce/dmub_hw_lock_mgr.h
··· 34 34 union dmub_hw_lock_flags *hw_locks, 35 35 struct dmub_hw_lock_inst_flags *inst_flags); 36 36 37 + void dmub_hw_lock_mgr_inbox0_cmd(struct dc_dmub_srv *dmub_srv, 38 + union dmub_inbox0_cmd_lock_hw hw_lock_cmd); 39 + 37 40 bool should_use_dmub_lock(struct dc_link *link); 38 41 39 42 #endif /*_DMUB_HW_LOCK_MGR_H_ */
+4 -13
drivers/gpu/drm/amd/display/dc/dce/dmub_outbox.c
··· 27 27 #include "dmub/inc/dmub_cmd.h" 28 28 29 29 /** 30 - ***************************************************************************** 31 - * Function: dmub_enable_outbox_notification 32 - * 33 - * @brief 34 - * Sends inbox cmd to dmub to enable outbox1 messages with interrupt. 35 - * Dmub sends outbox1 message and triggers outbox1 interrupt. 36 - * 37 - * @param 38 - * [in] dc: dc structure 39 - * 40 - * @return 41 - * None 42 - ***************************************************************************** 30 + * dmub_enable_outbox_notification - Sends inbox cmd to dmub to enable outbox1 31 + * messages with interrupt. Dmub sends outbox1 32 + * message and triggers outbox1 interrupt. 33 + * @dc: dc structure 43 34 */ 44 35 void dmub_enable_outbox_notification(struct dc *dc) 45 36 {
+4
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
··· 63 63 64 64 #include "atomfirmware.h" 65 65 66 + #include "dce110_hw_sequencer.h" 67 + #include "dcn10/dcn10_hw_sequencer.h" 68 + 66 69 #define GAMMA_HW_POINTS_NUM 256 67 70 68 71 /* ··· 267 264 prescale_params->scale = 0x2008; 268 265 break; 269 266 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 267 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 270 268 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 271 269 prescale_params->scale = 0x2000; 272 270 break;
+1
drivers/gpu/drm/amd/display/dc/dce110/dce110_mem_input_v.c
··· 393 393 grph_format = 1; 394 394 break; 395 395 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 396 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 396 397 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 397 398 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 398 399 grph_depth = 3;
+2 -1
drivers/gpu/drm/amd/display/dc/dce110/dce110_transform_v.c
··· 708 708 xfm_dce->lb_pixel_depth_supported = 709 709 LB_PIXEL_DEPTH_18BPP | 710 710 LB_PIXEL_DEPTH_24BPP | 711 - LB_PIXEL_DEPTH_30BPP; 711 + LB_PIXEL_DEPTH_30BPP | 712 + LB_PIXEL_DEPTH_36BPP; 712 713 713 714 xfm_dce->prescaler_on = true; 714 715 xfm_dce->lb_bits_per_entry = LB_BITS_PER_ENTRY;
+6 -3
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp.c
··· 257 257 if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F || 258 258 input_format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) 259 259 *fmt = PIXEL_FORMAT_FLOAT; 260 - else if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616) 260 + else if (input_format == SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616 || 261 + input_format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616) 261 262 *fmt = PIXEL_FORMAT_FIXED16; 262 263 else 263 264 *fmt = PIXEL_FORMAT_FIXED; ··· 369 368 select = INPUT_CSC_SELECT_ICSC; 370 369 break; 371 370 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 372 - pixel_format = 22; 371 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 372 + pixel_format = 26; /* ARGB16161616_UNORM */ 373 373 break; 374 374 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 375 375 pixel_format = 24; ··· 568 566 dpp->lb_pixel_depth_supported = 569 567 LB_PIXEL_DEPTH_18BPP | 570 568 LB_PIXEL_DEPTH_24BPP | 571 - LB_PIXEL_DEPTH_30BPP; 569 + LB_PIXEL_DEPTH_30BPP | 570 + LB_PIXEL_DEPTH_36BPP; 572 571 573 572 dpp->lb_bits_per_entry = LB_BITS_PER_ENTRY; 574 573 dpp->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x1404*/
+8 -4
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_dpp_dscl.c
··· 631 631 SCL_V_INIT_INT, init_int); 632 632 633 633 if (REG(SCL_VERT_FILTER_INIT_BOT)) { 634 - init_frac = dc_fixpt_u0d19(data->inits.v_bot) << 5; 635 - init_int = dc_fixpt_floor(data->inits.v_bot); 634 + struct fixed31_32 bot = dc_fixpt_add(data->inits.v, data->ratios.vert); 635 + 636 + init_frac = dc_fixpt_u0d19(bot) << 5; 637 + init_int = dc_fixpt_floor(bot); 636 638 REG_SET_2(SCL_VERT_FILTER_INIT_BOT, 0, 637 639 SCL_V_INIT_FRAC_BOT, init_frac, 638 640 SCL_V_INIT_INT_BOT, init_int); ··· 647 645 SCL_V_INIT_INT_C, init_int); 648 646 649 647 if (REG(SCL_VERT_FILTER_INIT_BOT_C)) { 650 - init_frac = dc_fixpt_u0d19(data->inits.v_c_bot) << 5; 651 - init_int = dc_fixpt_floor(data->inits.v_c_bot); 648 + struct fixed31_32 bot = dc_fixpt_add(data->inits.v_c, data->ratios.vert_c); 649 + 650 + init_frac = dc_fixpt_u0d19(bot) << 5; 651 + init_int = dc_fixpt_floor(bot); 652 652 REG_SET_2(SCL_VERT_FILTER_INIT_BOT_C, 0, 653 653 SCL_V_INIT_FRAC_BOT_C, init_frac, 654 654 SCL_V_INIT_INT_BOT_C, init_int);
+1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubbub.c
··· 785 785 *bytes_per_element = 4; 786 786 return true; 787 787 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 788 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 788 789 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 789 790 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 790 791 *bytes_per_element = 8;
+3 -1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hubp.c
··· 245 245 if (format == SURFACE_PIXEL_FORMAT_GRPH_ABGR8888 246 246 || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010 247 247 || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS 248 + || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616 248 249 || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) { 249 250 red_bar = 2; 250 251 blue_bar = 3; ··· 278 277 SURFACE_PIXEL_FORMAT, 10); 279 278 break; 280 279 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 280 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: /*we use crossbar already*/ 281 281 REG_UPDATE(DCSURF_SURFACE_CONFIG, 282 - SURFACE_PIXEL_FORMAT, 22); 282 + SURFACE_PIXEL_FORMAT, 26); /* ARGB16161616_UNORM */ 283 283 break; 284 284 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 285 285 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:/*we use crossbar already*/
+14 -20
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
··· 2502 2502 dpp->funcs->dpp_program_bias_and_scale(dpp, &bns_params); 2503 2503 } 2504 2504 2505 - void dcn10_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx, struct tg_color *color, int mpcc_id) 2506 - { 2507 - struct dce_hwseq *hws = dc->hwseq; 2508 - struct mpc *mpc = dc->res_pool->mpc; 2509 - 2510 - if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) 2511 - hws->funcs.get_hdr_visual_confirm_color(pipe_ctx, color); 2512 - else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) 2513 - hws->funcs.get_surface_visual_confirm_color(pipe_ctx, color); 2514 - else 2515 - color_space_to_black_color( 2516 - dc, pipe_ctx->stream->output_color_space, color); 2517 - 2518 - if (mpc->funcs->set_bg_color) 2519 - mpc->funcs->set_bg_color(mpc, color, mpcc_id); 2520 - } 2521 - 2522 2505 void dcn10_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) 2523 2506 { 2507 + struct dce_hwseq *hws = dc->hwseq; 2524 2508 struct hubp *hubp = pipe_ctx->plane_res.hubp; 2525 2509 struct mpcc_blnd_cfg blnd_cfg = {{0}}; 2526 2510 bool per_pixel_alpha = pipe_ctx->plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe; ··· 2512 2528 struct mpcc *new_mpcc; 2513 2529 struct mpc *mpc = dc->res_pool->mpc; 2514 2530 struct mpc_tree *mpc_tree_params = &(pipe_ctx->stream_res.opp->mpc_tree_params); 2531 + 2532 + if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) { 2533 + hws->funcs.get_hdr_visual_confirm_color( 2534 + pipe_ctx, &blnd_cfg.black_color); 2535 + } else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) { 2536 + hws->funcs.get_surface_visual_confirm_color( 2537 + pipe_ctx, &blnd_cfg.black_color); 2538 + } else { 2539 + color_space_to_black_color( 2540 + dc, pipe_ctx->stream->output_color_space, 2541 + &blnd_cfg.black_color); 2542 + } 2515 2543 2516 2544 if (per_pixel_alpha) 2517 2545 blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA; ··· 2555 2559 * which causes a pstate hang for yet unknown reason. 2556 2560 */ 2557 2561 mpcc_id = hubp->inst; 2558 - 2559 - dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); 2560 2562 2561 2563 /* If there is no full update, don't need to touch MPC tree*/ 2562 2564 if (!pipe_ctx->plane_state->update_flags.bits.full_update) { ··· 2593 2599 pipe_ctx->plane_state->per_pixel_alpha && pipe_ctx->bottom_pipe; 2594 2600 2595 2601 pipe_ctx->plane_res.scl_data.lb_params.alpha_en = per_pixel_alpha; 2596 - pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_30BPP; 2602 + pipe_ctx->plane_res.scl_data.lb_params.depth = LB_PIXEL_DEPTH_36BPP; 2597 2603 /* scaler configuration */ 2598 2604 pipe_ctx->plane_res.dpp->funcs->dpp_set_scaler( 2599 2605 pipe_ctx->plane_res.dpp, &pipe_ctx->plane_res.scl_data);
-6
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.h
··· 206 206 207 207 void dcn10_get_dcc_en_bits(struct dc *dc, int *dcc_en_bits); 208 208 209 - void dcn10_update_visual_confirm_color( 210 - struct dc *dc, 211 - struct pipe_ctx *pipe_ctx, 212 - struct tg_color *color, 213 - int mpcc_id); 214 - 215 209 #endif /* __DC_HWSS_DCN10_H__ */
-1
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_init.c
··· 82 82 .set_abm_immediate_disable = dce110_set_abm_immediate_disable, 83 83 .set_pipe = dce110_set_pipe, 84 84 .get_dcc_en_bits = dcn10_get_dcc_en_bits, 85 - .update_visual_confirm_color = dcn10_update_visual_confirm_color, 86 85 }; 87 86 88 87 static const struct hwseq_private_funcs dcn10_private_funcs = {
-5
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_mpc.c
··· 64 64 MPCC_BG_G_Y, bg_g_y); 65 65 REG_SET(MPCC_BG_B_CB[bottommost_mpcc->mpcc_id], 0, 66 66 MPCC_BG_B_CB, bg_b_cb); 67 - 68 - bottommost_mpcc->blnd_cfg.black_color = *bg_color; 69 67 } 70 68 71 69 static void mpc1_update_blending( ··· 245 247 MPCC_MODE, MPCC_BLEND_MODE_TOP_BOT_BLENDING); 246 248 } 247 249 } 248 - 249 - mpc->funcs->set_bg_color(mpc, &blnd_cfg->black_color, mpcc_id); 250 250 251 251 /* update the blending configuration */ 252 252 mpc->funcs->update_blending(mpc, blnd_cfg, mpcc_id); ··· 495 499 .set_output_csc = NULL, 496 500 .set_output_gamma = NULL, 497 501 .get_mpc_out_mux = mpc1_get_mpc_out_mux, 498 - .set_bg_color = mpc1_set_bg_color, 499 502 }; 500 503 501 504 void dcn10_mpc_construct(struct dcn10_mpc *mpc10,
+4 -2
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_dpp.c
··· 166 166 select = DCN2_ICSC_SELECT_ICSC_A; 167 167 break; 168 168 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 169 - pixel_format = 22; 169 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 170 + pixel_format = 26; /* ARGB16161616_UNORM */ 170 171 break; 171 172 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 172 173 pixel_format = 24; ··· 432 431 dpp->lb_pixel_depth_supported = 433 432 LB_PIXEL_DEPTH_18BPP | 434 433 LB_PIXEL_DEPTH_24BPP | 435 - LB_PIXEL_DEPTH_30BPP; 434 + LB_PIXEL_DEPTH_30BPP | 435 + LB_PIXEL_DEPTH_36BPP; 436 436 437 437 dpp->lb_bits_per_entry = LB_BITS_PER_ENTRY; 438 438 dpp->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x1404*/
+1
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubbub.c
··· 158 158 *bytes_per_element = 4; 159 159 return true; 160 160 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 161 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 161 162 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 162 163 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 163 164 *bytes_per_element = 8;
+3 -1
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hubp.c
··· 431 431 if (format == SURFACE_PIXEL_FORMAT_GRPH_ABGR8888 432 432 || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010 433 433 || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR2101010_XR_BIAS 434 + || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616 434 435 || format == SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F) { 435 436 red_bar = 2; 436 437 blue_bar = 3; ··· 464 463 SURFACE_PIXEL_FORMAT, 10); 465 464 break; 466 465 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 466 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: /*we use crossbar already*/ 467 467 REG_UPDATE(DCSURF_SURFACE_CONFIG, 468 - SURFACE_PIXEL_FORMAT, 22); 468 + SURFACE_PIXEL_FORMAT, 26); /* ARGB16161616_UNORM */ 469 469 break; 470 470 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 471 471 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F:/*we use crossbar already*/
+11 -20
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c
··· 1473 1473 plane_state->update_flags.bits.per_pixel_alpha_change || 1474 1474 pipe_ctx->stream->update_flags.bits.scaling) { 1475 1475 pipe_ctx->plane_res.scl_data.lb_params.alpha_en = pipe_ctx->plane_state->per_pixel_alpha; 1476 - ASSERT(pipe_ctx->plane_res.scl_data.lb_params.depth == LB_PIXEL_DEPTH_30BPP); 1476 + ASSERT(pipe_ctx->plane_res.scl_data.lb_params.depth == LB_PIXEL_DEPTH_36BPP); 1477 1477 /* scaler configuration */ 1478 1478 pipe_ctx->plane_res.dpp->funcs->dpp_set_scaler( 1479 1479 pipe_ctx->plane_res.dpp, &pipe_ctx->plane_res.scl_data); ··· 2267 2267 *color = pipe_colors[top_pipe->pipe_idx]; 2268 2268 } 2269 2269 2270 - void dcn20_update_visual_confirm_color(struct dc *dc, struct pipe_ctx *pipe_ctx, struct tg_color *color, int mpcc_id) 2271 - { 2272 - struct dce_hwseq *hws = dc->hwseq; 2273 - struct mpc *mpc = dc->res_pool->mpc; 2274 - 2275 - /* input to MPCC is always RGB, by default leave black_color at 0 */ 2276 - if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) 2277 - hws->funcs.get_hdr_visual_confirm_color(pipe_ctx, color); 2278 - else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) 2279 - hws->funcs.get_surface_visual_confirm_color(pipe_ctx, color); 2280 - else if (dc->debug.visual_confirm == VISUAL_CONFIRM_MPCTREE) 2281 - dcn20_get_mpctree_visual_confirm_color(pipe_ctx, color); 2282 - 2283 - if (mpc->funcs->set_bg_color) 2284 - mpc->funcs->set_bg_color(mpc, color, mpcc_id); 2285 - } 2286 - 2287 2270 void dcn20_update_mpcc(struct dc *dc, struct pipe_ctx *pipe_ctx) 2288 2271 { 2272 + struct dce_hwseq *hws = dc->hwseq; 2289 2273 struct hubp *hubp = pipe_ctx->plane_res.hubp; 2290 2274 struct mpcc_blnd_cfg blnd_cfg = { {0} }; 2291 2275 bool per_pixel_alpha = pipe_ctx->plane_state->per_pixel_alpha; ··· 2277 2293 struct mpcc *new_mpcc; 2278 2294 struct mpc *mpc = dc->res_pool->mpc; 2279 2295 struct mpc_tree *mpc_tree_params = &(pipe_ctx->stream_res.opp->mpc_tree_params); 2296 + 2297 + // input to MPCC is always RGB, by default leave black_color at 0 2298 + if (dc->debug.visual_confirm == VISUAL_CONFIRM_HDR) { 2299 + hws->funcs.get_hdr_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color); 2300 + } else if (dc->debug.visual_confirm == VISUAL_CONFIRM_SURFACE) { 2301 + hws->funcs.get_surface_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color); 2302 + } else if (dc->debug.visual_confirm == VISUAL_CONFIRM_MPCTREE) { 2303 + dcn20_get_mpctree_visual_confirm_color(pipe_ctx, &blnd_cfg.black_color); 2304 + } 2280 2305 2281 2306 if (per_pixel_alpha) 2282 2307 blnd_cfg.alpha_mode = MPCC_ALPHA_BLEND_MODE_PER_PIXEL_ALPHA; ··· 2319 2326 * which causes a pstate hang for yet unknown reason. 2320 2327 */ 2321 2328 mpcc_id = hubp->inst; 2322 - 2323 - dc->hwss.update_visual_confirm_color(dc, pipe_ctx, &blnd_cfg.black_color, mpcc_id); 2324 2329 2325 2330 /* If there is no full update, don't need to touch MPC tree*/ 2326 2331 if (!pipe_ctx->plane_state->update_flags.bits.full_update &&
-5
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.h
··· 146 146 const struct tg_color *solid_color, 147 147 int width, int height, int offset); 148 148 149 - void dcn20_update_visual_confirm_color(struct dc *dc, 150 - struct pipe_ctx *pipe_ctx, 151 - struct tg_color *color, 152 - int mpcc_id); 153 - 154 149 #endif /* __DC_HWSS_DCN20_H__ */ 155 150
-1
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_init.c
··· 96 96 #endif 97 97 .set_disp_pattern_generator = dcn20_set_disp_pattern_generator, 98 98 .get_dcc_en_bits = dcn10_get_dcc_en_bits, 99 - .update_visual_confirm_color = dcn20_update_visual_confirm_color, 100 99 }; 101 100 102 101 static const struct hwseq_private_funcs dcn20_private_funcs = {
+1 -1
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_mpc.c
··· 67 67 REG_SET(MPCC_BOT_GAIN_INSIDE[mpcc_id], 0, MPCC_BOT_GAIN_INSIDE, blnd_cfg->bottom_inside_gain); 68 68 REG_SET(MPCC_BOT_GAIN_OUTSIDE[mpcc_id], 0, MPCC_BOT_GAIN_OUTSIDE, blnd_cfg->bottom_outside_gain); 69 69 70 + mpc1_set_bg_color(mpc, &blnd_cfg->black_color, mpcc_id); 70 71 mpcc->blnd_cfg = *blnd_cfg; 71 72 } 72 73 ··· 557 556 .set_output_gamma = mpc2_set_output_gamma, 558 557 .power_on_mpc_mem_pwr = mpc20_power_on_ogam_lut, 559 558 .get_mpc_out_mux = mpc1_get_mpc_out_mux, 560 - .set_bg_color = mpc1_set_bg_color, 561 559 }; 562 560 563 561 void dcn20_mpc_construct(struct dcn20_mpc *mpc20,
+10 -7
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_resource.c
··· 2289 2289 2290 2290 pipes[pipe_cnt].pipe.src.source_scan = pln->rotation == ROTATION_ANGLE_90 2291 2291 || pln->rotation == ROTATION_ANGLE_270 ? dm_vert : dm_horz; 2292 - pipes[pipe_cnt].pipe.src.viewport_y_y = scl->viewport_unadjusted.y; 2293 - pipes[pipe_cnt].pipe.src.viewport_y_c = scl->viewport_c_unadjusted.y; 2294 - pipes[pipe_cnt].pipe.src.viewport_width = scl->viewport_unadjusted.width; 2295 - pipes[pipe_cnt].pipe.src.viewport_width_c = scl->viewport_c_unadjusted.width; 2296 - pipes[pipe_cnt].pipe.src.viewport_height = scl->viewport_unadjusted.height; 2297 - pipes[pipe_cnt].pipe.src.viewport_height_c = scl->viewport_c_unadjusted.height; 2292 + pipes[pipe_cnt].pipe.src.viewport_y_y = scl->viewport.y; 2293 + pipes[pipe_cnt].pipe.src.viewport_y_c = scl->viewport_c.y; 2294 + pipes[pipe_cnt].pipe.src.viewport_width = scl->viewport.width; 2295 + pipes[pipe_cnt].pipe.src.viewport_width_c = scl->viewport_c.width; 2296 + pipes[pipe_cnt].pipe.src.viewport_height = scl->viewport.height; 2297 + pipes[pipe_cnt].pipe.src.viewport_height_c = scl->viewport_c.height; 2298 + pipes[pipe_cnt].pipe.src.viewport_width_max = pln->src_rect.width; 2299 + pipes[pipe_cnt].pipe.src.viewport_height_max = pln->src_rect.height; 2298 2300 pipes[pipe_cnt].pipe.src.surface_width_y = pln->plane_size.surface_size.width; 2299 2301 pipes[pipe_cnt].pipe.src.surface_height_y = pln->plane_size.surface_size.height; 2300 2302 pipes[pipe_cnt].pipe.src.surface_width_c = pln->plane_size.chroma_size.width; ··· 2365 2363 pipes[pipe_cnt].pipe.src.source_format = dm_420_10; 2366 2364 break; 2367 2365 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 2366 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 2368 2367 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 2369 2368 case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616F: 2370 2369 pipes[pipe_cnt].pipe.src.source_format = dm_444_64; ··· 3239 3236 voltage_supported = dcn20_validate_bandwidth_internal(dc, context, false); 3240 3237 dummy_pstate_supported = context->bw_ctx.bw.dcn.clk.p_state_change_support; 3241 3238 3242 - if (voltage_supported && dummy_pstate_supported) { 3239 + if (voltage_supported && (dummy_pstate_supported || !(context->stream_count))) { 3243 3240 context->bw_ctx.bw.dcn.clk.p_state_change_support = false; 3244 3241 goto restore_dml_state; 3245 3242 }
-1
drivers/gpu/drm/amd/display/dc/dcn21/dcn21_init.c
··· 100 100 .is_abm_supported = dcn21_is_abm_supported, 101 101 .set_disp_pattern_generator = dcn20_set_disp_pattern_generator, 102 102 .get_dcc_en_bits = dcn10_get_dcc_en_bits, 103 - .update_visual_confirm_color = dcn20_update_visual_confirm_color, 104 103 }; 105 104 106 105 static const struct hwseq_private_funcs dcn21_private_funcs = {
+4 -2
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_dpp.c
··· 245 245 select = INPUT_CSC_SELECT_ICSC; 246 246 break; 247 247 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616: 248 - pixel_format = 22; 248 + case SURFACE_PIXEL_FORMAT_GRPH_ABGR16161616: 249 + pixel_format = 26; /* ARGB16161616_UNORM */ 249 250 break; 250 251 case SURFACE_PIXEL_FORMAT_GRPH_ARGB16161616F: 251 252 pixel_format = 24; ··· 1443 1442 dpp->lb_pixel_depth_supported = 1444 1443 LB_PIXEL_DEPTH_18BPP | 1445 1444 LB_PIXEL_DEPTH_24BPP | 1446 - LB_PIXEL_DEPTH_30BPP; 1445 + LB_PIXEL_DEPTH_30BPP | 1446 + LB_PIXEL_DEPTH_36BPP; 1447 1447 1448 1448 dpp->lb_bits_per_entry = LB_BITS_PER_ENTRY; 1449 1449 dpp->lb_memory_size = LB_TOTAL_NUMBER_OF_ENTRIES; /*0x1404*/
-1
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_init.c
··· 99 99 .set_pipe = dcn21_set_pipe, 100 100 .set_disp_pattern_generator = dcn30_set_disp_pattern_generator, 101 101 .get_dcc_en_bits = dcn10_get_dcc_en_bits, 102 - .update_visual_confirm_color = dcn20_update_visual_confirm_color, 103 102 }; 104 103 105 104 static const struct hwseq_private_funcs dcn30_private_funcs = {
+1 -1
drivers/gpu/drm/amd/display/dc/dcn30/dcn30_mpc.c
··· 1431 1431 .release_rmu = mpcc3_release_rmu, 1432 1432 .power_on_mpc_mem_pwr = mpc3_power_on_ogam_lut, 1433 1433 .get_mpc_out_mux = mpc1_get_mpc_out_mux, 1434 - .set_bg_color = mpc1_set_bg_color, 1434 + 1435 1435 }; 1436 1436 1437 1437 void dcn30_mpc_construct(struct dcn30_mpc *mpc30,
-1
drivers/gpu/drm/amd/display/dc/dcn301/dcn301_init.c
··· 101 101 .get_dcc_en_bits = dcn10_get_dcc_en_bits, 102 102 .optimize_pwr_state = dcn21_optimize_pwr_state, 103 103 .exit_optimized_pwr_state = dcn21_exit_optimized_pwr_state, 104 - .update_visual_confirm_color = dcn20_update_visual_confirm_color, 105 104 }; 106 105 107 106 static const struct hwseq_private_funcs dcn301_private_funcs = {
+4
drivers/gpu/drm/amd/display/dc/dm_pp_smu.h
··· 245 245 #define PP_SMU_NUM_DCFCLK_DPM_LEVELS 8 246 246 #define PP_SMU_NUM_FCLK_DPM_LEVELS 4 247 247 #define PP_SMU_NUM_MEMCLK_DPM_LEVELS 4 248 + #define PP_SMU_NUM_DCLK_DPM_LEVELS 8 249 + #define PP_SMU_NUM_VCLK_DPM_LEVELS 8 248 250 249 251 struct dpm_clock { 250 252 uint32_t Freq; // In MHz ··· 260 258 struct dpm_clock SocClocks[PP_SMU_NUM_SOCCLK_DPM_LEVELS]; 261 259 struct dpm_clock FClocks[PP_SMU_NUM_FCLK_DPM_LEVELS]; 262 260 struct dpm_clock MemClocks[PP_SMU_NUM_MEMCLK_DPM_LEVELS]; 261 + struct dpm_clock VClocks[PP_SMU_NUM_VCLK_DPM_LEVELS]; 262 + struct dpm_clock DClocks[PP_SMU_NUM_DCLK_DPM_LEVELS]; 263 263 }; 264 264 265 265
+2
drivers/gpu/drm/amd/display/dc/dml/display_mode_structs.h
··· 253 253 unsigned int viewport_y_c; 254 254 unsigned int viewport_width_c; 255 255 unsigned int viewport_height_c; 256 + unsigned int viewport_width_max; 257 + unsigned int viewport_height_max; 256 258 unsigned int data_pitch; 257 259 unsigned int data_pitch_c; 258 260 unsigned int meta_pitch;
+13
drivers/gpu/drm/amd/display/dc/dml/display_mode_vba.c
··· 630 630 } 631 631 } 632 632 } 633 + if (src->viewport_width_max) { 634 + int hdiv_c = src->source_format >= dm_420_8 && src->source_format <= dm_422_10 ? 2 : 1; 635 + int vdiv_c = src->source_format >= dm_420_8 && src->source_format <= dm_420_12 ? 2 : 1; 636 + 637 + if (mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] > src->viewport_width_max) 638 + mode_lib->vba.ViewportWidth[mode_lib->vba.NumberOfActivePlanes] = src->viewport_width_max; 639 + if (mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] > src->viewport_height_max) 640 + mode_lib->vba.ViewportHeight[mode_lib->vba.NumberOfActivePlanes] = src->viewport_height_max; 641 + if (mode_lib->vba.ViewportWidthChroma[mode_lib->vba.NumberOfActivePlanes] > src->viewport_width_max / hdiv_c) 642 + mode_lib->vba.ViewportWidthChroma[mode_lib->vba.NumberOfActivePlanes] = src->viewport_width_max / hdiv_c; 643 + if (mode_lib->vba.ViewportHeightChroma[mode_lib->vba.NumberOfActivePlanes] > src->viewport_height_max / vdiv_c) 644 + mode_lib->vba.ViewportHeightChroma[mode_lib->vba.NumberOfActivePlanes] = src->viewport_height_max / vdiv_c; 645 + } 633 646 634 647 if (pipes[k].pipe.src.immediate_flip) { 635 648 mode_lib->vba.ImmediateFlipSupport = true;
+6 -6
drivers/gpu/drm/amd/display/dc/gpio/gpio_service.c
··· 53 53 */ 54 54 55 55 struct gpio_service *dal_gpio_service_create( 56 - enum dce_version dce_version_major, 57 - enum dce_version dce_version_minor, 56 + enum dce_version dce_version, 57 + enum dce_environment dce_environment, 58 58 struct dc_context *ctx) 59 59 { 60 60 struct gpio_service *service; ··· 67 67 return NULL; 68 68 } 69 69 70 - if (!dal_hw_translate_init(&service->translate, dce_version_major, 71 - dce_version_minor)) { 70 + if (!dal_hw_translate_init(&service->translate, dce_version, 71 + dce_environment)) { 72 72 BREAK_TO_DEBUGGER(); 73 73 goto failure_1; 74 74 } 75 75 76 - if (!dal_hw_factory_init(&service->factory, dce_version_major, 77 - dce_version_minor)) { 76 + if (!dal_hw_factory_init(&service->factory, dce_version, 77 + dce_environment)) { 78 78 BREAK_TO_DEBUGGER(); 79 79 goto failure_1; 80 80 }
+2 -1
drivers/gpu/drm/amd/display/dc/inc/hw/abm.h
··· 52 52 unsigned int (*get_target_backlight)(struct abm *abm); 53 53 bool (*init_abm_config)(struct abm *abm, 54 54 const char *src, 55 - unsigned int bytes); 55 + unsigned int bytes, 56 + unsigned int inst); 56 57 }; 57 58 58 59 #endif
-3
drivers/gpu/drm/amd/display/dc/inc/hw/mpc.h
··· 363 363 struct mpc *mpc, 364 364 int opp_id); 365 365 366 - void (*set_bg_color)(struct mpc *mpc, 367 - struct tg_color *bg_color, 368 - int mpcc_id); 369 366 }; 370 367 371 368 #endif
-4
drivers/gpu/drm/amd/display/dc/inc/hw/transform.h
··· 162 162 struct fixed31_32 h; 163 163 struct fixed31_32 h_c; 164 164 struct fixed31_32 v; 165 - struct fixed31_32 v_bot; 166 165 struct fixed31_32 v_c; 167 - struct fixed31_32 v_c_bot; 168 166 }; 169 167 170 168 struct scaler_data { ··· 171 173 struct scaling_taps taps; 172 174 struct rect viewport; 173 175 struct rect viewport_c; 174 - struct rect viewport_unadjusted; 175 - struct rect viewport_c_unadjusted; 176 176 struct rect recout; 177 177 struct scaling_ratios ratios; 178 178 struct scl_inits inits;
-4
drivers/gpu/drm/amd/display/dc/inc/hw_sequencer.h
··· 235 235 enum dc_color_depth color_depth, 236 236 const struct tg_color *solid_color, 237 237 int width, int height, int offset); 238 - void (*update_visual_confirm_color)(struct dc *dc, 239 - struct pipe_ctx *pipe_ctx, 240 - struct tg_color *color, 241 - int mpcc_id); 242 238 }; 243 239 244 240 void color_space_to_black_color(
+1
drivers/gpu/drm/amd/display/dmub/dmub_srv.h
··· 324 324 325 325 uint32_t (*get_gpint_response)(struct dmub_srv *dmub); 326 326 327 + void (*send_inbox0_cmd)(struct dmub_srv *dmub, union dmub_inbox0_data_register data); 327 328 uint32_t (*get_current_time)(struct dmub_srv *dmub); 328 329 }; 329 330
+6 -13
drivers/gpu/drm/amd/display/dmub/src/dmub_srv_stat.c
··· 35 35 */ 36 36 37 37 /** 38 - ***************************************************************************** 39 - * Function: dmub_srv_stat_get_notification 38 + * dmub_srv_stat_get_notification - Retrieves a dmub outbox notification, set up dmub notification 39 + * structure with message information. Also a pending bit if queue 40 + * is having more notifications 41 + * @dmub: dmub srv structure 42 + * @notify: dmub notification structure to be filled up 40 43 * 41 - * @brief 42 - * Retrieves a dmub outbox notification, set up dmub notification 43 - * structure with message information. Also a pending bit if queue 44 - * is having more notifications 45 - * 46 - * @param [in] dmub: dmub srv structure 47 - * @param [out] pnotify: dmub notification structure to be filled up 48 - * 49 - * @return 50 - * dmub_status 51 - ***************************************************************************** 44 + * Returns: dmub_status 52 45 */ 53 46 enum dmub_status dmub_srv_stat_get_notification(struct dmub_srv *dmub, 54 47 struct dmub_notification *notify)
+2 -2
drivers/gpu/drm/amd/display/include/gpio_service_interface.h
··· 42 42 struct gpio **ptr); 43 43 44 44 struct gpio_service *dal_gpio_service_create( 45 - enum dce_version dce_version_major, 46 - enum dce_version dce_version_minor, 45 + enum dce_version dce_version, 46 + enum dce_environment dce_environment, 47 47 struct dc_context *ctx); 48 48 49 49 struct gpio *dal_gpio_service_create_irq(
+19 -10
drivers/gpu/drm/amd/display/modules/freesync/freesync.c
··· 516 516 } 517 517 518 518 static void build_vrr_infopacket_data_v1(const struct mod_vrr_params *vrr, 519 - struct dc_info_packet *infopacket) 519 + struct dc_info_packet *infopacket, 520 + bool freesync_on_desktop) 520 521 { 521 522 /* PB1 = 0x1A (24bit AMD IEEE OUI (0x00001A) - Byte 0) */ 522 523 infopacket->sb[1] = 0x1A; ··· 543 542 vrr->state != VRR_STATE_UNSUPPORTED) 544 543 infopacket->sb[6] |= 0x02; 545 544 546 - /* PB6 = [Bit 2 = FreeSync Active] */ 547 - if (vrr->state != VRR_STATE_DISABLED && 545 + if (freesync_on_desktop) { 546 + /* PB6 = [Bit 2 = FreeSync Active] */ 547 + if (vrr->state != VRR_STATE_DISABLED && 548 548 vrr->state != VRR_STATE_UNSUPPORTED) 549 - infopacket->sb[6] |= 0x04; 549 + infopacket->sb[6] |= 0x04; 550 + } else { 551 + if (vrr->state == VRR_STATE_ACTIVE_VARIABLE || 552 + vrr->state == VRR_STATE_ACTIVE_FIXED) 553 + infopacket->sb[6] |= 0x04; 554 + } 550 555 551 556 // For v1 & 2 infoframes program nominal if non-fs mode, otherwise full range 552 557 /* PB7 = FreeSync Minimum refresh rate (Hz) */ ··· 831 824 832 825 static void build_vrr_infopacket_v1(enum signal_type signal, 833 826 const struct mod_vrr_params *vrr, 834 - struct dc_info_packet *infopacket) 827 + struct dc_info_packet *infopacket, 828 + bool freesync_on_desktop) 835 829 { 836 830 /* SPD info packet for FreeSync */ 837 831 unsigned int payload_size = 0; 838 832 839 833 build_vrr_infopacket_header_v1(signal, infopacket, &payload_size); 840 - build_vrr_infopacket_data_v1(vrr, infopacket); 834 + build_vrr_infopacket_data_v1(vrr, infopacket, freesync_on_desktop); 841 835 build_vrr_infopacket_checksum(&payload_size, infopacket); 842 836 843 837 infopacket->valid = true; ··· 847 839 static void build_vrr_infopacket_v2(enum signal_type signal, 848 840 const struct mod_vrr_params *vrr, 849 841 enum color_transfer_func app_tf, 850 - struct dc_info_packet *infopacket) 842 + struct dc_info_packet *infopacket, 843 + bool freesync_on_desktop) 851 844 { 852 845 unsigned int payload_size = 0; 853 846 854 847 build_vrr_infopacket_header_v2(signal, infopacket, &payload_size); 855 - build_vrr_infopacket_data_v1(vrr, infopacket); 848 + build_vrr_infopacket_data_v1(vrr, infopacket, freesync_on_desktop); 856 849 857 850 build_vrr_infopacket_fs2_data(app_tf, infopacket); 858 851 ··· 962 953 #endif 963 954 break; 964 955 case PACKET_TYPE_FS_V2: 965 - build_vrr_infopacket_v2(stream->signal, vrr, app_tf, infopacket); 956 + build_vrr_infopacket_v2(stream->signal, vrr, app_tf, infopacket, stream->freesync_on_desktop); 966 957 break; 967 958 case PACKET_TYPE_VRR: 968 959 case PACKET_TYPE_FS_V1: 969 960 default: 970 - build_vrr_infopacket_v1(stream->signal, vrr, infopacket); 961 + build_vrr_infopacket_v1(stream->signal, vrr, infopacket, stream->freesync_on_desktop); 971 962 } 972 963 973 964 if (true == pack_sdp_v1_3 &&
+3 -1
drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c
··· 29 29 { 30 30 uint64_t n = 0; 31 31 uint8_t count = 0; 32 + u8 bksv[sizeof(n)] = { }; 32 33 33 - memcpy(&n, hdcp->auth.msg.hdcp1.bksv, sizeof(uint64_t)); 34 + memcpy(bksv, hdcp->auth.msg.hdcp1.bksv, sizeof(hdcp->auth.msg.hdcp1.bksv)); 35 + n = *(uint64_t *)bksv; 34 36 35 37 while (n) { 36 38 count++;
-13
drivers/gpu/drm/amd/display/modules/hdcp/hdcp_psp.c
··· 371 371 return status; 372 372 } 373 373 374 - enum mod_hdcp_status mod_hdcp_hdcp1_get_link_encryption_status(struct mod_hdcp *hdcp, 375 - enum mod_hdcp_encryption_status *encryption_status) 376 - { 377 - *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP_OFF; 378 - 379 - if (mod_hdcp_hdcp1_link_maintenance(hdcp) != MOD_HDCP_STATUS_SUCCESS) 380 - return MOD_HDCP_STATUS_FAILURE; 381 - 382 - *encryption_status = MOD_HDCP_ENCRYPTION_STATUS_HDCP1_ON; 383 - 384 - return MOD_HDCP_STATUS_SUCCESS; 385 - } 386 - 387 374 enum mod_hdcp_status mod_hdcp_hdcp2_create_session(struct mod_hdcp *hdcp) 388 375 { 389 376 struct psp_context *psp = hdcp->config.psp.handle;
+8 -7
drivers/gpu/drm/amd/display/modules/power/power_helpers.c
··· 660 660 } 661 661 662 662 bool dmub_init_abm_config(struct resource_pool *res_pool, 663 - struct dmcu_iram_parameters params) 663 + struct dmcu_iram_parameters params, 664 + unsigned int inst) 664 665 { 665 666 struct iram_table_v_2_2 ram_table; 666 667 struct abm_config_table config; ··· 670 669 uint32_t i, j = 0; 671 670 672 671 #if defined(CONFIG_DRM_AMD_DC_DCN) 673 - if (res_pool->abm == NULL && res_pool->multiple_abms[0] == NULL) 672 + if (res_pool->abm == NULL && res_pool->multiple_abms[inst] == NULL) 674 673 return false; 675 674 #else 676 675 if (res_pool->abm == NULL) ··· 729 728 config.min_abm_backlight = ram_table.min_abm_backlight; 730 729 731 730 #if defined(CONFIG_DRM_AMD_DC_DCN) 732 - if (res_pool->multiple_abms[0]) 733 - result = res_pool->multiple_abms[0]->funcs->init_abm_config( 734 - res_pool->multiple_abms[0], (char *)(&config), sizeof(struct abm_config_table)); 735 - else 731 + if (res_pool->multiple_abms[inst]) { 732 + result = res_pool->multiple_abms[inst]->funcs->init_abm_config( 733 + res_pool->multiple_abms[inst], (char *)(&config), sizeof(struct abm_config_table), inst); 734 + } else 736 735 #endif 737 736 result = res_pool->abm->funcs->init_abm_config( 738 - res_pool->abm, (char *)(&config), sizeof(struct abm_config_table)); 737 + res_pool->abm, (char *)(&config), sizeof(struct abm_config_table), 0); 739 738 740 739 return result; 741 740 }
+2 -1
drivers/gpu/drm/amd/display/modules/power/power_helpers.h
··· 49 49 bool dmcu_load_iram(struct dmcu *dmcu, 50 50 struct dmcu_iram_parameters params); 51 51 bool dmub_init_abm_config(struct resource_pool *res_pool, 52 - struct dmcu_iram_parameters params); 52 + struct dmcu_iram_parameters params, 53 + unsigned int inst); 53 54 54 55 #endif /* MODULES_POWER_POWER_HELPERS_H_ */
+1 -1
drivers/gpu/drm/amd/include/aldebaran_ip_offset.h
··· 30 30 31 31 struct IP_BASE { 32 32 struct IP_BASE_INSTANCE instance[MAX_INSTANCE]; 33 - }; 33 + } __maybe_unused; 34 34 35 35 static const struct IP_BASE ATHUB_BASE = { { { { 0x00000C20, 0x02408C00, 0, 0, 0, 0 } }, 36 36 { { 0, 0, 0, 0, 0, 0 } },
+18
drivers/gpu/drm/amd/include/amd_acpi.h
··· 103 103 u8 ret_val; /* return value */ 104 104 } __packed; 105 105 106 + struct atcs_pwr_shift_input { 107 + u16 size; /* structure size in bytes (includes size field) */ 108 + u16 dgpu_id; /* client id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) */ 109 + u8 dev_acpi_state; /* D0 = 0, D3 hot = 3 */ 110 + u8 drv_state; /* 0 = operational, 1 = not operational */ 111 + } __packed; 112 + 106 113 /* AMD hw uses four ACPI control methods: 107 114 * 1. ATIF 108 115 * ARG0: (ACPI_INTEGER) function code ··· 425 418 # define ATCS_PCIE_PERFORMANCE_REQUEST_SUPPORTED (1 << 1) 426 419 # define ATCS_PCIE_DEVICE_READY_NOTIFICATION_SUPPORTED (1 << 2) 427 420 # define ATCS_SET_PCIE_BUS_WIDTH_SUPPORTED (1 << 3) 421 + # define ATCS_SET_POWER_SHIFT_CONTROL_SUPPORTED (1 << 7) 428 422 #define ATCS_FUNCTION_GET_EXTERNAL_STATE 0x1 429 423 /* ARG0: ATCS_FUNCTION_GET_EXTERNAL_STATE 430 424 * ARG1: none ··· 478 470 * OUTPUT: 479 471 * WORD - structure size in bytes (includes size field) 480 472 * BYTE - number of active lanes 473 + */ 474 + 475 + #define ATCS_FUNCTION_POWER_SHIFT_CONTROL 0x8 476 + /* ARG0: ATCS_FUNCTION_POWER_SHIFT_CONTROL 477 + * ARG1: 478 + * WORD - structure size in bytes (includes size field) 479 + * WORD - dGPU id (bit 2-0: func num, 7-3: dev num, 15-8: bus num) 480 + * BYTE - Device ACPI state 481 + * BYTE - Driver state 482 + * OUTPUT: none 481 483 */ 482 484 483 485 #endif
+11 -6
drivers/gpu/drm/amd/include/atomfirmware.h
··· 197 197 DP_VS_LEVEL0_PREEMPH_LEVEL3 = 0x18, 198 198 }; 199 199 200 + #define BIOS_ATOM_PREFIX "ATOMBIOS" 201 + #define BIOS_VERSION_PREFIX "ATOMBIOSBK-AMD" 202 + #define BIOS_STRING_LENGTH 43 200 203 201 204 /* 202 205 enum atom_string_def{ ··· 212 209 #pragma pack(1) /* BIOS data must use byte aligment*/ 213 210 214 211 enum atombios_image_offset{ 215 - OFFSET_TO_ATOM_ROM_HEADER_POINTER =0x00000048, 216 - OFFSET_TO_ATOM_ROM_IMAGE_SIZE =0x00000002, 217 - OFFSET_TO_ATOMBIOS_ASIC_BUS_MEM_TYPE =0x94, 218 - MAXSIZE_OF_ATOMBIOS_ASIC_BUS_MEM_TYPE =20, /*including the terminator 0x0!*/ 219 - OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS =0x2f, 220 - OFFSET_TO_GET_ATOMBIOS_STRING_START =0x6e, 212 + OFFSET_TO_ATOM_ROM_HEADER_POINTER = 0x00000048, 213 + OFFSET_TO_ATOM_ROM_IMAGE_SIZE = 0x00000002, 214 + OFFSET_TO_ATOMBIOS_ASIC_BUS_MEM_TYPE = 0x94, 215 + MAXSIZE_OF_ATOMBIOS_ASIC_BUS_MEM_TYPE = 20, /*including the terminator 0x0!*/ 216 + OFFSET_TO_GET_ATOMBIOS_NUMBER_OF_STRINGS = 0x2f, 217 + OFFSET_TO_GET_ATOMBIOS_STRING_START = 0x6e, 218 + OFFSET_TO_VBIOS_PART_NUMBER = 0x80, 219 + OFFSET_TO_VBIOS_DATE = 0x50, 221 220 }; 222 221 223 222 /****************************************************************************
+69
drivers/gpu/drm/amd/include/kgd_pp_interface.h
··· 536 536 uint64_t firmware_timestamp; 537 537 }; 538 538 539 + struct gpu_metrics_v1_3 { 540 + struct metrics_table_header common_header; 541 + 542 + /* Temperature */ 543 + uint16_t temperature_edge; 544 + uint16_t temperature_hotspot; 545 + uint16_t temperature_mem; 546 + uint16_t temperature_vrgfx; 547 + uint16_t temperature_vrsoc; 548 + uint16_t temperature_vrmem; 549 + 550 + /* Utilization */ 551 + uint16_t average_gfx_activity; 552 + uint16_t average_umc_activity; // memory controller 553 + uint16_t average_mm_activity; // UVD or VCN 554 + 555 + /* Power/Energy */ 556 + uint16_t average_socket_power; 557 + uint64_t energy_accumulator; 558 + 559 + /* Driver attached timestamp (in ns) */ 560 + uint64_t system_clock_counter; 561 + 562 + /* Average clocks */ 563 + uint16_t average_gfxclk_frequency; 564 + uint16_t average_socclk_frequency; 565 + uint16_t average_uclk_frequency; 566 + uint16_t average_vclk0_frequency; 567 + uint16_t average_dclk0_frequency; 568 + uint16_t average_vclk1_frequency; 569 + uint16_t average_dclk1_frequency; 570 + 571 + /* Current clocks */ 572 + uint16_t current_gfxclk; 573 + uint16_t current_socclk; 574 + uint16_t current_uclk; 575 + uint16_t current_vclk0; 576 + uint16_t current_dclk0; 577 + uint16_t current_vclk1; 578 + uint16_t current_dclk1; 579 + 580 + /* Throttle status */ 581 + uint32_t throttle_status; 582 + 583 + /* Fans */ 584 + uint16_t current_fan_speed; 585 + 586 + /* Link width/speed */ 587 + uint16_t pcie_link_width; 588 + uint16_t pcie_link_speed; // in 0.1 GT/s 589 + 590 + uint16_t padding; 591 + 592 + uint32_t gfx_activity_acc; 593 + uint32_t mem_activity_acc; 594 + 595 + uint16_t temperature_hbm[NUM_HBM_INSTANCES]; 596 + 597 + /* PMFW attached timestamp (10ns resolution) */ 598 + uint64_t firmware_timestamp; 599 + 600 + /* Voltage (mV) */ 601 + uint16_t voltage_soc; 602 + uint16_t voltage_gfx; 603 + uint16_t voltage_mem; 604 + 605 + uint16_t padding1; 606 + }; 607 + 539 608 /* 540 609 * gpu_metrics_v2_0 is not recommended as it's not naturally aligned. 541 610 * Use gpu_metrics_v2_1 or later instead.
+1 -1
drivers/gpu/drm/amd/pm/amdgpu_pm.c
··· 1942 1942 1943 1943 BUG_ON(!attr); 1944 1944 1945 - attr_update = attr->attr_update ? attr_update : default_attr_update; 1945 + attr_update = attr->attr_update ? attr->attr_update : default_attr_update; 1946 1946 1947 1947 ret = attr_update(adev, attr, mask, &attr_states); 1948 1948 if (ret) {
+1 -1
drivers/gpu/drm/amd/pm/inc/smu11_driver_if_sienna_cichlid.h
··· 1176 1176 uint16_t LedGpio; //GeneriA GPIO flag used to control the radeon LEDs 1177 1177 uint16_t GfxPowerStagesGpio; //Genlk_vsync GPIO flag used to control gfx power stages 1178 1178 1179 - uint32_t SkuReserved[16]; 1179 + uint32_t SkuReserved[63]; 1180 1180 1181 1181 1182 1182
-6
drivers/gpu/drm/amd/pm/inc/smu_v13_0.h
··· 51 51 #define CTF_OFFSET_HOTSPOT 5 52 52 #define CTF_OFFSET_MEM 5 53 53 54 - static const struct smu_temperature_range smu13_thermal_policy[] = 55 - { 56 - {-273150, 99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000}, 57 - { 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000}, 58 - }; 59 - 60 54 struct smu_13_0_max_sustainable_clocks { 61 55 uint32_t display_clock; 62 56 uint32_t phy_clock;
+2 -1
drivers/gpu/drm/amd/pm/powerplay/hwmgr/hardwaremanager.c
··· 82 82 83 83 /* Skip for suspend/resume case */ 84 84 if (!hwmgr->pp_one_vf && smum_is_dpm_running(hwmgr) 85 - && !amdgpu_passthrough(adev) && adev->in_suspend) { 85 + && !amdgpu_passthrough(adev) && adev->in_suspend 86 + && adev->asic_type != CHIP_RAVEN) { 86 87 pr_info("dpm has been enabled\n"); 87 88 return 0; 88 89 }
+21
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu10_hwmgr.c
··· 377 377 378 378 static int smu10_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 379 379 { 380 + struct amdgpu_device *adev = hwmgr->adev; 381 + struct smu10_hwmgr *smu10_data = (struct smu10_hwmgr *)(hwmgr->backend); 382 + int ret = -EINVAL; 383 + 384 + if (adev->in_suspend) { 385 + pr_info("restore the fine grain parameters\n"); 386 + 387 + ret = smum_send_msg_to_smc_with_parameter(hwmgr, 388 + PPSMC_MSG_SetHardMinGfxClk, 389 + smu10_data->gfx_actual_soft_min_freq, 390 + NULL); 391 + if (ret) 392 + return ret; 393 + ret = smum_send_msg_to_smc_with_parameter(hwmgr, 394 + PPSMC_MSG_SetSoftMaxGfxClk, 395 + smu10_data->gfx_actual_soft_max_freq, 396 + NULL); 397 + if (ret) 398 + return ret; 399 + } 400 + 380 401 return 0; 381 402 } 382 403
+4 -4
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_thermal.c
··· 129 129 } 130 130 131 131 /** 132 - * Reset Fan Speed Control to default mode. 133 - * @hwmgr: the address of the powerplay hardware manager. 134 - * Exception: Should always succeed. 135 - */ 132 + * smu7_fan_ctrl_set_default_mode - Reset Fan Speed Control to default mode. 133 + * @hwmgr: the address of the powerplay hardware manager. 134 + * Exception: Should always succeed. 135 + */ 136 136 int smu7_fan_ctrl_set_default_mode(struct pp_hwmgr *hwmgr) 137 137 { 138 138 if (!hwmgr->fan_ctrl_is_in_default_mode) {
+15 -11
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
··· 544 544 545 545 #define ATOM_VIRTUAL_VOLTAGE_ID0 0xff01 546 546 /** 547 - * Get Leakage VDDC based on leakage ID. 547 + * vega10_get_evv_voltages - Get Leakage VDDC based on leakage ID. 548 548 * 549 549 * @hwmgr: the address of the powerplay hardware manager. 550 550 * return: always 0. ··· 600 600 } 601 601 602 602 /** 603 - * Change virtual leakage voltage to actual value. 603 + * vega10_patch_with_vdd_leakage - Change virtual leakage voltage to actual value. 604 604 * 605 605 * @hwmgr: the address of the powerplay hardware manager. 606 606 * @voltage: pointer to changing voltage ··· 626 626 } 627 627 628 628 /** 629 - * Patch voltage lookup table by EVV leakages. 629 + * vega10_patch_lookup_table_with_leakage - Patch voltage lookup table by EVV leakages. 630 630 * 631 631 * @hwmgr: the address of the powerplay hardware manager. 632 632 * @lookup_table: pointer to voltage lookup table ··· 1003 1003 } 1004 1004 1005 1005 /** 1006 - * Remove repeated voltage values and create table with unique values. 1006 + * vega10_trim_voltage_table - Remove repeated voltage values and create table with unique values. 1007 1007 * 1008 1008 * @hwmgr: the address of the powerplay hardware manager. 1009 1009 * @vol_table: the pointer to changing voltage table ··· 1152 1152 } 1153 1153 1154 1154 /** 1155 - * Create Voltage Tables. 1155 + * vega10_construct_voltage_tables - Create Voltage Tables. 1156 1156 * 1157 1157 * @hwmgr: the address of the powerplay hardware manager. 1158 1158 * return: always 0 ··· 1595 1595 } 1596 1596 1597 1597 /** 1598 - * Populates single SMC GFXSCLK structure using the provided engine clock 1598 + * vega10_populate_single_gfx_level - Populates single SMC GFXSCLK structure 1599 + * using the provided engine clock 1599 1600 * 1600 1601 * @hwmgr: the address of the hardware manager 1601 1602 * @gfx_clock: the GFX clock to use to populate the structure. ··· 1661 1660 } 1662 1661 1663 1662 /** 1664 - * Populates single SMC SOCCLK structure using the provided clock. 1663 + * vega10_populate_single_soc_level - Populates single SMC SOCCLK structure 1664 + * using the provided clock. 1665 1665 * 1666 1666 * @hwmgr: the address of the hardware manager. 1667 1667 * @soc_clock: the SOC clock to use to populate the structure. ··· 1712 1710 } 1713 1711 1714 1712 /** 1715 - * Populates all SMC SCLK levels' structure based on the trimmed allowed dpm engine clock states 1713 + * vega10_populate_all_graphic_levels - Populates all SMC SCLK levels' structure 1714 + * based on the trimmed allowed dpm engine clock states 1716 1715 * 1717 1716 * @hwmgr: the address of the hardware manager 1718 1717 */ ··· 1862 1859 } 1863 1860 1864 1861 /** 1865 - * Populates all SMC MCLK levels' structure based on the trimmed allowed dpm memory clock states. 1862 + * vega10_populate_all_memory_levels - Populates all SMC MCLK levels' structure 1863 + * based on the trimmed allowed dpm memory clock states. 1866 1864 * 1867 1865 * @hwmgr: the address of the hardware manager. 1868 1866 * return: PP_Result_OK on success. ··· 2541 2537 } 2542 2538 2543 2539 /** 2544 - * Initializes the SMC table and uploads it 2540 + * vega10_init_smc_table - Initializes the SMC table and uploads it 2545 2541 * 2546 2542 * @hwmgr: the address of the powerplay hardware manager. 2547 2543 * return: always 0 ··· 2923 2919 } 2924 2920 2925 2921 /** 2926 - * Tell SMC to enabled the supported DPMs. 2922 + * vega10_start_dpm - Tell SMC to enabled the supported DPMs. 2927 2923 * 2928 2924 * @hwmgr: the address of the powerplay hardware manager. 2929 2925 * @bitmap: bitmap for the features to enabled.
+1 -1
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
··· 803 803 #endif 804 804 805 805 /** 806 - * Initializes the SMC table and uploads it 806 + * vega12_init_smc_table - Initializes the SMC table and uploads it 807 807 * 808 808 * @hwmgr: the address of the powerplay hardware manager. 809 809 * return: always 0
+2 -1
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_thermal.c
··· 159 159 } 160 160 161 161 /** 162 - * Set the requested temperature range for high and low alert signals 162 + * vega12_thermal_set_temperature_range - Set the requested temperature range 163 + * for high and low alert signals 163 164 * 164 165 * @hwmgr: The address of the hardware manager. 165 166 * @range: Temperature range to be programmed for
+1 -1
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
··· 772 772 } 773 773 774 774 /** 775 - * Initializes the SMC table and uploads it 775 + * vega20_init_smc_table - Initializes the SMC table and uploads it 776 776 * 777 777 * @hwmgr: the address of the powerplay hardware manager. 778 778 * return: always 0
+46
drivers/gpu/drm/amd/pm/swsmu/smu11/arcturus_ppt.c
··· 822 822 now) ? "*" : "")); 823 823 break; 824 824 825 + case SMU_VCLK: 826 + ret = arcturus_get_current_clk_freq_by_table(smu, SMU_VCLK, &now); 827 + if (ret) { 828 + dev_err(smu->adev->dev, "Attempt to get current vclk Failed!"); 829 + return ret; 830 + } 831 + 832 + single_dpm_table = &(dpm_context->dpm_tables.vclk_table); 833 + ret = arcturus_get_clk_table(smu, &clocks, single_dpm_table); 834 + if (ret) { 835 + dev_err(smu->adev->dev, "Attempt to get vclk levels Failed!"); 836 + return ret; 837 + } 838 + 839 + for (i = 0; i < single_dpm_table->count; i++) 840 + size += sprintf(buf + size, "%d: %uMhz %s\n", 841 + i, single_dpm_table->dpm_levels[i].value, 842 + (clocks.num_levels == 1) ? "*" : 843 + (arcturus_freqs_in_same_level( 844 + clocks.data[i].clocks_in_khz / 1000, 845 + now) ? "*" : "")); 846 + break; 847 + 848 + case SMU_DCLK: 849 + ret = arcturus_get_current_clk_freq_by_table(smu, SMU_DCLK, &now); 850 + if (ret) { 851 + dev_err(smu->adev->dev, "Attempt to get current dclk Failed!"); 852 + return ret; 853 + } 854 + 855 + single_dpm_table = &(dpm_context->dpm_tables.dclk_table); 856 + ret = arcturus_get_clk_table(smu, &clocks, single_dpm_table); 857 + if (ret) { 858 + dev_err(smu->adev->dev, "Attempt to get dclk levels Failed!"); 859 + return ret; 860 + } 861 + 862 + for (i = 0; i < single_dpm_table->count; i++) 863 + size += sprintf(buf + size, "%d: %uMhz %s\n", 864 + i, single_dpm_table->dpm_levels[i].value, 865 + (clocks.num_levels == 1) ? "*" : 866 + (arcturus_freqs_in_same_level( 867 + clocks.data[i].clocks_in_khz / 1000, 868 + now) ? "*" : "")); 869 + break; 870 + 825 871 case SMU_PCIE: 826 872 gen_speed = smu_v11_0_get_current_pcie_link_speed_level(smu); 827 873 lane_width = smu_v11_0_get_current_pcie_link_width_level(smu);
+68 -17
drivers/gpu/drm/amd/pm/swsmu/smu11/navi10_ppt.c
··· 505 505 goto err0_out; 506 506 smu_table->metrics_time = 0; 507 507 508 - smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v1_1); 508 + smu_table->gpu_metrics_table_size = sizeof(struct gpu_metrics_v1_3); 509 509 smu_table->gpu_metrics_table = kzalloc(smu_table->gpu_metrics_table_size, GFP_KERNEL); 510 510 if (!smu_table->gpu_metrics_table) 511 511 goto err1_out; ··· 1273 1273 case SMU_MCLK: 1274 1274 case SMU_UCLK: 1275 1275 case SMU_FCLK: 1276 + case SMU_VCLK: 1277 + case SMU_DCLK: 1276 1278 case SMU_DCEFCLK: 1277 1279 ret = navi10_get_current_clk_freq_by_table(smu, clk_type, &cur_value); 1278 1280 if (ret) ··· 2629 2627 void **table) 2630 2628 { 2631 2629 struct smu_table_context *smu_table = &smu->smu_table; 2632 - struct gpu_metrics_v1_1 *gpu_metrics = 2633 - (struct gpu_metrics_v1_1 *)smu_table->gpu_metrics_table; 2630 + struct gpu_metrics_v1_3 *gpu_metrics = 2631 + (struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table; 2634 2632 SmuMetrics_legacy_t metrics; 2635 2633 int ret = 0; 2636 2634 ··· 2648 2646 2649 2647 mutex_unlock(&smu->metrics_lock); 2650 2648 2651 - smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 1); 2649 + smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3); 2652 2650 2653 2651 gpu_metrics->temperature_edge = metrics.TemperatureEdge; 2654 2652 gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot; ··· 2683 2681 2684 2682 gpu_metrics->system_clock_counter = ktime_get_boottime_ns(); 2685 2683 2684 + if (metrics.CurrGfxVoltageOffset) 2685 + gpu_metrics->voltage_gfx = 2686 + (155000 - 625 * metrics.CurrGfxVoltageOffset) / 100; 2687 + if (metrics.CurrMemVidOffset) 2688 + gpu_metrics->voltage_mem = 2689 + (155000 - 625 * metrics.CurrMemVidOffset) / 100; 2690 + if (metrics.CurrSocVoltageOffset) 2691 + gpu_metrics->voltage_soc = 2692 + (155000 - 625 * metrics.CurrSocVoltageOffset) / 100; 2693 + 2686 2694 *table = (void *)gpu_metrics; 2687 2695 2688 - return sizeof(struct gpu_metrics_v1_1); 2696 + return sizeof(struct gpu_metrics_v1_3); 2689 2697 } 2690 2698 2691 2699 static ssize_t navi10_get_gpu_metrics(struct smu_context *smu, 2692 2700 void **table) 2693 2701 { 2694 2702 struct smu_table_context *smu_table = &smu->smu_table; 2695 - struct gpu_metrics_v1_1 *gpu_metrics = 2696 - (struct gpu_metrics_v1_1 *)smu_table->gpu_metrics_table; 2703 + struct gpu_metrics_v1_3 *gpu_metrics = 2704 + (struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table; 2697 2705 SmuMetrics_t metrics; 2698 2706 int ret = 0; 2699 2707 ··· 2721 2709 2722 2710 mutex_unlock(&smu->metrics_lock); 2723 2711 2724 - smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 1); 2712 + smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3); 2725 2713 2726 2714 gpu_metrics->temperature_edge = metrics.TemperatureEdge; 2727 2715 gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot; ··· 2758 2746 2759 2747 gpu_metrics->system_clock_counter = ktime_get_boottime_ns(); 2760 2748 2749 + if (metrics.CurrGfxVoltageOffset) 2750 + gpu_metrics->voltage_gfx = 2751 + (155000 - 625 * metrics.CurrGfxVoltageOffset) / 100; 2752 + if (metrics.CurrMemVidOffset) 2753 + gpu_metrics->voltage_mem = 2754 + (155000 - 625 * metrics.CurrMemVidOffset) / 100; 2755 + if (metrics.CurrSocVoltageOffset) 2756 + gpu_metrics->voltage_soc = 2757 + (155000 - 625 * metrics.CurrSocVoltageOffset) / 100; 2758 + 2761 2759 *table = (void *)gpu_metrics; 2762 2760 2763 - return sizeof(struct gpu_metrics_v1_1); 2761 + return sizeof(struct gpu_metrics_v1_3); 2764 2762 } 2765 2763 2766 2764 static ssize_t navi12_get_legacy_gpu_metrics(struct smu_context *smu, 2767 2765 void **table) 2768 2766 { 2769 2767 struct smu_table_context *smu_table = &smu->smu_table; 2770 - struct gpu_metrics_v1_1 *gpu_metrics = 2771 - (struct gpu_metrics_v1_1 *)smu_table->gpu_metrics_table; 2768 + struct gpu_metrics_v1_3 *gpu_metrics = 2769 + (struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table; 2772 2770 SmuMetrics_NV12_legacy_t metrics; 2773 2771 int ret = 0; 2774 2772 ··· 2796 2774 2797 2775 mutex_unlock(&smu->metrics_lock); 2798 2776 2799 - smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 1); 2777 + smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3); 2800 2778 2801 2779 gpu_metrics->temperature_edge = metrics.TemperatureEdge; 2802 2780 gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot; ··· 2836 2814 2837 2815 gpu_metrics->system_clock_counter = ktime_get_boottime_ns(); 2838 2816 2817 + if (metrics.CurrGfxVoltageOffset) 2818 + gpu_metrics->voltage_gfx = 2819 + (155000 - 625 * metrics.CurrGfxVoltageOffset) / 100; 2820 + if (metrics.CurrMemVidOffset) 2821 + gpu_metrics->voltage_mem = 2822 + (155000 - 625 * metrics.CurrMemVidOffset) / 100; 2823 + if (metrics.CurrSocVoltageOffset) 2824 + gpu_metrics->voltage_soc = 2825 + (155000 - 625 * metrics.CurrSocVoltageOffset) / 100; 2826 + 2839 2827 *table = (void *)gpu_metrics; 2840 2828 2841 - return sizeof(struct gpu_metrics_v1_1); 2829 + return sizeof(struct gpu_metrics_v1_3); 2842 2830 } 2843 2831 2844 2832 static ssize_t navi12_get_gpu_metrics(struct smu_context *smu, 2845 2833 void **table) 2846 2834 { 2847 2835 struct smu_table_context *smu_table = &smu->smu_table; 2848 - struct gpu_metrics_v1_1 *gpu_metrics = 2849 - (struct gpu_metrics_v1_1 *)smu_table->gpu_metrics_table; 2836 + struct gpu_metrics_v1_3 *gpu_metrics = 2837 + (struct gpu_metrics_v1_3 *)smu_table->gpu_metrics_table; 2850 2838 SmuMetrics_NV12_t metrics; 2851 2839 int ret = 0; 2852 2840 ··· 2874 2842 2875 2843 mutex_unlock(&smu->metrics_lock); 2876 2844 2877 - smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 1); 2845 + smu_cmn_init_soft_gpu_metrics(gpu_metrics, 1, 3); 2878 2846 2879 2847 gpu_metrics->temperature_edge = metrics.TemperatureEdge; 2880 2848 gpu_metrics->temperature_hotspot = metrics.TemperatureHotspot; ··· 2916 2884 2917 2885 gpu_metrics->system_clock_counter = ktime_get_boottime_ns(); 2918 2886 2887 + if (metrics.CurrGfxVoltageOffset) 2888 + gpu_metrics->voltage_gfx = 2889 + (155000 - 625 * metrics.CurrGfxVoltageOffset) / 100; 2890 + if (metrics.CurrMemVidOffset) 2891 + gpu_metrics->voltage_mem = 2892 + (155000 - 625 * metrics.CurrMemVidOffset) / 100; 2893 + if (metrics.CurrSocVoltageOffset) 2894 + gpu_metrics->voltage_soc = 2895 + (155000 - 625 * metrics.CurrSocVoltageOffset) / 100; 2896 + 2919 2897 *table = (void *)gpu_metrics; 2920 2898 2921 - return sizeof(struct gpu_metrics_v1_1); 2899 + return sizeof(struct gpu_metrics_v1_3); 2922 2900 } 2923 2901 2924 2902 static ssize_t navi1x_get_gpu_metrics(struct smu_context *smu, ··· 2967 2925 2968 2926 static int navi10_enable_mgpu_fan_boost(struct smu_context *smu) 2969 2927 { 2928 + struct smu_table_context *table_context = &smu->smu_table; 2929 + PPTable_t *smc_pptable = table_context->driver_pptable; 2970 2930 struct amdgpu_device *adev = smu->adev; 2971 2931 uint32_t param = 0; 2972 2932 2973 2933 /* Navi12 does not support this */ 2974 2934 if (adev->asic_type == CHIP_NAVI12) 2935 + return 0; 2936 + 2937 + /* 2938 + * Skip the MGpuFanBoost setting for those ASICs 2939 + * which do not support it 2940 + */ 2941 + if (!smc_pptable->MGpuFanBoostLimitRpm) 2975 2942 return 0; 2976 2943 2977 2944 /* Workaround for WS SKU */
+14
drivers/gpu/drm/amd/pm/swsmu/smu11/sienna_cichlid_ppt.c
··· 987 987 case SMU_MCLK: 988 988 case SMU_UCLK: 989 989 case SMU_FCLK: 990 + case SMU_VCLK: 991 + case SMU_VCLK1: 992 + case SMU_DCLK: 993 + case SMU_DCLK1: 990 994 case SMU_DCEFCLK: 991 995 ret = sienna_cichlid_get_current_clk_freq_by_table(smu, clk_type, &cur_value); 992 996 if (ret) ··· 3694 3690 3695 3691 static int sienna_cichlid_enable_mgpu_fan_boost(struct smu_context *smu) 3696 3692 { 3693 + struct smu_table_context *table_context = &smu->smu_table; 3694 + PPTable_t *smc_pptable = table_context->driver_pptable; 3695 + 3696 + /* 3697 + * Skip the MGpuFanBoost setting for those ASICs 3698 + * which do not support it 3699 + */ 3700 + if (!smc_pptable->MGpuFanBoostLimitRpm) 3701 + return 0; 3702 + 3697 3703 return smu_cmn_send_smc_msg_with_param(smu, 3698 3704 SMU_MSG_SetMGpuFanBoostLimitRpm, 3699 3705 0,
+33
drivers/gpu/drm/amd/pm/swsmu/smu12/renoir_ppt.c
··· 109 109 CLK_MAP(SOCCLK, CLOCK_SOCCLK), 110 110 CLK_MAP(UCLK, CLOCK_FCLK), 111 111 CLK_MAP(MCLK, CLOCK_FCLK), 112 + CLK_MAP(VCLK, CLOCK_VCLK), 113 + CLK_MAP(DCLK, CLOCK_DCLK), 112 114 }; 113 115 114 116 static struct cmn2asic_mapping renoir_table_map[SMU_TABLE_COUNT] = { ··· 204 202 return -EINVAL; 205 203 *freq = clk_table->FClocks[dpm_level].Freq; 206 204 break; 205 + case SMU_VCLK: 206 + if (dpm_level >= NUM_VCN_DPM_LEVELS) 207 + return -EINVAL; 208 + *freq = clk_table->VClocks[dpm_level].Freq; 209 + break; 210 + case SMU_DCLK: 211 + if (dpm_level >= NUM_VCN_DPM_LEVELS) 212 + return -EINVAL; 213 + *freq = clk_table->DClocks[dpm_level].Freq; 214 + break; 215 + 207 216 default: 208 217 return -EINVAL; 209 218 } ··· 545 532 count = NUM_FCLK_DPM_LEVELS; 546 533 cur_value = metrics.ClockFrequency[CLOCK_FCLK]; 547 534 break; 535 + case SMU_VCLK: 536 + count = NUM_VCN_DPM_LEVELS; 537 + cur_value = metrics.ClockFrequency[CLOCK_VCLK]; 538 + break; 539 + case SMU_DCLK: 540 + count = NUM_VCN_DPM_LEVELS; 541 + cur_value = metrics.ClockFrequency[CLOCK_DCLK]; 542 + break; 548 543 default: 549 544 break; 550 545 } ··· 564 543 case SMU_MCLK: 565 544 case SMU_DCEFCLK: 566 545 case SMU_FCLK: 546 + case SMU_VCLK: 547 + case SMU_DCLK: 567 548 for (i = 0; i < count; i++) { 568 549 ret = renoir_get_dpm_clk_limited(smu, clk_type, i, &value); 569 550 if (ret) ··· 751 728 for (i = 0; i< NUM_MEMCLK_DPM_LEVELS; i++) { 752 729 clock_table->MemClocks[i].Freq = table->MemClocks[i].Freq; 753 730 clock_table->MemClocks[i].Vol = table->MemClocks[i].Vol; 731 + } 732 + 733 + for (i = 0; i < NUM_VCN_DPM_LEVELS; i++) { 734 + clock_table->VClocks[i].Freq = table->VClocks[i].Freq; 735 + clock_table->VClocks[i].Vol = table->VClocks[i].Vol; 736 + } 737 + 738 + for (i = 0; i < NUM_VCN_DPM_LEVELS; i++) { 739 + clock_table->DClocks[i].Freq = table->DClocks[i].Freq; 740 + clock_table->DClocks[i].Vol = table->DClocks[i].Vol; 754 741 } 755 742 756 743 return 0;
+57 -4
drivers/gpu/drm/amd/pm/swsmu/smu13/aldebaran_ppt.c
··· 78 78 79 79 #define smnPCIE_ESM_CTRL 0x111003D0 80 80 81 + static const struct smu_temperature_range smu13_thermal_policy[] = 82 + { 83 + {-273150, 99000, 99000, -273150, 99000, 99000, -273150, 99000, 99000}, 84 + { 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000, 120000}, 85 + }; 86 + 81 87 static const struct cmn2asic_msg_mapping aldebaran_message_map[SMU_MSG_MAX_COUNT] = { 82 88 MSG_MAP(TestMessage, PPSMC_MSG_TestMessage, 0), 83 89 MSG_MAP(GetSmuVersion, PPSMC_MSG_GetSmuVersion, 1), ··· 822 816 now) ? "*" : "")); 823 817 break; 824 818 819 + case SMU_VCLK: 820 + ret = aldebaran_get_current_clk_freq_by_table(smu, SMU_VCLK, &now); 821 + if (ret) { 822 + dev_err(smu->adev->dev, "Attempt to get current vclk Failed!"); 823 + return ret; 824 + } 825 + 826 + single_dpm_table = &(dpm_context->dpm_tables.vclk_table); 827 + ret = aldebaran_get_clk_table(smu, &clocks, single_dpm_table); 828 + if (ret) { 829 + dev_err(smu->adev->dev, "Attempt to get vclk levels Failed!"); 830 + return ret; 831 + } 832 + 833 + for (i = 0; i < single_dpm_table->count; i++) 834 + size += sprintf(buf + size, "%d: %uMhz %s\n", 835 + i, single_dpm_table->dpm_levels[i].value, 836 + (clocks.num_levels == 1) ? "*" : 837 + (aldebaran_freqs_in_same_level( 838 + clocks.data[i].clocks_in_khz / 1000, 839 + now) ? "*" : "")); 840 + break; 841 + 842 + case SMU_DCLK: 843 + ret = aldebaran_get_current_clk_freq_by_table(smu, SMU_DCLK, &now); 844 + if (ret) { 845 + dev_err(smu->adev->dev, "Attempt to get current dclk Failed!"); 846 + return ret; 847 + } 848 + 849 + single_dpm_table = &(dpm_context->dpm_tables.dclk_table); 850 + ret = aldebaran_get_clk_table(smu, &clocks, single_dpm_table); 851 + if (ret) { 852 + dev_err(smu->adev->dev, "Attempt to get dclk levels Failed!"); 853 + return ret; 854 + } 855 + 856 + for (i = 0; i < single_dpm_table->count; i++) 857 + size += sprintf(buf + size, "%d: %uMhz %s\n", 858 + i, single_dpm_table->dpm_levels[i].value, 859 + (clocks.num_levels == 1) ? "*" : 860 + (aldebaran_freqs_in_same_level( 861 + clocks.data[i].clocks_in_khz / 1000, 862 + now) ? "*" : "")); 863 + break; 864 + 825 865 default: 826 866 break; 827 867 } ··· 1368 1316 1369 1317 static bool aldebaran_is_dpm_running(struct smu_context *smu) 1370 1318 { 1371 - int ret = 0; 1319 + int ret; 1372 1320 uint32_t feature_mask[2]; 1373 1321 unsigned long feature_enabled; 1322 + 1374 1323 ret = smu_cmn_get_enabled_mask(smu, feature_mask, 2); 1324 + if (ret) 1325 + return false; 1375 1326 feature_enabled = (unsigned long)((uint64_t)feature_mask[0] | 1376 1327 ((uint64_t)feature_mask[1] << 32)); 1377 1328 return !!(feature_enabled & SMC_DPM_FEATURE); ··· 1865 1810 case PP_MP1_STATE_UNLOAD: 1866 1811 return smu_cmn_set_mp1_state(smu, mp1_state); 1867 1812 default: 1868 - return -EINVAL; 1813 + return 0; 1869 1814 } 1870 - 1871 - return 0; 1872 1815 } 1873 1816 1874 1817 static const struct pptable_funcs aldebaran_ppt_funcs = {
+3
drivers/gpu/drm/amd/pm/swsmu/smu_cmn.c
··· 764 764 case METRICS_VERSION(1, 2): 765 765 structure_size = sizeof(struct gpu_metrics_v1_2); 766 766 break; 767 + case METRICS_VERSION(1, 3): 768 + structure_size = sizeof(struct gpu_metrics_v1_3); 769 + break; 767 770 case METRICS_VERSION(2, 0): 768 771 structure_size = sizeof(struct gpu_metrics_v2_0); 769 772 break;
+4
drivers/gpu/drm/drm_fourcc.c
··· 178 178 { .format = DRM_FORMAT_ARGB16161616F, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 179 179 { .format = DRM_FORMAT_ABGR16161616F, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 180 180 { .format = DRM_FORMAT_AXBXGXRX106106106106, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 181 + { .format = DRM_FORMAT_XRGB16161616, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 }, 182 + { .format = DRM_FORMAT_XBGR16161616, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1 }, 183 + { .format = DRM_FORMAT_ARGB16161616, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 184 + { .format = DRM_FORMAT_ABGR16161616, .depth = 0, .num_planes = 1, .cpp = { 8, 0, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 181 185 { .format = DRM_FORMAT_RGB888_A8, .depth = 32, .num_planes = 2, .cpp = { 3, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 182 186 { .format = DRM_FORMAT_BGR888_A8, .depth = 32, .num_planes = 2, .cpp = { 3, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true }, 183 187 { .format = DRM_FORMAT_XRGB8888_A8, .depth = 32, .num_planes = 2, .cpp = { 4, 1, 0 }, .hsub = 1, .vsub = 1, .has_alpha = true },
+1 -1
drivers/gpu/drm/radeon/cik.c
··· 7439 7439 } 7440 7440 7441 7441 /** 7442 - * cik_irq_disable - disable interrupts for suspend 7442 + * cik_irq_suspend - disable interrupts for suspend 7443 7443 * 7444 7444 * @rdev: radeon_device pointer 7445 7445 *
-1
drivers/gpu/drm/radeon/evergreen.h
··· 45 45 int sumo_rlc_init(struct radeon_device *rdev); 46 46 void evergreen_gpu_pci_config_reset(struct radeon_device *rdev); 47 47 u32 evergreen_get_number_of_dram_channels(struct radeon_device *rdev); 48 - void evergreen_print_gpu_status_regs(struct radeon_device *rdev); 49 48 u32 evergreen_gpu_check_soft_reset(struct radeon_device *rdev); 50 49 int evergreen_rlc_resume(struct radeon_device *rdev); 51 50 struct evergreen_power_info *evergreen_get_pi(struct radeon_device *rdev);
+1 -1
drivers/gpu/drm/radeon/r100.c
··· 1406 1406 } 1407 1407 1408 1408 /** 1409 - * r100_cs_packet_next_vline() - parse userspace VLINE packet 1409 + * r100_cs_packet_parse_vline() - parse userspace VLINE packet 1410 1410 * @p: parser structure holding parsing context. 1411 1411 * 1412 1412 * Userspace sends a special sequence for VLINE waits.
-2
drivers/gpu/drm/radeon/radeon_asic.h
··· 187 187 extern void rv370_pcie_gart_fini(struct radeon_device *rdev); 188 188 extern int rv370_pcie_gart_enable(struct radeon_device *rdev); 189 189 extern void rv370_pcie_gart_disable(struct radeon_device *rdev); 190 - extern int r300_mc_wait_for_idle(struct radeon_device *rdev); 191 190 192 191 /* 193 192 * r420,r423,rv410 ··· 403 404 void r600_hdmi_audio_workaround(struct drm_encoder *encoder); 404 405 int r600_hdmi_buffer_status_changed(struct drm_encoder *encoder); 405 406 void r600_hdmi_update_audio_settings(struct drm_encoder *encoder); 406 - int r600_mc_wait_for_idle(struct radeon_device *rdev); 407 407 u32 r600_get_xclk(struct radeon_device *rdev); 408 408 uint64_t r600_get_gpu_clock_counter(struct radeon_device *rdev); 409 409 int rv6xx_get_temp(struct radeon_device *rdev);
+1 -1
drivers/gpu/drm/radeon/radeon_cs.c
··· 405 405 } 406 406 407 407 /** 408 - * cs_parser_fini() - clean parser states 408 + * radeon_cs_parser_fini() - clean parser states 409 409 * @parser: parser structure holding parsing context. 410 410 * @error: error number 411 411 * @backoff: indicator to backoff the reservation
+2 -2
drivers/gpu/drm/radeon/radeon_vm.c
··· 51 51 */ 52 52 53 53 /** 54 - * radeon_vm_num_pde - return the number of page directory entries 54 + * radeon_vm_num_pdes - return the number of page directory entries 55 55 * 56 56 * @rdev: radeon_device pointer 57 57 * ··· 626 626 } 627 627 628 628 /** 629 - * radeon_vm_update_pdes - make sure that page directory is valid 629 + * radeon_vm_update_page_directory - make sure that page directory is valid 630 630 * 631 631 * @rdev: radeon_device pointer 632 632 * @vm: requested vm
+12
include/drm/drm_atomic.h
··· 896 896 (new_plane_state) = (__state)->planes[__i].new_state, 1)) 897 897 898 898 /** 899 + * for_each_new_plane_in_state_reverse - other than only tracking new state, 900 + * it's the same as for_each_oldnew_plane_in_state_reverse 901 + */ 902 + #define for_each_new_plane_in_state_reverse(__state, plane, new_plane_state, __i) \ 903 + for ((__i) = ((__state)->dev->mode_config.num_total_plane - 1); \ 904 + (__i) >= 0; \ 905 + (__i)--) \ 906 + for_each_if ((__state)->planes[__i].ptr && \ 907 + ((plane) = (__state)->planes[__i].ptr, \ 908 + (new_plane_state) = (__state)->planes[__i].new_state, 1)) 909 + 910 + /** 899 911 * for_each_old_plane_in_state - iterate over all planes in an atomic update 900 912 * @__state: &struct drm_atomic_state pointer 901 913 * @plane: &struct drm_plane iteration cursor
+15
include/uapi/drm/amdgpu_drm.h
··· 136 136 * accessing it with various hw blocks 137 137 */ 138 138 #define AMDGPU_GEM_CREATE_ENCRYPTED (1 << 10) 139 + /* Flag that BO will be used only in preemptible context, which does 140 + * not require GTT memory accounting 141 + */ 142 + #define AMDGPU_GEM_CREATE_PREEMPTIBLE (1 << 11) 139 143 140 144 struct drm_amdgpu_gem_create_in { 141 145 /** the requested memory size */ ··· 757 753 #define AMDGPU_INFO_VBIOS_SIZE 0x1 758 754 /* Subquery id: Query vbios image */ 759 755 #define AMDGPU_INFO_VBIOS_IMAGE 0x2 756 + /* Subquery id: Query vbios info */ 757 + #define AMDGPU_INFO_VBIOS_INFO 0x3 760 758 /* Query UVD handles */ 761 759 #define AMDGPU_INFO_NUM_HANDLES 0x1C 762 760 /* Query sensor related information */ ··· 950 944 struct drm_amdgpu_info_firmware { 951 945 __u32 ver; 952 946 __u32 feature; 947 + }; 948 + 949 + struct drm_amdgpu_info_vbios { 950 + __u8 name[64]; 951 + __u8 vbios_pn[64]; 952 + __u32 version; 953 + __u32 pad; 954 + __u8 vbios_ver_str[32]; 955 + __u8 date[32]; 953 956 }; 954 957 955 958 #define AMDGPU_VRAM_TYPE_UNKNOWN 0
+7
include/uapi/drm/drm_fourcc.h
··· 168 168 #define DRM_FORMAT_RGBA1010102 fourcc_code('R', 'A', '3', '0') /* [31:0] R:G:B:A 10:10:10:2 little endian */ 169 169 #define DRM_FORMAT_BGRA1010102 fourcc_code('B', 'A', '3', '0') /* [31:0] B:G:R:A 10:10:10:2 little endian */ 170 170 171 + /* 64 bpp RGB */ 172 + #define DRM_FORMAT_XRGB16161616 fourcc_code('X', 'R', '4', '8') /* [63:0] x:R:G:B 16:16:16:16 little endian */ 173 + #define DRM_FORMAT_XBGR16161616 fourcc_code('X', 'B', '4', '8') /* [63:0] x:B:G:R 16:16:16:16 little endian */ 174 + 175 + #define DRM_FORMAT_ARGB16161616 fourcc_code('A', 'R', '4', '8') /* [63:0] A:R:G:B 16:16:16:16 little endian */ 176 + #define DRM_FORMAT_ABGR16161616 fourcc_code('A', 'B', '4', '8') /* [63:0] A:B:G:R 16:16:16:16 little endian */ 177 + 171 178 /* 172 179 * Floating point 64bpp RGB 173 180 * IEEE 754-2008 binary16 half-precision float