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

Merge branch 'drm-next-4.10' of git://people.freedesktop.org/~agd5f/linux into drm-next

First new feature pull for 4.10. Highlights:
- Support for multple virtual displays in the virtual dce component
- New VM mgr to support non-contiguous vram buffers
- Support for UVD powergating on additional asics
- Power management improvements
- lots of code cleanup and bug fixes

* 'drm-next-4.10' of git://people.freedesktop.org/~agd5f/linux: (107 commits)
drm/amdgpu: turn on/off uvd clock when dpm enable/disable on CI
drm/amdgpu: disable dpm before turn off clock when vce idle.
drm/amdgpu: enable uvd bypass mode for CI/VI.
drm/amdgpu: just not load smc firmware if smu is already running
drm/amdgpu: when suspend, set boot state instand of disable dpm.
drm/amdgpu: use failed label to handle context init failure
drm/amdgpu: add amdgpu_ttm_bo_eviction_valuable callback
drm/ttm: make eviction decision a driver callback v2
drm/ttm: fix coding style in ttm_bo_driver.h
drm/radeon/pm: autoswitch power state when in balanced mode
drm/amd/powerplay: fix spelling mistake and add KERN_WARNING to printks
drm/amdgpu:new ids flag for preempt
drm/amdgpu: mark symbols static where possible
drm/amdgpu: change function declarations and add missing header dependencies
drm/amdgpu: s/amdgpuCrtc/amdgpu_crtc/ in pageflip code
drm/amdgpu/atom: remove a bunch of unused functions
drm/amdgpu: consolidate atom scratch reg handling for hangs
drm/amdgpu: use amdgpu_bo_[create|free]_kernel for wb
drm/amdgpu: add VCE VM session tracking
drm/amdgpu: improve parse_cs handling a bit
...

+4347 -4649
+1 -1
drivers/gpu/drm/amd/amdgpu/Makefile
··· 24 24 atombios_encoders.o amdgpu_sa.o atombios_i2c.o \ 25 25 amdgpu_prime.o amdgpu_vm.o amdgpu_ib.o amdgpu_pll.o \ 26 26 amdgpu_ucode.o amdgpu_bo_list.o amdgpu_ctx.o amdgpu_sync.o \ 27 - amdgpu_gtt_mgr.o 27 + amdgpu_gtt_mgr.o amdgpu_vram_mgr.o 28 28 29 29 # add asic specific block 30 30 amdgpu-$(CONFIG_DRM_AMDGPU_CIK)+= cik.o cik_ih.o kv_smc.o kv_dpm.o \
-7
drivers/gpu/drm/amd/amdgpu/ObjectID.h
··· 90 90 #define ENCODER_OBJECT_ID_INTERNAL_VCE 0x24 91 91 #define ENCODER_OBJECT_ID_INTERNAL_UNIPHY3 0x25 92 92 #define ENCODER_OBJECT_ID_INTERNAL_AMCLK 0x27 93 - #define ENCODER_OBJECT_ID_VIRTUAL 0x28 94 93 95 94 #define ENCODER_OBJECT_ID_GENERAL_EXTERNAL_DVO 0xFF 96 95 ··· 119 120 #define CONNECTOR_OBJECT_ID_eDP 0x14 120 121 #define CONNECTOR_OBJECT_ID_MXM 0x15 121 122 #define CONNECTOR_OBJECT_ID_LVDS_eDP 0x16 122 - #define CONNECTOR_OBJECT_ID_VIRTUAL 0x17 123 123 124 124 /* deleted */ 125 125 ··· 147 149 #define GRAPH_OBJECT_ENUM_ID5 0x05 148 150 #define GRAPH_OBJECT_ENUM_ID6 0x06 149 151 #define GRAPH_OBJECT_ENUM_ID7 0x07 150 - #define GRAPH_OBJECT_ENUM_VIRTUAL 0x08 151 152 152 153 /****************************************************/ 153 154 /* Graphics Object ID Bit definition */ ··· 407 410 #define ENCODER_HDMI_ANX9805_ENUM_ID1 ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 408 411 GRAPH_OBJECT_ENUM_ID1 << ENUM_ID_SHIFT |\ 409 412 ENCODER_OBJECT_ID_HDMI_ANX9805 << OBJECT_ID_SHIFT) 410 - 411 - #define ENCODER_VIRTUAL_ENUM_VIRTUAL ( GRAPH_OBJECT_TYPE_ENCODER << OBJECT_TYPE_SHIFT |\ 412 - GRAPH_OBJECT_ENUM_VIRTUAL << ENUM_ID_SHIFT |\ 413 - ENCODER_OBJECT_ID_VIRTUAL << OBJECT_ID_SHIFT) 414 413 415 414 /****************************************************/ 416 415 /* Connector Object ID definition - Shared with BIOS */
+48 -804
drivers/gpu/drm/amd/amdgpu/amdgpu.h
··· 53 53 #include "amdgpu_ucode.h" 54 54 #include "amdgpu_ttm.h" 55 55 #include "amdgpu_gds.h" 56 + #include "amdgpu_sync.h" 57 + #include "amdgpu_ring.h" 58 + #include "amdgpu_vm.h" 56 59 #include "amd_powerplay.h" 60 + #include "amdgpu_dpm.h" 57 61 #include "amdgpu_acp.h" 58 62 59 63 #include "gpu_scheduler.h" ··· 101 97 extern int amdgpu_sclk_deep_sleep_en; 102 98 extern char *amdgpu_virtual_display; 103 99 extern unsigned amdgpu_pp_feature_mask; 100 + extern int amdgpu_vram_page_split; 104 101 105 102 #define AMDGPU_WAIT_IDLE_TIMEOUT_IN_MS 3000 106 103 #define AMDGPU_MAX_USEC_TIMEOUT 100000 /* 100 ms */ ··· 111 106 #define AMDGPU_DEBUGFS_MAX_COMPONENTS 32 112 107 #define AMDGPUFB_CONN_LIMIT 4 113 108 #define AMDGPU_BIOS_NUM_SCRATCH 8 114 - 115 - /* max number of rings */ 116 - #define AMDGPU_MAX_RINGS 16 117 - #define AMDGPU_MAX_GFX_RINGS 1 118 - #define AMDGPU_MAX_COMPUTE_RINGS 8 119 - #define AMDGPU_MAX_VCE_RINGS 3 120 109 121 110 /* max number of IP instances */ 122 111 #define AMDGPU_MAX_SDMA_INSTANCES 2 ··· 151 152 152 153 struct amdgpu_device; 153 154 struct amdgpu_ib; 154 - struct amdgpu_vm; 155 - struct amdgpu_ring; 156 155 struct amdgpu_cs_parser; 157 156 struct amdgpu_job; 158 157 struct amdgpu_irq_src; ··· 195 198 bool amdgpu_is_idle(struct amdgpu_device *adev, 196 199 enum amd_ip_block_type block_type); 197 200 201 + #define AMDGPU_MAX_IP_NUM 16 202 + 203 + struct amdgpu_ip_block_status { 204 + bool valid; 205 + bool sw; 206 + bool hw; 207 + bool late_initialized; 208 + bool hang; 209 + }; 210 + 198 211 struct amdgpu_ip_block_version { 199 - enum amd_ip_block_type type; 200 - u32 major; 201 - u32 minor; 202 - u32 rev; 212 + const enum amd_ip_block_type type; 213 + const u32 major; 214 + const u32 minor; 215 + const u32 rev; 203 216 const struct amd_ip_funcs *funcs; 217 + }; 218 + 219 + struct amdgpu_ip_block { 220 + struct amdgpu_ip_block_status status; 221 + const struct amdgpu_ip_block_version *version; 204 222 }; 205 223 206 224 int amdgpu_ip_block_version_cmp(struct amdgpu_device *adev, 207 225 enum amd_ip_block_type type, 208 226 u32 major, u32 minor); 209 227 210 - const struct amdgpu_ip_block_version * amdgpu_get_ip_block( 211 - struct amdgpu_device *adev, 212 - enum amd_ip_block_type type); 228 + struct amdgpu_ip_block * amdgpu_get_ip_block(struct amdgpu_device *adev, 229 + enum amd_ip_block_type type); 230 + 231 + int amdgpu_ip_block_add(struct amdgpu_device *adev, 232 + const struct amdgpu_ip_block_version *ip_block_version); 213 233 214 234 /* provided by hw blocks that can move/clear data. e.g., gfx or sdma */ 215 235 struct amdgpu_buffer_funcs { ··· 300 286 void (*set_rptr)(struct amdgpu_device *adev); 301 287 }; 302 288 303 - /* provided by hw blocks that expose a ring buffer for commands */ 304 - struct amdgpu_ring_funcs { 305 - /* ring read/write ptr handling */ 306 - u32 (*get_rptr)(struct amdgpu_ring *ring); 307 - u32 (*get_wptr)(struct amdgpu_ring *ring); 308 - void (*set_wptr)(struct amdgpu_ring *ring); 309 - /* validating and patching of IBs */ 310 - int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx); 311 - /* command emit functions */ 312 - void (*emit_ib)(struct amdgpu_ring *ring, 313 - struct amdgpu_ib *ib, 314 - unsigned vm_id, bool ctx_switch); 315 - void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr, 316 - uint64_t seq, unsigned flags); 317 - void (*emit_pipeline_sync)(struct amdgpu_ring *ring); 318 - void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, 319 - uint64_t pd_addr); 320 - void (*emit_hdp_flush)(struct amdgpu_ring *ring); 321 - void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); 322 - void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, 323 - uint32_t gds_base, uint32_t gds_size, 324 - uint32_t gws_base, uint32_t gws_size, 325 - uint32_t oa_base, uint32_t oa_size); 326 - /* testing functions */ 327 - int (*test_ring)(struct amdgpu_ring *ring); 328 - int (*test_ib)(struct amdgpu_ring *ring, long timeout); 329 - /* insert NOP packets */ 330 - void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count); 331 - /* pad the indirect buffer to the necessary number of dw */ 332 - void (*pad_ib)(struct amdgpu_ring *ring, struct amdgpu_ib *ib); 333 - unsigned (*init_cond_exec)(struct amdgpu_ring *ring); 334 - void (*patch_cond_exec)(struct amdgpu_ring *ring, unsigned offset); 335 - /* note usage for clock and power gating */ 336 - void (*begin_use)(struct amdgpu_ring *ring); 337 - void (*end_use)(struct amdgpu_ring *ring); 338 - void (*emit_switch_buffer) (struct amdgpu_ring *ring); 339 - void (*emit_cntxcntl) (struct amdgpu_ring *ring, uint32_t flags); 340 - unsigned (*get_emit_ib_size) (struct amdgpu_ring *ring); 341 - unsigned (*get_dma_frame_size) (struct amdgpu_ring *ring); 342 - }; 343 - 344 289 /* 345 290 * BIOS. 346 291 */ ··· 335 362 uint32_t dp_extclk; 336 363 uint32_t max_pixel_clock; 337 364 }; 338 - 339 - /* 340 - * Fences. 341 - */ 342 - struct amdgpu_fence_driver { 343 - uint64_t gpu_addr; 344 - volatile uint32_t *cpu_addr; 345 - /* sync_seq is protected by ring emission lock */ 346 - uint32_t sync_seq; 347 - atomic_t last_seq; 348 - bool initialized; 349 - struct amdgpu_irq_src *irq_src; 350 - unsigned irq_type; 351 - struct timer_list fallback_timer; 352 - unsigned num_fences_mask; 353 - spinlock_t lock; 354 - struct fence **fences; 355 - }; 356 - 357 - /* some special values for the owner field */ 358 - #define AMDGPU_FENCE_OWNER_UNDEFINED ((void*)0ul) 359 - #define AMDGPU_FENCE_OWNER_VM ((void*)1ul) 360 - 361 - #define AMDGPU_FENCE_FLAG_64BIT (1 << 0) 362 - #define AMDGPU_FENCE_FLAG_INT (1 << 1) 363 - 364 - int amdgpu_fence_driver_init(struct amdgpu_device *adev); 365 - void amdgpu_fence_driver_fini(struct amdgpu_device *adev); 366 - void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); 367 - 368 - int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring, 369 - unsigned num_hw_submission); 370 - int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, 371 - struct amdgpu_irq_src *irq_src, 372 - unsigned irq_type); 373 - void amdgpu_fence_driver_suspend(struct amdgpu_device *adev); 374 - void amdgpu_fence_driver_resume(struct amdgpu_device *adev); 375 - int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **fence); 376 - void amdgpu_fence_process(struct amdgpu_ring *ring); 377 - int amdgpu_fence_wait_empty(struct amdgpu_ring *ring); 378 - unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring); 379 365 380 366 /* 381 367 * BO. ··· 396 464 */ 397 465 struct list_head va; 398 466 /* Constant after initialization */ 399 - struct amdgpu_device *adev; 400 467 struct drm_gem_object gem_base; 401 468 struct amdgpu_bo *parent; 402 469 struct amdgpu_bo *shadow; ··· 492 561 int amdgpu_mode_dumb_mmap(struct drm_file *filp, 493 562 struct drm_device *dev, 494 563 uint32_t handle, uint64_t *offset_p); 495 - /* 496 - * Synchronization 497 - */ 498 - struct amdgpu_sync { 499 - DECLARE_HASHTABLE(fences, 4); 500 - struct fence *last_vm_update; 501 - }; 502 - 503 - void amdgpu_sync_create(struct amdgpu_sync *sync); 504 - int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync, 505 - struct fence *f); 506 - int amdgpu_sync_resv(struct amdgpu_device *adev, 507 - struct amdgpu_sync *sync, 508 - struct reservation_object *resv, 509 - void *owner); 510 - struct fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync, 511 - struct amdgpu_ring *ring); 512 - struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync); 513 - void amdgpu_sync_free(struct amdgpu_sync *sync); 514 - int amdgpu_sync_init(void); 515 - void amdgpu_sync_fini(void); 516 564 int amdgpu_fence_slab_init(void); 517 565 void amdgpu_fence_slab_fini(void); 518 566 ··· 633 723 uint32_t flags; 634 724 }; 635 725 636 - enum amdgpu_ring_type { 637 - AMDGPU_RING_TYPE_GFX, 638 - AMDGPU_RING_TYPE_COMPUTE, 639 - AMDGPU_RING_TYPE_SDMA, 640 - AMDGPU_RING_TYPE_UVD, 641 - AMDGPU_RING_TYPE_VCE 642 - }; 643 - 644 726 extern const struct amd_sched_backend_ops amdgpu_sched_ops; 645 727 646 728 int amdgpu_job_alloc(struct amdgpu_device *adev, unsigned num_ibs, ··· 645 743 int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, 646 744 struct amd_sched_entity *entity, void *owner, 647 745 struct fence **f); 648 - 649 - struct amdgpu_ring { 650 - struct amdgpu_device *adev; 651 - const struct amdgpu_ring_funcs *funcs; 652 - struct amdgpu_fence_driver fence_drv; 653 - struct amd_gpu_scheduler sched; 654 - 655 - struct amdgpu_bo *ring_obj; 656 - volatile uint32_t *ring; 657 - unsigned rptr_offs; 658 - unsigned wptr; 659 - unsigned wptr_old; 660 - unsigned ring_size; 661 - unsigned max_dw; 662 - int count_dw; 663 - uint64_t gpu_addr; 664 - uint32_t align_mask; 665 - uint32_t ptr_mask; 666 - bool ready; 667 - u32 nop; 668 - u32 idx; 669 - u32 me; 670 - u32 pipe; 671 - u32 queue; 672 - struct amdgpu_bo *mqd_obj; 673 - u32 doorbell_index; 674 - bool use_doorbell; 675 - unsigned wptr_offs; 676 - unsigned fence_offs; 677 - uint64_t current_ctx; 678 - enum amdgpu_ring_type type; 679 - char name[16]; 680 - unsigned cond_exe_offs; 681 - u64 cond_exe_gpu_addr; 682 - volatile u32 *cond_exe_cpu_addr; 683 - #if defined(CONFIG_DEBUG_FS) 684 - struct dentry *ent; 685 - #endif 686 - }; 687 - 688 - /* 689 - * VM 690 - */ 691 - 692 - /* maximum number of VMIDs */ 693 - #define AMDGPU_NUM_VM 16 694 - 695 - /* Maximum number of PTEs the hardware can write with one command */ 696 - #define AMDGPU_VM_MAX_UPDATE_SIZE 0x3FFFF 697 - 698 - /* number of entries in page table */ 699 - #define AMDGPU_VM_PTE_COUNT (1 << amdgpu_vm_block_size) 700 - 701 - /* PTBs (Page Table Blocks) need to be aligned to 32K */ 702 - #define AMDGPU_VM_PTB_ALIGN_SIZE 32768 703 - 704 - /* LOG2 number of continuous pages for the fragment field */ 705 - #define AMDGPU_LOG2_PAGES_PER_FRAG 4 706 - 707 - #define AMDGPU_PTE_VALID (1 << 0) 708 - #define AMDGPU_PTE_SYSTEM (1 << 1) 709 - #define AMDGPU_PTE_SNOOPED (1 << 2) 710 - 711 - /* VI only */ 712 - #define AMDGPU_PTE_EXECUTABLE (1 << 4) 713 - 714 - #define AMDGPU_PTE_READABLE (1 << 5) 715 - #define AMDGPU_PTE_WRITEABLE (1 << 6) 716 - 717 - #define AMDGPU_PTE_FRAG(x) ((x & 0x1f) << 7) 718 - 719 - /* How to programm VM fault handling */ 720 - #define AMDGPU_VM_FAULT_STOP_NEVER 0 721 - #define AMDGPU_VM_FAULT_STOP_FIRST 1 722 - #define AMDGPU_VM_FAULT_STOP_ALWAYS 2 723 - 724 - struct amdgpu_vm_pt { 725 - struct amdgpu_bo_list_entry entry; 726 - uint64_t addr; 727 - uint64_t shadow_addr; 728 - }; 729 - 730 - struct amdgpu_vm { 731 - /* tree of virtual addresses mapped */ 732 - struct rb_root va; 733 - 734 - /* protecting invalidated */ 735 - spinlock_t status_lock; 736 - 737 - /* BOs moved, but not yet updated in the PT */ 738 - struct list_head invalidated; 739 - 740 - /* BOs cleared in the PT because of a move */ 741 - struct list_head cleared; 742 - 743 - /* BO mappings freed, but not yet updated in the PT */ 744 - struct list_head freed; 745 - 746 - /* contains the page directory */ 747 - struct amdgpu_bo *page_directory; 748 - unsigned max_pde_used; 749 - struct fence *page_directory_fence; 750 - uint64_t last_eviction_counter; 751 - 752 - /* array of page tables, one for each page directory entry */ 753 - struct amdgpu_vm_pt *page_tables; 754 - 755 - /* for id and flush management per ring */ 756 - struct amdgpu_vm_id *ids[AMDGPU_MAX_RINGS]; 757 - 758 - /* protecting freed */ 759 - spinlock_t freed_lock; 760 - 761 - /* Scheduler entity for page table updates */ 762 - struct amd_sched_entity entity; 763 - 764 - /* client id */ 765 - u64 client_id; 766 - }; 767 - 768 - struct amdgpu_vm_id { 769 - struct list_head list; 770 - struct fence *first; 771 - struct amdgpu_sync active; 772 - struct fence *last_flush; 773 - atomic64_t owner; 774 - 775 - uint64_t pd_gpu_addr; 776 - /* last flushed PD/PT update */ 777 - struct fence *flushed_updates; 778 - 779 - uint32_t current_gpu_reset_count; 780 - 781 - uint32_t gds_base; 782 - uint32_t gds_size; 783 - uint32_t gws_base; 784 - uint32_t gws_size; 785 - uint32_t oa_base; 786 - uint32_t oa_size; 787 - }; 788 - 789 - struct amdgpu_vm_manager { 790 - /* Handling of VMIDs */ 791 - struct mutex lock; 792 - unsigned num_ids; 793 - struct list_head ids_lru; 794 - struct amdgpu_vm_id ids[AMDGPU_NUM_VM]; 795 - 796 - /* Handling of VM fences */ 797 - u64 fence_context; 798 - unsigned seqno[AMDGPU_MAX_RINGS]; 799 - 800 - uint32_t max_pfn; 801 - /* vram base address for page table entry */ 802 - u64 vram_base_offset; 803 - /* is vm enabled? */ 804 - bool enabled; 805 - /* vm pte handling */ 806 - const struct amdgpu_vm_pte_funcs *vm_pte_funcs; 807 - struct amdgpu_ring *vm_pte_rings[AMDGPU_MAX_RINGS]; 808 - unsigned vm_pte_num_rings; 809 - atomic_t vm_pte_next_ring; 810 - /* client id counter */ 811 - atomic64_t client_counter; 812 - }; 813 - 814 - void amdgpu_vm_manager_init(struct amdgpu_device *adev); 815 - void amdgpu_vm_manager_fini(struct amdgpu_device *adev); 816 - int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm); 817 - void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); 818 - void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, 819 - struct list_head *validated, 820 - struct amdgpu_bo_list_entry *entry); 821 - void amdgpu_vm_get_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, 822 - struct list_head *duplicates); 823 - void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev, 824 - struct amdgpu_vm *vm); 825 - int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, 826 - struct amdgpu_sync *sync, struct fence *fence, 827 - struct amdgpu_job *job); 828 - int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); 829 - void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id); 830 - int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, 831 - struct amdgpu_vm *vm); 832 - int amdgpu_vm_clear_freed(struct amdgpu_device *adev, 833 - struct amdgpu_vm *vm); 834 - int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm, 835 - struct amdgpu_sync *sync); 836 - int amdgpu_vm_bo_update(struct amdgpu_device *adev, 837 - struct amdgpu_bo_va *bo_va, 838 - bool clear); 839 - void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, 840 - struct amdgpu_bo *bo); 841 - struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm, 842 - struct amdgpu_bo *bo); 843 - struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev, 844 - struct amdgpu_vm *vm, 845 - struct amdgpu_bo *bo); 846 - int amdgpu_vm_bo_map(struct amdgpu_device *adev, 847 - struct amdgpu_bo_va *bo_va, 848 - uint64_t addr, uint64_t offset, 849 - uint64_t size, uint32_t flags); 850 - int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, 851 - struct amdgpu_bo_va *bo_va, 852 - uint64_t addr); 853 - void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, 854 - struct amdgpu_bo_va *bo_va); 855 746 856 747 /* 857 748 * context related structures ··· 788 1093 /* 789 1094 * GFX configurations 790 1095 */ 1096 + #define AMDGPU_GFX_MAX_SE 4 1097 + #define AMDGPU_GFX_MAX_SH_PER_SE 2 1098 + 1099 + struct amdgpu_rb_config { 1100 + uint32_t rb_backend_disable; 1101 + uint32_t user_rb_backend_disable; 1102 + uint32_t raster_config; 1103 + uint32_t raster_config_1; 1104 + }; 1105 + 791 1106 struct amdgpu_gca_config { 792 1107 unsigned max_shader_engines; 793 1108 unsigned max_tile_pipes; ··· 826 1121 827 1122 uint32_t tile_mode_array[32]; 828 1123 uint32_t macrotile_mode_array[16]; 1124 + 1125 + struct amdgpu_rb_config rb_config[AMDGPU_GFX_MAX_SE][AMDGPU_GFX_MAX_SH_PER_SE]; 829 1126 }; 830 1127 831 1128 struct amdgpu_cu_info { ··· 840 1133 /* get the gpu clock counter */ 841 1134 uint64_t (*get_gpu_clock_counter)(struct amdgpu_device *adev); 842 1135 void (*select_se_sh)(struct amdgpu_device *adev, u32 se_num, u32 sh_num, u32 instance); 1136 + void (*read_wave_data)(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields); 843 1137 }; 844 1138 845 1139 struct amdgpu_gfx { ··· 896 1188 int amdgpu_ib_pool_init(struct amdgpu_device *adev); 897 1189 void amdgpu_ib_pool_fini(struct amdgpu_device *adev); 898 1190 int amdgpu_ib_ring_tests(struct amdgpu_device *adev); 899 - int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw); 900 - void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count); 901 - void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib); 902 - void amdgpu_ring_commit(struct amdgpu_ring *ring); 903 - void amdgpu_ring_undo(struct amdgpu_ring *ring); 904 - int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, 905 - unsigned ring_size, u32 nop, u32 align_mask, 906 - struct amdgpu_irq_src *irq_src, unsigned irq_type, 907 - enum amdgpu_ring_type ring_type); 908 - void amdgpu_ring_fini(struct amdgpu_ring *ring); 909 1191 910 1192 /* 911 1193 * CS. ··· 991 1293 992 1294 int amdgpu_wb_get(struct amdgpu_device *adev, u32 *wb); 993 1295 void amdgpu_wb_free(struct amdgpu_device *adev, u32 wb); 994 - 995 - 996 - 997 - enum amdgpu_int_thermal_type { 998 - THERMAL_TYPE_NONE, 999 - THERMAL_TYPE_EXTERNAL, 1000 - THERMAL_TYPE_EXTERNAL_GPIO, 1001 - THERMAL_TYPE_RV6XX, 1002 - THERMAL_TYPE_RV770, 1003 - THERMAL_TYPE_ADT7473_WITH_INTERNAL, 1004 - THERMAL_TYPE_EVERGREEN, 1005 - THERMAL_TYPE_SUMO, 1006 - THERMAL_TYPE_NI, 1007 - THERMAL_TYPE_SI, 1008 - THERMAL_TYPE_EMC2103_WITH_INTERNAL, 1009 - THERMAL_TYPE_CI, 1010 - THERMAL_TYPE_KV, 1011 - }; 1012 - 1013 - enum amdgpu_dpm_auto_throttle_src { 1014 - AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, 1015 - AMDGPU_DPM_AUTO_THROTTLE_SRC_EXTERNAL 1016 - }; 1017 - 1018 - enum amdgpu_dpm_event_src { 1019 - AMDGPU_DPM_EVENT_SRC_ANALOG = 0, 1020 - AMDGPU_DPM_EVENT_SRC_EXTERNAL = 1, 1021 - AMDGPU_DPM_EVENT_SRC_DIGITAL = 2, 1022 - AMDGPU_DPM_EVENT_SRC_ANALOG_OR_EXTERNAL = 3, 1023 - AMDGPU_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL = 4 1024 - }; 1025 - 1026 - #define AMDGPU_MAX_VCE_LEVELS 6 1027 - 1028 - enum amdgpu_vce_level { 1029 - AMDGPU_VCE_LEVEL_AC_ALL = 0, /* AC, All cases */ 1030 - AMDGPU_VCE_LEVEL_DC_EE = 1, /* DC, entropy encoding */ 1031 - AMDGPU_VCE_LEVEL_DC_LL_LOW = 2, /* DC, low latency queue, res <= 720 */ 1032 - AMDGPU_VCE_LEVEL_DC_LL_HIGH = 3, /* DC, low latency queue, 1080 >= res > 720 */ 1033 - AMDGPU_VCE_LEVEL_DC_GP_LOW = 4, /* DC, general purpose queue, res <= 720 */ 1034 - AMDGPU_VCE_LEVEL_DC_GP_HIGH = 5, /* DC, general purpose queue, 1080 >= res > 720 */ 1035 - }; 1036 - 1037 - struct amdgpu_ps { 1038 - u32 caps; /* vbios flags */ 1039 - u32 class; /* vbios flags */ 1040 - u32 class2; /* vbios flags */ 1041 - /* UVD clocks */ 1042 - u32 vclk; 1043 - u32 dclk; 1044 - /* VCE clocks */ 1045 - u32 evclk; 1046 - u32 ecclk; 1047 - bool vce_active; 1048 - enum amdgpu_vce_level vce_level; 1049 - /* asic priv */ 1050 - void *ps_priv; 1051 - }; 1052 - 1053 - struct amdgpu_dpm_thermal { 1054 - /* thermal interrupt work */ 1055 - struct work_struct work; 1056 - /* low temperature threshold */ 1057 - int min_temp; 1058 - /* high temperature threshold */ 1059 - int max_temp; 1060 - /* was last interrupt low to high or high to low */ 1061 - bool high_to_low; 1062 - /* interrupt source */ 1063 - struct amdgpu_irq_src irq; 1064 - }; 1065 - 1066 - enum amdgpu_clk_action 1067 - { 1068 - AMDGPU_SCLK_UP = 1, 1069 - AMDGPU_SCLK_DOWN 1070 - }; 1071 - 1072 - struct amdgpu_blacklist_clocks 1073 - { 1074 - u32 sclk; 1075 - u32 mclk; 1076 - enum amdgpu_clk_action action; 1077 - }; 1078 - 1079 - struct amdgpu_clock_and_voltage_limits { 1080 - u32 sclk; 1081 - u32 mclk; 1082 - u16 vddc; 1083 - u16 vddci; 1084 - }; 1085 - 1086 - struct amdgpu_clock_array { 1087 - u32 count; 1088 - u32 *values; 1089 - }; 1090 - 1091 - struct amdgpu_clock_voltage_dependency_entry { 1092 - u32 clk; 1093 - u16 v; 1094 - }; 1095 - 1096 - struct amdgpu_clock_voltage_dependency_table { 1097 - u32 count; 1098 - struct amdgpu_clock_voltage_dependency_entry *entries; 1099 - }; 1100 - 1101 - union amdgpu_cac_leakage_entry { 1102 - struct { 1103 - u16 vddc; 1104 - u32 leakage; 1105 - }; 1106 - struct { 1107 - u16 vddc1; 1108 - u16 vddc2; 1109 - u16 vddc3; 1110 - }; 1111 - }; 1112 - 1113 - struct amdgpu_cac_leakage_table { 1114 - u32 count; 1115 - union amdgpu_cac_leakage_entry *entries; 1116 - }; 1117 - 1118 - struct amdgpu_phase_shedding_limits_entry { 1119 - u16 voltage; 1120 - u32 sclk; 1121 - u32 mclk; 1122 - }; 1123 - 1124 - struct amdgpu_phase_shedding_limits_table { 1125 - u32 count; 1126 - struct amdgpu_phase_shedding_limits_entry *entries; 1127 - }; 1128 - 1129 - struct amdgpu_uvd_clock_voltage_dependency_entry { 1130 - u32 vclk; 1131 - u32 dclk; 1132 - u16 v; 1133 - }; 1134 - 1135 - struct amdgpu_uvd_clock_voltage_dependency_table { 1136 - u8 count; 1137 - struct amdgpu_uvd_clock_voltage_dependency_entry *entries; 1138 - }; 1139 - 1140 - struct amdgpu_vce_clock_voltage_dependency_entry { 1141 - u32 ecclk; 1142 - u32 evclk; 1143 - u16 v; 1144 - }; 1145 - 1146 - struct amdgpu_vce_clock_voltage_dependency_table { 1147 - u8 count; 1148 - struct amdgpu_vce_clock_voltage_dependency_entry *entries; 1149 - }; 1150 - 1151 - struct amdgpu_ppm_table { 1152 - u8 ppm_design; 1153 - u16 cpu_core_number; 1154 - u32 platform_tdp; 1155 - u32 small_ac_platform_tdp; 1156 - u32 platform_tdc; 1157 - u32 small_ac_platform_tdc; 1158 - u32 apu_tdp; 1159 - u32 dgpu_tdp; 1160 - u32 dgpu_ulv_power; 1161 - u32 tj_max; 1162 - }; 1163 - 1164 - struct amdgpu_cac_tdp_table { 1165 - u16 tdp; 1166 - u16 configurable_tdp; 1167 - u16 tdc; 1168 - u16 battery_power_limit; 1169 - u16 small_power_limit; 1170 - u16 low_cac_leakage; 1171 - u16 high_cac_leakage; 1172 - u16 maximum_power_delivery_limit; 1173 - }; 1174 - 1175 - struct amdgpu_dpm_dynamic_state { 1176 - struct amdgpu_clock_voltage_dependency_table vddc_dependency_on_sclk; 1177 - struct amdgpu_clock_voltage_dependency_table vddci_dependency_on_mclk; 1178 - struct amdgpu_clock_voltage_dependency_table vddc_dependency_on_mclk; 1179 - struct amdgpu_clock_voltage_dependency_table mvdd_dependency_on_mclk; 1180 - struct amdgpu_clock_voltage_dependency_table vddc_dependency_on_dispclk; 1181 - struct amdgpu_uvd_clock_voltage_dependency_table uvd_clock_voltage_dependency_table; 1182 - struct amdgpu_vce_clock_voltage_dependency_table vce_clock_voltage_dependency_table; 1183 - struct amdgpu_clock_voltage_dependency_table samu_clock_voltage_dependency_table; 1184 - struct amdgpu_clock_voltage_dependency_table acp_clock_voltage_dependency_table; 1185 - struct amdgpu_clock_voltage_dependency_table vddgfx_dependency_on_sclk; 1186 - struct amdgpu_clock_array valid_sclk_values; 1187 - struct amdgpu_clock_array valid_mclk_values; 1188 - struct amdgpu_clock_and_voltage_limits max_clock_voltage_on_dc; 1189 - struct amdgpu_clock_and_voltage_limits max_clock_voltage_on_ac; 1190 - u32 mclk_sclk_ratio; 1191 - u32 sclk_mclk_delta; 1192 - u16 vddc_vddci_delta; 1193 - u16 min_vddc_for_pcie_gen2; 1194 - struct amdgpu_cac_leakage_table cac_leakage_table; 1195 - struct amdgpu_phase_shedding_limits_table phase_shedding_limits_table; 1196 - struct amdgpu_ppm_table *ppm_table; 1197 - struct amdgpu_cac_tdp_table *cac_tdp_table; 1198 - }; 1199 - 1200 - struct amdgpu_dpm_fan { 1201 - u16 t_min; 1202 - u16 t_med; 1203 - u16 t_high; 1204 - u16 pwm_min; 1205 - u16 pwm_med; 1206 - u16 pwm_high; 1207 - u8 t_hyst; 1208 - u32 cycle_delay; 1209 - u16 t_max; 1210 - u8 control_mode; 1211 - u16 default_max_fan_pwm; 1212 - u16 default_fan_output_sensitivity; 1213 - u16 fan_output_sensitivity; 1214 - bool ucode_fan_control; 1215 - }; 1216 - 1217 - enum amdgpu_pcie_gen { 1218 - AMDGPU_PCIE_GEN1 = 0, 1219 - AMDGPU_PCIE_GEN2 = 1, 1220 - AMDGPU_PCIE_GEN3 = 2, 1221 - AMDGPU_PCIE_GEN_INVALID = 0xffff 1222 - }; 1223 - 1224 - enum amdgpu_dpm_forced_level { 1225 - AMDGPU_DPM_FORCED_LEVEL_AUTO = 0, 1226 - AMDGPU_DPM_FORCED_LEVEL_LOW = 1, 1227 - AMDGPU_DPM_FORCED_LEVEL_HIGH = 2, 1228 - AMDGPU_DPM_FORCED_LEVEL_MANUAL = 3, 1229 - }; 1230 - 1231 - struct amdgpu_vce_state { 1232 - /* vce clocks */ 1233 - u32 evclk; 1234 - u32 ecclk; 1235 - /* gpu clocks */ 1236 - u32 sclk; 1237 - u32 mclk; 1238 - u8 clk_idx; 1239 - u8 pstate; 1240 - }; 1241 - 1242 - struct amdgpu_dpm_funcs { 1243 - int (*get_temperature)(struct amdgpu_device *adev); 1244 - int (*pre_set_power_state)(struct amdgpu_device *adev); 1245 - int (*set_power_state)(struct amdgpu_device *adev); 1246 - void (*post_set_power_state)(struct amdgpu_device *adev); 1247 - void (*display_configuration_changed)(struct amdgpu_device *adev); 1248 - u32 (*get_sclk)(struct amdgpu_device *adev, bool low); 1249 - u32 (*get_mclk)(struct amdgpu_device *adev, bool low); 1250 - void (*print_power_state)(struct amdgpu_device *adev, struct amdgpu_ps *ps); 1251 - void (*debugfs_print_current_performance_level)(struct amdgpu_device *adev, struct seq_file *m); 1252 - int (*force_performance_level)(struct amdgpu_device *adev, enum amdgpu_dpm_forced_level level); 1253 - bool (*vblank_too_short)(struct amdgpu_device *adev); 1254 - void (*powergate_uvd)(struct amdgpu_device *adev, bool gate); 1255 - void (*powergate_vce)(struct amdgpu_device *adev, bool gate); 1256 - void (*enable_bapm)(struct amdgpu_device *adev, bool enable); 1257 - void (*set_fan_control_mode)(struct amdgpu_device *adev, u32 mode); 1258 - u32 (*get_fan_control_mode)(struct amdgpu_device *adev); 1259 - int (*set_fan_speed_percent)(struct amdgpu_device *adev, u32 speed); 1260 - int (*get_fan_speed_percent)(struct amdgpu_device *adev, u32 *speed); 1261 - int (*force_clock_level)(struct amdgpu_device *adev, enum pp_clock_type type, uint32_t mask); 1262 - int (*print_clock_levels)(struct amdgpu_device *adev, enum pp_clock_type type, char *buf); 1263 - int (*get_sclk_od)(struct amdgpu_device *adev); 1264 - int (*set_sclk_od)(struct amdgpu_device *adev, uint32_t value); 1265 - int (*get_mclk_od)(struct amdgpu_device *adev); 1266 - int (*set_mclk_od)(struct amdgpu_device *adev, uint32_t value); 1267 - }; 1268 - 1269 - struct amdgpu_dpm { 1270 - struct amdgpu_ps *ps; 1271 - /* number of valid power states */ 1272 - int num_ps; 1273 - /* current power state that is active */ 1274 - struct amdgpu_ps *current_ps; 1275 - /* requested power state */ 1276 - struct amdgpu_ps *requested_ps; 1277 - /* boot up power state */ 1278 - struct amdgpu_ps *boot_ps; 1279 - /* default uvd power state */ 1280 - struct amdgpu_ps *uvd_ps; 1281 - /* vce requirements */ 1282 - struct amdgpu_vce_state vce_states[AMDGPU_MAX_VCE_LEVELS]; 1283 - enum amdgpu_vce_level vce_level; 1284 - enum amd_pm_state_type state; 1285 - enum amd_pm_state_type user_state; 1286 - u32 platform_caps; 1287 - u32 voltage_response_time; 1288 - u32 backbias_response_time; 1289 - void *priv; 1290 - u32 new_active_crtcs; 1291 - int new_active_crtc_count; 1292 - u32 current_active_crtcs; 1293 - int current_active_crtc_count; 1294 - struct amdgpu_dpm_dynamic_state dyn_state; 1295 - struct amdgpu_dpm_fan fan; 1296 - u32 tdp_limit; 1297 - u32 near_tdp_limit; 1298 - u32 near_tdp_limit_adjusted; 1299 - u32 sq_ramping_threshold; 1300 - u32 cac_leakage; 1301 - u16 tdp_od_limit; 1302 - u32 tdp_adjustment; 1303 - u16 load_line_slope; 1304 - bool power_control; 1305 - bool ac_power; 1306 - /* special states active */ 1307 - bool thermal_active; 1308 - bool uvd_active; 1309 - bool vce_active; 1310 - /* thermal handling */ 1311 - struct amdgpu_dpm_thermal thermal; 1312 - /* forced levels */ 1313 - enum amdgpu_dpm_forced_level forced_level; 1314 - }; 1315 - 1316 - struct amdgpu_pm { 1317 - struct mutex mutex; 1318 - u32 current_sclk; 1319 - u32 current_mclk; 1320 - u32 default_sclk; 1321 - u32 default_mclk; 1322 - struct amdgpu_i2c_chan *i2c_bus; 1323 - /* internal thermal controller on rv6xx+ */ 1324 - enum amdgpu_int_thermal_type int_thermal_type; 1325 - struct device *int_hwmon_dev; 1326 - /* fan control parameters */ 1327 - bool no_fan; 1328 - u8 fan_pulses_per_revolution; 1329 - u8 fan_min_rpm; 1330 - u8 fan_max_rpm; 1331 - /* dpm */ 1332 - bool dpm_enabled; 1333 - bool sysfs_initialized; 1334 - struct amdgpu_dpm dpm; 1335 - const struct firmware *fw; /* SMC firmware */ 1336 - uint32_t fw_version; 1337 - const struct amdgpu_dpm_funcs *funcs; 1338 - uint32_t pcie_gen_mask; 1339 - uint32_t pcie_mlw_mask; 1340 - struct amd_pp_display_configuration pm_display_cfg;/* set by DAL */ 1341 - }; 1342 1296 1343 1297 void amdgpu_get_pcie_info(struct amdgpu_device *adev); 1344 1298 ··· 1289 1939 typedef uint32_t (*amdgpu_block_rreg_t)(struct amdgpu_device*, uint32_t, uint32_t); 1290 1940 typedef void (*amdgpu_block_wreg_t)(struct amdgpu_device*, uint32_t, uint32_t, uint32_t); 1291 1941 1292 - struct amdgpu_ip_block_status { 1293 - bool valid; 1294 - bool sw; 1295 - bool hw; 1296 - bool late_initialized; 1297 - bool hang; 1298 - }; 1299 - 1300 1942 struct amdgpu_device { 1301 1943 struct device *dev; 1302 1944 struct drm_device *ddev; ··· 1444 2102 /* GDS */ 1445 2103 struct amdgpu_gds gds; 1446 2104 1447 - const struct amdgpu_ip_block_version *ip_blocks; 2105 + struct amdgpu_ip_block ip_blocks[AMDGPU_MAX_IP_NUM]; 1448 2106 int num_ip_blocks; 1449 - struct amdgpu_ip_block_status *ip_block_status; 1450 2107 struct mutex mn_lock; 1451 2108 DECLARE_HASHTABLE(mn_hash, 7); 1452 2109 ··· 1467 2126 struct list_head gtt_list; 1468 2127 1469 2128 }; 2129 + 2130 + static inline struct amdgpu_device *amdgpu_ttm_adev(struct ttm_bo_device *bdev) 2131 + { 2132 + return container_of(bdev, struct amdgpu_device, mman.bdev); 2133 + } 1470 2134 1471 2135 bool amdgpu_device_is_px(struct drm_device *dev); 1472 2136 int amdgpu_device_init(struct amdgpu_device *adev, ··· 1624 2278 #define amdgpu_ring_pad_ib(r, ib) ((r)->funcs->pad_ib((r), (ib))) 1625 2279 #define amdgpu_ring_init_cond_exec(r) (r)->funcs->init_cond_exec((r)) 1626 2280 #define amdgpu_ring_patch_cond_exec(r,o) (r)->funcs->patch_cond_exec((r),(o)) 1627 - #define amdgpu_ring_get_emit_ib_size(r) (r)->funcs->get_emit_ib_size((r)) 1628 - #define amdgpu_ring_get_dma_frame_size(r) (r)->funcs->get_dma_frame_size((r)) 1629 2281 #define amdgpu_ih_get_wptr(adev) (adev)->irq.ih_funcs->get_wptr((adev)) 1630 2282 #define amdgpu_ih_decode_iv(adev, iv) (adev)->irq.ih_funcs->decode_iv((adev), (iv)) 1631 2283 #define amdgpu_ih_set_rptr(adev) (adev)->irq.ih_funcs->set_rptr((adev)) ··· 1645 2301 #define amdgpu_display_resume_mc_access(adev, s) (adev)->mode_info.funcs->resume_mc_access((adev), (s)) 1646 2302 #define amdgpu_emit_copy_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_copy_buffer((ib), (s), (d), (b)) 1647 2303 #define amdgpu_emit_fill_buffer(adev, ib, s, d, b) (adev)->mman.buffer_funcs->emit_fill_buffer((ib), (s), (d), (b)) 1648 - #define amdgpu_dpm_pre_set_power_state(adev) (adev)->pm.funcs->pre_set_power_state((adev)) 1649 - #define amdgpu_dpm_set_power_state(adev) (adev)->pm.funcs->set_power_state((adev)) 1650 - #define amdgpu_dpm_post_set_power_state(adev) (adev)->pm.funcs->post_set_power_state((adev)) 1651 - #define amdgpu_dpm_display_configuration_changed(adev) (adev)->pm.funcs->display_configuration_changed((adev)) 1652 - #define amdgpu_dpm_print_power_state(adev, ps) (adev)->pm.funcs->print_power_state((adev), (ps)) 1653 - #define amdgpu_dpm_vblank_too_short(adev) (adev)->pm.funcs->vblank_too_short((adev)) 1654 - #define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e)) 1655 2304 #define amdgpu_gfx_get_gpu_clock_counter(adev) (adev)->gfx.funcs->get_gpu_clock_counter((adev)) 1656 2305 #define amdgpu_gfx_select_se_sh(adev, se, sh, instance) (adev)->gfx.funcs->select_se_sh((adev), (se), (sh), (instance)) 1657 - 1658 - #define amdgpu_dpm_read_sensor(adev, idx, value) \ 1659 - ((adev)->pp_enabled ? \ 1660 - (adev)->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, (idx), (value)) : \ 1661 - -EINVAL) 1662 - 1663 - #define amdgpu_dpm_get_temperature(adev) \ 1664 - ((adev)->pp_enabled ? \ 1665 - (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ 1666 - (adev)->pm.funcs->get_temperature((adev))) 1667 - 1668 - #define amdgpu_dpm_set_fan_control_mode(adev, m) \ 1669 - ((adev)->pp_enabled ? \ 1670 - (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \ 1671 - (adev)->pm.funcs->set_fan_control_mode((adev), (m))) 1672 - 1673 - #define amdgpu_dpm_get_fan_control_mode(adev) \ 1674 - ((adev)->pp_enabled ? \ 1675 - (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \ 1676 - (adev)->pm.funcs->get_fan_control_mode((adev))) 1677 - 1678 - #define amdgpu_dpm_set_fan_speed_percent(adev, s) \ 1679 - ((adev)->pp_enabled ? \ 1680 - (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 1681 - (adev)->pm.funcs->set_fan_speed_percent((adev), (s))) 1682 - 1683 - #define amdgpu_dpm_get_fan_speed_percent(adev, s) \ 1684 - ((adev)->pp_enabled ? \ 1685 - (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 1686 - (adev)->pm.funcs->get_fan_speed_percent((adev), (s))) 1687 - 1688 - #define amdgpu_dpm_get_sclk(adev, l) \ 1689 - ((adev)->pp_enabled ? \ 1690 - (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \ 1691 - (adev)->pm.funcs->get_sclk((adev), (l))) 1692 - 1693 - #define amdgpu_dpm_get_mclk(adev, l) \ 1694 - ((adev)->pp_enabled ? \ 1695 - (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \ 1696 - (adev)->pm.funcs->get_mclk((adev), (l))) 1697 - 1698 - 1699 - #define amdgpu_dpm_force_performance_level(adev, l) \ 1700 - ((adev)->pp_enabled ? \ 1701 - (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \ 1702 - (adev)->pm.funcs->force_performance_level((adev), (l))) 1703 - 1704 - #define amdgpu_dpm_powergate_uvd(adev, g) \ 1705 - ((adev)->pp_enabled ? \ 1706 - (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \ 1707 - (adev)->pm.funcs->powergate_uvd((adev), (g))) 1708 - 1709 - #define amdgpu_dpm_powergate_vce(adev, g) \ 1710 - ((adev)->pp_enabled ? \ 1711 - (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ 1712 - (adev)->pm.funcs->powergate_vce((adev), (g))) 1713 - 1714 - #define amdgpu_dpm_get_current_power_state(adev) \ 1715 - (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) 1716 - 1717 - #define amdgpu_dpm_get_performance_level(adev) \ 1718 - (adev)->powerplay.pp_funcs->get_performance_level((adev)->powerplay.pp_handle) 1719 - 1720 - #define amdgpu_dpm_get_pp_num_states(adev, data) \ 1721 - (adev)->powerplay.pp_funcs->get_pp_num_states((adev)->powerplay.pp_handle, data) 1722 - 1723 - #define amdgpu_dpm_get_pp_table(adev, table) \ 1724 - (adev)->powerplay.pp_funcs->get_pp_table((adev)->powerplay.pp_handle, table) 1725 - 1726 - #define amdgpu_dpm_set_pp_table(adev, buf, size) \ 1727 - (adev)->powerplay.pp_funcs->set_pp_table((adev)->powerplay.pp_handle, buf, size) 1728 - 1729 - #define amdgpu_dpm_print_clock_levels(adev, type, buf) \ 1730 - (adev)->powerplay.pp_funcs->print_clock_levels((adev)->powerplay.pp_handle, type, buf) 1731 - 1732 - #define amdgpu_dpm_force_clock_level(adev, type, level) \ 1733 - (adev)->powerplay.pp_funcs->force_clock_level((adev)->powerplay.pp_handle, type, level) 1734 - 1735 - #define amdgpu_dpm_get_sclk_od(adev) \ 1736 - (adev)->powerplay.pp_funcs->get_sclk_od((adev)->powerplay.pp_handle) 1737 - 1738 - #define amdgpu_dpm_set_sclk_od(adev, value) \ 1739 - (adev)->powerplay.pp_funcs->set_sclk_od((adev)->powerplay.pp_handle, value) 1740 - 1741 - #define amdgpu_dpm_get_mclk_od(adev) \ 1742 - ((adev)->powerplay.pp_funcs->get_mclk_od((adev)->powerplay.pp_handle)) 1743 - 1744 - #define amdgpu_dpm_set_mclk_od(adev, value) \ 1745 - ((adev)->powerplay.pp_funcs->set_mclk_od((adev)->powerplay.pp_handle, value)) 1746 - 1747 - #define amdgpu_dpm_dispatch_task(adev, event_id, input, output) \ 1748 - (adev)->powerplay.pp_funcs->dispatch_tasks((adev)->powerplay.pp_handle, (event_id), (input), (output)) 1749 - 1750 2306 #define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) 1751 2307 1752 2308 /* Common functions */
+13 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.c
··· 265 265 266 266 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 267 267 268 - const struct amdgpu_ip_block_version *ip_version = 268 + const struct amdgpu_ip_block *ip_block = 269 269 amdgpu_get_ip_block(adev, AMD_IP_BLOCK_TYPE_ACP); 270 270 271 - if (!ip_version) 271 + if (!ip_block) 272 272 return -EINVAL; 273 273 274 274 r = amd_acp_hw_init(adev->acp.cgs_device, 275 - ip_version->major, ip_version->minor); 275 + ip_block->version->major, ip_block->version->minor); 276 276 /* -ENODEV means board uses AZ rather than ACP */ 277 277 if (r == -ENODEV) 278 278 return 0; ··· 456 456 return 0; 457 457 } 458 458 459 - const struct amd_ip_funcs acp_ip_funcs = { 459 + static const struct amd_ip_funcs acp_ip_funcs = { 460 460 .name = "acp_ip", 461 461 .early_init = acp_early_init, 462 462 .late_init = NULL, ··· 471 471 .soft_reset = acp_soft_reset, 472 472 .set_clockgating_state = acp_set_clockgating_state, 473 473 .set_powergating_state = acp_set_powergating_state, 474 + }; 475 + 476 + const struct amdgpu_ip_block_version acp_ip_block = 477 + { 478 + .type = AMD_IP_BLOCK_TYPE_ACP, 479 + .major = 2, 480 + .minor = 2, 481 + .rev = 0, 482 + .funcs = &acp_ip_funcs, 474 483 };
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_acp.h
··· 37 37 struct acp_pm_domain *acp_genpd; 38 38 }; 39 39 40 - extern const struct amd_ip_funcs acp_ip_funcs; 40 + extern const struct amdgpu_ip_block_version acp_ip_block; 41 41 42 42 #endif /* __AMDGPU_ACP_H__ */
+13 -82
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
··· 1115 1115 return 0; 1116 1116 } 1117 1117 1118 - uint32_t amdgpu_atombios_get_engine_clock(struct amdgpu_device *adev) 1119 - { 1120 - GET_ENGINE_CLOCK_PS_ALLOCATION args; 1121 - int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock); 1122 - 1123 - amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); 1124 - return le32_to_cpu(args.ulReturnEngineClock); 1125 - } 1126 - 1127 - uint32_t amdgpu_atombios_get_memory_clock(struct amdgpu_device *adev) 1128 - { 1129 - GET_MEMORY_CLOCK_PS_ALLOCATION args; 1130 - int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock); 1131 - 1132 - amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); 1133 - return le32_to_cpu(args.ulReturnMemoryClock); 1134 - } 1135 - 1136 - void amdgpu_atombios_set_engine_clock(struct amdgpu_device *adev, 1137 - uint32_t eng_clock) 1138 - { 1139 - SET_ENGINE_CLOCK_PS_ALLOCATION args; 1140 - int index = GetIndexIntoMasterTable(COMMAND, SetEngineClock); 1141 - 1142 - args.ulTargetEngineClock = cpu_to_le32(eng_clock); /* 10 khz */ 1143 - 1144 - amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); 1145 - } 1146 - 1147 - void amdgpu_atombios_set_memory_clock(struct amdgpu_device *adev, 1148 - uint32_t mem_clock) 1149 - { 1150 - SET_MEMORY_CLOCK_PS_ALLOCATION args; 1151 - int index = GetIndexIntoMasterTable(COMMAND, SetMemoryClock); 1152 - 1153 - if (adev->flags & AMD_IS_APU) 1154 - return; 1155 - 1156 - args.ulTargetMemoryClock = cpu_to_le32(mem_clock); /* 10 khz */ 1157 - 1158 - amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); 1159 - } 1160 - 1161 1118 void amdgpu_atombios_set_engine_dram_timings(struct amdgpu_device *adev, 1162 1119 u32 eng_clock, u32 mem_clock) 1163 1120 { ··· 1211 1254 u16 leakage_idx) 1212 1255 { 1213 1256 return amdgpu_atombios_get_max_vddc(adev, VOLTAGE_TYPE_VDDC, leakage_idx, voltage); 1214 - } 1215 - 1216 - void amdgpu_atombios_set_voltage(struct amdgpu_device *adev, 1217 - u16 voltage_level, 1218 - u8 voltage_type) 1219 - { 1220 - union set_voltage args; 1221 - int index = GetIndexIntoMasterTable(COMMAND, SetVoltage); 1222 - u8 frev, crev, volt_index = voltage_level; 1223 - 1224 - if (!amdgpu_atom_parse_cmd_header(adev->mode_info.atom_context, index, &frev, &crev)) 1225 - return; 1226 - 1227 - /* 0xff01 is a flag rather then an actual voltage */ 1228 - if (voltage_level == 0xff01) 1229 - return; 1230 - 1231 - switch (crev) { 1232 - case 1: 1233 - args.v1.ucVoltageType = voltage_type; 1234 - args.v1.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_ALL_SOURCE; 1235 - args.v1.ucVoltageIndex = volt_index; 1236 - break; 1237 - case 2: 1238 - args.v2.ucVoltageType = voltage_type; 1239 - args.v2.ucVoltageMode = SET_ASIC_VOLTAGE_MODE_SET_VOLTAGE; 1240 - args.v2.usVoltageLevel = cpu_to_le16(voltage_level); 1241 - break; 1242 - case 3: 1243 - args.v3.ucVoltageType = voltage_type; 1244 - args.v3.ucVoltageMode = ATOM_SET_VOLTAGE; 1245 - args.v3.usVoltageLevel = cpu_to_le16(voltage_level); 1246 - break; 1247 - default: 1248 - DRM_ERROR("Unknown table version %d, %d\n", frev, crev); 1249 - return; 1250 - } 1251 - 1252 - amdgpu_atom_execute_table(adev->mode_info.atom_context, index, (uint32_t *)&args); 1253 1257 } 1254 1258 1255 1259 int amdgpu_atombios_get_leakage_id_from_vbios(struct amdgpu_device *adev, ··· 1700 1782 1701 1783 for (i = 0; i < AMDGPU_BIOS_NUM_SCRATCH; i++) 1702 1784 WREG32(mmBIOS_SCRATCH_0 + i, adev->bios_scratch[i]); 1785 + } 1786 + 1787 + void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev, 1788 + bool hung) 1789 + { 1790 + u32 tmp = RREG32(mmBIOS_SCRATCH_3); 1791 + 1792 + if (hung) 1793 + tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1794 + else 1795 + tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1796 + 1797 + WREG32(mmBIOS_SCRATCH_3, tmp); 1703 1798 } 1704 1799 1705 1800 /* Atom needs data in little endian format
+2 -10
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.h
··· 163 163 bool strobe_mode, 164 164 struct atom_mpll_param *mpll_param); 165 165 166 - uint32_t amdgpu_atombios_get_engine_clock(struct amdgpu_device *adev); 167 - uint32_t amdgpu_atombios_get_memory_clock(struct amdgpu_device *adev); 168 - void amdgpu_atombios_set_engine_clock(struct amdgpu_device *adev, 169 - uint32_t eng_clock); 170 - void amdgpu_atombios_set_memory_clock(struct amdgpu_device *adev, 171 - uint32_t mem_clock); 172 - void amdgpu_atombios_set_voltage(struct amdgpu_device *adev, 173 - u16 voltage_level, 174 - u8 voltage_type); 175 - 176 166 void amdgpu_atombios_set_engine_dram_timings(struct amdgpu_device *adev, 177 167 u32 eng_clock, u32 mem_clock); 178 168 ··· 196 206 void amdgpu_atombios_scratch_regs_init(struct amdgpu_device *adev); 197 207 void amdgpu_atombios_scratch_regs_save(struct amdgpu_device *adev); 198 208 void amdgpu_atombios_scratch_regs_restore(struct amdgpu_device *adev); 209 + void amdgpu_atombios_scratch_regs_engine_hung(struct amdgpu_device *adev, 210 + bool hung); 199 211 200 212 void amdgpu_atombios_copy_swap(u8 *dst, u8 *src, u8 num_bytes, bool to_le); 201 213 int amdgpu_atombios_get_max_vddc(struct amdgpu_device *adev, u8 voltage_type,
+36 -15
drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c
··· 146 146 switch(type) { 147 147 case CGS_GPU_MEM_TYPE__VISIBLE_CONTIG_FB: 148 148 case CGS_GPU_MEM_TYPE__VISIBLE_FB: 149 - flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED; 149 + flags = AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 150 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; 150 151 domain = AMDGPU_GEM_DOMAIN_VRAM; 151 152 if (max_offset > adev->mc.real_vram_size) 152 153 return -EINVAL; ··· 158 157 break; 159 158 case CGS_GPU_MEM_TYPE__INVISIBLE_CONTIG_FB: 160 159 case CGS_GPU_MEM_TYPE__INVISIBLE_FB: 161 - flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS; 160 + flags = AMDGPU_GEM_CREATE_NO_CPU_ACCESS | 161 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; 162 162 domain = AMDGPU_GEM_DOMAIN_VRAM; 163 163 if (adev->mc.visible_vram_size < adev->mc.real_vram_size) { 164 164 place.fpfn = ··· 242 240 r = amdgpu_bo_reserve(obj, false); 243 241 if (unlikely(r != 0)) 244 242 return r; 245 - r = amdgpu_bo_pin_restricted(obj, AMDGPU_GEM_DOMAIN_GTT, 243 + r = amdgpu_bo_pin_restricted(obj, obj->prefered_domains, 246 244 min_offset, max_offset, mcaddr); 247 245 amdgpu_bo_unreserve(obj); 248 246 return r; ··· 626 624 int i, r = -1; 627 625 628 626 for (i = 0; i < adev->num_ip_blocks; i++) { 629 - if (!adev->ip_block_status[i].valid) 627 + if (!adev->ip_blocks[i].status.valid) 630 628 continue; 631 629 632 - if (adev->ip_blocks[i].type == block_type) { 633 - r = adev->ip_blocks[i].funcs->set_clockgating_state( 630 + if (adev->ip_blocks[i].version->type == block_type) { 631 + r = adev->ip_blocks[i].version->funcs->set_clockgating_state( 634 632 (void *)adev, 635 633 state); 636 634 break; ··· 647 645 int i, r = -1; 648 646 649 647 for (i = 0; i < adev->num_ip_blocks; i++) { 650 - if (!adev->ip_block_status[i].valid) 648 + if (!adev->ip_blocks[i].status.valid) 651 649 continue; 652 650 653 - if (adev->ip_blocks[i].type == block_type) { 654 - r = adev->ip_blocks[i].funcs->set_powergating_state( 651 + if (adev->ip_blocks[i].version->type == block_type) { 652 + r = adev->ip_blocks[i].version->funcs->set_powergating_state( 655 653 (void *)adev, 656 654 state); 657 655 break; ··· 687 685 result = AMDGPU_UCODE_ID_CP_MEC1; 688 686 break; 689 687 case CGS_UCODE_ID_CP_MEC_JT2: 690 - if (adev->asic_type == CHIP_TONGA || adev->asic_type == CHIP_POLARIS11 691 - || adev->asic_type == CHIP_POLARIS10) 692 - result = AMDGPU_UCODE_ID_CP_MEC2; 693 - else 688 + /* for VI. JT2 should be the same as JT1, because: 689 + 1, MEC2 and MEC1 use exactly same FW. 690 + 2, JT2 is not pached but JT1 is. 691 + */ 692 + if (adev->asic_type >= CHIP_TOPAZ) 694 693 result = AMDGPU_UCODE_ID_CP_MEC1; 694 + else 695 + result = AMDGPU_UCODE_ID_CP_MEC2; 695 696 break; 696 697 case CGS_UCODE_ID_RLC_G: 697 698 result = AMDGPU_UCODE_ID_RLC_G; 699 + break; 700 + case CGS_UCODE_ID_STORAGE: 701 + result = AMDGPU_UCODE_ID_STORAGE; 698 702 break; 699 703 default: 700 704 DRM_ERROR("Firmware type not supported\n"); ··· 784 776 785 777 if ((type == CGS_UCODE_ID_CP_MEC_JT1) || 786 778 (type == CGS_UCODE_ID_CP_MEC_JT2)) { 787 - gpu_addr += le32_to_cpu(header->jt_offset) << 2; 779 + gpu_addr += ALIGN(le32_to_cpu(header->header.ucode_size_bytes), PAGE_SIZE); 788 780 data_size = le32_to_cpu(header->jt_size) << 2; 789 781 } 790 - info->mc_addr = gpu_addr; 782 + 783 + info->kptr = ucode->kaddr; 791 784 info->image_size = data_size; 785 + info->mc_addr = gpu_addr; 792 786 info->version = (uint16_t)le32_to_cpu(header->header.ucode_version); 787 + 788 + if (CGS_UCODE_ID_CP_MEC == type) 789 + info->image_size = (header->jt_offset) << 2; 790 + 793 791 info->fw_version = amdgpu_get_firmware_version(cgs_device, type); 794 792 info->feature_version = (uint16_t)le32_to_cpu(header->ucode_feature_version); 795 793 } else { ··· 863 849 info->kptr = (void *)src; 864 850 } 865 851 return 0; 852 + } 853 + 854 + static int amdgpu_cgs_is_virtualization_enabled(void *cgs_device) 855 + { 856 + CGS_FUNC_ADEV; 857 + return amdgpu_sriov_vf(adev); 866 858 } 867 859 868 860 static int amdgpu_cgs_query_system_info(struct cgs_device *cgs_device, ··· 1224 1204 amdgpu_cgs_notify_dpm_enabled, 1225 1205 amdgpu_cgs_call_acpi_method, 1226 1206 amdgpu_cgs_query_system_info, 1207 + amdgpu_cgs_is_virtualization_enabled 1227 1208 }; 1228 1209 1229 1210 static const struct cgs_os_ops amdgpu_cgs_os_ops = {
-93
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
··· 1517 1517 .force = amdgpu_connector_dvi_force, 1518 1518 }; 1519 1519 1520 - static struct drm_encoder * 1521 - amdgpu_connector_virtual_encoder(struct drm_connector *connector) 1522 - { 1523 - int enc_id = connector->encoder_ids[0]; 1524 - struct drm_encoder *encoder; 1525 - int i; 1526 - for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { 1527 - if (connector->encoder_ids[i] == 0) 1528 - break; 1529 - 1530 - encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); 1531 - if (!encoder) 1532 - continue; 1533 - 1534 - if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL) 1535 - return encoder; 1536 - } 1537 - 1538 - /* pick the first one */ 1539 - if (enc_id) 1540 - return drm_encoder_find(connector->dev, enc_id); 1541 - return NULL; 1542 - } 1543 - 1544 - static int amdgpu_connector_virtual_get_modes(struct drm_connector *connector) 1545 - { 1546 - struct drm_encoder *encoder = amdgpu_connector_best_single_encoder(connector); 1547 - 1548 - if (encoder) { 1549 - amdgpu_connector_add_common_modes(encoder, connector); 1550 - } 1551 - 1552 - return 0; 1553 - } 1554 - 1555 - static int amdgpu_connector_virtual_mode_valid(struct drm_connector *connector, 1556 - struct drm_display_mode *mode) 1557 - { 1558 - return MODE_OK; 1559 - } 1560 - 1561 - static int 1562 - amdgpu_connector_virtual_dpms(struct drm_connector *connector, int mode) 1563 - { 1564 - return 0; 1565 - } 1566 - 1567 - static enum drm_connector_status 1568 - 1569 - amdgpu_connector_virtual_detect(struct drm_connector *connector, bool force) 1570 - { 1571 - return connector_status_connected; 1572 - } 1573 - 1574 - static int 1575 - amdgpu_connector_virtual_set_property(struct drm_connector *connector, 1576 - struct drm_property *property, 1577 - uint64_t val) 1578 - { 1579 - return 0; 1580 - } 1581 - 1582 - static void amdgpu_connector_virtual_force(struct drm_connector *connector) 1583 - { 1584 - return; 1585 - } 1586 - 1587 - static const struct drm_connector_helper_funcs amdgpu_connector_virtual_helper_funcs = { 1588 - .get_modes = amdgpu_connector_virtual_get_modes, 1589 - .mode_valid = amdgpu_connector_virtual_mode_valid, 1590 - .best_encoder = amdgpu_connector_virtual_encoder, 1591 - }; 1592 - 1593 - static const struct drm_connector_funcs amdgpu_connector_virtual_funcs = { 1594 - .dpms = amdgpu_connector_virtual_dpms, 1595 - .detect = amdgpu_connector_virtual_detect, 1596 - .fill_modes = drm_helper_probe_single_connector_modes, 1597 - .set_property = amdgpu_connector_virtual_set_property, 1598 - .destroy = amdgpu_connector_destroy, 1599 - .force = amdgpu_connector_virtual_force, 1600 - }; 1601 - 1602 1520 void 1603 1521 amdgpu_connector_add(struct amdgpu_device *adev, 1604 1522 uint32_t connector_id, ··· 1897 1979 drm_object_attach_property(&amdgpu_connector->base.base, 1898 1980 dev->mode_config.scaling_mode_property, 1899 1981 DRM_MODE_SCALE_FULLSCREEN); 1900 - subpixel_order = SubPixelHorizontalRGB; 1901 - connector->interlace_allowed = false; 1902 - connector->doublescan_allowed = false; 1903 - break; 1904 - case DRM_MODE_CONNECTOR_VIRTUAL: 1905 - amdgpu_dig_connector = kzalloc(sizeof(struct amdgpu_connector_atom_dig), GFP_KERNEL); 1906 - if (!amdgpu_dig_connector) 1907 - goto failed; 1908 - amdgpu_connector->con_priv = amdgpu_dig_connector; 1909 - drm_connector_init(dev, &amdgpu_connector->base, &amdgpu_connector_virtual_funcs, connector_type); 1910 - drm_connector_helper_add(&amdgpu_connector->base, &amdgpu_connector_virtual_helper_funcs); 1911 1982 subpixel_order = SubPixelHorizontalRGB; 1912 1983 connector->interlace_allowed = false; 1913 1984 connector->doublescan_allowed = false;
+50 -24
drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
··· 355 355 static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p, 356 356 struct amdgpu_bo *bo) 357 357 { 358 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 358 359 u64 initial_bytes_moved; 359 360 uint32_t domain; 360 361 int r; ··· 373 372 374 373 retry: 375 374 amdgpu_ttm_placement_from_domain(bo, domain); 376 - initial_bytes_moved = atomic64_read(&bo->adev->num_bytes_moved); 375 + initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); 377 376 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 378 - p->bytes_moved += atomic64_read(&bo->adev->num_bytes_moved) - 377 + p->bytes_moved += atomic64_read(&adev->num_bytes_moved) - 379 378 initial_bytes_moved; 380 379 381 380 if (unlikely(r == -ENOMEM) && domain != bo->allowed_domains) { ··· 388 387 389 388 /* Last resort, try to evict something from the current working set */ 390 389 static bool amdgpu_cs_try_evict(struct amdgpu_cs_parser *p, 391 - struct amdgpu_bo_list_entry *lobj) 390 + struct amdgpu_bo *validated) 392 391 { 393 - uint32_t domain = lobj->robj->allowed_domains; 392 + uint32_t domain = validated->allowed_domains; 394 393 int r; 395 394 396 395 if (!p->evictable) ··· 401 400 402 401 struct amdgpu_bo_list_entry *candidate = p->evictable; 403 402 struct amdgpu_bo *bo = candidate->robj; 403 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 404 404 u64 initial_bytes_moved; 405 405 uint32_t other; 406 406 407 407 /* If we reached our current BO we can forget it */ 408 - if (candidate == lobj) 408 + if (candidate->robj == validated) 409 409 break; 410 410 411 411 other = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type); ··· 422 420 423 421 /* Good we can try to move this BO somewhere else */ 424 422 amdgpu_ttm_placement_from_domain(bo, other); 425 - initial_bytes_moved = atomic64_read(&bo->adev->num_bytes_moved); 423 + initial_bytes_moved = atomic64_read(&adev->num_bytes_moved); 426 424 r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false); 427 - p->bytes_moved += atomic64_read(&bo->adev->num_bytes_moved) - 425 + p->bytes_moved += atomic64_read(&adev->num_bytes_moved) - 428 426 initial_bytes_moved; 429 427 430 428 if (unlikely(r)) ··· 437 435 } 438 436 439 437 return false; 438 + } 439 + 440 + static int amdgpu_cs_validate(void *param, struct amdgpu_bo *bo) 441 + { 442 + struct amdgpu_cs_parser *p = param; 443 + int r; 444 + 445 + do { 446 + r = amdgpu_cs_bo_validate(p, bo); 447 + } while (r == -ENOMEM && amdgpu_cs_try_evict(p, bo)); 448 + if (r) 449 + return r; 450 + 451 + if (bo->shadow) 452 + r = amdgpu_cs_bo_validate(p, bo); 453 + 454 + return r; 440 455 } 441 456 442 457 static int amdgpu_cs_list_validate(struct amdgpu_cs_parser *p, ··· 483 464 if (p->evictable == lobj) 484 465 p->evictable = NULL; 485 466 486 - do { 487 - r = amdgpu_cs_bo_validate(p, bo); 488 - } while (r == -ENOMEM && amdgpu_cs_try_evict(p, lobj)); 467 + r = amdgpu_cs_validate(p, bo); 489 468 if (r) 490 469 return r; 491 - 492 - if (bo->shadow) { 493 - r = amdgpu_cs_bo_validate(p, bo); 494 - if (r) 495 - return r; 496 - } 497 470 498 471 if (binding_userptr) { 499 472 drm_free_large(lobj->user_pages); ··· 604 593 list_splice(&need_pages, &p->validated); 605 594 } 606 595 607 - amdgpu_vm_get_pt_bos(p->adev, &fpriv->vm, &duplicates); 608 - 609 596 p->bytes_moved_threshold = amdgpu_cs_get_threshold_for_moves(p->adev); 610 597 p->bytes_moved = 0; 611 598 p->evictable = list_last_entry(&p->validated, 612 599 struct amdgpu_bo_list_entry, 613 600 tv.head); 601 + 602 + r = amdgpu_vm_validate_pt_bos(p->adev, &fpriv->vm, 603 + amdgpu_cs_validate, p); 604 + if (r) { 605 + DRM_ERROR("amdgpu_vm_validate_pt_bos() failed.\n"); 606 + goto error_validate; 607 + } 614 608 615 609 r = amdgpu_cs_list_validate(p, &duplicates); 616 610 if (r) { ··· 822 806 823 807 /* Only for UVD/VCE VM emulation */ 824 808 if (ring->funcs->parse_cs) { 825 - p->job->vm = NULL; 826 809 for (i = 0; i < p->job->num_ibs; i++) { 827 810 r = amdgpu_ring_parse_cs(ring, p, i); 828 811 if (r) 829 812 return r; 830 813 } 831 - } else { 814 + } 815 + 816 + if (p->job->vm) { 832 817 p->job->vm_pd_addr = amdgpu_bo_gpu_offset(vm->page_directory); 833 818 834 819 r = amdgpu_bo_vm_update_pte(p, vm); ··· 918 901 offset = ((uint64_t)m->it.start) * AMDGPU_GPU_PAGE_SIZE; 919 902 kptr += chunk_ib->va_start - offset; 920 903 921 - r = amdgpu_ib_get(adev, NULL, chunk_ib->ib_bytes, ib); 904 + r = amdgpu_ib_get(adev, vm, chunk_ib->ib_bytes, ib); 922 905 if (r) { 923 906 DRM_ERROR("Failed to get ib !\n"); 924 907 return r; ··· 933 916 return r; 934 917 } 935 918 936 - ib->gpu_addr = chunk_ib->va_start; 937 919 } 938 920 921 + ib->gpu_addr = chunk_ib->va_start; 939 922 ib->length_dw = chunk_ib->ib_bytes / 4; 940 923 ib->flags = chunk_ib->flags; 941 924 j++; ··· 943 926 944 927 /* UVD & VCE fw doesn't support user fences */ 945 928 if (parser->job->uf_addr && ( 946 - parser->job->ring->type == AMDGPU_RING_TYPE_UVD || 947 - parser->job->ring->type == AMDGPU_RING_TYPE_VCE)) 929 + parser->job->ring->funcs->type == AMDGPU_RING_TYPE_UVD || 930 + parser->job->ring->funcs->type == AMDGPU_RING_TYPE_VCE)) 948 931 return -EINVAL; 949 932 950 933 return 0; ··· 1210 1193 struct amdgpu_bo *bo = parser->bo_list->array[i].robj; 1211 1194 1212 1195 r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem); 1196 + if (unlikely(r)) 1197 + return r; 1198 + 1199 + if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) 1200 + continue; 1201 + 1202 + bo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; 1203 + amdgpu_ttm_placement_from_domain(bo, bo->allowed_domains); 1204 + r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 1213 1205 if (unlikely(r)) 1214 1206 return r; 1215 1207 }
+9 -9
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
··· 55 55 r = amd_sched_entity_init(&ring->sched, &ctx->rings[i].entity, 56 56 rq, amdgpu_sched_jobs); 57 57 if (r) 58 - break; 58 + goto failed; 59 59 } 60 60 61 - if (i < adev->num_rings) { 62 - for (j = 0; j < i; j++) 63 - amd_sched_entity_fini(&adev->rings[j]->sched, 64 - &ctx->rings[j].entity); 65 - kfree(ctx->fences); 66 - ctx->fences = NULL; 67 - return r; 68 - } 69 61 return 0; 62 + 63 + failed: 64 + for (j = 0; j < i; j++) 65 + amd_sched_entity_fini(&adev->rings[j]->sched, 66 + &ctx->rings[j].entity); 67 + kfree(ctx->fences); 68 + ctx->fences = NULL; 69 + return r; 70 70 } 71 71 72 72 static void amdgpu_ctx_fini(struct amdgpu_ctx *ctx)
+293 -163
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
··· 264 264 if (adev->vram_scratch.robj == NULL) { 265 265 r = amdgpu_bo_create(adev, AMDGPU_GPU_PAGE_SIZE, 266 266 PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 267 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 267 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 268 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 268 269 NULL, NULL, &adev->vram_scratch.robj); 269 270 if (r) { 270 271 return r; ··· 443 442 static void amdgpu_wb_fini(struct amdgpu_device *adev) 444 443 { 445 444 if (adev->wb.wb_obj) { 446 - if (!amdgpu_bo_reserve(adev->wb.wb_obj, false)) { 447 - amdgpu_bo_kunmap(adev->wb.wb_obj); 448 - amdgpu_bo_unpin(adev->wb.wb_obj); 449 - amdgpu_bo_unreserve(adev->wb.wb_obj); 450 - } 451 - amdgpu_bo_unref(&adev->wb.wb_obj); 452 - adev->wb.wb = NULL; 445 + amdgpu_bo_free_kernel(&adev->wb.wb_obj, 446 + &adev->wb.gpu_addr, 447 + (void **)&adev->wb.wb); 453 448 adev->wb.wb_obj = NULL; 454 449 } 455 450 } ··· 464 467 int r; 465 468 466 469 if (adev->wb.wb_obj == NULL) { 467 - r = amdgpu_bo_create(adev, AMDGPU_MAX_WB * 4, PAGE_SIZE, true, 468 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, 469 - &adev->wb.wb_obj); 470 + r = amdgpu_bo_create_kernel(adev, AMDGPU_MAX_WB * 4, 471 + PAGE_SIZE, AMDGPU_GEM_DOMAIN_GTT, 472 + &adev->wb.wb_obj, &adev->wb.gpu_addr, 473 + (void **)&adev->wb.wb); 470 474 if (r) { 471 475 dev_warn(adev->dev, "(%d) create WB bo failed\n", r); 472 - return r; 473 - } 474 - r = amdgpu_bo_reserve(adev->wb.wb_obj, false); 475 - if (unlikely(r != 0)) { 476 - amdgpu_wb_fini(adev); 477 - return r; 478 - } 479 - r = amdgpu_bo_pin(adev->wb.wb_obj, AMDGPU_GEM_DOMAIN_GTT, 480 - &adev->wb.gpu_addr); 481 - if (r) { 482 - amdgpu_bo_unreserve(adev->wb.wb_obj); 483 - dev_warn(adev->dev, "(%d) pin WB bo failed\n", r); 484 - amdgpu_wb_fini(adev); 485 - return r; 486 - } 487 - r = amdgpu_bo_kmap(adev->wb.wb_obj, (void **)&adev->wb.wb); 488 - amdgpu_bo_unreserve(adev->wb.wb_obj); 489 - if (r) { 490 - dev_warn(adev->dev, "(%d) map WB bo failed\n", r); 491 - amdgpu_wb_fini(adev); 492 476 return r; 493 477 } 494 478 ··· 1029 1051 amdgpu_vm_block_size); 1030 1052 amdgpu_vm_block_size = 9; 1031 1053 } 1054 + 1055 + if ((amdgpu_vram_page_split != -1 && amdgpu_vram_page_split < 16) || 1056 + !amdgpu_check_pot_argument(amdgpu_vram_page_split)) { 1057 + dev_warn(adev->dev, "invalid VRAM page split (%d)\n", 1058 + amdgpu_vram_page_split); 1059 + amdgpu_vram_page_split = 1024; 1060 + } 1032 1061 } 1033 1062 1034 1063 /** ··· 1110 1125 int i, r = 0; 1111 1126 1112 1127 for (i = 0; i < adev->num_ip_blocks; i++) { 1113 - if (!adev->ip_block_status[i].valid) 1128 + if (!adev->ip_blocks[i].status.valid) 1114 1129 continue; 1115 - if (adev->ip_blocks[i].type == block_type) { 1116 - r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, 1117 - state); 1130 + if (adev->ip_blocks[i].version->type == block_type) { 1131 + r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev, 1132 + state); 1118 1133 if (r) 1119 1134 return r; 1120 1135 break; ··· 1130 1145 int i, r = 0; 1131 1146 1132 1147 for (i = 0; i < adev->num_ip_blocks; i++) { 1133 - if (!adev->ip_block_status[i].valid) 1148 + if (!adev->ip_blocks[i].status.valid) 1134 1149 continue; 1135 - if (adev->ip_blocks[i].type == block_type) { 1136 - r = adev->ip_blocks[i].funcs->set_powergating_state((void *)adev, 1137 - state); 1150 + if (adev->ip_blocks[i].version->type == block_type) { 1151 + r = adev->ip_blocks[i].version->funcs->set_powergating_state((void *)adev, 1152 + state); 1138 1153 if (r) 1139 1154 return r; 1140 1155 break; ··· 1149 1164 int i, r; 1150 1165 1151 1166 for (i = 0; i < adev->num_ip_blocks; i++) { 1152 - if (!adev->ip_block_status[i].valid) 1167 + if (!adev->ip_blocks[i].status.valid) 1153 1168 continue; 1154 - if (adev->ip_blocks[i].type == block_type) { 1155 - r = adev->ip_blocks[i].funcs->wait_for_idle((void *)adev); 1169 + if (adev->ip_blocks[i].version->type == block_type) { 1170 + r = adev->ip_blocks[i].version->funcs->wait_for_idle((void *)adev); 1156 1171 if (r) 1157 1172 return r; 1158 1173 break; ··· 1168 1183 int i; 1169 1184 1170 1185 for (i = 0; i < adev->num_ip_blocks; i++) { 1171 - if (!adev->ip_block_status[i].valid) 1186 + if (!adev->ip_blocks[i].status.valid) 1172 1187 continue; 1173 - if (adev->ip_blocks[i].type == block_type) 1174 - return adev->ip_blocks[i].funcs->is_idle((void *)adev); 1188 + if (adev->ip_blocks[i].version->type == block_type) 1189 + return adev->ip_blocks[i].version->funcs->is_idle((void *)adev); 1175 1190 } 1176 1191 return true; 1177 1192 1178 1193 } 1179 1194 1180 - const struct amdgpu_ip_block_version * amdgpu_get_ip_block( 1181 - struct amdgpu_device *adev, 1182 - enum amd_ip_block_type type) 1195 + struct amdgpu_ip_block * amdgpu_get_ip_block(struct amdgpu_device *adev, 1196 + enum amd_ip_block_type type) 1183 1197 { 1184 1198 int i; 1185 1199 1186 1200 for (i = 0; i < adev->num_ip_blocks; i++) 1187 - if (adev->ip_blocks[i].type == type) 1201 + if (adev->ip_blocks[i].version->type == type) 1188 1202 return &adev->ip_blocks[i]; 1189 1203 1190 1204 return NULL; ··· 1204 1220 enum amd_ip_block_type type, 1205 1221 u32 major, u32 minor) 1206 1222 { 1207 - const struct amdgpu_ip_block_version *ip_block; 1208 - ip_block = amdgpu_get_ip_block(adev, type); 1223 + struct amdgpu_ip_block *ip_block = amdgpu_get_ip_block(adev, type); 1209 1224 1210 - if (ip_block && ((ip_block->major > major) || 1211 - ((ip_block->major == major) && 1212 - (ip_block->minor >= minor)))) 1225 + if (ip_block && ((ip_block->version->major > major) || 1226 + ((ip_block->version->major == major) && 1227 + (ip_block->version->minor >= minor)))) 1213 1228 return 0; 1214 1229 1215 1230 return 1; 1216 1231 } 1217 1232 1218 - static void amdgpu_whether_enable_virtual_display(struct amdgpu_device *adev) 1233 + /** 1234 + * amdgpu_ip_block_add 1235 + * 1236 + * @adev: amdgpu_device pointer 1237 + * @ip_block_version: pointer to the IP to add 1238 + * 1239 + * Adds the IP block driver information to the collection of IPs 1240 + * on the asic. 1241 + */ 1242 + int amdgpu_ip_block_add(struct amdgpu_device *adev, 1243 + const struct amdgpu_ip_block_version *ip_block_version) 1244 + { 1245 + if (!ip_block_version) 1246 + return -EINVAL; 1247 + 1248 + adev->ip_blocks[adev->num_ip_blocks++].version = ip_block_version; 1249 + 1250 + return 0; 1251 + } 1252 + 1253 + static void amdgpu_device_enable_virtual_display(struct amdgpu_device *adev) 1219 1254 { 1220 1255 adev->enable_virtual_display = false; 1221 1256 1222 1257 if (amdgpu_virtual_display) { 1223 1258 struct drm_device *ddev = adev->ddev; 1224 1259 const char *pci_address_name = pci_name(ddev->pdev); 1225 - char *pciaddstr, *pciaddstr_tmp, *pciaddname; 1260 + char *pciaddstr, *pciaddstr_tmp, *pciaddname_tmp, *pciaddname; 1226 1261 1227 1262 pciaddstr = kstrdup(amdgpu_virtual_display, GFP_KERNEL); 1228 1263 pciaddstr_tmp = pciaddstr; 1229 - while ((pciaddname = strsep(&pciaddstr_tmp, ";"))) { 1264 + while ((pciaddname_tmp = strsep(&pciaddstr_tmp, ";"))) { 1265 + pciaddname = strsep(&pciaddname_tmp, ","); 1230 1266 if (!strcmp(pci_address_name, pciaddname)) { 1267 + long num_crtc; 1268 + int res = -1; 1269 + 1231 1270 adev->enable_virtual_display = true; 1271 + 1272 + if (pciaddname_tmp) 1273 + res = kstrtol(pciaddname_tmp, 10, 1274 + &num_crtc); 1275 + 1276 + if (!res) { 1277 + if (num_crtc < 1) 1278 + num_crtc = 1; 1279 + if (num_crtc > 6) 1280 + num_crtc = 6; 1281 + adev->mode_info.num_crtc = num_crtc; 1282 + } else { 1283 + adev->mode_info.num_crtc = 1; 1284 + } 1232 1285 break; 1233 1286 } 1234 1287 } 1235 1288 1236 - DRM_INFO("virtual display string:%s, %s:virtual_display:%d\n", 1237 - amdgpu_virtual_display, pci_address_name, 1238 - adev->enable_virtual_display); 1289 + DRM_INFO("virtual display string:%s, %s:virtual_display:%d, num_crtc:%d\n", 1290 + amdgpu_virtual_display, pci_address_name, 1291 + adev->enable_virtual_display, adev->mode_info.num_crtc); 1239 1292 1240 1293 kfree(pciaddstr); 1241 1294 } ··· 1282 1261 { 1283 1262 int i, r; 1284 1263 1285 - amdgpu_whether_enable_virtual_display(adev); 1264 + amdgpu_device_enable_virtual_display(adev); 1286 1265 1287 1266 switch (adev->asic_type) { 1288 1267 case CHIP_TOPAZ: ··· 1334 1313 return -EINVAL; 1335 1314 } 1336 1315 1337 - adev->ip_block_status = kcalloc(adev->num_ip_blocks, 1338 - sizeof(struct amdgpu_ip_block_status), GFP_KERNEL); 1339 - if (adev->ip_block_status == NULL) 1340 - return -ENOMEM; 1341 - 1342 - if (adev->ip_blocks == NULL) { 1343 - DRM_ERROR("No IP blocks found!\n"); 1344 - return r; 1345 - } 1346 - 1347 1316 for (i = 0; i < adev->num_ip_blocks; i++) { 1348 1317 if ((amdgpu_ip_block_mask & (1 << i)) == 0) { 1349 1318 DRM_ERROR("disabled ip block: %d\n", i); 1350 - adev->ip_block_status[i].valid = false; 1319 + adev->ip_blocks[i].status.valid = false; 1351 1320 } else { 1352 - if (adev->ip_blocks[i].funcs->early_init) { 1353 - r = adev->ip_blocks[i].funcs->early_init((void *)adev); 1321 + if (adev->ip_blocks[i].version->funcs->early_init) { 1322 + r = adev->ip_blocks[i].version->funcs->early_init((void *)adev); 1354 1323 if (r == -ENOENT) { 1355 - adev->ip_block_status[i].valid = false; 1324 + adev->ip_blocks[i].status.valid = false; 1356 1325 } else if (r) { 1357 - DRM_ERROR("early_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1326 + DRM_ERROR("early_init of IP block <%s> failed %d\n", 1327 + adev->ip_blocks[i].version->funcs->name, r); 1358 1328 return r; 1359 1329 } else { 1360 - adev->ip_block_status[i].valid = true; 1330 + adev->ip_blocks[i].status.valid = true; 1361 1331 } 1362 1332 } else { 1363 - adev->ip_block_status[i].valid = true; 1333 + adev->ip_blocks[i].status.valid = true; 1364 1334 } 1365 1335 } 1366 1336 } ··· 1367 1355 int i, r; 1368 1356 1369 1357 for (i = 0; i < adev->num_ip_blocks; i++) { 1370 - if (!adev->ip_block_status[i].valid) 1358 + if (!adev->ip_blocks[i].status.valid) 1371 1359 continue; 1372 - r = adev->ip_blocks[i].funcs->sw_init((void *)adev); 1360 + r = adev->ip_blocks[i].version->funcs->sw_init((void *)adev); 1373 1361 if (r) { 1374 - DRM_ERROR("sw_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1362 + DRM_ERROR("sw_init of IP block <%s> failed %d\n", 1363 + adev->ip_blocks[i].version->funcs->name, r); 1375 1364 return r; 1376 1365 } 1377 - adev->ip_block_status[i].sw = true; 1366 + adev->ip_blocks[i].status.sw = true; 1378 1367 /* need to do gmc hw init early so we can allocate gpu mem */ 1379 - if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) { 1368 + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) { 1380 1369 r = amdgpu_vram_scratch_init(adev); 1381 1370 if (r) { 1382 1371 DRM_ERROR("amdgpu_vram_scratch_init failed %d\n", r); 1383 1372 return r; 1384 1373 } 1385 - r = adev->ip_blocks[i].funcs->hw_init((void *)adev); 1374 + r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev); 1386 1375 if (r) { 1387 1376 DRM_ERROR("hw_init %d failed %d\n", i, r); 1388 1377 return r; ··· 1393 1380 DRM_ERROR("amdgpu_wb_init failed %d\n", r); 1394 1381 return r; 1395 1382 } 1396 - adev->ip_block_status[i].hw = true; 1383 + adev->ip_blocks[i].status.hw = true; 1397 1384 } 1398 1385 } 1399 1386 1400 1387 for (i = 0; i < adev->num_ip_blocks; i++) { 1401 - if (!adev->ip_block_status[i].sw) 1388 + if (!adev->ip_blocks[i].status.sw) 1402 1389 continue; 1403 1390 /* gmc hw init is done early */ 1404 - if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) 1391 + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) 1405 1392 continue; 1406 - r = adev->ip_blocks[i].funcs->hw_init((void *)adev); 1393 + r = adev->ip_blocks[i].version->funcs->hw_init((void *)adev); 1407 1394 if (r) { 1408 - DRM_ERROR("hw_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1395 + DRM_ERROR("hw_init of IP block <%s> failed %d\n", 1396 + adev->ip_blocks[i].version->funcs->name, r); 1409 1397 return r; 1410 1398 } 1411 - adev->ip_block_status[i].hw = true; 1399 + adev->ip_blocks[i].status.hw = true; 1412 1400 } 1413 1401 1414 1402 return 0; ··· 1420 1406 int i = 0, r; 1421 1407 1422 1408 for (i = 0; i < adev->num_ip_blocks; i++) { 1423 - if (!adev->ip_block_status[i].valid) 1409 + if (!adev->ip_blocks[i].status.valid) 1424 1410 continue; 1425 - if (adev->ip_blocks[i].funcs->late_init) { 1426 - r = adev->ip_blocks[i].funcs->late_init((void *)adev); 1411 + if (adev->ip_blocks[i].version->funcs->late_init) { 1412 + r = adev->ip_blocks[i].version->funcs->late_init((void *)adev); 1427 1413 if (r) { 1428 - DRM_ERROR("late_init of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1414 + DRM_ERROR("late_init of IP block <%s> failed %d\n", 1415 + adev->ip_blocks[i].version->funcs->name, r); 1429 1416 return r; 1430 1417 } 1431 - adev->ip_block_status[i].late_initialized = true; 1418 + adev->ip_blocks[i].status.late_initialized = true; 1432 1419 } 1433 1420 /* skip CG for VCE/UVD, it's handled specially */ 1434 - if (adev->ip_blocks[i].type != AMD_IP_BLOCK_TYPE_UVD && 1435 - adev->ip_blocks[i].type != AMD_IP_BLOCK_TYPE_VCE) { 1421 + if (adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_UVD && 1422 + adev->ip_blocks[i].version->type != AMD_IP_BLOCK_TYPE_VCE) { 1436 1423 /* enable clockgating to save power */ 1437 - r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, 1438 - AMD_CG_STATE_GATE); 1424 + r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev, 1425 + AMD_CG_STATE_GATE); 1439 1426 if (r) { 1440 1427 DRM_ERROR("set_clockgating_state(gate) of IP block <%s> failed %d\n", 1441 - adev->ip_blocks[i].funcs->name, r); 1428 + adev->ip_blocks[i].version->funcs->name, r); 1442 1429 return r; 1443 1430 } 1444 1431 } ··· 1454 1439 1455 1440 /* need to disable SMC first */ 1456 1441 for (i = 0; i < adev->num_ip_blocks; i++) { 1457 - if (!adev->ip_block_status[i].hw) 1442 + if (!adev->ip_blocks[i].status.hw) 1458 1443 continue; 1459 - if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_SMC) { 1444 + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) { 1460 1445 /* ungate blocks before hw fini so that we can shutdown the blocks safely */ 1461 - r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, 1462 - AMD_CG_STATE_UNGATE); 1446 + r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev, 1447 + AMD_CG_STATE_UNGATE); 1463 1448 if (r) { 1464 1449 DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", 1465 - adev->ip_blocks[i].funcs->name, r); 1450 + adev->ip_blocks[i].version->funcs->name, r); 1466 1451 return r; 1467 1452 } 1468 - r = adev->ip_blocks[i].funcs->hw_fini((void *)adev); 1453 + r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev); 1469 1454 /* XXX handle errors */ 1470 1455 if (r) { 1471 1456 DRM_DEBUG("hw_fini of IP block <%s> failed %d\n", 1472 - adev->ip_blocks[i].funcs->name, r); 1457 + adev->ip_blocks[i].version->funcs->name, r); 1473 1458 } 1474 - adev->ip_block_status[i].hw = false; 1459 + adev->ip_blocks[i].status.hw = false; 1475 1460 break; 1476 1461 } 1477 1462 } 1478 1463 1479 1464 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1480 - if (!adev->ip_block_status[i].hw) 1465 + if (!adev->ip_blocks[i].status.hw) 1481 1466 continue; 1482 - if (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) { 1467 + if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) { 1483 1468 amdgpu_wb_fini(adev); 1484 1469 amdgpu_vram_scratch_fini(adev); 1485 1470 } 1486 1471 /* ungate blocks before hw fini so that we can shutdown the blocks safely */ 1487 - r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, 1488 - AMD_CG_STATE_UNGATE); 1472 + r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev, 1473 + AMD_CG_STATE_UNGATE); 1489 1474 if (r) { 1490 - DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1475 + DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", 1476 + adev->ip_blocks[i].version->funcs->name, r); 1491 1477 return r; 1492 1478 } 1493 - r = adev->ip_blocks[i].funcs->hw_fini((void *)adev); 1479 + r = adev->ip_blocks[i].version->funcs->hw_fini((void *)adev); 1494 1480 /* XXX handle errors */ 1495 1481 if (r) { 1496 - DRM_DEBUG("hw_fini of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1482 + DRM_DEBUG("hw_fini of IP block <%s> failed %d\n", 1483 + adev->ip_blocks[i].version->funcs->name, r); 1497 1484 } 1498 - adev->ip_block_status[i].hw = false; 1485 + adev->ip_blocks[i].status.hw = false; 1499 1486 } 1500 1487 1501 1488 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1502 - if (!adev->ip_block_status[i].sw) 1489 + if (!adev->ip_blocks[i].status.sw) 1503 1490 continue; 1504 - r = adev->ip_blocks[i].funcs->sw_fini((void *)adev); 1491 + r = adev->ip_blocks[i].version->funcs->sw_fini((void *)adev); 1505 1492 /* XXX handle errors */ 1506 1493 if (r) { 1507 - DRM_DEBUG("sw_fini of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1494 + DRM_DEBUG("sw_fini of IP block <%s> failed %d\n", 1495 + adev->ip_blocks[i].version->funcs->name, r); 1508 1496 } 1509 - adev->ip_block_status[i].sw = false; 1510 - adev->ip_block_status[i].valid = false; 1497 + adev->ip_blocks[i].status.sw = false; 1498 + adev->ip_blocks[i].status.valid = false; 1511 1499 } 1512 1500 1513 1501 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1514 - if (!adev->ip_block_status[i].late_initialized) 1502 + if (!adev->ip_blocks[i].status.late_initialized) 1515 1503 continue; 1516 - if (adev->ip_blocks[i].funcs->late_fini) 1517 - adev->ip_blocks[i].funcs->late_fini((void *)adev); 1518 - adev->ip_block_status[i].late_initialized = false; 1504 + if (adev->ip_blocks[i].version->funcs->late_fini) 1505 + adev->ip_blocks[i].version->funcs->late_fini((void *)adev); 1506 + adev->ip_blocks[i].status.late_initialized = false; 1519 1507 } 1520 1508 1521 1509 return 0; ··· 1536 1518 } 1537 1519 1538 1520 for (i = adev->num_ip_blocks - 1; i >= 0; i--) { 1539 - if (!adev->ip_block_status[i].valid) 1521 + if (!adev->ip_blocks[i].status.valid) 1540 1522 continue; 1541 1523 /* ungate blocks so that suspend can properly shut them down */ 1542 1524 if (i != AMD_IP_BLOCK_TYPE_SMC) { 1543 - r = adev->ip_blocks[i].funcs->set_clockgating_state((void *)adev, 1544 - AMD_CG_STATE_UNGATE); 1525 + r = adev->ip_blocks[i].version->funcs->set_clockgating_state((void *)adev, 1526 + AMD_CG_STATE_UNGATE); 1545 1527 if (r) { 1546 - DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1528 + DRM_ERROR("set_clockgating_state(ungate) of IP block <%s> failed %d\n", 1529 + adev->ip_blocks[i].version->funcs->name, r); 1547 1530 } 1548 1531 } 1549 1532 /* XXX handle errors */ 1550 - r = adev->ip_blocks[i].funcs->suspend(adev); 1533 + r = adev->ip_blocks[i].version->funcs->suspend(adev); 1551 1534 /* XXX handle errors */ 1552 1535 if (r) { 1553 - DRM_ERROR("suspend of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1536 + DRM_ERROR("suspend of IP block <%s> failed %d\n", 1537 + adev->ip_blocks[i].version->funcs->name, r); 1554 1538 } 1555 1539 } 1556 1540 ··· 1564 1544 int i, r; 1565 1545 1566 1546 for (i = 0; i < adev->num_ip_blocks; i++) { 1567 - if (!adev->ip_block_status[i].valid) 1547 + if (!adev->ip_blocks[i].status.valid) 1568 1548 continue; 1569 - r = adev->ip_blocks[i].funcs->resume(adev); 1549 + r = adev->ip_blocks[i].version->funcs->resume(adev); 1570 1550 if (r) { 1571 - DRM_ERROR("resume of IP block <%s> failed %d\n", adev->ip_blocks[i].funcs->name, r); 1551 + DRM_ERROR("resume of IP block <%s> failed %d\n", 1552 + adev->ip_blocks[i].version->funcs->name, r); 1572 1553 return r; 1573 1554 } 1574 1555 } ··· 1880 1859 amdgpu_fence_driver_fini(adev); 1881 1860 amdgpu_fbdev_fini(adev); 1882 1861 r = amdgpu_fini(adev); 1883 - kfree(adev->ip_block_status); 1884 - adev->ip_block_status = NULL; 1885 1862 adev->accel_working = false; 1886 1863 /* free i2c buses */ 1887 1864 amdgpu_i2c_fini(adev); ··· 1975 1956 1976 1957 r = amdgpu_suspend(adev); 1977 1958 1978 - /* evict remaining vram memory */ 1959 + /* evict remaining vram memory 1960 + * This second call to evict vram is to evict the gart page table 1961 + * using the CPU. 1962 + */ 1979 1963 amdgpu_bo_evict_vram(adev); 1980 1964 1981 1965 pci_save_state(dev->pdev); ··· 2118 2096 bool asic_hang = false; 2119 2097 2120 2098 for (i = 0; i < adev->num_ip_blocks; i++) { 2121 - if (!adev->ip_block_status[i].valid) 2099 + if (!adev->ip_blocks[i].status.valid) 2122 2100 continue; 2123 - if (adev->ip_blocks[i].funcs->check_soft_reset) 2124 - adev->ip_block_status[i].hang = 2125 - adev->ip_blocks[i].funcs->check_soft_reset(adev); 2126 - if (adev->ip_block_status[i].hang) { 2127 - DRM_INFO("IP block:%d is hang!\n", i); 2101 + if (adev->ip_blocks[i].version->funcs->check_soft_reset) 2102 + adev->ip_blocks[i].status.hang = 2103 + adev->ip_blocks[i].version->funcs->check_soft_reset(adev); 2104 + if (adev->ip_blocks[i].status.hang) { 2105 + DRM_INFO("IP block:%s is hung!\n", adev->ip_blocks[i].version->funcs->name); 2128 2106 asic_hang = true; 2129 2107 } 2130 2108 } ··· 2136 2114 int i, r = 0; 2137 2115 2138 2116 for (i = 0; i < adev->num_ip_blocks; i++) { 2139 - if (!adev->ip_block_status[i].valid) 2117 + if (!adev->ip_blocks[i].status.valid) 2140 2118 continue; 2141 - if (adev->ip_block_status[i].hang && 2142 - adev->ip_blocks[i].funcs->pre_soft_reset) { 2143 - r = adev->ip_blocks[i].funcs->pre_soft_reset(adev); 2119 + if (adev->ip_blocks[i].status.hang && 2120 + adev->ip_blocks[i].version->funcs->pre_soft_reset) { 2121 + r = adev->ip_blocks[i].version->funcs->pre_soft_reset(adev); 2144 2122 if (r) 2145 2123 return r; 2146 2124 } ··· 2154 2132 int i; 2155 2133 2156 2134 for (i = 0; i < adev->num_ip_blocks; i++) { 2157 - if (!adev->ip_block_status[i].valid) 2135 + if (!adev->ip_blocks[i].status.valid) 2158 2136 continue; 2159 - if ((adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_GMC) || 2160 - (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_SMC) || 2161 - (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_ACP) || 2162 - (adev->ip_blocks[i].type == AMD_IP_BLOCK_TYPE_DCE)) { 2163 - if (adev->ip_block_status[i].hang) { 2137 + if ((adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) || 2138 + (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) || 2139 + (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_ACP) || 2140 + (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_DCE)) { 2141 + if (adev->ip_blocks[i].status.hang) { 2164 2142 DRM_INFO("Some block need full reset!\n"); 2165 2143 return true; 2166 2144 } ··· 2174 2152 int i, r = 0; 2175 2153 2176 2154 for (i = 0; i < adev->num_ip_blocks; i++) { 2177 - if (!adev->ip_block_status[i].valid) 2155 + if (!adev->ip_blocks[i].status.valid) 2178 2156 continue; 2179 - if (adev->ip_block_status[i].hang && 2180 - adev->ip_blocks[i].funcs->soft_reset) { 2181 - r = adev->ip_blocks[i].funcs->soft_reset(adev); 2157 + if (adev->ip_blocks[i].status.hang && 2158 + adev->ip_blocks[i].version->funcs->soft_reset) { 2159 + r = adev->ip_blocks[i].version->funcs->soft_reset(adev); 2182 2160 if (r) 2183 2161 return r; 2184 2162 } ··· 2192 2170 int i, r = 0; 2193 2171 2194 2172 for (i = 0; i < adev->num_ip_blocks; i++) { 2195 - if (!adev->ip_block_status[i].valid) 2173 + if (!adev->ip_blocks[i].status.valid) 2196 2174 continue; 2197 - if (adev->ip_block_status[i].hang && 2198 - adev->ip_blocks[i].funcs->post_soft_reset) 2199 - r = adev->ip_blocks[i].funcs->post_soft_reset(adev); 2175 + if (adev->ip_blocks[i].status.hang && 2176 + adev->ip_blocks[i].version->funcs->post_soft_reset) 2177 + r = adev->ip_blocks[i].version->funcs->post_soft_reset(adev); 2200 2178 if (r) 2201 2179 return r; 2202 2180 } ··· 2553 2531 se_bank = (*pos >> 24) & 0x3FF; 2554 2532 sh_bank = (*pos >> 34) & 0x3FF; 2555 2533 instance_bank = (*pos >> 44) & 0x3FF; 2534 + 2535 + if (se_bank == 0x3FF) 2536 + se_bank = 0xFFFFFFFF; 2537 + if (sh_bank == 0x3FF) 2538 + sh_bank = 0xFFFFFFFF; 2539 + if (instance_bank == 0x3FF) 2540 + instance_bank = 0xFFFFFFFF; 2556 2541 use_bank = 1; 2557 2542 } else { 2558 2543 use_bank = 0; ··· 2568 2539 *pos &= 0x3FFFF; 2569 2540 2570 2541 if (use_bank) { 2571 - if (sh_bank >= adev->gfx.config.max_sh_per_se || 2572 - se_bank >= adev->gfx.config.max_shader_engines) 2542 + if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) || 2543 + (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) 2573 2544 return -EINVAL; 2574 2545 mutex_lock(&adev->grbm_idx_mutex); 2575 2546 amdgpu_gfx_select_se_sh(adev, se_bank, ··· 2616 2587 struct amdgpu_device *adev = f->f_inode->i_private; 2617 2588 ssize_t result = 0; 2618 2589 int r; 2590 + bool pm_pg_lock, use_bank; 2591 + unsigned instance_bank, sh_bank, se_bank; 2619 2592 2620 2593 if (size & 0x3 || *pos & 0x3) 2621 2594 return -EINVAL; 2595 + 2596 + /* are we reading registers for which a PG lock is necessary? */ 2597 + pm_pg_lock = (*pos >> 23) & 1; 2598 + 2599 + if (*pos & (1ULL << 62)) { 2600 + se_bank = (*pos >> 24) & 0x3FF; 2601 + sh_bank = (*pos >> 34) & 0x3FF; 2602 + instance_bank = (*pos >> 44) & 0x3FF; 2603 + 2604 + if (se_bank == 0x3FF) 2605 + se_bank = 0xFFFFFFFF; 2606 + if (sh_bank == 0x3FF) 2607 + sh_bank = 0xFFFFFFFF; 2608 + if (instance_bank == 0x3FF) 2609 + instance_bank = 0xFFFFFFFF; 2610 + use_bank = 1; 2611 + } else { 2612 + use_bank = 0; 2613 + } 2614 + 2615 + *pos &= 0x3FFFF; 2616 + 2617 + if (use_bank) { 2618 + if ((sh_bank != 0xFFFFFFFF && sh_bank >= adev->gfx.config.max_sh_per_se) || 2619 + (se_bank != 0xFFFFFFFF && se_bank >= adev->gfx.config.max_shader_engines)) 2620 + return -EINVAL; 2621 + mutex_lock(&adev->grbm_idx_mutex); 2622 + amdgpu_gfx_select_se_sh(adev, se_bank, 2623 + sh_bank, instance_bank); 2624 + } 2625 + 2626 + if (pm_pg_lock) 2627 + mutex_lock(&adev->pm.mutex); 2622 2628 2623 2629 while (size) { 2624 2630 uint32_t value; ··· 2672 2608 *pos += 4; 2673 2609 size -= 4; 2674 2610 } 2611 + 2612 + if (use_bank) { 2613 + amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 2614 + mutex_unlock(&adev->grbm_idx_mutex); 2615 + } 2616 + 2617 + if (pm_pg_lock) 2618 + mutex_unlock(&adev->pm.mutex); 2675 2619 2676 2620 return result; 2677 2621 } ··· 2943 2871 return !r ? 4 : r; 2944 2872 } 2945 2873 2874 + static ssize_t amdgpu_debugfs_wave_read(struct file *f, char __user *buf, 2875 + size_t size, loff_t *pos) 2876 + { 2877 + struct amdgpu_device *adev = f->f_inode->i_private; 2878 + int r, x; 2879 + ssize_t result=0; 2880 + uint32_t offset, se, sh, cu, wave, simd, data[32]; 2881 + 2882 + if (size & 3 || *pos & 3) 2883 + return -EINVAL; 2884 + 2885 + /* decode offset */ 2886 + offset = (*pos & 0x7F); 2887 + se = ((*pos >> 7) & 0xFF); 2888 + sh = ((*pos >> 15) & 0xFF); 2889 + cu = ((*pos >> 23) & 0xFF); 2890 + wave = ((*pos >> 31) & 0xFF); 2891 + simd = ((*pos >> 37) & 0xFF); 2892 + 2893 + /* switch to the specific se/sh/cu */ 2894 + mutex_lock(&adev->grbm_idx_mutex); 2895 + amdgpu_gfx_select_se_sh(adev, se, sh, cu); 2896 + 2897 + x = 0; 2898 + if (adev->gfx.funcs->read_wave_data) 2899 + adev->gfx.funcs->read_wave_data(adev, simd, wave, data, &x); 2900 + 2901 + amdgpu_gfx_select_se_sh(adev, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF); 2902 + mutex_unlock(&adev->grbm_idx_mutex); 2903 + 2904 + if (!x) 2905 + return -EINVAL; 2906 + 2907 + while (size && (offset < x * 4)) { 2908 + uint32_t value; 2909 + 2910 + value = data[offset >> 2]; 2911 + r = put_user(value, (uint32_t *)buf); 2912 + if (r) 2913 + return r; 2914 + 2915 + result += 4; 2916 + buf += 4; 2917 + offset += 4; 2918 + size -= 4; 2919 + } 2920 + 2921 + return result; 2922 + } 2923 + 2946 2924 static const struct file_operations amdgpu_debugfs_regs_fops = { 2947 2925 .owner = THIS_MODULE, 2948 2926 .read = amdgpu_debugfs_regs_read, ··· 3030 2908 .llseek = default_llseek 3031 2909 }; 3032 2910 2911 + static const struct file_operations amdgpu_debugfs_wave_fops = { 2912 + .owner = THIS_MODULE, 2913 + .read = amdgpu_debugfs_wave_read, 2914 + .llseek = default_llseek 2915 + }; 2916 + 3033 2917 static const struct file_operations *debugfs_regs[] = { 3034 2918 &amdgpu_debugfs_regs_fops, 3035 2919 &amdgpu_debugfs_regs_didt_fops, ··· 3043 2915 &amdgpu_debugfs_regs_smc_fops, 3044 2916 &amdgpu_debugfs_gca_config_fops, 3045 2917 &amdgpu_debugfs_sensors_fops, 2918 + &amdgpu_debugfs_wave_fops, 3046 2919 }; 3047 2920 3048 2921 static const char *debugfs_regs_names[] = { ··· 3053 2924 "amdgpu_regs_smc", 3054 2925 "amdgpu_gca_config", 3055 2926 "amdgpu_sensors", 2927 + "amdgpu_wave", 3056 2928 }; 3057 2929 3058 2930 static int amdgpu_debugfs_regs_init(struct amdgpu_device *adev)
+6 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
··· 68 68 struct amdgpu_flip_work *work = 69 69 container_of(delayed_work, struct amdgpu_flip_work, flip_work); 70 70 struct amdgpu_device *adev = work->adev; 71 - struct amdgpu_crtc *amdgpuCrtc = adev->mode_info.crtcs[work->crtc_id]; 71 + struct amdgpu_crtc *amdgpu_crtc = adev->mode_info.crtcs[work->crtc_id]; 72 72 73 - struct drm_crtc *crtc = &amdgpuCrtc->base; 73 + struct drm_crtc *crtc = &amdgpu_crtc->base; 74 74 unsigned long flags; 75 75 unsigned i; 76 76 int vpos, hpos; ··· 85 85 /* Wait until we're out of the vertical blank period before the one 86 86 * targeted by the flip 87 87 */ 88 - if (amdgpuCrtc->enabled && 88 + if (amdgpu_crtc->enabled && 89 89 (amdgpu_get_crtc_scanoutpos(adev->ddev, work->crtc_id, 0, 90 90 &vpos, &hpos, NULL, NULL, 91 91 &crtc->hwmode) 92 92 & (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_IN_VBLANK)) == 93 93 (DRM_SCANOUTPOS_VALID | DRM_SCANOUTPOS_IN_VBLANK) && 94 94 (int)(work->target_vblank - 95 - amdgpu_get_vblank_counter_kms(adev->ddev, amdgpuCrtc->crtc_id)) > 0) { 95 + amdgpu_get_vblank_counter_kms(adev->ddev, amdgpu_crtc->crtc_id)) > 0) { 96 96 schedule_delayed_work(&work->flip_work, usecs_to_jiffies(1000)); 97 97 return; 98 98 } ··· 104 104 adev->mode_info.funcs->page_flip(adev, work->crtc_id, work->base, work->async); 105 105 106 106 /* Set the flip status */ 107 - amdgpuCrtc->pflip_status = AMDGPU_FLIP_SUBMITTED; 107 + amdgpu_crtc->pflip_status = AMDGPU_FLIP_SUBMITTED; 108 108 spin_unlock_irqrestore(&crtc->dev->event_lock, flags); 109 109 110 110 111 111 DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_SUBMITTED, work: %p,\n", 112 - amdgpuCrtc->crtc_id, amdgpuCrtc, work); 112 + amdgpu_crtc->crtc_id, amdgpu_crtc, work); 113 113 114 114 } 115 115
+13 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.c
··· 553 553 entry = (ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record *) 554 554 ((u8 *)entry + sizeof(ATOM_PPLIB_VCE_Clock_Voltage_Limit_Record)); 555 555 } 556 - for (i = 0; i < states->numEntries; i++) { 557 - if (i >= AMDGPU_MAX_VCE_LEVELS) 558 - break; 556 + adev->pm.dpm.num_of_vce_states = 557 + states->numEntries > AMD_MAX_VCE_LEVELS ? 558 + AMD_MAX_VCE_LEVELS : states->numEntries; 559 + for (i = 0; i < adev->pm.dpm.num_of_vce_states; i++) { 559 560 vce_clk = (VCEClockInfo *) 560 561 ((u8 *)&array->entries[0] + 561 562 (state_entry->ucVCEClockInfoIndex * sizeof(VCEClockInfo))); ··· 955 954 return 0; 956 955 957 956 return encoded_lanes[lanes]; 957 + } 958 + 959 + struct amd_vce_state* 960 + amdgpu_get_vce_clock_state(struct amdgpu_device *adev, unsigned idx) 961 + { 962 + if (idx < adev->pm.dpm.num_of_vce_states) 963 + return &adev->pm.dpm.vce_states[idx]; 964 + 965 + return NULL; 958 966 }
+443
drivers/gpu/drm/amd/amdgpu/amdgpu_dpm.h
··· 23 23 #ifndef __AMDGPU_DPM_H__ 24 24 #define __AMDGPU_DPM_H__ 25 25 26 + enum amdgpu_int_thermal_type { 27 + THERMAL_TYPE_NONE, 28 + THERMAL_TYPE_EXTERNAL, 29 + THERMAL_TYPE_EXTERNAL_GPIO, 30 + THERMAL_TYPE_RV6XX, 31 + THERMAL_TYPE_RV770, 32 + THERMAL_TYPE_ADT7473_WITH_INTERNAL, 33 + THERMAL_TYPE_EVERGREEN, 34 + THERMAL_TYPE_SUMO, 35 + THERMAL_TYPE_NI, 36 + THERMAL_TYPE_SI, 37 + THERMAL_TYPE_EMC2103_WITH_INTERNAL, 38 + THERMAL_TYPE_CI, 39 + THERMAL_TYPE_KV, 40 + }; 41 + 42 + enum amdgpu_dpm_auto_throttle_src { 43 + AMDGPU_DPM_AUTO_THROTTLE_SRC_THERMAL, 44 + AMDGPU_DPM_AUTO_THROTTLE_SRC_EXTERNAL 45 + }; 46 + 47 + enum amdgpu_dpm_event_src { 48 + AMDGPU_DPM_EVENT_SRC_ANALOG = 0, 49 + AMDGPU_DPM_EVENT_SRC_EXTERNAL = 1, 50 + AMDGPU_DPM_EVENT_SRC_DIGITAL = 2, 51 + AMDGPU_DPM_EVENT_SRC_ANALOG_OR_EXTERNAL = 3, 52 + AMDGPU_DPM_EVENT_SRC_DIGIAL_OR_EXTERNAL = 4 53 + }; 54 + 55 + struct amdgpu_ps { 56 + u32 caps; /* vbios flags */ 57 + u32 class; /* vbios flags */ 58 + u32 class2; /* vbios flags */ 59 + /* UVD clocks */ 60 + u32 vclk; 61 + u32 dclk; 62 + /* VCE clocks */ 63 + u32 evclk; 64 + u32 ecclk; 65 + bool vce_active; 66 + enum amd_vce_level vce_level; 67 + /* asic priv */ 68 + void *ps_priv; 69 + }; 70 + 71 + struct amdgpu_dpm_thermal { 72 + /* thermal interrupt work */ 73 + struct work_struct work; 74 + /* low temperature threshold */ 75 + int min_temp; 76 + /* high temperature threshold */ 77 + int max_temp; 78 + /* was last interrupt low to high or high to low */ 79 + bool high_to_low; 80 + /* interrupt source */ 81 + struct amdgpu_irq_src irq; 82 + }; 83 + 84 + enum amdgpu_clk_action 85 + { 86 + AMDGPU_SCLK_UP = 1, 87 + AMDGPU_SCLK_DOWN 88 + }; 89 + 90 + struct amdgpu_blacklist_clocks 91 + { 92 + u32 sclk; 93 + u32 mclk; 94 + enum amdgpu_clk_action action; 95 + }; 96 + 97 + struct amdgpu_clock_and_voltage_limits { 98 + u32 sclk; 99 + u32 mclk; 100 + u16 vddc; 101 + u16 vddci; 102 + }; 103 + 104 + struct amdgpu_clock_array { 105 + u32 count; 106 + u32 *values; 107 + }; 108 + 109 + struct amdgpu_clock_voltage_dependency_entry { 110 + u32 clk; 111 + u16 v; 112 + }; 113 + 114 + struct amdgpu_clock_voltage_dependency_table { 115 + u32 count; 116 + struct amdgpu_clock_voltage_dependency_entry *entries; 117 + }; 118 + 119 + union amdgpu_cac_leakage_entry { 120 + struct { 121 + u16 vddc; 122 + u32 leakage; 123 + }; 124 + struct { 125 + u16 vddc1; 126 + u16 vddc2; 127 + u16 vddc3; 128 + }; 129 + }; 130 + 131 + struct amdgpu_cac_leakage_table { 132 + u32 count; 133 + union amdgpu_cac_leakage_entry *entries; 134 + }; 135 + 136 + struct amdgpu_phase_shedding_limits_entry { 137 + u16 voltage; 138 + u32 sclk; 139 + u32 mclk; 140 + }; 141 + 142 + struct amdgpu_phase_shedding_limits_table { 143 + u32 count; 144 + struct amdgpu_phase_shedding_limits_entry *entries; 145 + }; 146 + 147 + struct amdgpu_uvd_clock_voltage_dependency_entry { 148 + u32 vclk; 149 + u32 dclk; 150 + u16 v; 151 + }; 152 + 153 + struct amdgpu_uvd_clock_voltage_dependency_table { 154 + u8 count; 155 + struct amdgpu_uvd_clock_voltage_dependency_entry *entries; 156 + }; 157 + 158 + struct amdgpu_vce_clock_voltage_dependency_entry { 159 + u32 ecclk; 160 + u32 evclk; 161 + u16 v; 162 + }; 163 + 164 + struct amdgpu_vce_clock_voltage_dependency_table { 165 + u8 count; 166 + struct amdgpu_vce_clock_voltage_dependency_entry *entries; 167 + }; 168 + 169 + struct amdgpu_ppm_table { 170 + u8 ppm_design; 171 + u16 cpu_core_number; 172 + u32 platform_tdp; 173 + u32 small_ac_platform_tdp; 174 + u32 platform_tdc; 175 + u32 small_ac_platform_tdc; 176 + u32 apu_tdp; 177 + u32 dgpu_tdp; 178 + u32 dgpu_ulv_power; 179 + u32 tj_max; 180 + }; 181 + 182 + struct amdgpu_cac_tdp_table { 183 + u16 tdp; 184 + u16 configurable_tdp; 185 + u16 tdc; 186 + u16 battery_power_limit; 187 + u16 small_power_limit; 188 + u16 low_cac_leakage; 189 + u16 high_cac_leakage; 190 + u16 maximum_power_delivery_limit; 191 + }; 192 + 193 + struct amdgpu_dpm_dynamic_state { 194 + struct amdgpu_clock_voltage_dependency_table vddc_dependency_on_sclk; 195 + struct amdgpu_clock_voltage_dependency_table vddci_dependency_on_mclk; 196 + struct amdgpu_clock_voltage_dependency_table vddc_dependency_on_mclk; 197 + struct amdgpu_clock_voltage_dependency_table mvdd_dependency_on_mclk; 198 + struct amdgpu_clock_voltage_dependency_table vddc_dependency_on_dispclk; 199 + struct amdgpu_uvd_clock_voltage_dependency_table uvd_clock_voltage_dependency_table; 200 + struct amdgpu_vce_clock_voltage_dependency_table vce_clock_voltage_dependency_table; 201 + struct amdgpu_clock_voltage_dependency_table samu_clock_voltage_dependency_table; 202 + struct amdgpu_clock_voltage_dependency_table acp_clock_voltage_dependency_table; 203 + struct amdgpu_clock_voltage_dependency_table vddgfx_dependency_on_sclk; 204 + struct amdgpu_clock_array valid_sclk_values; 205 + struct amdgpu_clock_array valid_mclk_values; 206 + struct amdgpu_clock_and_voltage_limits max_clock_voltage_on_dc; 207 + struct amdgpu_clock_and_voltage_limits max_clock_voltage_on_ac; 208 + u32 mclk_sclk_ratio; 209 + u32 sclk_mclk_delta; 210 + u16 vddc_vddci_delta; 211 + u16 min_vddc_for_pcie_gen2; 212 + struct amdgpu_cac_leakage_table cac_leakage_table; 213 + struct amdgpu_phase_shedding_limits_table phase_shedding_limits_table; 214 + struct amdgpu_ppm_table *ppm_table; 215 + struct amdgpu_cac_tdp_table *cac_tdp_table; 216 + }; 217 + 218 + struct amdgpu_dpm_fan { 219 + u16 t_min; 220 + u16 t_med; 221 + u16 t_high; 222 + u16 pwm_min; 223 + u16 pwm_med; 224 + u16 pwm_high; 225 + u8 t_hyst; 226 + u32 cycle_delay; 227 + u16 t_max; 228 + u8 control_mode; 229 + u16 default_max_fan_pwm; 230 + u16 default_fan_output_sensitivity; 231 + u16 fan_output_sensitivity; 232 + bool ucode_fan_control; 233 + }; 234 + 235 + enum amdgpu_pcie_gen { 236 + AMDGPU_PCIE_GEN1 = 0, 237 + AMDGPU_PCIE_GEN2 = 1, 238 + AMDGPU_PCIE_GEN3 = 2, 239 + AMDGPU_PCIE_GEN_INVALID = 0xffff 240 + }; 241 + 242 + enum amdgpu_dpm_forced_level { 243 + AMDGPU_DPM_FORCED_LEVEL_AUTO = 0, 244 + AMDGPU_DPM_FORCED_LEVEL_LOW = 1, 245 + AMDGPU_DPM_FORCED_LEVEL_HIGH = 2, 246 + AMDGPU_DPM_FORCED_LEVEL_MANUAL = 3, 247 + }; 248 + 249 + struct amdgpu_dpm_funcs { 250 + int (*get_temperature)(struct amdgpu_device *adev); 251 + int (*pre_set_power_state)(struct amdgpu_device *adev); 252 + int (*set_power_state)(struct amdgpu_device *adev); 253 + void (*post_set_power_state)(struct amdgpu_device *adev); 254 + void (*display_configuration_changed)(struct amdgpu_device *adev); 255 + u32 (*get_sclk)(struct amdgpu_device *adev, bool low); 256 + u32 (*get_mclk)(struct amdgpu_device *adev, bool low); 257 + void (*print_power_state)(struct amdgpu_device *adev, struct amdgpu_ps *ps); 258 + void (*debugfs_print_current_performance_level)(struct amdgpu_device *adev, struct seq_file *m); 259 + int (*force_performance_level)(struct amdgpu_device *adev, enum amdgpu_dpm_forced_level level); 260 + bool (*vblank_too_short)(struct amdgpu_device *adev); 261 + void (*powergate_uvd)(struct amdgpu_device *adev, bool gate); 262 + void (*powergate_vce)(struct amdgpu_device *adev, bool gate); 263 + void (*enable_bapm)(struct amdgpu_device *adev, bool enable); 264 + void (*set_fan_control_mode)(struct amdgpu_device *adev, u32 mode); 265 + u32 (*get_fan_control_mode)(struct amdgpu_device *adev); 266 + int (*set_fan_speed_percent)(struct amdgpu_device *adev, u32 speed); 267 + int (*get_fan_speed_percent)(struct amdgpu_device *adev, u32 *speed); 268 + int (*force_clock_level)(struct amdgpu_device *adev, enum pp_clock_type type, uint32_t mask); 269 + int (*print_clock_levels)(struct amdgpu_device *adev, enum pp_clock_type type, char *buf); 270 + int (*get_sclk_od)(struct amdgpu_device *adev); 271 + int (*set_sclk_od)(struct amdgpu_device *adev, uint32_t value); 272 + int (*get_mclk_od)(struct amdgpu_device *adev); 273 + int (*set_mclk_od)(struct amdgpu_device *adev, uint32_t value); 274 + int (*check_state_equal)(struct amdgpu_device *adev, 275 + struct amdgpu_ps *cps, 276 + struct amdgpu_ps *rps, 277 + bool *equal); 278 + 279 + struct amd_vce_state* (*get_vce_clock_state)(struct amdgpu_device *adev, unsigned idx); 280 + }; 281 + 282 + #define amdgpu_dpm_pre_set_power_state(adev) (adev)->pm.funcs->pre_set_power_state((adev)) 283 + #define amdgpu_dpm_set_power_state(adev) (adev)->pm.funcs->set_power_state((adev)) 284 + #define amdgpu_dpm_post_set_power_state(adev) (adev)->pm.funcs->post_set_power_state((adev)) 285 + #define amdgpu_dpm_display_configuration_changed(adev) (adev)->pm.funcs->display_configuration_changed((adev)) 286 + #define amdgpu_dpm_print_power_state(adev, ps) (adev)->pm.funcs->print_power_state((adev), (ps)) 287 + #define amdgpu_dpm_vblank_too_short(adev) (adev)->pm.funcs->vblank_too_short((adev)) 288 + #define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e)) 289 + 290 + #define amdgpu_dpm_read_sensor(adev, idx, value) \ 291 + ((adev)->pp_enabled ? \ 292 + (adev)->powerplay.pp_funcs->read_sensor(adev->powerplay.pp_handle, (idx), (value)) : \ 293 + -EINVAL) 294 + 295 + #define amdgpu_dpm_get_temperature(adev) \ 296 + ((adev)->pp_enabled ? \ 297 + (adev)->powerplay.pp_funcs->get_temperature((adev)->powerplay.pp_handle) : \ 298 + (adev)->pm.funcs->get_temperature((adev))) 299 + 300 + #define amdgpu_dpm_set_fan_control_mode(adev, m) \ 301 + ((adev)->pp_enabled ? \ 302 + (adev)->powerplay.pp_funcs->set_fan_control_mode((adev)->powerplay.pp_handle, (m)) : \ 303 + (adev)->pm.funcs->set_fan_control_mode((adev), (m))) 304 + 305 + #define amdgpu_dpm_get_fan_control_mode(adev) \ 306 + ((adev)->pp_enabled ? \ 307 + (adev)->powerplay.pp_funcs->get_fan_control_mode((adev)->powerplay.pp_handle) : \ 308 + (adev)->pm.funcs->get_fan_control_mode((adev))) 309 + 310 + #define amdgpu_dpm_set_fan_speed_percent(adev, s) \ 311 + ((adev)->pp_enabled ? \ 312 + (adev)->powerplay.pp_funcs->set_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 313 + (adev)->pm.funcs->set_fan_speed_percent((adev), (s))) 314 + 315 + #define amdgpu_dpm_get_fan_speed_percent(adev, s) \ 316 + ((adev)->pp_enabled ? \ 317 + (adev)->powerplay.pp_funcs->get_fan_speed_percent((adev)->powerplay.pp_handle, (s)) : \ 318 + (adev)->pm.funcs->get_fan_speed_percent((adev), (s))) 319 + 320 + #define amdgpu_dpm_get_sclk(adev, l) \ 321 + ((adev)->pp_enabled ? \ 322 + (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \ 323 + (adev)->pm.funcs->get_sclk((adev), (l))) 324 + 325 + #define amdgpu_dpm_get_mclk(adev, l) \ 326 + ((adev)->pp_enabled ? \ 327 + (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \ 328 + (adev)->pm.funcs->get_mclk((adev), (l))) 329 + 330 + 331 + #define amdgpu_dpm_force_performance_level(adev, l) \ 332 + ((adev)->pp_enabled ? \ 333 + (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \ 334 + (adev)->pm.funcs->force_performance_level((adev), (l))) 335 + 336 + #define amdgpu_dpm_powergate_uvd(adev, g) \ 337 + ((adev)->pp_enabled ? \ 338 + (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \ 339 + (adev)->pm.funcs->powergate_uvd((adev), (g))) 340 + 341 + #define amdgpu_dpm_powergate_vce(adev, g) \ 342 + ((adev)->pp_enabled ? \ 343 + (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ 344 + (adev)->pm.funcs->powergate_vce((adev), (g))) 345 + 346 + #define amdgpu_dpm_get_current_power_state(adev) \ 347 + (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) 348 + 349 + #define amdgpu_dpm_get_performance_level(adev) \ 350 + (adev)->powerplay.pp_funcs->get_performance_level((adev)->powerplay.pp_handle) 351 + 352 + #define amdgpu_dpm_get_pp_num_states(adev, data) \ 353 + (adev)->powerplay.pp_funcs->get_pp_num_states((adev)->powerplay.pp_handle, data) 354 + 355 + #define amdgpu_dpm_get_pp_table(adev, table) \ 356 + (adev)->powerplay.pp_funcs->get_pp_table((adev)->powerplay.pp_handle, table) 357 + 358 + #define amdgpu_dpm_set_pp_table(adev, buf, size) \ 359 + (adev)->powerplay.pp_funcs->set_pp_table((adev)->powerplay.pp_handle, buf, size) 360 + 361 + #define amdgpu_dpm_print_clock_levels(adev, type, buf) \ 362 + (adev)->powerplay.pp_funcs->print_clock_levels((adev)->powerplay.pp_handle, type, buf) 363 + 364 + #define amdgpu_dpm_force_clock_level(adev, type, level) \ 365 + (adev)->powerplay.pp_funcs->force_clock_level((adev)->powerplay.pp_handle, type, level) 366 + 367 + #define amdgpu_dpm_get_sclk_od(adev) \ 368 + (adev)->powerplay.pp_funcs->get_sclk_od((adev)->powerplay.pp_handle) 369 + 370 + #define amdgpu_dpm_set_sclk_od(adev, value) \ 371 + (adev)->powerplay.pp_funcs->set_sclk_od((adev)->powerplay.pp_handle, value) 372 + 373 + #define amdgpu_dpm_get_mclk_od(adev) \ 374 + ((adev)->powerplay.pp_funcs->get_mclk_od((adev)->powerplay.pp_handle)) 375 + 376 + #define amdgpu_dpm_set_mclk_od(adev, value) \ 377 + ((adev)->powerplay.pp_funcs->set_mclk_od((adev)->powerplay.pp_handle, value)) 378 + 379 + #define amdgpu_dpm_dispatch_task(adev, event_id, input, output) \ 380 + (adev)->powerplay.pp_funcs->dispatch_tasks((adev)->powerplay.pp_handle, (event_id), (input), (output)) 381 + 382 + #define amgdpu_dpm_check_state_equal(adev, cps, rps, equal) (adev)->pm.funcs->check_state_equal((adev), (cps),(rps),(equal)) 383 + 384 + #define amdgpu_dpm_get_vce_clock_state(adev, i) \ 385 + ((adev)->pp_enabled ? \ 386 + (adev)->powerplay.pp_funcs->get_vce_clock_state((adev)->powerplay.pp_handle, (i)) : \ 387 + (adev)->pm.funcs->get_vce_clock_state((adev), (i))) 388 + 389 + struct amdgpu_dpm { 390 + struct amdgpu_ps *ps; 391 + /* number of valid power states */ 392 + int num_ps; 393 + /* current power state that is active */ 394 + struct amdgpu_ps *current_ps; 395 + /* requested power state */ 396 + struct amdgpu_ps *requested_ps; 397 + /* boot up power state */ 398 + struct amdgpu_ps *boot_ps; 399 + /* default uvd power state */ 400 + struct amdgpu_ps *uvd_ps; 401 + /* vce requirements */ 402 + u32 num_of_vce_states; 403 + struct amd_vce_state vce_states[AMD_MAX_VCE_LEVELS]; 404 + enum amd_vce_level vce_level; 405 + enum amd_pm_state_type state; 406 + enum amd_pm_state_type user_state; 407 + enum amd_pm_state_type last_state; 408 + enum amd_pm_state_type last_user_state; 409 + u32 platform_caps; 410 + u32 voltage_response_time; 411 + u32 backbias_response_time; 412 + void *priv; 413 + u32 new_active_crtcs; 414 + int new_active_crtc_count; 415 + u32 current_active_crtcs; 416 + int current_active_crtc_count; 417 + struct amdgpu_dpm_dynamic_state dyn_state; 418 + struct amdgpu_dpm_fan fan; 419 + u32 tdp_limit; 420 + u32 near_tdp_limit; 421 + u32 near_tdp_limit_adjusted; 422 + u32 sq_ramping_threshold; 423 + u32 cac_leakage; 424 + u16 tdp_od_limit; 425 + u32 tdp_adjustment; 426 + u16 load_line_slope; 427 + bool power_control; 428 + bool ac_power; 429 + /* special states active */ 430 + bool thermal_active; 431 + bool uvd_active; 432 + bool vce_active; 433 + /* thermal handling */ 434 + struct amdgpu_dpm_thermal thermal; 435 + /* forced levels */ 436 + enum amdgpu_dpm_forced_level forced_level; 437 + }; 438 + 439 + struct amdgpu_pm { 440 + struct mutex mutex; 441 + u32 current_sclk; 442 + u32 current_mclk; 443 + u32 default_sclk; 444 + u32 default_mclk; 445 + struct amdgpu_i2c_chan *i2c_bus; 446 + /* internal thermal controller on rv6xx+ */ 447 + enum amdgpu_int_thermal_type int_thermal_type; 448 + struct device *int_hwmon_dev; 449 + /* fan control parameters */ 450 + bool no_fan; 451 + u8 fan_pulses_per_revolution; 452 + u8 fan_min_rpm; 453 + u8 fan_max_rpm; 454 + /* dpm */ 455 + bool dpm_enabled; 456 + bool sysfs_initialized; 457 + struct amdgpu_dpm dpm; 458 + const struct firmware *fw; /* SMC firmware */ 459 + uint32_t fw_version; 460 + const struct amdgpu_dpm_funcs *funcs; 461 + uint32_t pcie_gen_mask; 462 + uint32_t pcie_mlw_mask; 463 + struct amd_pp_display_configuration pm_display_cfg;/* set by DAL */ 464 + }; 465 + 26 466 #define R600_SSTU_DFLT 0 27 467 #define R600_SST_DFLT 0x00C8 28 468 ··· 521 81 u16 asic_lanes, 522 82 u16 default_lanes); 523 83 u8 amdgpu_encode_pci_lane_width(u32 lanes); 84 + 85 + struct amd_vce_state* 86 + amdgpu_get_vce_clock_state(struct amdgpu_device *adev, unsigned idx); 524 87 525 88 #endif
+9 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
··· 58 58 * - 3.6.0 - kmd involves use CONTEXT_CONTROL in ring buffer. 59 59 * - 3.7.0 - Add support for VCE clock list packet 60 60 * - 3.8.0 - Add support raster config init in the kernel 61 + * - 3.9.0 - Add support for memory query info about VRAM and GTT. 61 62 */ 62 63 #define KMS_DRIVER_MAJOR 3 63 - #define KMS_DRIVER_MINOR 8 64 + #define KMS_DRIVER_MINOR 9 64 65 #define KMS_DRIVER_PATCHLEVEL 0 65 66 66 67 int amdgpu_vram_limit = 0; ··· 86 85 int amdgpu_vm_block_size = -1; 87 86 int amdgpu_vm_fault_stop = 0; 88 87 int amdgpu_vm_debug = 0; 88 + int amdgpu_vram_page_split = 1024; 89 89 int amdgpu_exp_hw_support = 0; 90 90 int amdgpu_sched_jobs = 32; 91 91 int amdgpu_sched_hw_submission = 2; ··· 167 165 MODULE_PARM_DESC(vm_debug, "Debug VM handling (0 = disabled (default), 1 = enabled)"); 168 166 module_param_named(vm_debug, amdgpu_vm_debug, int, 0644); 169 167 168 + MODULE_PARM_DESC(vram_page_split, "Number of pages after we split VRAM allocations (default 1024, -1 = disable)"); 169 + module_param_named(vram_page_split, amdgpu_vram_page_split, int, 0444); 170 + 170 171 MODULE_PARM_DESC(exp_hw_support, "experimental hw support (1 = enable, 0 = disable (default))"); 171 172 module_param_named(exp_hw_support, amdgpu_exp_hw_support, int, 0444); 172 173 ··· 206 201 MODULE_PARM_DESC(disable_cu, "Disable CUs (se.sh.cu,...)"); 207 202 module_param_named(disable_cu, amdgpu_disable_cu, charp, 0444); 208 203 209 - MODULE_PARM_DESC(virtual_display, "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x;xxxx:xx:xx.x)"); 204 + MODULE_PARM_DESC(virtual_display, 205 + "Enable virtual display feature (the virtual_display will be set like xxxx:xx:xx.x,x;xxxx:xx:xx.x,x)"); 210 206 module_param_named(virtual_display, amdgpu_virtual_display, charp, 0444); 211 207 212 208 static const struct pci_device_id pciidlist[] = { ··· 387 381 {0x1002, 0x6939, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TONGA}, 388 382 /* fiji */ 389 383 {0x1002, 0x7300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_FIJI}, 384 + {0x1002, 0x730F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_FIJI}, 390 385 /* carrizo */ 391 386 {0x1002, 0x9870, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU}, 392 387 {0x1002, 0x9874, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_CARRIZO|AMD_IS_APU},
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_fb.c
··· 152 152 aligned_size = ALIGN(size, PAGE_SIZE); 153 153 ret = amdgpu_gem_object_create(adev, aligned_size, 0, 154 154 AMDGPU_GEM_DOMAIN_VRAM, 155 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 155 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 156 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 156 157 true, &gobj); 157 158 if (ret) { 158 159 printk(KERN_ERR "failed to allocate framebuffer (%d)\n",
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gart.c
··· 126 126 if (adev->gart.robj == NULL) { 127 127 r = amdgpu_bo_create(adev, adev->gart.table_size, 128 128 PAGE_SIZE, true, AMDGPU_GEM_DOMAIN_VRAM, 129 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 129 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 130 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 130 131 NULL, NULL, &adev->gart.robj); 131 132 if (r) { 132 133 return r;
+23 -18
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
··· 116 116 * Call from drm_gem_handle_create which appear in both new and open ioctl 117 117 * case. 118 118 */ 119 - int amdgpu_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv) 119 + int amdgpu_gem_object_open(struct drm_gem_object *obj, 120 + struct drm_file *file_priv) 120 121 { 121 122 struct amdgpu_bo *abo = gem_to_amdgpu_bo(obj); 122 - struct amdgpu_device *adev = abo->adev; 123 + struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev); 123 124 struct amdgpu_fpriv *fpriv = file_priv->driver_priv; 124 125 struct amdgpu_vm *vm = &fpriv->vm; 125 126 struct amdgpu_bo_va *bo_va; ··· 143 142 struct drm_file *file_priv) 144 143 { 145 144 struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); 146 - struct amdgpu_device *adev = bo->adev; 145 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 147 146 struct amdgpu_fpriv *fpriv = file_priv->driver_priv; 148 147 struct amdgpu_vm *vm = &fpriv->vm; 149 148 ··· 469 468 return r; 470 469 } 471 470 471 + static int amdgpu_gem_va_check(void *param, struct amdgpu_bo *bo) 472 + { 473 + unsigned domain = amdgpu_mem_type_to_domain(bo->tbo.mem.mem_type); 474 + 475 + /* if anything is swapped out don't swap it in here, 476 + just abort and wait for the next CS */ 477 + 478 + return domain == AMDGPU_GEM_DOMAIN_CPU ? -ERESTARTSYS : 0; 479 + } 480 + 472 481 /** 473 482 * amdgpu_gem_va_update_vm -update the bo_va in its VM 474 483 * ··· 489 478 * vital here, so they are not reported back to userspace. 490 479 */ 491 480 static void amdgpu_gem_va_update_vm(struct amdgpu_device *adev, 492 - struct amdgpu_bo_va *bo_va, uint32_t operation) 481 + struct amdgpu_bo_va *bo_va, 482 + uint32_t operation) 493 483 { 494 484 struct ttm_validate_buffer tv, *entry; 495 485 struct amdgpu_bo_list_entry vm_pd; ··· 513 501 if (r) 514 502 goto error_print; 515 503 516 - amdgpu_vm_get_pt_bos(adev, bo_va->vm, &duplicates); 517 504 list_for_each_entry(entry, &list, head) { 518 505 domain = amdgpu_mem_type_to_domain(entry->bo->mem.mem_type); 519 506 /* if anything is swapped out don't swap it in here, ··· 520 509 if (domain == AMDGPU_GEM_DOMAIN_CPU) 521 510 goto error_unreserve; 522 511 } 523 - list_for_each_entry(entry, &duplicates, head) { 524 - domain = amdgpu_mem_type_to_domain(entry->bo->mem.mem_type); 525 - /* if anything is swapped out don't swap it in here, 526 - just abort and wait for the next CS */ 527 - if (domain == AMDGPU_GEM_DOMAIN_CPU) 528 - goto error_unreserve; 529 - } 512 + r = amdgpu_vm_validate_pt_bos(adev, bo_va->vm, amdgpu_gem_va_check, 513 + NULL); 514 + if (r) 515 + goto error_unreserve; 530 516 531 517 r = amdgpu_vm_update_page_directory(adev, bo_va->vm); 532 518 if (r) ··· 544 536 DRM_ERROR("Couldn't update BO_VA (%d)\n", r); 545 537 } 546 538 547 - 548 - 549 539 int amdgpu_gem_va_ioctl(struct drm_device *dev, void *data, 550 540 struct drm_file *filp) 551 541 { ··· 553 547 struct amdgpu_fpriv *fpriv = filp->driver_priv; 554 548 struct amdgpu_bo *abo; 555 549 struct amdgpu_bo_va *bo_va; 556 - struct ttm_validate_buffer tv, tv_pd; 550 + struct amdgpu_bo_list_entry vm_pd; 551 + struct ttm_validate_buffer tv; 557 552 struct ww_acquire_ctx ticket; 558 553 struct list_head list, duplicates; 559 554 uint32_t invalid_flags, va_flags = 0; ··· 599 592 tv.shared = true; 600 593 list_add(&tv.head, &list); 601 594 602 - tv_pd.bo = &fpriv->vm.page_directory->tbo; 603 - tv_pd.shared = true; 604 - list_add(&tv_pd.head, &list); 595 + amdgpu_vm_get_pd_bo(&fpriv->vm, &list, &vm_pd); 605 596 606 597 r = ttm_eu_reserve_buffers(&ticket, &list, true, &duplicates); 607 598 if (r) {
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c
··· 24 24 */ 25 25 #include <drm/drmP.h> 26 26 #include "amdgpu.h" 27 + #include "amdgpu_gfx.h" 27 28 28 29 /* 29 30 * GPU scratch registers helpers function.
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.h
··· 27 27 int amdgpu_gfx_scratch_get(struct amdgpu_device *adev, uint32_t *reg); 28 28 void amdgpu_gfx_scratch_free(struct amdgpu_device *adev, uint32_t reg); 29 29 30 - unsigned amdgpu_gfx_parse_disable_cu(unsigned *mask, unsigned max_se, unsigned max_sh); 30 + void amdgpu_gfx_parse_disable_cu(unsigned *mask, unsigned max_se, 31 + unsigned max_sh); 31 32 32 33 #endif
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_gtt_mgr.c
··· 168 168 return -ENOMEM; 169 169 170 170 node->start = AMDGPU_BO_INVALID_OFFSET; 171 + node->size = mem->num_pages; 171 172 mem->mm_node = node; 172 173 173 174 if (place->fpfn || place->lpfn || place->flags & TTM_PL_FLAG_TOPDOWN) {
+3 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_ib.c
··· 152 152 return -EINVAL; 153 153 } 154 154 155 - alloc_size = amdgpu_ring_get_dma_frame_size(ring) + 156 - num_ibs * amdgpu_ring_get_emit_ib_size(ring); 155 + alloc_size = ring->funcs->emit_frame_size + num_ibs * 156 + ring->funcs->emit_ib_size; 157 157 158 158 r = amdgpu_ring_alloc(ring, alloc_size); 159 159 if (r) { ··· 161 161 return r; 162 162 } 163 163 164 - if (ring->type == AMDGPU_RING_TYPE_SDMA && ring->funcs->init_cond_exec) 164 + if (ring->funcs->init_cond_exec) 165 165 patch_offset = amdgpu_ring_init_cond_exec(ring); 166 166 167 167 if (vm) {
+56 -6
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
··· 306 306 } 307 307 308 308 for (i = 0; i < adev->num_ip_blocks; i++) { 309 - if (adev->ip_blocks[i].type == type && 310 - adev->ip_block_status[i].valid) { 311 - ip.hw_ip_version_major = adev->ip_blocks[i].major; 312 - ip.hw_ip_version_minor = adev->ip_blocks[i].minor; 309 + if (adev->ip_blocks[i].version->type == type && 310 + adev->ip_blocks[i].status.valid) { 311 + ip.hw_ip_version_major = adev->ip_blocks[i].version->major; 312 + ip.hw_ip_version_minor = adev->ip_blocks[i].version->minor; 313 313 ip.capabilities_flags = 0; 314 314 ip.available_rings = ring_mask; 315 315 ip.ib_start_alignment = ib_start_alignment; ··· 345 345 } 346 346 347 347 for (i = 0; i < adev->num_ip_blocks; i++) 348 - if (adev->ip_blocks[i].type == type && 349 - adev->ip_block_status[i].valid && 348 + if (adev->ip_blocks[i].version->type == type && 349 + adev->ip_blocks[i].status.valid && 350 350 count < AMDGPU_HW_IP_INSTANCE_MAX_COUNT) 351 351 count++; 352 352 ··· 410 410 vram_gtt.gtt_size -= adev->gart_pin_size; 411 411 return copy_to_user(out, &vram_gtt, 412 412 min((size_t)size, sizeof(vram_gtt))) ? -EFAULT : 0; 413 + } 414 + case AMDGPU_INFO_MEMORY: { 415 + struct drm_amdgpu_memory_info mem; 416 + 417 + memset(&mem, 0, sizeof(mem)); 418 + mem.vram.total_heap_size = adev->mc.real_vram_size; 419 + mem.vram.usable_heap_size = 420 + adev->mc.real_vram_size - adev->vram_pin_size; 421 + mem.vram.heap_usage = atomic64_read(&adev->vram_usage); 422 + mem.vram.max_allocation = mem.vram.usable_heap_size * 3 / 4; 423 + 424 + mem.cpu_accessible_vram.total_heap_size = 425 + adev->mc.visible_vram_size; 426 + mem.cpu_accessible_vram.usable_heap_size = 427 + adev->mc.visible_vram_size - 428 + (adev->vram_pin_size - adev->invisible_pin_size); 429 + mem.cpu_accessible_vram.heap_usage = 430 + atomic64_read(&adev->vram_vis_usage); 431 + mem.cpu_accessible_vram.max_allocation = 432 + mem.cpu_accessible_vram.usable_heap_size * 3 / 4; 433 + 434 + mem.gtt.total_heap_size = adev->mc.gtt_size; 435 + mem.gtt.usable_heap_size = 436 + adev->mc.gtt_size - adev->gart_pin_size; 437 + mem.gtt.heap_usage = atomic64_read(&adev->gtt_usage); 438 + mem.gtt.max_allocation = mem.gtt.usable_heap_size * 3 / 4; 439 + 440 + return copy_to_user(out, &mem, 441 + min((size_t)size, sizeof(mem))) 442 + ? -EFAULT : 0; 413 443 } 414 444 case AMDGPU_INFO_READ_MMR_REG: { 415 445 unsigned n, alloc_size; ··· 505 475 dev_info.ids_flags = 0; 506 476 if (adev->flags & AMD_IS_APU) 507 477 dev_info.ids_flags |= AMDGPU_IDS_FLAGS_FUSION; 478 + if (amdgpu_sriov_vf(adev)) 479 + dev_info.ids_flags |= AMDGPU_IDS_FLAGS_PREEMPTION; 508 480 dev_info.virtual_address_offset = AMDGPU_VA_RESERVED_SIZE; 509 481 dev_info.virtual_address_max = (uint64_t)adev->vm_manager.max_pfn * AMDGPU_GPU_PAGE_SIZE; 510 482 dev_info.virtual_address_alignment = max((int)PAGE_SIZE, AMDGPU_GPU_PAGE_SIZE); ··· 525 493 526 494 return copy_to_user(out, &dev_info, 527 495 min((size_t)size, sizeof(dev_info))) ? -EFAULT : 0; 496 + } 497 + case AMDGPU_INFO_VCE_CLOCK_TABLE: { 498 + unsigned i; 499 + struct drm_amdgpu_info_vce_clock_table vce_clk_table = {}; 500 + struct amd_vce_state *vce_state; 501 + 502 + for (i = 0; i < AMDGPU_VCE_CLOCK_TABLE_ENTRIES; i++) { 503 + vce_state = amdgpu_dpm_get_vce_clock_state(adev, i); 504 + if (vce_state) { 505 + vce_clk_table.entries[i].sclk = vce_state->sclk; 506 + vce_clk_table.entries[i].mclk = vce_state->mclk; 507 + vce_clk_table.entries[i].eclk = vce_state->evclk; 508 + vce_clk_table.num_valid_entries++; 509 + } 510 + } 511 + 512 + return copy_to_user(out, &vce_clk_table, 513 + min((size_t)size, sizeof(vce_clk_table))) ? -EFAULT : 0; 528 514 } 529 515 default: 530 516 DRM_DEBUG_KMS("Invalid request %d\n", info->query);
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_mn.c
··· 285 285 int amdgpu_mn_register(struct amdgpu_bo *bo, unsigned long addr) 286 286 { 287 287 unsigned long end = addr + amdgpu_bo_size(bo) - 1; 288 - struct amdgpu_device *adev = bo->adev; 288 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 289 289 struct amdgpu_mn *rmn; 290 290 struct amdgpu_mn_node *node = NULL; 291 291 struct list_head bos; ··· 340 340 */ 341 341 void amdgpu_mn_unregister(struct amdgpu_bo *bo) 342 342 { 343 - struct amdgpu_device *adev = bo->adev; 343 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 344 344 struct amdgpu_mn *rmn; 345 345 struct list_head *head; 346 346
+3 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
··· 341 341 int num_dig; /* number of dig blocks */ 342 342 int disp_priority; 343 343 const struct amdgpu_display_funcs *funcs; 344 - struct hrtimer vblank_timer; 345 - enum amdgpu_interrupt_state vsync_timer_enabled; 346 344 }; 347 345 348 346 #define AMDGPU_MAX_BL_LEVEL 0xFF ··· 411 413 u32 wm_high; 412 414 u32 lb_vblank_lead_lines; 413 415 struct drm_display_mode hw_mode; 416 + /* for virtual dce */ 417 + struct hrtimer vblank_timer; 418 + enum amdgpu_interrupt_state vsync_timer_enabled; 414 419 }; 415 420 416 421 struct amdgpu_encoder_atom_dig {
+44 -27
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c
··· 88 88 89 89 static void amdgpu_ttm_bo_destroy(struct ttm_buffer_object *tbo) 90 90 { 91 + struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); 91 92 struct amdgpu_bo *bo; 92 93 93 94 bo = container_of(tbo, struct amdgpu_bo, tbo); 94 95 95 - amdgpu_update_memory_usage(bo->adev, &bo->tbo.mem, NULL); 96 + amdgpu_update_memory_usage(adev, &bo->tbo.mem, NULL); 96 97 97 98 drm_gem_object_release(&bo->gem_base); 98 99 amdgpu_bo_unref(&bo->parent); 99 100 if (!list_empty(&bo->shadow_list)) { 100 - mutex_lock(&bo->adev->shadow_list_lock); 101 + mutex_lock(&adev->shadow_list_lock); 101 102 list_del_init(&bo->shadow_list); 102 - mutex_unlock(&bo->adev->shadow_list_lock); 103 + mutex_unlock(&adev->shadow_list_lock); 103 104 } 104 105 kfree(bo->metadata); 105 106 kfree(bo); ··· 122 121 123 122 if (domain & AMDGPU_GEM_DOMAIN_VRAM) { 124 123 unsigned visible_pfn = adev->mc.visible_vram_size >> PAGE_SHIFT; 124 + unsigned lpfn = 0; 125 + 126 + /* This forces a reallocation if the flag wasn't set before */ 127 + if (flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS) 128 + lpfn = adev->mc.real_vram_size >> PAGE_SHIFT; 125 129 126 130 if (flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS && 127 131 !(flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) && 128 132 adev->mc.visible_vram_size < adev->mc.real_vram_size) { 129 133 places[c].fpfn = visible_pfn; 130 - places[c].lpfn = 0; 134 + places[c].lpfn = lpfn; 131 135 places[c].flags = TTM_PL_FLAG_WC | 132 136 TTM_PL_FLAG_UNCACHED | TTM_PL_FLAG_VRAM | 133 137 TTM_PL_FLAG_TOPDOWN; ··· 140 134 } 141 135 142 136 places[c].fpfn = 0; 143 - places[c].lpfn = 0; 137 + places[c].lpfn = lpfn; 144 138 places[c].flags = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED | 145 139 TTM_PL_FLAG_VRAM; 146 140 if (flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED) ··· 211 205 212 206 void amdgpu_ttm_placement_from_domain(struct amdgpu_bo *abo, u32 domain) 213 207 { 214 - amdgpu_ttm_placement_init(abo->adev, &abo->placement, 215 - abo->placements, domain, abo->flags); 208 + struct amdgpu_device *adev = amdgpu_ttm_adev(abo->tbo.bdev); 209 + 210 + amdgpu_ttm_placement_init(adev, &abo->placement, abo->placements, 211 + domain, abo->flags); 216 212 } 217 213 218 214 static void amdgpu_fill_placement_to_bo(struct amdgpu_bo *bo, ··· 253 245 int r; 254 246 255 247 r = amdgpu_bo_create(adev, size, align, true, domain, 256 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 248 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 249 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 257 250 NULL, NULL, bo_ptr); 258 251 if (r) { 259 252 dev_err(adev->dev, "(%d) failed to allocate kernel bo\n", r); ··· 360 351 kfree(bo); 361 352 return r; 362 353 } 363 - bo->adev = adev; 364 354 INIT_LIST_HEAD(&bo->shadow_list); 365 355 INIT_LIST_HEAD(&bo->va); 366 356 bo->prefered_domains = domain & (AMDGPU_GEM_DOMAIN_VRAM | ··· 624 616 u64 min_offset, u64 max_offset, 625 617 u64 *gpu_addr) 626 618 { 619 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 627 620 int r, i; 628 621 unsigned fpfn, lpfn; 629 622 ··· 652 643 653 644 return 0; 654 645 } 646 + 647 + bo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; 655 648 amdgpu_ttm_placement_from_domain(bo, domain); 656 649 for (i = 0; i < bo->placement.num_placement; i++) { 657 650 /* force to pin into visible video ram */ 658 651 if ((bo->placements[i].flags & TTM_PL_FLAG_VRAM) && 659 652 !(bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) && 660 653 (!max_offset || max_offset > 661 - bo->adev->mc.visible_vram_size)) { 654 + adev->mc.visible_vram_size)) { 662 655 if (WARN_ON_ONCE(min_offset > 663 - bo->adev->mc.visible_vram_size)) 656 + adev->mc.visible_vram_size)) 664 657 return -EINVAL; 665 658 fpfn = min_offset >> PAGE_SHIFT; 666 - lpfn = bo->adev->mc.visible_vram_size >> PAGE_SHIFT; 659 + lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; 667 660 } else { 668 661 fpfn = min_offset >> PAGE_SHIFT; 669 662 lpfn = max_offset >> PAGE_SHIFT; ··· 680 669 681 670 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 682 671 if (unlikely(r)) { 683 - dev_err(bo->adev->dev, "%p pin failed\n", bo); 672 + dev_err(adev->dev, "%p pin failed\n", bo); 684 673 goto error; 685 674 } 686 675 r = amdgpu_ttm_bind(&bo->tbo, &bo->tbo.mem); 687 676 if (unlikely(r)) { 688 - dev_err(bo->adev->dev, "%p bind failed\n", bo); 677 + dev_err(adev->dev, "%p bind failed\n", bo); 689 678 goto error; 690 679 } 691 680 ··· 693 682 if (gpu_addr != NULL) 694 683 *gpu_addr = amdgpu_bo_gpu_offset(bo); 695 684 if (domain == AMDGPU_GEM_DOMAIN_VRAM) { 696 - bo->adev->vram_pin_size += amdgpu_bo_size(bo); 685 + adev->vram_pin_size += amdgpu_bo_size(bo); 697 686 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) 698 - bo->adev->invisible_pin_size += amdgpu_bo_size(bo); 687 + adev->invisible_pin_size += amdgpu_bo_size(bo); 699 688 } else if (domain == AMDGPU_GEM_DOMAIN_GTT) { 700 - bo->adev->gart_pin_size += amdgpu_bo_size(bo); 689 + adev->gart_pin_size += amdgpu_bo_size(bo); 701 690 } 702 691 703 692 error: ··· 711 700 712 701 int amdgpu_bo_unpin(struct amdgpu_bo *bo) 713 702 { 703 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 714 704 int r, i; 715 705 716 706 if (!bo->pin_count) { 717 - dev_warn(bo->adev->dev, "%p unpin not necessary\n", bo); 707 + dev_warn(adev->dev, "%p unpin not necessary\n", bo); 718 708 return 0; 719 709 } 720 710 bo->pin_count--; ··· 727 715 } 728 716 r = ttm_bo_validate(&bo->tbo, &bo->placement, false, false); 729 717 if (unlikely(r)) { 730 - dev_err(bo->adev->dev, "%p validate failed for unpin\n", bo); 718 + dev_err(adev->dev, "%p validate failed for unpin\n", bo); 731 719 goto error; 732 720 } 733 721 734 722 if (bo->tbo.mem.mem_type == TTM_PL_VRAM) { 735 - bo->adev->vram_pin_size -= amdgpu_bo_size(bo); 723 + adev->vram_pin_size -= amdgpu_bo_size(bo); 736 724 if (bo->flags & AMDGPU_GEM_CREATE_NO_CPU_ACCESS) 737 - bo->adev->invisible_pin_size -= amdgpu_bo_size(bo); 725 + adev->invisible_pin_size -= amdgpu_bo_size(bo); 738 726 } else if (bo->tbo.mem.mem_type == TTM_PL_TT) { 739 - bo->adev->gart_pin_size -= amdgpu_bo_size(bo); 727 + adev->gart_pin_size -= amdgpu_bo_size(bo); 740 728 } 741 729 742 730 error: ··· 861 849 void amdgpu_bo_move_notify(struct ttm_buffer_object *bo, 862 850 struct ttm_mem_reg *new_mem) 863 851 { 852 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); 864 853 struct amdgpu_bo *abo; 865 854 struct ttm_mem_reg *old_mem = &bo->mem; 866 855 ··· 869 856 return; 870 857 871 858 abo = container_of(bo, struct amdgpu_bo, tbo); 872 - amdgpu_vm_bo_invalidate(abo->adev, abo); 859 + amdgpu_vm_bo_invalidate(adev, abo); 873 860 874 861 /* update statistics */ 875 862 if (!new_mem) 876 863 return; 877 864 878 865 /* move_notify is called before move happens */ 879 - amdgpu_update_memory_usage(abo->adev, &bo->mem, new_mem); 866 + amdgpu_update_memory_usage(adev, &bo->mem, new_mem); 880 867 881 868 trace_amdgpu_ttm_bo_move(abo, new_mem->mem_type, old_mem->mem_type); 882 869 } 883 870 884 871 int amdgpu_bo_fault_reserve_notify(struct ttm_buffer_object *bo) 885 872 { 886 - struct amdgpu_device *adev; 873 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); 887 874 struct amdgpu_bo *abo; 888 875 unsigned long offset, size, lpfn; 889 876 int i, r; ··· 892 879 return 0; 893 880 894 881 abo = container_of(bo, struct amdgpu_bo, tbo); 895 - adev = abo->adev; 896 882 if (bo->mem.mem_type != TTM_PL_VRAM) 897 883 return 0; 898 884 899 885 size = bo->mem.num_pages << PAGE_SHIFT; 900 886 offset = bo->mem.start << PAGE_SHIFT; 901 - if ((offset + size) <= adev->mc.visible_vram_size) 887 + /* TODO: figure out how to map scattered VRAM to the CPU */ 888 + if ((offset + size) <= adev->mc.visible_vram_size && 889 + (abo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)) 902 890 return 0; 903 891 904 892 /* Can't move a pinned BO to visible VRAM */ ··· 907 893 return -EINVAL; 908 894 909 895 /* hurrah the memory is not visible ! */ 896 + abo->flags |= AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS; 910 897 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_VRAM); 911 898 lpfn = adev->mc.visible_vram_size >> PAGE_SHIFT; 912 899 for (i = 0; i < abo->placement.num_placement; i++) { ··· 969 954 WARN_ON_ONCE(!ww_mutex_is_locked(&bo->tbo.resv->lock) && 970 955 !bo->pin_count); 971 956 WARN_ON_ONCE(bo->tbo.mem.start == AMDGPU_BO_INVALID_OFFSET); 957 + WARN_ON_ONCE(bo->tbo.mem.mem_type == TTM_PL_VRAM && 958 + !(bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS)); 972 959 973 960 return bo->tbo.offset; 974 961 }
+2 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h
··· 71 71 */ 72 72 static inline int amdgpu_bo_reserve(struct amdgpu_bo *bo, bool no_intr) 73 73 { 74 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 74 75 int r; 75 76 76 77 r = ttm_bo_reserve(&bo->tbo, !no_intr, false, NULL); 77 78 if (unlikely(r != 0)) { 78 79 if (r != -ERESTARTSYS) 79 - dev_err(bo->adev->dev, "%p reserve failed\n", bo); 80 + dev_err(adev->dev, "%p reserve failed\n", bo); 80 81 return r; 81 82 } 82 83 return 0;
+17 -67
drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c
··· 986 986 987 987 static void amdgpu_dpm_change_power_state_locked(struct amdgpu_device *adev) 988 988 { 989 - int i; 990 989 struct amdgpu_ps *ps; 991 990 enum amd_pm_state_type dpm_state; 992 991 int ret; 992 + bool equal; 993 993 994 994 /* if dpm init failed */ 995 995 if (!adev->pm.dpm_enabled) ··· 1009 1009 else 1010 1010 return; 1011 1011 1012 - /* no need to reprogram if nothing changed unless we are on BTC+ */ 1013 - if (adev->pm.dpm.current_ps == adev->pm.dpm.requested_ps) { 1014 - /* vce just modifies an existing state so force a change */ 1015 - if (ps->vce_active != adev->pm.dpm.vce_active) 1016 - goto force; 1017 - if (adev->flags & AMD_IS_APU) { 1018 - /* for APUs if the num crtcs changed but state is the same, 1019 - * all we need to do is update the display configuration. 1020 - */ 1021 - if (adev->pm.dpm.new_active_crtcs != adev->pm.dpm.current_active_crtcs) { 1022 - /* update display watermarks based on new power state */ 1023 - amdgpu_display_bandwidth_update(adev); 1024 - /* update displays */ 1025 - amdgpu_dpm_display_configuration_changed(adev); 1026 - adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs; 1027 - adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; 1028 - } 1029 - return; 1030 - } else { 1031 - /* for BTC+ if the num crtcs hasn't changed and state is the same, 1032 - * nothing to do, if the num crtcs is > 1 and state is the same, 1033 - * update display configuration. 1034 - */ 1035 - if (adev->pm.dpm.new_active_crtcs == 1036 - adev->pm.dpm.current_active_crtcs) { 1037 - return; 1038 - } else if ((adev->pm.dpm.current_active_crtc_count > 1) && 1039 - (adev->pm.dpm.new_active_crtc_count > 1)) { 1040 - /* update display watermarks based on new power state */ 1041 - amdgpu_display_bandwidth_update(adev); 1042 - /* update displays */ 1043 - amdgpu_dpm_display_configuration_changed(adev); 1044 - adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs; 1045 - adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; 1046 - return; 1047 - } 1048 - } 1049 - } 1050 - 1051 - force: 1052 1012 if (amdgpu_dpm == 1) { 1053 1013 printk("switching from power state:\n"); 1054 1014 amdgpu_dpm_print_power_state(adev, adev->pm.dpm.current_ps); ··· 1019 1059 /* update whether vce is active */ 1020 1060 ps->vce_active = adev->pm.dpm.vce_active; 1021 1061 1062 + amdgpu_dpm_display_configuration_changed(adev); 1063 + 1022 1064 ret = amdgpu_dpm_pre_set_power_state(adev); 1023 1065 if (ret) 1024 1066 return; 1025 1067 1026 - /* update display watermarks based on new power state */ 1027 - amdgpu_display_bandwidth_update(adev); 1068 + if ((0 != amgdpu_dpm_check_state_equal(adev, adev->pm.dpm.current_ps, adev->pm.dpm.requested_ps, &equal))) 1069 + equal = false; 1028 1070 1029 - /* wait for the rings to drain */ 1030 - for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 1031 - struct amdgpu_ring *ring = adev->rings[i]; 1032 - if (ring && ring->ready) 1033 - amdgpu_fence_wait_empty(ring); 1034 - } 1071 + if (equal) 1072 + return; 1035 1073 1036 - /* program the new power state */ 1037 1074 amdgpu_dpm_set_power_state(adev); 1038 - 1039 - /* update current power state */ 1040 - adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps; 1041 - 1042 1075 amdgpu_dpm_post_set_power_state(adev); 1043 - 1044 - /* update displays */ 1045 - amdgpu_dpm_display_configuration_changed(adev); 1046 1076 1047 1077 adev->pm.dpm.current_active_crtcs = adev->pm.dpm.new_active_crtcs; 1048 1078 adev->pm.dpm.current_active_crtc_count = adev->pm.dpm.new_active_crtc_count; ··· 1085 1135 mutex_lock(&adev->pm.mutex); 1086 1136 adev->pm.dpm.vce_active = true; 1087 1137 /* XXX select vce level based on ring/task */ 1088 - adev->pm.dpm.vce_level = AMDGPU_VCE_LEVEL_AC_ALL; 1138 + adev->pm.dpm.vce_level = AMD_VCE_LEVEL_AC_ALL; 1089 1139 mutex_unlock(&adev->pm.mutex); 1090 1140 } else { 1091 1141 mutex_lock(&adev->pm.mutex); ··· 1226 1276 struct drm_device *ddev = adev->ddev; 1227 1277 struct drm_crtc *crtc; 1228 1278 struct amdgpu_crtc *amdgpu_crtc; 1279 + int i = 0; 1229 1280 1230 1281 if (!adev->pm.dpm_enabled) 1231 1282 return; 1232 1283 1284 + amdgpu_display_bandwidth_update(adev); 1285 + 1286 + for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 1287 + struct amdgpu_ring *ring = adev->rings[i]; 1288 + if (ring && ring->ready) 1289 + amdgpu_fence_wait_empty(ring); 1290 + } 1291 + 1233 1292 if (adev->pp_enabled) { 1234 - int i = 0; 1235 - 1236 - amdgpu_display_bandwidth_update(adev); 1237 - for (i = 0; i < AMDGPU_MAX_RINGS; i++) { 1238 - struct amdgpu_ring *ring = adev->rings[i]; 1239 - if (ring && ring->ready) 1240 - amdgpu_fence_wait_empty(ring); 1241 - } 1242 - 1243 1293 amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE, NULL, NULL); 1244 1294 } else { 1245 1295 mutex_lock(&adev->pm.mutex);
+10 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.c
··· 299 299 return ret; 300 300 } 301 301 302 - const struct amd_ip_funcs amdgpu_pp_ip_funcs = { 302 + static const struct amd_ip_funcs amdgpu_pp_ip_funcs = { 303 303 .name = "amdgpu_powerplay", 304 304 .early_init = amdgpu_pp_early_init, 305 305 .late_init = amdgpu_pp_late_init, ··· 315 315 .soft_reset = amdgpu_pp_soft_reset, 316 316 .set_clockgating_state = amdgpu_pp_set_clockgating_state, 317 317 .set_powergating_state = amdgpu_pp_set_powergating_state, 318 + }; 319 + 320 + const struct amdgpu_ip_block_version amdgpu_pp_ip_block = 321 + { 322 + .type = AMD_IP_BLOCK_TYPE_SMC, 323 + .major = 1, 324 + .minor = 0, 325 + .rev = 0, 326 + .funcs = &amdgpu_pp_ip_funcs, 318 327 };
+4 -4
drivers/gpu/drm/amd/amdgpu/amdgpu_powerplay.h
··· 23 23 * 24 24 */ 25 25 26 - #ifndef __AMDGPU_POPWERPLAY_H__ 27 - #define __AMDGPU_POPWERPLAY_H__ 26 + #ifndef __AMDGPU_POWERPLAY_H__ 27 + #define __AMDGPU_POWERPLAY_H__ 28 28 29 29 #include "amd_shared.h" 30 30 31 - extern const struct amd_ip_funcs amdgpu_pp_ip_funcs; 31 + extern const struct amdgpu_ip_block_version amdgpu_pp_ip_block; 32 32 33 - #endif /* __AMDSOC_DM_H__ */ 33 + #endif /* __AMDGPU_POWERPLAY_H__ */
+9 -12
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.c
··· 65 65 { 66 66 /* Align requested size with padding so unlock_commit can 67 67 * pad safely */ 68 - ndw = (ndw + ring->align_mask) & ~ring->align_mask; 68 + ndw = (ndw + ring->funcs->align_mask) & ~ring->funcs->align_mask; 69 69 70 70 /* Make sure we aren't trying to allocate more space 71 71 * than the maximum for one submission ··· 94 94 int i; 95 95 96 96 for (i = 0; i < count; i++) 97 - amdgpu_ring_write(ring, ring->nop); 97 + amdgpu_ring_write(ring, ring->funcs->nop); 98 98 } 99 99 100 100 /** amdgpu_ring_generic_pad_ib - pad IB with NOP packets ··· 106 106 */ 107 107 void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib) 108 108 { 109 - while (ib->length_dw & ring->align_mask) 110 - ib->ptr[ib->length_dw++] = ring->nop; 109 + while (ib->length_dw & ring->funcs->align_mask) 110 + ib->ptr[ib->length_dw++] = ring->funcs->nop; 111 111 } 112 112 113 113 /** ··· 125 125 uint32_t count; 126 126 127 127 /* We pad to match fetch size */ 128 - count = ring->align_mask + 1 - (ring->wptr & ring->align_mask); 129 - count %= ring->align_mask + 1; 128 + count = ring->funcs->align_mask + 1 - 129 + (ring->wptr & ring->funcs->align_mask); 130 + count %= ring->funcs->align_mask + 1; 130 131 ring->funcs->insert_nop(ring, count); 131 132 132 133 mb(); ··· 164 163 * Returns 0 on success, error on failure. 165 164 */ 166 165 int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, 167 - unsigned max_dw, u32 nop, u32 align_mask, 168 - struct amdgpu_irq_src *irq_src, unsigned irq_type, 169 - enum amdgpu_ring_type ring_type) 166 + unsigned max_dw, struct amdgpu_irq_src *irq_src, 167 + unsigned irq_type) 170 168 { 171 169 int r; 172 170 ··· 216 216 217 217 ring->ring_size = roundup_pow_of_two(max_dw * 4 * 218 218 amdgpu_sched_hw_submission); 219 - ring->align_mask = align_mask; 220 - ring->nop = nop; 221 - ring->type = ring_type; 222 219 223 220 /* Allocate ring buffer */ 224 221 if (ring->ring_obj == NULL) {
+185
drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
··· 1 + /* 2 + * Copyright 2016 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Christian König 23 + */ 24 + #ifndef __AMDGPU_RING_H__ 25 + #define __AMDGPU_RING_H__ 26 + 27 + #include "gpu_scheduler.h" 28 + 29 + /* max number of rings */ 30 + #define AMDGPU_MAX_RINGS 16 31 + #define AMDGPU_MAX_GFX_RINGS 1 32 + #define AMDGPU_MAX_COMPUTE_RINGS 8 33 + #define AMDGPU_MAX_VCE_RINGS 3 34 + 35 + /* some special values for the owner field */ 36 + #define AMDGPU_FENCE_OWNER_UNDEFINED ((void*)0ul) 37 + #define AMDGPU_FENCE_OWNER_VM ((void*)1ul) 38 + 39 + #define AMDGPU_FENCE_FLAG_64BIT (1 << 0) 40 + #define AMDGPU_FENCE_FLAG_INT (1 << 1) 41 + 42 + enum amdgpu_ring_type { 43 + AMDGPU_RING_TYPE_GFX, 44 + AMDGPU_RING_TYPE_COMPUTE, 45 + AMDGPU_RING_TYPE_SDMA, 46 + AMDGPU_RING_TYPE_UVD, 47 + AMDGPU_RING_TYPE_VCE 48 + }; 49 + 50 + struct amdgpu_device; 51 + struct amdgpu_ring; 52 + struct amdgpu_ib; 53 + struct amdgpu_cs_parser; 54 + 55 + /* 56 + * Fences. 57 + */ 58 + struct amdgpu_fence_driver { 59 + uint64_t gpu_addr; 60 + volatile uint32_t *cpu_addr; 61 + /* sync_seq is protected by ring emission lock */ 62 + uint32_t sync_seq; 63 + atomic_t last_seq; 64 + bool initialized; 65 + struct amdgpu_irq_src *irq_src; 66 + unsigned irq_type; 67 + struct timer_list fallback_timer; 68 + unsigned num_fences_mask; 69 + spinlock_t lock; 70 + struct fence **fences; 71 + }; 72 + 73 + int amdgpu_fence_driver_init(struct amdgpu_device *adev); 74 + void amdgpu_fence_driver_fini(struct amdgpu_device *adev); 75 + void amdgpu_fence_driver_force_completion(struct amdgpu_device *adev); 76 + 77 + int amdgpu_fence_driver_init_ring(struct amdgpu_ring *ring, 78 + unsigned num_hw_submission); 79 + int amdgpu_fence_driver_start_ring(struct amdgpu_ring *ring, 80 + struct amdgpu_irq_src *irq_src, 81 + unsigned irq_type); 82 + void amdgpu_fence_driver_suspend(struct amdgpu_device *adev); 83 + void amdgpu_fence_driver_resume(struct amdgpu_device *adev); 84 + int amdgpu_fence_emit(struct amdgpu_ring *ring, struct fence **fence); 85 + void amdgpu_fence_process(struct amdgpu_ring *ring); 86 + int amdgpu_fence_wait_empty(struct amdgpu_ring *ring); 87 + unsigned amdgpu_fence_count_emitted(struct amdgpu_ring *ring); 88 + 89 + /* 90 + * Rings. 91 + */ 92 + 93 + /* provided by hw blocks that expose a ring buffer for commands */ 94 + struct amdgpu_ring_funcs { 95 + enum amdgpu_ring_type type; 96 + uint32_t align_mask; 97 + u32 nop; 98 + 99 + /* ring read/write ptr handling */ 100 + u32 (*get_rptr)(struct amdgpu_ring *ring); 101 + u32 (*get_wptr)(struct amdgpu_ring *ring); 102 + void (*set_wptr)(struct amdgpu_ring *ring); 103 + /* validating and patching of IBs */ 104 + int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx); 105 + /* constants to calculate how many DW are needed for an emit */ 106 + unsigned emit_frame_size; 107 + unsigned emit_ib_size; 108 + /* command emit functions */ 109 + void (*emit_ib)(struct amdgpu_ring *ring, 110 + struct amdgpu_ib *ib, 111 + unsigned vm_id, bool ctx_switch); 112 + void (*emit_fence)(struct amdgpu_ring *ring, uint64_t addr, 113 + uint64_t seq, unsigned flags); 114 + void (*emit_pipeline_sync)(struct amdgpu_ring *ring); 115 + void (*emit_vm_flush)(struct amdgpu_ring *ring, unsigned vm_id, 116 + uint64_t pd_addr); 117 + void (*emit_hdp_flush)(struct amdgpu_ring *ring); 118 + void (*emit_hdp_invalidate)(struct amdgpu_ring *ring); 119 + void (*emit_gds_switch)(struct amdgpu_ring *ring, uint32_t vmid, 120 + uint32_t gds_base, uint32_t gds_size, 121 + uint32_t gws_base, uint32_t gws_size, 122 + uint32_t oa_base, uint32_t oa_size); 123 + /* testing functions */ 124 + int (*test_ring)(struct amdgpu_ring *ring); 125 + int (*test_ib)(struct amdgpu_ring *ring, long timeout); 126 + /* insert NOP packets */ 127 + void (*insert_nop)(struct amdgpu_ring *ring, uint32_t count); 128 + /* pad the indirect buffer to the necessary number of dw */ 129 + void (*pad_ib)(struct amdgpu_ring *ring, struct amdgpu_ib *ib); 130 + unsigned (*init_cond_exec)(struct amdgpu_ring *ring); 131 + void (*patch_cond_exec)(struct amdgpu_ring *ring, unsigned offset); 132 + /* note usage for clock and power gating */ 133 + void (*begin_use)(struct amdgpu_ring *ring); 134 + void (*end_use)(struct amdgpu_ring *ring); 135 + void (*emit_switch_buffer) (struct amdgpu_ring *ring); 136 + void (*emit_cntxcntl) (struct amdgpu_ring *ring, uint32_t flags); 137 + }; 138 + 139 + struct amdgpu_ring { 140 + struct amdgpu_device *adev; 141 + const struct amdgpu_ring_funcs *funcs; 142 + struct amdgpu_fence_driver fence_drv; 143 + struct amd_gpu_scheduler sched; 144 + 145 + struct amdgpu_bo *ring_obj; 146 + volatile uint32_t *ring; 147 + unsigned rptr_offs; 148 + unsigned wptr; 149 + unsigned wptr_old; 150 + unsigned ring_size; 151 + unsigned max_dw; 152 + int count_dw; 153 + uint64_t gpu_addr; 154 + uint32_t ptr_mask; 155 + bool ready; 156 + u32 idx; 157 + u32 me; 158 + u32 pipe; 159 + u32 queue; 160 + struct amdgpu_bo *mqd_obj; 161 + u32 doorbell_index; 162 + bool use_doorbell; 163 + unsigned wptr_offs; 164 + unsigned fence_offs; 165 + uint64_t current_ctx; 166 + char name[16]; 167 + unsigned cond_exe_offs; 168 + u64 cond_exe_gpu_addr; 169 + volatile u32 *cond_exe_cpu_addr; 170 + #if defined(CONFIG_DEBUG_FS) 171 + struct dentry *ent; 172 + #endif 173 + }; 174 + 175 + int amdgpu_ring_alloc(struct amdgpu_ring *ring, unsigned ndw); 176 + void amdgpu_ring_insert_nop(struct amdgpu_ring *ring, uint32_t count); 177 + void amdgpu_ring_generic_pad_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib); 178 + void amdgpu_ring_commit(struct amdgpu_ring *ring); 179 + void amdgpu_ring_undo(struct amdgpu_ring *ring); 180 + int amdgpu_ring_init(struct amdgpu_device *adev, struct amdgpu_ring *ring, 181 + unsigned ring_size, struct amdgpu_irq_src *irq_src, 182 + unsigned irq_type); 183 + void amdgpu_ring_fini(struct amdgpu_ring *ring); 184 + 185 + #endif
+56
drivers/gpu/drm/amd/amdgpu/amdgpu_sync.h
··· 1 + /* 2 + * Copyright 2016 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Christian König 23 + */ 24 + #ifndef __AMDGPU_SYNC_H__ 25 + #define __AMDGPU_SYNC_H__ 26 + 27 + #include <linux/hashtable.h> 28 + 29 + struct fence; 30 + struct reservation_object; 31 + struct amdgpu_device; 32 + struct amdgpu_ring; 33 + 34 + /* 35 + * Container for fences used to sync command submissions. 36 + */ 37 + struct amdgpu_sync { 38 + DECLARE_HASHTABLE(fences, 4); 39 + struct fence *last_vm_update; 40 + }; 41 + 42 + void amdgpu_sync_create(struct amdgpu_sync *sync); 43 + int amdgpu_sync_fence(struct amdgpu_device *adev, struct amdgpu_sync *sync, 44 + struct fence *f); 45 + int amdgpu_sync_resv(struct amdgpu_device *adev, 46 + struct amdgpu_sync *sync, 47 + struct reservation_object *resv, 48 + void *owner); 49 + struct fence *amdgpu_sync_peek_fence(struct amdgpu_sync *sync, 50 + struct amdgpu_ring *ring); 51 + struct fence *amdgpu_sync_get_fence(struct amdgpu_sync *sync); 52 + void amdgpu_sync_free(struct amdgpu_sync *sync); 53 + int amdgpu_sync_init(void); 54 + void amdgpu_sync_fini(void); 55 + 56 + #endif
+130 -61
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
··· 51 51 static int amdgpu_ttm_debugfs_init(struct amdgpu_device *adev); 52 52 static void amdgpu_ttm_debugfs_fini(struct amdgpu_device *adev); 53 53 54 - static struct amdgpu_device *amdgpu_get_adev(struct ttm_bo_device *bdev) 55 - { 56 - struct amdgpu_mman *mman; 57 - struct amdgpu_device *adev; 58 - 59 - mman = container_of(bdev, struct amdgpu_mman, bdev); 60 - adev = container_of(mman, struct amdgpu_device, mman); 61 - return adev; 62 - } 63 - 64 54 65 55 /* 66 56 * Global memory. ··· 140 150 { 141 151 struct amdgpu_device *adev; 142 152 143 - adev = amdgpu_get_adev(bdev); 153 + adev = amdgpu_ttm_adev(bdev); 144 154 145 155 switch (type) { 146 156 case TTM_PL_SYSTEM: ··· 158 168 break; 159 169 case TTM_PL_VRAM: 160 170 /* "On-card" video ram */ 161 - man->func = &ttm_bo_manager_func; 171 + man->func = &amdgpu_vram_mgr_func; 162 172 man->gpu_offset = adev->mc.vram_start; 163 173 man->flags = TTM_MEMTYPE_FLAG_FIXED | 164 174 TTM_MEMTYPE_FLAG_MAPPABLE; ··· 185 195 static void amdgpu_evict_flags(struct ttm_buffer_object *bo, 186 196 struct ttm_placement *placement) 187 197 { 198 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); 188 199 struct amdgpu_bo *abo; 189 200 static struct ttm_place placements = { 190 201 .fpfn = 0, ··· 204 213 abo = container_of(bo, struct amdgpu_bo, tbo); 205 214 switch (bo->mem.mem_type) { 206 215 case TTM_PL_VRAM: 207 - if (abo->adev->mman.buffer_funcs_ring->ready == false) { 216 + if (adev->mman.buffer_funcs_ring->ready == false) { 208 217 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_CPU); 209 218 } else { 210 219 amdgpu_ttm_placement_from_domain(abo, AMDGPU_GEM_DOMAIN_GTT); ··· 220 229 * allocating address space for the BO. 221 230 */ 222 231 abo->placements[i].lpfn = 223 - abo->adev->mc.gtt_size >> PAGE_SHIFT; 232 + adev->mc.gtt_size >> PAGE_SHIFT; 224 233 } 225 234 } 226 235 break; ··· 251 260 new_mem->mm_node = NULL; 252 261 } 253 262 254 - static int amdgpu_move_blit(struct ttm_buffer_object *bo, 255 - bool evict, bool no_wait_gpu, 256 - struct ttm_mem_reg *new_mem, 257 - struct ttm_mem_reg *old_mem) 263 + static int amdgpu_mm_node_addr(struct ttm_buffer_object *bo, 264 + struct drm_mm_node *mm_node, 265 + struct ttm_mem_reg *mem, 266 + uint64_t *addr) 258 267 { 259 - struct amdgpu_device *adev; 260 - struct amdgpu_ring *ring; 261 - uint64_t old_start, new_start; 262 - struct fence *fence; 263 268 int r; 264 269 265 - adev = amdgpu_get_adev(bo->bdev); 266 - ring = adev->mman.buffer_funcs_ring; 267 - 268 - switch (old_mem->mem_type) { 270 + switch (mem->mem_type) { 269 271 case TTM_PL_TT: 270 - r = amdgpu_ttm_bind(bo, old_mem); 272 + r = amdgpu_ttm_bind(bo, mem); 271 273 if (r) 272 274 return r; 273 275 274 276 case TTM_PL_VRAM: 275 - old_start = (u64)old_mem->start << PAGE_SHIFT; 276 - old_start += bo->bdev->man[old_mem->mem_type].gpu_offset; 277 + *addr = mm_node->start << PAGE_SHIFT; 278 + *addr += bo->bdev->man[mem->mem_type].gpu_offset; 277 279 break; 278 280 default: 279 - DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); 281 + DRM_ERROR("Unknown placement %d\n", mem->mem_type); 280 282 return -EINVAL; 281 283 } 282 - switch (new_mem->mem_type) { 283 - case TTM_PL_TT: 284 - r = amdgpu_ttm_bind(bo, new_mem); 285 - if (r) 286 - return r; 287 284 288 - case TTM_PL_VRAM: 289 - new_start = (u64)new_mem->start << PAGE_SHIFT; 290 - new_start += bo->bdev->man[new_mem->mem_type].gpu_offset; 291 - break; 292 - default: 293 - DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); 294 - return -EINVAL; 295 - } 285 + return 0; 286 + } 287 + 288 + static int amdgpu_move_blit(struct ttm_buffer_object *bo, 289 + bool evict, bool no_wait_gpu, 290 + struct ttm_mem_reg *new_mem, 291 + struct ttm_mem_reg *old_mem) 292 + { 293 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->bdev); 294 + struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring; 295 + 296 + struct drm_mm_node *old_mm, *new_mm; 297 + uint64_t old_start, old_size, new_start, new_size; 298 + unsigned long num_pages; 299 + struct fence *fence = NULL; 300 + int r; 301 + 302 + BUILD_BUG_ON((PAGE_SIZE % AMDGPU_GPU_PAGE_SIZE) != 0); 303 + 296 304 if (!ring->ready) { 297 305 DRM_ERROR("Trying to move memory with ring turned off.\n"); 298 306 return -EINVAL; 299 307 } 300 308 301 - BUILD_BUG_ON((PAGE_SIZE % AMDGPU_GPU_PAGE_SIZE) != 0); 302 - 303 - r = amdgpu_copy_buffer(ring, old_start, new_start, 304 - new_mem->num_pages * PAGE_SIZE, /* bytes */ 305 - bo->resv, &fence, false); 309 + old_mm = old_mem->mm_node; 310 + r = amdgpu_mm_node_addr(bo, old_mm, old_mem, &old_start); 306 311 if (r) 307 312 return r; 313 + old_size = old_mm->size; 314 + 315 + 316 + new_mm = new_mem->mm_node; 317 + r = amdgpu_mm_node_addr(bo, new_mm, new_mem, &new_start); 318 + if (r) 319 + return r; 320 + new_size = new_mm->size; 321 + 322 + num_pages = new_mem->num_pages; 323 + while (num_pages) { 324 + unsigned long cur_pages = min(old_size, new_size); 325 + struct fence *next; 326 + 327 + r = amdgpu_copy_buffer(ring, old_start, new_start, 328 + cur_pages * PAGE_SIZE, 329 + bo->resv, &next, false); 330 + if (r) 331 + goto error; 332 + 333 + fence_put(fence); 334 + fence = next; 335 + 336 + num_pages -= cur_pages; 337 + if (!num_pages) 338 + break; 339 + 340 + old_size -= cur_pages; 341 + if (!old_size) { 342 + r = amdgpu_mm_node_addr(bo, ++old_mm, old_mem, 343 + &old_start); 344 + if (r) 345 + goto error; 346 + old_size = old_mm->size; 347 + } else { 348 + old_start += cur_pages * PAGE_SIZE; 349 + } 350 + 351 + new_size -= cur_pages; 352 + if (!new_size) { 353 + r = amdgpu_mm_node_addr(bo, ++new_mm, new_mem, 354 + &new_start); 355 + if (r) 356 + goto error; 357 + 358 + new_size = new_mm->size; 359 + } else { 360 + new_start += cur_pages * PAGE_SIZE; 361 + } 362 + } 308 363 309 364 r = ttm_bo_pipeline_move(bo, fence, evict, new_mem); 365 + fence_put(fence); 366 + return r; 367 + 368 + error: 369 + if (fence) 370 + fence_wait(fence, false); 310 371 fence_put(fence); 311 372 return r; 312 373 } ··· 375 332 struct ttm_placement placement; 376 333 int r; 377 334 378 - adev = amdgpu_get_adev(bo->bdev); 335 + adev = amdgpu_ttm_adev(bo->bdev); 379 336 tmp_mem = *new_mem; 380 337 tmp_mem.mm_node = NULL; 381 338 placement.num_placement = 1; ··· 422 379 struct ttm_place placements; 423 380 int r; 424 381 425 - adev = amdgpu_get_adev(bo->bdev); 382 + adev = amdgpu_ttm_adev(bo->bdev); 426 383 tmp_mem = *new_mem; 427 384 tmp_mem.mm_node = NULL; 428 385 placement.num_placement = 1; ··· 465 422 if (WARN_ON_ONCE(abo->pin_count > 0)) 466 423 return -EINVAL; 467 424 468 - adev = amdgpu_get_adev(bo->bdev); 425 + adev = amdgpu_ttm_adev(bo->bdev); 469 426 470 427 /* remember the eviction */ 471 428 if (evict) ··· 518 475 static int amdgpu_ttm_io_mem_reserve(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem) 519 476 { 520 477 struct ttm_mem_type_manager *man = &bdev->man[mem->mem_type]; 521 - struct amdgpu_device *adev = amdgpu_get_adev(bdev); 478 + struct amdgpu_device *adev = amdgpu_ttm_adev(bdev); 522 479 523 480 mem->bus.addr = NULL; 524 481 mem->bus.offset = 0; ··· 650 607 /* prepare the sg table with the user pages */ 651 608 static int amdgpu_ttm_tt_pin_userptr(struct ttm_tt *ttm) 652 609 { 653 - struct amdgpu_device *adev = amdgpu_get_adev(ttm->bdev); 610 + struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); 654 611 struct amdgpu_ttm_tt *gtt = (void *)ttm; 655 612 unsigned nents; 656 613 int r; ··· 682 639 683 640 static void amdgpu_ttm_tt_unpin_userptr(struct ttm_tt *ttm) 684 641 { 685 - struct amdgpu_device *adev = amdgpu_get_adev(ttm->bdev); 642 + struct amdgpu_device *adev = amdgpu_ttm_adev(ttm->bdev); 686 643 struct amdgpu_ttm_tt *gtt = (void *)ttm; 687 644 struct sg_page_iter sg_iter; 688 645 ··· 842 799 struct amdgpu_device *adev; 843 800 struct amdgpu_ttm_tt *gtt; 844 801 845 - adev = amdgpu_get_adev(bdev); 802 + adev = amdgpu_ttm_adev(bdev); 846 803 847 804 gtt = kzalloc(sizeof(struct amdgpu_ttm_tt), GFP_KERNEL); 848 805 if (gtt == NULL) { ··· 886 843 return 0; 887 844 } 888 845 889 - adev = amdgpu_get_adev(ttm->bdev); 846 + adev = amdgpu_ttm_adev(ttm->bdev); 890 847 891 848 #ifdef CONFIG_SWIOTLB 892 849 if (swiotlb_nr_tbl()) { ··· 932 889 if (slave) 933 890 return; 934 891 935 - adev = amdgpu_get_adev(ttm->bdev); 892 + adev = amdgpu_ttm_adev(ttm->bdev); 936 893 937 894 #ifdef CONFIG_SWIOTLB 938 895 if (swiotlb_nr_tbl()) { ··· 1055 1012 1056 1013 static void amdgpu_ttm_lru_removal(struct ttm_buffer_object *tbo) 1057 1014 { 1058 - struct amdgpu_device *adev = amdgpu_get_adev(tbo->bdev); 1015 + struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); 1059 1016 unsigned i, j; 1060 1017 1061 1018 for (i = 0; i < AMDGPU_TTM_LRU_SIZE; ++i) { ··· 1072 1029 1073 1030 static struct amdgpu_mman_lru *amdgpu_ttm_lru(struct ttm_buffer_object *tbo) 1074 1031 { 1075 - struct amdgpu_device *adev = amdgpu_get_adev(tbo->bdev); 1032 + struct amdgpu_device *adev = amdgpu_ttm_adev(tbo->bdev); 1076 1033 unsigned log2_size = min(ilog2(tbo->num_pages), 1077 1034 AMDGPU_TTM_LRU_SIZE - 1); 1078 1035 ··· 1103 1060 return res; 1104 1061 } 1105 1062 1063 + static bool amdgpu_ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 1064 + const struct ttm_place *place) 1065 + { 1066 + if (bo->mem.mem_type == TTM_PL_VRAM && 1067 + bo->mem.start == AMDGPU_BO_INVALID_OFFSET) { 1068 + unsigned long num_pages = bo->mem.num_pages; 1069 + struct drm_mm_node *node = bo->mem.mm_node; 1070 + 1071 + /* Check each drm MM node individually */ 1072 + while (num_pages) { 1073 + if (place->fpfn < (node->start + node->size) && 1074 + !(place->lpfn && place->lpfn <= node->start)) 1075 + return true; 1076 + 1077 + num_pages -= node->size; 1078 + ++node; 1079 + } 1080 + 1081 + return false; 1082 + } 1083 + 1084 + return ttm_bo_eviction_valuable(bo, place); 1085 + } 1086 + 1106 1087 static struct ttm_bo_driver amdgpu_bo_driver = { 1107 1088 .ttm_tt_create = &amdgpu_ttm_tt_create, 1108 1089 .ttm_tt_populate = &amdgpu_ttm_tt_populate, 1109 1090 .ttm_tt_unpopulate = &amdgpu_ttm_tt_unpopulate, 1110 1091 .invalidate_caches = &amdgpu_invalidate_caches, 1111 1092 .init_mem_type = &amdgpu_init_mem_type, 1093 + .eviction_valuable = amdgpu_ttm_bo_eviction_valuable, 1112 1094 .evict_flags = &amdgpu_evict_flags, 1113 1095 .move = &amdgpu_bo_move, 1114 1096 .verify_access = &amdgpu_verify_access, ··· 1187 1119 1188 1120 r = amdgpu_bo_create(adev, 256 * 1024, PAGE_SIZE, true, 1189 1121 AMDGPU_GEM_DOMAIN_VRAM, 1190 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1122 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 1123 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1191 1124 NULL, NULL, &adev->stollen_vga_memory); 1192 1125 if (r) { 1193 1126 return r; ··· 1386 1317 struct reservation_object *resv, 1387 1318 struct fence **fence) 1388 1319 { 1389 - struct amdgpu_device *adev = bo->adev; 1320 + struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); 1390 1321 struct amdgpu_job *job; 1391 1322 struct amdgpu_ring *ring = adev->mman.buffer_funcs_ring; 1392 1323
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.h
··· 66 66 }; 67 67 68 68 extern const struct ttm_mem_type_manager_func amdgpu_gtt_mgr_func; 69 + extern const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func; 69 70 70 71 int amdgpu_gtt_mgr_alloc(struct ttm_mem_type_manager *man, 71 72 struct ttm_buffer_object *tbo,
+39 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c
··· 228 228 ucode->mc_addr = mc_addr; 229 229 ucode->kaddr = kptr; 230 230 231 + if (ucode->ucode_id == AMDGPU_UCODE_ID_STORAGE) 232 + return 0; 233 + 231 234 header = (const struct common_firmware_header *)ucode->fw->data; 232 235 memcpy(ucode->kaddr, (void *)((uint8_t *)ucode->fw->data + 233 236 le32_to_cpu(header->ucode_array_offset_bytes)), ··· 238 235 239 236 return 0; 240 237 } 238 + 239 + static int amdgpu_ucode_patch_jt(struct amdgpu_firmware_info *ucode, 240 + uint64_t mc_addr, void *kptr) 241 + { 242 + const struct gfx_firmware_header_v1_0 *header = NULL; 243 + const struct common_firmware_header *comm_hdr = NULL; 244 + uint8_t* src_addr = NULL; 245 + uint8_t* dst_addr = NULL; 246 + 247 + if (NULL == ucode->fw) 248 + return 0; 249 + 250 + comm_hdr = (const struct common_firmware_header *)ucode->fw->data; 251 + header = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data; 252 + dst_addr = ucode->kaddr + 253 + ALIGN(le32_to_cpu(comm_hdr->ucode_size_bytes), 254 + PAGE_SIZE); 255 + src_addr = (uint8_t *)ucode->fw->data + 256 + le32_to_cpu(comm_hdr->ucode_array_offset_bytes) + 257 + (le32_to_cpu(header->jt_offset) * 4); 258 + memcpy(dst_addr, src_addr, le32_to_cpu(header->jt_size) * 4); 259 + 260 + return 0; 261 + } 262 + 241 263 242 264 int amdgpu_ucode_init_bo(struct amdgpu_device *adev) 243 265 { ··· 275 247 const struct common_firmware_header *header = NULL; 276 248 277 249 err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true, 278 - AMDGPU_GEM_DOMAIN_GTT, 0, NULL, NULL, bo); 250 + amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, 251 + 0, NULL, NULL, bo); 279 252 if (err) { 280 253 dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err); 281 254 goto failed; ··· 288 259 goto failed_reserve; 289 260 } 290 261 291 - err = amdgpu_bo_pin(*bo, AMDGPU_GEM_DOMAIN_GTT, &fw_mc_addr); 262 + err = amdgpu_bo_pin(*bo, amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, 263 + &fw_mc_addr); 292 264 if (err) { 293 265 dev_err(adev->dev, "(%d) Firmware buffer pin failed\n", err); 294 266 goto failed_pin; ··· 309 279 header = (const struct common_firmware_header *)ucode->fw->data; 310 280 amdgpu_ucode_init_single_fw(ucode, fw_mc_addr + fw_offset, 311 281 fw_buf_ptr + fw_offset); 282 + if (i == AMDGPU_UCODE_ID_CP_MEC1) { 283 + const struct gfx_firmware_header_v1_0 *cp_hdr; 284 + cp_hdr = (const struct gfx_firmware_header_v1_0 *)ucode->fw->data; 285 + amdgpu_ucode_patch_jt(ucode, fw_mc_addr + fw_offset, 286 + fw_buf_ptr + fw_offset); 287 + fw_offset += ALIGN(le32_to_cpu(cp_hdr->jt_size) << 2, PAGE_SIZE); 288 + } 312 289 fw_offset += ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); 313 290 } 314 291 }
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h
··· 130 130 AMDGPU_UCODE_ID_CP_MEC1, 131 131 AMDGPU_UCODE_ID_CP_MEC2, 132 132 AMDGPU_UCODE_ID_RLC_G, 133 + AMDGPU_UCODE_ID_STORAGE, 133 134 AMDGPU_UCODE_ID_MAXIMUM, 134 135 }; 135 136
+8 -3
drivers/gpu/drm/amd/amdgpu/amdgpu_uvd.c
··· 876 876 struct amdgpu_ib *ib = &parser->job->ibs[ib_idx]; 877 877 int r; 878 878 879 + parser->job->vm = NULL; 880 + ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); 881 + 879 882 if (ib->length_dw % 16) { 880 883 DRM_ERROR("UVD IB length (%d) not 16 dwords aligned!\n", 881 884 ib->length_dw); ··· 934 931 if (r) 935 932 return r; 936 933 937 - if (!bo->adev->uvd.address_64_bit) { 934 + if (!ring->adev->uvd.address_64_bit) { 938 935 amdgpu_ttm_placement_from_domain(bo, AMDGPU_GEM_DOMAIN_VRAM); 939 936 amdgpu_uvd_force_into_uvd_segment(bo); 940 937 } ··· 1005 1002 1006 1003 r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, 1007 1004 AMDGPU_GEM_DOMAIN_VRAM, 1008 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1005 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 1006 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1009 1007 NULL, NULL, &bo); 1010 1008 if (r) 1011 1009 return r; ··· 1055 1051 1056 1052 r = amdgpu_bo_create(adev, 1024, PAGE_SIZE, true, 1057 1053 AMDGPU_GEM_DOMAIN_VRAM, 1058 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1054 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 1055 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1059 1056 NULL, NULL, &bo); 1060 1057 if (r) 1061 1058 return r;
+95 -13
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.c
··· 157 157 158 158 r = amdgpu_bo_create(adev, size, PAGE_SIZE, true, 159 159 AMDGPU_GEM_DOMAIN_VRAM, 160 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 160 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 161 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 161 162 NULL, NULL, &adev->vce.vcpu_bo); 162 163 if (r) { 163 164 dev_err(adev->dev, "(%d) failed to allocate VCE bo\n", r); ··· 642 641 uint32_t *size = &tmp; 643 642 int i, r, idx = 0; 644 643 644 + p->job->vm = NULL; 645 + ib->gpu_addr = amdgpu_sa_bo_gpu_addr(ib->sa_bo); 646 + 645 647 r = amdgpu_cs_sysvm_access_required(p); 646 648 if (r) 647 649 return r; ··· 792 788 } 793 789 794 790 /** 791 + * amdgpu_vce_cs_parse_vm - parse the command stream in VM mode 792 + * 793 + * @p: parser context 794 + * 795 + */ 796 + int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx) 797 + { 798 + struct amdgpu_ib *ib = &p->job->ibs[ib_idx]; 799 + int session_idx = -1; 800 + uint32_t destroyed = 0; 801 + uint32_t created = 0; 802 + uint32_t allocated = 0; 803 + uint32_t tmp, handle = 0; 804 + int i, r = 0, idx = 0; 805 + 806 + while (idx < ib->length_dw) { 807 + uint32_t len = amdgpu_get_ib_value(p, ib_idx, idx); 808 + uint32_t cmd = amdgpu_get_ib_value(p, ib_idx, idx + 1); 809 + 810 + if ((len < 8) || (len & 3)) { 811 + DRM_ERROR("invalid VCE command length (%d)!\n", len); 812 + r = -EINVAL; 813 + goto out; 814 + } 815 + 816 + switch (cmd) { 817 + case 0x00000001: /* session */ 818 + handle = amdgpu_get_ib_value(p, ib_idx, idx + 2); 819 + session_idx = amdgpu_vce_validate_handle(p, handle, 820 + &allocated); 821 + if (session_idx < 0) { 822 + r = session_idx; 823 + goto out; 824 + } 825 + break; 826 + 827 + case 0x01000001: /* create */ 828 + created |= 1 << session_idx; 829 + if (destroyed & (1 << session_idx)) { 830 + destroyed &= ~(1 << session_idx); 831 + allocated |= 1 << session_idx; 832 + 833 + } else if (!(allocated & (1 << session_idx))) { 834 + DRM_ERROR("Handle already in use!\n"); 835 + r = -EINVAL; 836 + goto out; 837 + } 838 + 839 + break; 840 + 841 + case 0x02000001: /* destroy */ 842 + destroyed |= 1 << session_idx; 843 + break; 844 + 845 + default: 846 + break; 847 + } 848 + 849 + if (session_idx == -1) { 850 + DRM_ERROR("no session command at start of IB\n"); 851 + r = -EINVAL; 852 + goto out; 853 + } 854 + 855 + idx += len / 4; 856 + } 857 + 858 + if (allocated & ~created) { 859 + DRM_ERROR("New session without create command!\n"); 860 + r = -ENOENT; 861 + } 862 + 863 + out: 864 + if (!r) { 865 + /* No error, free all destroyed handle slots */ 866 + tmp = destroyed; 867 + amdgpu_ib_free(p->adev, ib, NULL); 868 + } else { 869 + /* Error during parsing, free all allocated handle slots */ 870 + tmp = allocated; 871 + } 872 + 873 + for (i = 0; i < AMDGPU_MAX_VCE_HANDLES; ++i) 874 + if (tmp & (1 << i)) 875 + atomic_set(&p->adev->vce.handles[i], 0); 876 + 877 + return r; 878 + } 879 + 880 + /** 795 881 * amdgpu_vce_ring_emit_ib - execute indirect buffer 796 882 * 797 883 * @ring: engine to use ··· 915 821 amdgpu_ring_write(ring, seq); 916 822 amdgpu_ring_write(ring, VCE_CMD_TRAP); 917 823 amdgpu_ring_write(ring, VCE_CMD_END); 918 - } 919 - 920 - unsigned amdgpu_vce_ring_get_emit_ib_size(struct amdgpu_ring *ring) 921 - { 922 - return 923 - 4; /* amdgpu_vce_ring_emit_ib */ 924 - } 925 - 926 - unsigned amdgpu_vce_ring_get_dma_frame_size(struct amdgpu_ring *ring) 927 - { 928 - return 929 - 6; /* amdgpu_vce_ring_emit_fence x1 no user fence */ 930 824 } 931 825 932 826 /**
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_vce.h
··· 34 34 bool direct, struct fence **fence); 35 35 void amdgpu_vce_free_handles(struct amdgpu_device *adev, struct drm_file *filp); 36 36 int amdgpu_vce_ring_parse_cs(struct amdgpu_cs_parser *p, uint32_t ib_idx); 37 + int amdgpu_vce_ring_parse_cs_vm(struct amdgpu_cs_parser *p, uint32_t ib_idx); 37 38 void amdgpu_vce_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_ib *ib, 38 39 unsigned vm_id, bool ctx_switch); 39 40 void amdgpu_vce_ring_emit_fence(struct amdgpu_ring *ring, u64 addr, u64 seq,
+204 -188
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c
··· 116 116 } 117 117 118 118 /** 119 - * amdgpu_vm_get_bos - add the vm BOs to a duplicates list 119 + * amdgpu_vm_validate_pt_bos - validate the page table BOs 120 120 * 121 121 * @adev: amdgpu device pointer 122 122 * @vm: vm providing the BOs 123 - * @duplicates: head of duplicates list 123 + * @validate: callback to do the validation 124 + * @param: parameter for the validation callback 124 125 * 125 - * Add the page directory to the BO duplicates list 126 - * for command submission. 126 + * Validate the page table BOs on command submission if neccessary. 127 127 */ 128 - void amdgpu_vm_get_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, 129 - struct list_head *duplicates) 128 + int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, 129 + int (*validate)(void *p, struct amdgpu_bo *bo), 130 + void *param) 130 131 { 131 132 uint64_t num_evictions; 132 133 unsigned i; 134 + int r; 133 135 134 136 /* We only need to validate the page tables 135 137 * if they aren't already valid. 136 138 */ 137 139 num_evictions = atomic64_read(&adev->num_evictions); 138 140 if (num_evictions == vm->last_eviction_counter) 139 - return; 141 + return 0; 140 142 141 143 /* add the vm page table to the list */ 142 144 for (i = 0; i <= vm->max_pde_used; ++i) { 143 - struct amdgpu_bo_list_entry *entry = &vm->page_tables[i].entry; 145 + struct amdgpu_bo *bo = vm->page_tables[i].bo; 144 146 145 - if (!entry->robj) 147 + if (!bo) 146 148 continue; 147 149 148 - list_add(&entry->tv.head, duplicates); 150 + r = validate(param, bo); 151 + if (r) 152 + return r; 149 153 } 150 154 155 + return 0; 151 156 } 152 157 153 158 /** ··· 171 166 172 167 spin_lock(&glob->lru_lock); 173 168 for (i = 0; i <= vm->max_pde_used; ++i) { 174 - struct amdgpu_bo_list_entry *entry = &vm->page_tables[i].entry; 169 + struct amdgpu_bo *bo = vm->page_tables[i].bo; 175 170 176 - if (!entry->robj) 171 + if (!bo) 177 172 continue; 178 173 179 - ttm_bo_move_to_lru_tail(&entry->robj->tbo); 174 + ttm_bo_move_to_lru_tail(&bo->tbo); 180 175 } 181 176 spin_unlock(&glob->lru_lock); 182 177 } ··· 346 341 static bool amdgpu_vm_ring_has_compute_vm_bug(struct amdgpu_ring *ring) 347 342 { 348 343 struct amdgpu_device *adev = ring->adev; 349 - const struct amdgpu_ip_block_version *ip_block; 344 + const struct amdgpu_ip_block *ip_block; 350 345 351 - if (ring->type != AMDGPU_RING_TYPE_COMPUTE) 346 + if (ring->funcs->type != AMDGPU_RING_TYPE_COMPUTE) 352 347 /* only compute rings */ 353 348 return false; 354 349 ··· 356 351 if (!ip_block) 357 352 return false; 358 353 359 - if (ip_block->major <= 7) { 354 + if (ip_block->version->major <= 7) { 360 355 /* gfx7 has no workaround */ 361 356 return true; 362 - } else if (ip_block->major == 8) { 357 + } else if (ip_block->version->major == 8) { 363 358 if (adev->gfx.mec_fw_version >= 673) 364 359 /* gfx8 is fixed in MEC firmware 673 */ 365 360 return false; ··· 617 612 return result; 618 613 } 619 614 620 - static int amdgpu_vm_update_pd_or_shadow(struct amdgpu_device *adev, 621 - struct amdgpu_vm *vm, 622 - bool shadow) 623 - { 624 - struct amdgpu_ring *ring; 625 - struct amdgpu_bo *pd = shadow ? vm->page_directory->shadow : 626 - vm->page_directory; 627 - uint64_t pd_addr; 628 - uint32_t incr = AMDGPU_VM_PTE_COUNT * 8; 629 - uint64_t last_pde = ~0, last_pt = ~0; 630 - unsigned count = 0, pt_idx, ndw; 631 - struct amdgpu_job *job; 632 - struct amdgpu_pte_update_params params; 633 - struct fence *fence = NULL; 634 - 635 - int r; 636 - 637 - if (!pd) 638 - return 0; 639 - 640 - r = amdgpu_ttm_bind(&pd->tbo, &pd->tbo.mem); 641 - if (r) 642 - return r; 643 - 644 - pd_addr = amdgpu_bo_gpu_offset(pd); 645 - ring = container_of(vm->entity.sched, struct amdgpu_ring, sched); 646 - 647 - /* padding, etc. */ 648 - ndw = 64; 649 - 650 - /* assume the worst case */ 651 - ndw += vm->max_pde_used * 6; 652 - 653 - r = amdgpu_job_alloc_with_ib(adev, ndw * 4, &job); 654 - if (r) 655 - return r; 656 - 657 - memset(&params, 0, sizeof(params)); 658 - params.adev = adev; 659 - params.ib = &job->ibs[0]; 660 - 661 - /* walk over the address space and update the page directory */ 662 - for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) { 663 - struct amdgpu_bo *bo = vm->page_tables[pt_idx].entry.robj; 664 - uint64_t pde, pt; 665 - 666 - if (bo == NULL) 667 - continue; 668 - 669 - if (bo->shadow) { 670 - struct amdgpu_bo *shadow = bo->shadow; 671 - 672 - r = amdgpu_ttm_bind(&shadow->tbo, &shadow->tbo.mem); 673 - if (r) 674 - return r; 675 - } 676 - 677 - pt = amdgpu_bo_gpu_offset(bo); 678 - if (!shadow) { 679 - if (vm->page_tables[pt_idx].addr == pt) 680 - continue; 681 - vm->page_tables[pt_idx].addr = pt; 682 - } else { 683 - if (vm->page_tables[pt_idx].shadow_addr == pt) 684 - continue; 685 - vm->page_tables[pt_idx].shadow_addr = pt; 686 - } 687 - 688 - pde = pd_addr + pt_idx * 8; 689 - if (((last_pde + 8 * count) != pde) || 690 - ((last_pt + incr * count) != pt) || 691 - (count == AMDGPU_VM_MAX_UPDATE_SIZE)) { 692 - 693 - if (count) { 694 - amdgpu_vm_do_set_ptes(&params, last_pde, 695 - last_pt, count, incr, 696 - AMDGPU_PTE_VALID); 697 - } 698 - 699 - count = 1; 700 - last_pde = pde; 701 - last_pt = pt; 702 - } else { 703 - ++count; 704 - } 705 - } 706 - 707 - if (count) 708 - amdgpu_vm_do_set_ptes(&params, last_pde, last_pt, 709 - count, incr, AMDGPU_PTE_VALID); 710 - 711 - if (params.ib->length_dw != 0) { 712 - amdgpu_ring_pad_ib(ring, params.ib); 713 - amdgpu_sync_resv(adev, &job->sync, pd->tbo.resv, 714 - AMDGPU_FENCE_OWNER_VM); 715 - WARN_ON(params.ib->length_dw > ndw); 716 - r = amdgpu_job_submit(job, ring, &vm->entity, 717 - AMDGPU_FENCE_OWNER_VM, &fence); 718 - if (r) 719 - goto error_free; 720 - 721 - amdgpu_bo_fence(pd, fence, true); 722 - fence_put(vm->page_directory_fence); 723 - vm->page_directory_fence = fence_get(fence); 724 - fence_put(fence); 725 - 726 - } else { 727 - amdgpu_job_free(job); 728 - } 729 - 730 - return 0; 731 - 732 - error_free: 733 - amdgpu_job_free(job); 734 - return r; 735 - } 736 - 737 615 /* 738 616 * amdgpu_vm_update_pdes - make sure that page directory is valid 739 617 * ··· 630 742 * Returns 0 for success, error for failure. 631 743 */ 632 744 int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, 633 - struct amdgpu_vm *vm) 745 + struct amdgpu_vm *vm) 634 746 { 747 + struct amdgpu_bo *shadow; 748 + struct amdgpu_ring *ring; 749 + uint64_t pd_addr, shadow_addr; 750 + uint32_t incr = AMDGPU_VM_PTE_COUNT * 8; 751 + uint64_t last_pde = ~0, last_pt = ~0, last_shadow = ~0; 752 + unsigned count = 0, pt_idx, ndw; 753 + struct amdgpu_job *job; 754 + struct amdgpu_pte_update_params params; 755 + struct fence *fence = NULL; 756 + 635 757 int r; 636 758 637 - r = amdgpu_vm_update_pd_or_shadow(adev, vm, true); 759 + ring = container_of(vm->entity.sched, struct amdgpu_ring, sched); 760 + shadow = vm->page_directory->shadow; 761 + 762 + /* padding, etc. */ 763 + ndw = 64; 764 + 765 + /* assume the worst case */ 766 + ndw += vm->max_pde_used * 6; 767 + 768 + pd_addr = amdgpu_bo_gpu_offset(vm->page_directory); 769 + if (shadow) { 770 + r = amdgpu_ttm_bind(&shadow->tbo, &shadow->tbo.mem); 771 + if (r) 772 + return r; 773 + shadow_addr = amdgpu_bo_gpu_offset(shadow); 774 + ndw *= 2; 775 + } else { 776 + shadow_addr = 0; 777 + } 778 + 779 + r = amdgpu_job_alloc_with_ib(adev, ndw * 4, &job); 638 780 if (r) 639 781 return r; 640 - return amdgpu_vm_update_pd_or_shadow(adev, vm, false); 782 + 783 + memset(&params, 0, sizeof(params)); 784 + params.adev = adev; 785 + params.ib = &job->ibs[0]; 786 + 787 + /* walk over the address space and update the page directory */ 788 + for (pt_idx = 0; pt_idx <= vm->max_pde_used; ++pt_idx) { 789 + struct amdgpu_bo *bo = vm->page_tables[pt_idx].bo; 790 + uint64_t pde, pt; 791 + 792 + if (bo == NULL) 793 + continue; 794 + 795 + if (bo->shadow) { 796 + struct amdgpu_bo *pt_shadow = bo->shadow; 797 + 798 + r = amdgpu_ttm_bind(&pt_shadow->tbo, 799 + &pt_shadow->tbo.mem); 800 + if (r) 801 + return r; 802 + } 803 + 804 + pt = amdgpu_bo_gpu_offset(bo); 805 + if (vm->page_tables[pt_idx].addr == pt) 806 + continue; 807 + 808 + vm->page_tables[pt_idx].addr = pt; 809 + 810 + pde = pd_addr + pt_idx * 8; 811 + if (((last_pde + 8 * count) != pde) || 812 + ((last_pt + incr * count) != pt) || 813 + (count == AMDGPU_VM_MAX_UPDATE_SIZE)) { 814 + 815 + if (count) { 816 + if (shadow) 817 + amdgpu_vm_do_set_ptes(&params, 818 + last_shadow, 819 + last_pt, count, 820 + incr, 821 + AMDGPU_PTE_VALID); 822 + 823 + amdgpu_vm_do_set_ptes(&params, last_pde, 824 + last_pt, count, incr, 825 + AMDGPU_PTE_VALID); 826 + } 827 + 828 + count = 1; 829 + last_pde = pde; 830 + last_shadow = shadow_addr + pt_idx * 8; 831 + last_pt = pt; 832 + } else { 833 + ++count; 834 + } 835 + } 836 + 837 + if (count) { 838 + if (vm->page_directory->shadow) 839 + amdgpu_vm_do_set_ptes(&params, last_shadow, last_pt, 840 + count, incr, AMDGPU_PTE_VALID); 841 + 842 + amdgpu_vm_do_set_ptes(&params, last_pde, last_pt, 843 + count, incr, AMDGPU_PTE_VALID); 844 + } 845 + 846 + if (params.ib->length_dw == 0) { 847 + amdgpu_job_free(job); 848 + return 0; 849 + } 850 + 851 + amdgpu_ring_pad_ib(ring, params.ib); 852 + amdgpu_sync_resv(adev, &job->sync, vm->page_directory->tbo.resv, 853 + AMDGPU_FENCE_OWNER_VM); 854 + if (shadow) 855 + amdgpu_sync_resv(adev, &job->sync, shadow->tbo.resv, 856 + AMDGPU_FENCE_OWNER_VM); 857 + 858 + WARN_ON(params.ib->length_dw > ndw); 859 + r = amdgpu_job_submit(job, ring, &vm->entity, 860 + AMDGPU_FENCE_OWNER_VM, &fence); 861 + if (r) 862 + goto error_free; 863 + 864 + amdgpu_bo_fence(vm->page_directory, fence, true); 865 + fence_put(vm->page_directory_fence); 866 + vm->page_directory_fence = fence_get(fence); 867 + fence_put(fence); 868 + 869 + return 0; 870 + 871 + error_free: 872 + amdgpu_job_free(job); 873 + return r; 641 874 } 642 875 643 876 /** ··· 790 781 /* initialize the variables */ 791 782 addr = start; 792 783 pt_idx = addr >> amdgpu_vm_block_size; 793 - pt = vm->page_tables[pt_idx].entry.robj; 784 + pt = vm->page_tables[pt_idx].bo; 794 785 if (params->shadow) { 795 786 if (!pt->shadow) 796 787 return; 797 - pt = vm->page_tables[pt_idx].entry.robj->shadow; 788 + pt = pt->shadow; 798 789 } 799 790 if ((addr & ~mask) == (end & ~mask)) 800 791 nptes = end - addr; ··· 813 804 /* walk over the address space and update the page tables */ 814 805 while (addr < end) { 815 806 pt_idx = addr >> amdgpu_vm_block_size; 816 - pt = vm->page_tables[pt_idx].entry.robj; 807 + pt = vm->page_tables[pt_idx].bo; 817 808 if (params->shadow) { 818 809 if (!pt->shadow) 819 810 return; 820 - pt = vm->page_tables[pt_idx].entry.robj->shadow; 811 + pt = pt->shadow; 821 812 } 822 813 823 814 if ((addr & ~mask) == (end & ~mask)) ··· 1074 1065 * @pages_addr: DMA addresses to use for mapping 1075 1066 * @vm: requested vm 1076 1067 * @mapping: mapped range and flags to use for the update 1077 - * @addr: addr to set the area to 1078 1068 * @flags: HW flags for the mapping 1069 + * @nodes: array of drm_mm_nodes with the MC addresses 1079 1070 * @fence: optional resulting fence 1080 1071 * 1081 1072 * Split the mapping into smaller chunks so that each update fits ··· 1088 1079 dma_addr_t *pages_addr, 1089 1080 struct amdgpu_vm *vm, 1090 1081 struct amdgpu_bo_va_mapping *mapping, 1091 - uint32_t flags, uint64_t addr, 1082 + uint32_t flags, 1083 + struct drm_mm_node *nodes, 1092 1084 struct fence **fence) 1093 1085 { 1094 - const uint64_t max_size = 64ULL * 1024ULL * 1024ULL / AMDGPU_GPU_PAGE_SIZE; 1095 - 1096 - uint64_t src = 0, start = mapping->it.start; 1086 + uint64_t pfn, src = 0, start = mapping->it.start; 1097 1087 int r; 1098 1088 1099 1089 /* normally,bo_va->flags only contians READABLE and WIRTEABLE bit go here ··· 1105 1097 1106 1098 trace_amdgpu_vm_bo_update(mapping); 1107 1099 1108 - if (pages_addr) { 1109 - if (flags == gtt_flags) 1110 - src = adev->gart.table_addr + (addr >> 12) * 8; 1111 - addr = 0; 1100 + pfn = mapping->offset >> PAGE_SHIFT; 1101 + if (nodes) { 1102 + while (pfn >= nodes->size) { 1103 + pfn -= nodes->size; 1104 + ++nodes; 1105 + } 1112 1106 } 1113 - addr += mapping->offset; 1114 1107 1115 - if (!pages_addr || src) 1116 - return amdgpu_vm_bo_update_mapping(adev, exclusive, 1117 - src, pages_addr, vm, 1118 - start, mapping->it.last, 1119 - flags, addr, fence); 1108 + do { 1109 + uint64_t max_entries; 1110 + uint64_t addr, last; 1120 1111 1121 - while (start != mapping->it.last + 1) { 1122 - uint64_t last; 1112 + if (nodes) { 1113 + addr = nodes->start << PAGE_SHIFT; 1114 + max_entries = (nodes->size - pfn) * 1115 + (PAGE_SIZE / AMDGPU_GPU_PAGE_SIZE); 1116 + } else { 1117 + addr = 0; 1118 + max_entries = S64_MAX; 1119 + } 1123 1120 1124 - last = min((uint64_t)mapping->it.last, start + max_size - 1); 1121 + if (pages_addr) { 1122 + if (flags == gtt_flags) 1123 + src = adev->gart.table_addr + 1124 + (addr >> AMDGPU_GPU_PAGE_SHIFT) * 8; 1125 + else 1126 + max_entries = min(max_entries, 16ull * 1024ull); 1127 + addr = 0; 1128 + } else if (flags & AMDGPU_PTE_VALID) { 1129 + addr += adev->vm_manager.vram_base_offset; 1130 + } 1131 + addr += pfn << PAGE_SHIFT; 1132 + 1133 + last = min((uint64_t)mapping->it.last, start + max_entries - 1); 1125 1134 r = amdgpu_vm_bo_update_mapping(adev, exclusive, 1126 1135 src, pages_addr, vm, 1127 1136 start, last, flags, addr, ··· 1146 1121 if (r) 1147 1122 return r; 1148 1123 1124 + pfn += last - start + 1; 1125 + if (nodes && nodes->size == pfn) { 1126 + pfn = 0; 1127 + ++nodes; 1128 + } 1149 1129 start = last + 1; 1150 - addr += max_size * AMDGPU_GPU_PAGE_SIZE; 1151 - } 1130 + 1131 + } while (unlikely(start != mapping->it.last + 1)); 1152 1132 1153 1133 return 0; 1154 1134 } ··· 1177 1147 dma_addr_t *pages_addr = NULL; 1178 1148 uint32_t gtt_flags, flags; 1179 1149 struct ttm_mem_reg *mem; 1150 + struct drm_mm_node *nodes; 1180 1151 struct fence *exclusive; 1181 - uint64_t addr; 1182 1152 int r; 1183 1153 1184 1154 if (clear) { 1185 1155 mem = NULL; 1186 - addr = 0; 1156 + nodes = NULL; 1187 1157 exclusive = NULL; 1188 1158 } else { 1189 1159 struct ttm_dma_tt *ttm; 1190 1160 1191 1161 mem = &bo_va->bo->tbo.mem; 1192 - addr = (u64)mem->start << PAGE_SHIFT; 1193 - switch (mem->mem_type) { 1194 - case TTM_PL_TT: 1162 + nodes = mem->mm_node; 1163 + if (mem->mem_type == TTM_PL_TT) { 1195 1164 ttm = container_of(bo_va->bo->tbo.ttm, struct 1196 1165 ttm_dma_tt, ttm); 1197 1166 pages_addr = ttm->dma_address; 1198 - break; 1199 - 1200 - case TTM_PL_VRAM: 1201 - addr += adev->vm_manager.vram_base_offset; 1202 - break; 1203 - 1204 - default: 1205 - break; 1206 1167 } 1207 - 1208 1168 exclusive = reservation_object_get_excl(bo_va->bo->tbo.resv); 1209 1169 } 1210 1170 1211 1171 flags = amdgpu_ttm_tt_pte_flags(adev, bo_va->bo->tbo.ttm, mem); 1212 1172 gtt_flags = (amdgpu_ttm_is_bound(bo_va->bo->tbo.ttm) && 1213 - adev == bo_va->bo->adev) ? flags : 0; 1173 + adev == amdgpu_ttm_adev(bo_va->bo->tbo.bdev)) ? flags : 0; 1214 1174 1215 1175 spin_lock(&vm->status_lock); 1216 1176 if (!list_empty(&bo_va->vm_status)) ··· 1210 1190 list_for_each_entry(mapping, &bo_va->invalids, list) { 1211 1191 r = amdgpu_vm_bo_split_mapping(adev, exclusive, 1212 1192 gtt_flags, pages_addr, vm, 1213 - mapping, flags, addr, 1193 + mapping, flags, nodes, 1214 1194 &bo_va->last_pt_update); 1215 1195 if (r) 1216 1196 return r; ··· 1425 1405 /* walk over the address space and allocate the page tables */ 1426 1406 for (pt_idx = saddr; pt_idx <= eaddr; ++pt_idx) { 1427 1407 struct reservation_object *resv = vm->page_directory->tbo.resv; 1428 - struct amdgpu_bo_list_entry *entry; 1429 1408 struct amdgpu_bo *pt; 1430 1409 1431 - entry = &vm->page_tables[pt_idx].entry; 1432 - if (entry->robj) 1410 + if (vm->page_tables[pt_idx].bo) 1433 1411 continue; 1434 1412 1435 1413 r = amdgpu_bo_create(adev, AMDGPU_VM_PTE_COUNT * 8, 1436 1414 AMDGPU_GPU_PAGE_SIZE, true, 1437 1415 AMDGPU_GEM_DOMAIN_VRAM, 1438 1416 AMDGPU_GEM_CREATE_NO_CPU_ACCESS | 1439 - AMDGPU_GEM_CREATE_SHADOW, 1417 + AMDGPU_GEM_CREATE_SHADOW | 1418 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1440 1419 NULL, resv, &pt); 1441 1420 if (r) 1442 1421 goto error_free; ··· 1461 1442 } 1462 1443 } 1463 1444 1464 - entry->robj = pt; 1465 - entry->priority = 0; 1466 - entry->tv.bo = &entry->robj->tbo; 1467 - entry->tv.shared = true; 1468 - entry->user_pages = NULL; 1445 + vm->page_tables[pt_idx].bo = pt; 1469 1446 vm->page_tables[pt_idx].addr = 0; 1470 1447 } 1471 1448 ··· 1641 1626 r = amdgpu_bo_create(adev, pd_size, align, true, 1642 1627 AMDGPU_GEM_DOMAIN_VRAM, 1643 1628 AMDGPU_GEM_CREATE_NO_CPU_ACCESS | 1644 - AMDGPU_GEM_CREATE_SHADOW, 1629 + AMDGPU_GEM_CREATE_SHADOW | 1630 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1645 1631 NULL, NULL, &vm->page_directory); 1646 1632 if (r) 1647 1633 goto error_free_sched_entity; ··· 1713 1697 } 1714 1698 1715 1699 for (i = 0; i < amdgpu_vm_num_pdes(adev); i++) { 1716 - struct amdgpu_bo *pt = vm->page_tables[i].entry.robj; 1700 + struct amdgpu_bo *pt = vm->page_tables[i].bo; 1717 1701 1718 1702 if (!pt) 1719 1703 continue;
+205
drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h
··· 1 + /* 2 + * Copyright 2016 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Christian König 23 + */ 24 + #ifndef __AMDGPU_VM_H__ 25 + #define __AMDGPU_VM_H__ 26 + 27 + #include <linux/rbtree.h> 28 + 29 + #include "gpu_scheduler.h" 30 + #include "amdgpu_sync.h" 31 + #include "amdgpu_ring.h" 32 + 33 + struct amdgpu_bo_va; 34 + struct amdgpu_job; 35 + struct amdgpu_bo_list_entry; 36 + 37 + /* 38 + * GPUVM handling 39 + */ 40 + 41 + /* maximum number of VMIDs */ 42 + #define AMDGPU_NUM_VM 16 43 + 44 + /* Maximum number of PTEs the hardware can write with one command */ 45 + #define AMDGPU_VM_MAX_UPDATE_SIZE 0x3FFFF 46 + 47 + /* number of entries in page table */ 48 + #define AMDGPU_VM_PTE_COUNT (1 << amdgpu_vm_block_size) 49 + 50 + /* PTBs (Page Table Blocks) need to be aligned to 32K */ 51 + #define AMDGPU_VM_PTB_ALIGN_SIZE 32768 52 + 53 + /* LOG2 number of continuous pages for the fragment field */ 54 + #define AMDGPU_LOG2_PAGES_PER_FRAG 4 55 + 56 + #define AMDGPU_PTE_VALID (1 << 0) 57 + #define AMDGPU_PTE_SYSTEM (1 << 1) 58 + #define AMDGPU_PTE_SNOOPED (1 << 2) 59 + 60 + /* VI only */ 61 + #define AMDGPU_PTE_EXECUTABLE (1 << 4) 62 + 63 + #define AMDGPU_PTE_READABLE (1 << 5) 64 + #define AMDGPU_PTE_WRITEABLE (1 << 6) 65 + 66 + #define AMDGPU_PTE_FRAG(x) ((x & 0x1f) << 7) 67 + 68 + /* How to programm VM fault handling */ 69 + #define AMDGPU_VM_FAULT_STOP_NEVER 0 70 + #define AMDGPU_VM_FAULT_STOP_FIRST 1 71 + #define AMDGPU_VM_FAULT_STOP_ALWAYS 2 72 + 73 + struct amdgpu_vm_pt { 74 + struct amdgpu_bo *bo; 75 + uint64_t addr; 76 + }; 77 + 78 + struct amdgpu_vm { 79 + /* tree of virtual addresses mapped */ 80 + struct rb_root va; 81 + 82 + /* protecting invalidated */ 83 + spinlock_t status_lock; 84 + 85 + /* BOs moved, but not yet updated in the PT */ 86 + struct list_head invalidated; 87 + 88 + /* BOs cleared in the PT because of a move */ 89 + struct list_head cleared; 90 + 91 + /* BO mappings freed, but not yet updated in the PT */ 92 + struct list_head freed; 93 + 94 + /* contains the page directory */ 95 + struct amdgpu_bo *page_directory; 96 + unsigned max_pde_used; 97 + struct fence *page_directory_fence; 98 + uint64_t last_eviction_counter; 99 + 100 + /* array of page tables, one for each page directory entry */ 101 + struct amdgpu_vm_pt *page_tables; 102 + 103 + /* for id and flush management per ring */ 104 + struct amdgpu_vm_id *ids[AMDGPU_MAX_RINGS]; 105 + 106 + /* protecting freed */ 107 + spinlock_t freed_lock; 108 + 109 + /* Scheduler entity for page table updates */ 110 + struct amd_sched_entity entity; 111 + 112 + /* client id */ 113 + u64 client_id; 114 + }; 115 + 116 + struct amdgpu_vm_id { 117 + struct list_head list; 118 + struct fence *first; 119 + struct amdgpu_sync active; 120 + struct fence *last_flush; 121 + atomic64_t owner; 122 + 123 + uint64_t pd_gpu_addr; 124 + /* last flushed PD/PT update */ 125 + struct fence *flushed_updates; 126 + 127 + uint32_t current_gpu_reset_count; 128 + 129 + uint32_t gds_base; 130 + uint32_t gds_size; 131 + uint32_t gws_base; 132 + uint32_t gws_size; 133 + uint32_t oa_base; 134 + uint32_t oa_size; 135 + }; 136 + 137 + struct amdgpu_vm_manager { 138 + /* Handling of VMIDs */ 139 + struct mutex lock; 140 + unsigned num_ids; 141 + struct list_head ids_lru; 142 + struct amdgpu_vm_id ids[AMDGPU_NUM_VM]; 143 + 144 + /* Handling of VM fences */ 145 + u64 fence_context; 146 + unsigned seqno[AMDGPU_MAX_RINGS]; 147 + 148 + uint32_t max_pfn; 149 + /* vram base address for page table entry */ 150 + u64 vram_base_offset; 151 + /* is vm enabled? */ 152 + bool enabled; 153 + /* vm pte handling */ 154 + const struct amdgpu_vm_pte_funcs *vm_pte_funcs; 155 + struct amdgpu_ring *vm_pte_rings[AMDGPU_MAX_RINGS]; 156 + unsigned vm_pte_num_rings; 157 + atomic_t vm_pte_next_ring; 158 + /* client id counter */ 159 + atomic64_t client_counter; 160 + }; 161 + 162 + void amdgpu_vm_manager_init(struct amdgpu_device *adev); 163 + void amdgpu_vm_manager_fini(struct amdgpu_device *adev); 164 + int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm); 165 + void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm); 166 + void amdgpu_vm_get_pd_bo(struct amdgpu_vm *vm, 167 + struct list_head *validated, 168 + struct amdgpu_bo_list_entry *entry); 169 + int amdgpu_vm_validate_pt_bos(struct amdgpu_device *adev, struct amdgpu_vm *vm, 170 + int (*callback)(void *p, struct amdgpu_bo *bo), 171 + void *param); 172 + void amdgpu_vm_move_pt_bos_in_lru(struct amdgpu_device *adev, 173 + struct amdgpu_vm *vm); 174 + int amdgpu_vm_grab_id(struct amdgpu_vm *vm, struct amdgpu_ring *ring, 175 + struct amdgpu_sync *sync, struct fence *fence, 176 + struct amdgpu_job *job); 177 + int amdgpu_vm_flush(struct amdgpu_ring *ring, struct amdgpu_job *job); 178 + void amdgpu_vm_reset_id(struct amdgpu_device *adev, unsigned vm_id); 179 + int amdgpu_vm_update_page_directory(struct amdgpu_device *adev, 180 + struct amdgpu_vm *vm); 181 + int amdgpu_vm_clear_freed(struct amdgpu_device *adev, 182 + struct amdgpu_vm *vm); 183 + int amdgpu_vm_clear_invalids(struct amdgpu_device *adev, struct amdgpu_vm *vm, 184 + struct amdgpu_sync *sync); 185 + int amdgpu_vm_bo_update(struct amdgpu_device *adev, 186 + struct amdgpu_bo_va *bo_va, 187 + bool clear); 188 + void amdgpu_vm_bo_invalidate(struct amdgpu_device *adev, 189 + struct amdgpu_bo *bo); 190 + struct amdgpu_bo_va *amdgpu_vm_bo_find(struct amdgpu_vm *vm, 191 + struct amdgpu_bo *bo); 192 + struct amdgpu_bo_va *amdgpu_vm_bo_add(struct amdgpu_device *adev, 193 + struct amdgpu_vm *vm, 194 + struct amdgpu_bo *bo); 195 + int amdgpu_vm_bo_map(struct amdgpu_device *adev, 196 + struct amdgpu_bo_va *bo_va, 197 + uint64_t addr, uint64_t offset, 198 + uint64_t size, uint32_t flags); 199 + int amdgpu_vm_bo_unmap(struct amdgpu_device *adev, 200 + struct amdgpu_bo_va *bo_va, 201 + uint64_t addr); 202 + void amdgpu_vm_bo_rmv(struct amdgpu_device *adev, 203 + struct amdgpu_bo_va *bo_va); 204 + 205 + #endif
+222
drivers/gpu/drm/amd/amdgpu/amdgpu_vram_mgr.c
··· 1 + /* 2 + * Copyright 2016 Advanced Micro Devices, Inc. 3 + * 4 + * Permission is hereby granted, free of charge, to any person obtaining a 5 + * copy of this software and associated documentation files (the "Software"), 6 + * to deal in the Software without restriction, including without limitation 7 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 + * and/or sell copies of the Software, and to permit persons to whom the 9 + * Software is furnished to do so, subject to the following conditions: 10 + * 11 + * The above copyright notice and this permission notice shall be included in 12 + * all copies or substantial portions of the Software. 13 + * 14 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 + * OTHER DEALINGS IN THE SOFTWARE. 21 + * 22 + * Authors: Christian König 23 + */ 24 + 25 + #include <drm/drmP.h> 26 + #include "amdgpu.h" 27 + 28 + struct amdgpu_vram_mgr { 29 + struct drm_mm mm; 30 + spinlock_t lock; 31 + }; 32 + 33 + /** 34 + * amdgpu_vram_mgr_init - init VRAM manager and DRM MM 35 + * 36 + * @man: TTM memory type manager 37 + * @p_size: maximum size of VRAM 38 + * 39 + * Allocate and initialize the VRAM manager. 40 + */ 41 + static int amdgpu_vram_mgr_init(struct ttm_mem_type_manager *man, 42 + unsigned long p_size) 43 + { 44 + struct amdgpu_vram_mgr *mgr; 45 + 46 + mgr = kzalloc(sizeof(*mgr), GFP_KERNEL); 47 + if (!mgr) 48 + return -ENOMEM; 49 + 50 + drm_mm_init(&mgr->mm, 0, p_size); 51 + spin_lock_init(&mgr->lock); 52 + man->priv = mgr; 53 + return 0; 54 + } 55 + 56 + /** 57 + * amdgpu_vram_mgr_fini - free and destroy VRAM manager 58 + * 59 + * @man: TTM memory type manager 60 + * 61 + * Destroy and free the VRAM manager, returns -EBUSY if ranges are still 62 + * allocated inside it. 63 + */ 64 + static int amdgpu_vram_mgr_fini(struct ttm_mem_type_manager *man) 65 + { 66 + struct amdgpu_vram_mgr *mgr = man->priv; 67 + 68 + spin_lock(&mgr->lock); 69 + if (!drm_mm_clean(&mgr->mm)) { 70 + spin_unlock(&mgr->lock); 71 + return -EBUSY; 72 + } 73 + 74 + drm_mm_takedown(&mgr->mm); 75 + spin_unlock(&mgr->lock); 76 + kfree(mgr); 77 + man->priv = NULL; 78 + return 0; 79 + } 80 + 81 + /** 82 + * amdgpu_vram_mgr_new - allocate new ranges 83 + * 84 + * @man: TTM memory type manager 85 + * @tbo: TTM BO we need this range for 86 + * @place: placement flags and restrictions 87 + * @mem: the resulting mem object 88 + * 89 + * Allocate VRAM for the given BO. 90 + */ 91 + static int amdgpu_vram_mgr_new(struct ttm_mem_type_manager *man, 92 + struct ttm_buffer_object *tbo, 93 + const struct ttm_place *place, 94 + struct ttm_mem_reg *mem) 95 + { 96 + struct amdgpu_bo *bo = container_of(tbo, struct amdgpu_bo, tbo); 97 + struct amdgpu_vram_mgr *mgr = man->priv; 98 + struct drm_mm *mm = &mgr->mm; 99 + struct drm_mm_node *nodes; 100 + enum drm_mm_search_flags sflags = DRM_MM_SEARCH_DEFAULT; 101 + enum drm_mm_allocator_flags aflags = DRM_MM_CREATE_DEFAULT; 102 + unsigned long lpfn, num_nodes, pages_per_node, pages_left; 103 + unsigned i; 104 + int r; 105 + 106 + lpfn = place->lpfn; 107 + if (!lpfn) 108 + lpfn = man->size; 109 + 110 + if (bo->flags & AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS || 111 + amdgpu_vram_page_split == -1) { 112 + pages_per_node = ~0ul; 113 + num_nodes = 1; 114 + } else { 115 + pages_per_node = max((uint32_t)amdgpu_vram_page_split, 116 + mem->page_alignment); 117 + num_nodes = DIV_ROUND_UP(mem->num_pages, pages_per_node); 118 + } 119 + 120 + nodes = kcalloc(num_nodes, sizeof(*nodes), GFP_KERNEL); 121 + if (!nodes) 122 + return -ENOMEM; 123 + 124 + if (place->flags & TTM_PL_FLAG_TOPDOWN) { 125 + sflags = DRM_MM_SEARCH_BELOW; 126 + aflags = DRM_MM_CREATE_TOP; 127 + } 128 + 129 + pages_left = mem->num_pages; 130 + 131 + spin_lock(&mgr->lock); 132 + for (i = 0; i < num_nodes; ++i) { 133 + unsigned long pages = min(pages_left, pages_per_node); 134 + uint32_t alignment = mem->page_alignment; 135 + 136 + if (pages == pages_per_node) 137 + alignment = pages_per_node; 138 + else 139 + sflags |= DRM_MM_SEARCH_BEST; 140 + 141 + r = drm_mm_insert_node_in_range_generic(mm, &nodes[i], pages, 142 + alignment, 0, 143 + place->fpfn, lpfn, 144 + sflags, aflags); 145 + if (unlikely(r)) 146 + goto error; 147 + 148 + pages_left -= pages; 149 + } 150 + spin_unlock(&mgr->lock); 151 + 152 + mem->start = num_nodes == 1 ? nodes[0].start : AMDGPU_BO_INVALID_OFFSET; 153 + mem->mm_node = nodes; 154 + 155 + return 0; 156 + 157 + error: 158 + while (i--) 159 + drm_mm_remove_node(&nodes[i]); 160 + spin_unlock(&mgr->lock); 161 + 162 + kfree(nodes); 163 + return r == -ENOSPC ? 0 : r; 164 + } 165 + 166 + /** 167 + * amdgpu_vram_mgr_del - free ranges 168 + * 169 + * @man: TTM memory type manager 170 + * @tbo: TTM BO we need this range for 171 + * @place: placement flags and restrictions 172 + * @mem: TTM memory object 173 + * 174 + * Free the allocated VRAM again. 175 + */ 176 + static void amdgpu_vram_mgr_del(struct ttm_mem_type_manager *man, 177 + struct ttm_mem_reg *mem) 178 + { 179 + struct amdgpu_vram_mgr *mgr = man->priv; 180 + struct drm_mm_node *nodes = mem->mm_node; 181 + unsigned pages = mem->num_pages; 182 + 183 + if (!mem->mm_node) 184 + return; 185 + 186 + spin_lock(&mgr->lock); 187 + while (pages) { 188 + pages -= nodes->size; 189 + drm_mm_remove_node(nodes); 190 + ++nodes; 191 + } 192 + spin_unlock(&mgr->lock); 193 + 194 + kfree(mem->mm_node); 195 + mem->mm_node = NULL; 196 + } 197 + 198 + /** 199 + * amdgpu_vram_mgr_debug - dump VRAM table 200 + * 201 + * @man: TTM memory type manager 202 + * @prefix: text prefix 203 + * 204 + * Dump the table content using printk. 205 + */ 206 + static void amdgpu_vram_mgr_debug(struct ttm_mem_type_manager *man, 207 + const char *prefix) 208 + { 209 + struct amdgpu_vram_mgr *mgr = man->priv; 210 + 211 + spin_lock(&mgr->lock); 212 + drm_mm_debug_table(&mgr->mm, prefix); 213 + spin_unlock(&mgr->lock); 214 + } 215 + 216 + const struct ttm_mem_type_manager_func amdgpu_vram_mgr_func = { 217 + amdgpu_vram_mgr_init, 218 + amdgpu_vram_mgr_fini, 219 + amdgpu_vram_mgr_new, 220 + amdgpu_vram_mgr_del, 221 + amdgpu_vram_mgr_debug 222 + };
+1
drivers/gpu/drm/amd/amdgpu/atombios_crtc.c
··· 31 31 #include "atom.h" 32 32 #include "atom-bits.h" 33 33 #include "atombios_encoders.h" 34 + #include "atombios_crtc.h" 34 35 #include "amdgpu_atombios.h" 35 36 #include "amdgpu_pll.h" 36 37 #include "amdgpu_connectors.h"
+107 -15
drivers/gpu/drm/amd/amdgpu/ci_dpm.c
··· 887 887 { 888 888 struct ci_power_info *pi = ci_get_pi(adev); 889 889 890 - if (pi->uvd_power_gated == gate) 891 - return; 892 - 893 890 pi->uvd_power_gated = gate; 894 891 895 892 ci_update_uvd_dpm(adev, gate); ··· 956 959 mclk = ps->performance_levels[0].mclk; 957 960 sclk = ps->performance_levels[0].sclk; 958 961 } 962 + 963 + if (adev->pm.pm_display_cfg.min_core_set_clock > sclk) 964 + sclk = adev->pm.pm_display_cfg.min_core_set_clock; 965 + 966 + if (adev->pm.pm_display_cfg.min_mem_set_clock > mclk) 967 + mclk = adev->pm.pm_display_cfg.min_mem_set_clock; 959 968 960 969 if (rps->vce_active) { 961 970 if (sclk < adev->pm.dpm.vce_states[adev->pm.dpm.vce_level].sclk) ··· 2203 2200 { 2204 2201 struct ci_power_info *pi = ci_get_pi(adev); 2205 2202 int i, ret; 2203 + 2204 + if (amdgpu_ci_is_smc_running(adev)) { 2205 + DRM_INFO("smc is running, no need to load smc firmware\n"); 2206 + return 0; 2207 + } 2206 2208 2207 2209 for (i = 0; i < adev->usec_timeout; i++) { 2208 2210 if (RREG32_SMC(ixRCU_UC_EVENTS) & RCU_UC_EVENTS__boot_seq_done_MASK) ··· 4198 4190 { 4199 4191 struct ci_power_info *pi = ci_get_pi(adev); 4200 4192 u32 tmp; 4193 + int ret = 0; 4201 4194 4202 4195 if (!gate) { 4196 + /* turn the clocks on when decoding */ 4197 + ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD, 4198 + AMD_CG_STATE_UNGATE); 4199 + if (ret) 4200 + return ret; 4201 + 4203 4202 if (pi->caps_uvd_dpm || 4204 4203 (adev->pm.dpm.dyn_state.uvd_clock_voltage_dependency_table.count <= 0)) 4205 4204 pi->smc_state_table.UvdBootLevel = 0; ··· 4218 4203 tmp &= ~DPM_TABLE_475__UvdBootLevel_MASK; 4219 4204 tmp |= (pi->smc_state_table.UvdBootLevel << DPM_TABLE_475__UvdBootLevel__SHIFT); 4220 4205 WREG32_SMC(ixDPM_TABLE_475, tmp); 4206 + ret = ci_enable_uvd_dpm(adev, true); 4207 + } else { 4208 + ret = ci_enable_uvd_dpm(adev, false); 4209 + if (ret) 4210 + return ret; 4211 + 4212 + ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_UVD, 4213 + AMD_CG_STATE_GATE); 4221 4214 } 4222 4215 4223 - return ci_enable_uvd_dpm(adev, !gate); 4216 + return ret; 4224 4217 } 4225 4218 4226 4219 static u8 ci_get_vce_boot_level(struct amdgpu_device *adev) ··· 4270 4247 4271 4248 ret = ci_enable_vce_dpm(adev, true); 4272 4249 } else { 4250 + ret = ci_enable_vce_dpm(adev, false); 4251 + if (ret) 4252 + return ret; 4273 4253 /* turn the clocks off when not encoding */ 4274 4254 ret = amdgpu_set_clockgating_state(adev, AMD_IP_BLOCK_TYPE_VCE, 4275 4255 AMD_CG_STATE_GATE); 4276 - if (ret) 4277 - return ret; 4278 - 4279 - ret = ci_enable_vce_dpm(adev, false); 4280 4256 } 4281 4257 } 4282 4258 return ret; ··· 5241 5219 pi->current_rps = *rps; 5242 5220 pi->current_ps = *new_ps; 5243 5221 pi->current_rps.ps_priv = &pi->current_ps; 5222 + adev->pm.dpm.current_ps = &pi->current_rps; 5244 5223 } 5245 5224 5246 5225 static void ci_update_requested_ps(struct amdgpu_device *adev, ··· 5253 5230 pi->requested_rps = *rps; 5254 5231 pi->requested_ps = *new_ps; 5255 5232 pi->requested_rps.ps_priv = &pi->requested_ps; 5233 + adev->pm.dpm.requested_ps = &pi->requested_rps; 5256 5234 } 5257 5235 5258 5236 static int ci_dpm_pre_set_power_state(struct amdgpu_device *adev) ··· 5291 5267 struct amdgpu_ps *boot_ps = adev->pm.dpm.boot_ps; 5292 5268 int ret; 5293 5269 5294 - if (amdgpu_ci_is_smc_running(adev)) 5295 - return -EINVAL; 5296 5270 if (pi->voltage_control != CISLANDS_VOLTAGE_CONTROL_NONE) { 5297 5271 ci_enable_voltage_control(adev); 5298 5272 ret = ci_construct_voltage_tables(adev); ··· 5711 5689 adev->pm.dpm.num_ps = state_array->ucNumEntries; 5712 5690 5713 5691 /* fill in the vce power states */ 5714 - for (i = 0; i < AMDGPU_MAX_VCE_LEVELS; i++) { 5692 + for (i = 0; i < adev->pm.dpm.num_of_vce_states; i++) { 5715 5693 u32 sclk, mclk; 5716 5694 clock_array_index = adev->pm.dpm.vce_states[i].clk_idx; 5717 5695 clock_info = (union pplib_clock_info *) ··· 6116 6094 amdgpu_dpm_print_ps_status(adev, rps); 6117 6095 } 6118 6096 6097 + static inline bool ci_are_power_levels_equal(const struct ci_pl *ci_cpl1, 6098 + const struct ci_pl *ci_cpl2) 6099 + { 6100 + return ((ci_cpl1->mclk == ci_cpl2->mclk) && 6101 + (ci_cpl1->sclk == ci_cpl2->sclk) && 6102 + (ci_cpl1->pcie_gen == ci_cpl2->pcie_gen) && 6103 + (ci_cpl1->pcie_lane == ci_cpl2->pcie_lane)); 6104 + } 6105 + 6106 + static int ci_check_state_equal(struct amdgpu_device *adev, 6107 + struct amdgpu_ps *cps, 6108 + struct amdgpu_ps *rps, 6109 + bool *equal) 6110 + { 6111 + struct ci_ps *ci_cps; 6112 + struct ci_ps *ci_rps; 6113 + int i; 6114 + 6115 + if (adev == NULL || cps == NULL || rps == NULL || equal == NULL) 6116 + return -EINVAL; 6117 + 6118 + ci_cps = ci_get_ps(cps); 6119 + ci_rps = ci_get_ps(rps); 6120 + 6121 + if (ci_cps == NULL) { 6122 + *equal = false; 6123 + return 0; 6124 + } 6125 + 6126 + if (ci_cps->performance_level_count != ci_rps->performance_level_count) { 6127 + 6128 + *equal = false; 6129 + return 0; 6130 + } 6131 + 6132 + for (i = 0; i < ci_cps->performance_level_count; i++) { 6133 + if (!ci_are_power_levels_equal(&(ci_cps->performance_levels[i]), 6134 + &(ci_rps->performance_levels[i]))) { 6135 + *equal = false; 6136 + return 0; 6137 + } 6138 + } 6139 + 6140 + /* If all performance levels are the same try to use the UVD clocks to break the tie.*/ 6141 + *equal = ((cps->vclk == rps->vclk) && (cps->dclk == rps->dclk)); 6142 + *equal &= ((cps->evclk == rps->evclk) && (cps->ecclk == rps->ecclk)); 6143 + 6144 + return 0; 6145 + } 6146 + 6119 6147 static u32 ci_dpm_get_sclk(struct amdgpu_device *adev, bool low) 6120 6148 { 6121 6149 struct ci_power_info *pi = ci_get_pi(adev); ··· 6359 6287 6360 6288 if (adev->pm.dpm_enabled) { 6361 6289 mutex_lock(&adev->pm.mutex); 6362 - /* disable dpm */ 6363 - ci_dpm_disable(adev); 6364 - /* reset the power state */ 6365 - adev->pm.dpm.current_ps = adev->pm.dpm.requested_ps = adev->pm.dpm.boot_ps; 6290 + amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, 6291 + AMDGPU_THERMAL_IRQ_LOW_TO_HIGH); 6292 + amdgpu_irq_put(adev, &adev->pm.dpm.thermal.irq, 6293 + AMDGPU_THERMAL_IRQ_HIGH_TO_LOW); 6294 + adev->pm.dpm.last_user_state = adev->pm.dpm.user_state; 6295 + adev->pm.dpm.last_state = adev->pm.dpm.state; 6296 + adev->pm.dpm.user_state = POWER_STATE_TYPE_INTERNAL_BOOT; 6297 + adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_BOOT; 6366 6298 mutex_unlock(&adev->pm.mutex); 6299 + amdgpu_pm_compute_clocks(adev); 6300 + 6367 6301 } 6302 + 6368 6303 return 0; 6369 6304 } 6370 6305 ··· 6389 6310 adev->pm.dpm_enabled = false; 6390 6311 else 6391 6312 adev->pm.dpm_enabled = true; 6313 + adev->pm.dpm.user_state = adev->pm.dpm.last_user_state; 6314 + adev->pm.dpm.state = adev->pm.dpm.last_state; 6392 6315 mutex_unlock(&adev->pm.mutex); 6393 6316 if (adev->pm.dpm_enabled) 6394 6317 amdgpu_pm_compute_clocks(adev); ··· 6725 6644 .set_sclk_od = ci_dpm_set_sclk_od, 6726 6645 .get_mclk_od = ci_dpm_get_mclk_od, 6727 6646 .set_mclk_od = ci_dpm_set_mclk_od, 6647 + .check_state_equal = ci_check_state_equal, 6648 + .get_vce_clock_state = amdgpu_get_vce_clock_state, 6728 6649 }; 6729 6650 6730 6651 static void ci_dpm_set_dpm_funcs(struct amdgpu_device *adev) ··· 6745 6662 adev->pm.dpm.thermal.irq.num_types = AMDGPU_THERMAL_IRQ_LAST; 6746 6663 adev->pm.dpm.thermal.irq.funcs = &ci_dpm_irq_funcs; 6747 6664 } 6665 + 6666 + const struct amdgpu_ip_block_version ci_dpm_ip_block = 6667 + { 6668 + .type = AMD_IP_BLOCK_TYPE_SMC, 6669 + .major = 7, 6670 + .minor = 0, 6671 + .rev = 0, 6672 + .funcs = &ci_dpm_ip_funcs, 6673 + };
+80 -754
drivers/gpu/drm/amd/amdgpu/cik.c
··· 1189 1189 return r; 1190 1190 } 1191 1191 1192 - static void cik_set_bios_scratch_engine_hung(struct amdgpu_device *adev, bool hung) 1193 - { 1194 - u32 tmp = RREG32(mmBIOS_SCRATCH_3); 1195 - 1196 - if (hung) 1197 - tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1198 - else 1199 - tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG; 1200 - 1201 - WREG32(mmBIOS_SCRATCH_3, tmp); 1202 - } 1203 - 1204 1192 /** 1205 1193 * cik_asic_reset - soft reset GPU 1206 1194 * ··· 1201 1213 static int cik_asic_reset(struct amdgpu_device *adev) 1202 1214 { 1203 1215 int r; 1204 - cik_set_bios_scratch_engine_hung(adev, true); 1216 + 1217 + amdgpu_atombios_scratch_regs_engine_hung(adev, true); 1205 1218 1206 1219 r = cik_gpu_pci_config_reset(adev); 1207 1220 1208 - cik_set_bios_scratch_engine_hung(adev, false); 1221 + amdgpu_atombios_scratch_regs_engine_hung(adev, false); 1209 1222 1210 1223 return r; 1211 1224 } ··· 1630 1641 adev->virtualization.virtual_caps |= AMDGPU_PASSTHROUGH_MODE; 1631 1642 } 1632 1643 1633 - static const struct amdgpu_ip_block_version bonaire_ip_blocks[] = 1634 - { 1635 - /* ORDER MATTERS! */ 1636 - { 1637 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1638 - .major = 1, 1639 - .minor = 0, 1640 - .rev = 0, 1641 - .funcs = &cik_common_ip_funcs, 1642 - }, 1643 - { 1644 - .type = AMD_IP_BLOCK_TYPE_GMC, 1645 - .major = 7, 1646 - .minor = 0, 1647 - .rev = 0, 1648 - .funcs = &gmc_v7_0_ip_funcs, 1649 - }, 1650 - { 1651 - .type = AMD_IP_BLOCK_TYPE_IH, 1652 - .major = 2, 1653 - .minor = 0, 1654 - .rev = 0, 1655 - .funcs = &cik_ih_ip_funcs, 1656 - }, 1657 - { 1658 - .type = AMD_IP_BLOCK_TYPE_SMC, 1659 - .major = 7, 1660 - .minor = 0, 1661 - .rev = 0, 1662 - .funcs = &amdgpu_pp_ip_funcs, 1663 - }, 1664 - { 1665 - .type = AMD_IP_BLOCK_TYPE_DCE, 1666 - .major = 8, 1667 - .minor = 2, 1668 - .rev = 0, 1669 - .funcs = &dce_v8_0_ip_funcs, 1670 - }, 1671 - { 1672 - .type = AMD_IP_BLOCK_TYPE_GFX, 1673 - .major = 7, 1674 - .minor = 2, 1675 - .rev = 0, 1676 - .funcs = &gfx_v7_0_ip_funcs, 1677 - }, 1678 - { 1679 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1680 - .major = 2, 1681 - .minor = 0, 1682 - .rev = 0, 1683 - .funcs = &cik_sdma_ip_funcs, 1684 - }, 1685 - { 1686 - .type = AMD_IP_BLOCK_TYPE_UVD, 1687 - .major = 4, 1688 - .minor = 2, 1689 - .rev = 0, 1690 - .funcs = &uvd_v4_2_ip_funcs, 1691 - }, 1692 - { 1693 - .type = AMD_IP_BLOCK_TYPE_VCE, 1694 - .major = 2, 1695 - .minor = 0, 1696 - .rev = 0, 1697 - .funcs = &vce_v2_0_ip_funcs, 1698 - }, 1699 - }; 1700 - 1701 - static const struct amdgpu_ip_block_version bonaire_ip_blocks_vd[] = 1702 - { 1703 - /* ORDER MATTERS! */ 1704 - { 1705 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1706 - .major = 1, 1707 - .minor = 0, 1708 - .rev = 0, 1709 - .funcs = &cik_common_ip_funcs, 1710 - }, 1711 - { 1712 - .type = AMD_IP_BLOCK_TYPE_GMC, 1713 - .major = 7, 1714 - .minor = 0, 1715 - .rev = 0, 1716 - .funcs = &gmc_v7_0_ip_funcs, 1717 - }, 1718 - { 1719 - .type = AMD_IP_BLOCK_TYPE_IH, 1720 - .major = 2, 1721 - .minor = 0, 1722 - .rev = 0, 1723 - .funcs = &cik_ih_ip_funcs, 1724 - }, 1725 - { 1726 - .type = AMD_IP_BLOCK_TYPE_SMC, 1727 - .major = 7, 1728 - .minor = 0, 1729 - .rev = 0, 1730 - .funcs = &amdgpu_pp_ip_funcs, 1731 - }, 1732 - { 1733 - .type = AMD_IP_BLOCK_TYPE_DCE, 1734 - .major = 8, 1735 - .minor = 2, 1736 - .rev = 0, 1737 - .funcs = &dce_virtual_ip_funcs, 1738 - }, 1739 - { 1740 - .type = AMD_IP_BLOCK_TYPE_GFX, 1741 - .major = 7, 1742 - .minor = 2, 1743 - .rev = 0, 1744 - .funcs = &gfx_v7_0_ip_funcs, 1745 - }, 1746 - { 1747 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1748 - .major = 2, 1749 - .minor = 0, 1750 - .rev = 0, 1751 - .funcs = &cik_sdma_ip_funcs, 1752 - }, 1753 - { 1754 - .type = AMD_IP_BLOCK_TYPE_UVD, 1755 - .major = 4, 1756 - .minor = 2, 1757 - .rev = 0, 1758 - .funcs = &uvd_v4_2_ip_funcs, 1759 - }, 1760 - { 1761 - .type = AMD_IP_BLOCK_TYPE_VCE, 1762 - .major = 2, 1763 - .minor = 0, 1764 - .rev = 0, 1765 - .funcs = &vce_v2_0_ip_funcs, 1766 - }, 1767 - }; 1768 - 1769 - static const struct amdgpu_ip_block_version hawaii_ip_blocks[] = 1770 - { 1771 - /* ORDER MATTERS! */ 1772 - { 1773 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1774 - .major = 1, 1775 - .minor = 0, 1776 - .rev = 0, 1777 - .funcs = &cik_common_ip_funcs, 1778 - }, 1779 - { 1780 - .type = AMD_IP_BLOCK_TYPE_GMC, 1781 - .major = 7, 1782 - .minor = 0, 1783 - .rev = 0, 1784 - .funcs = &gmc_v7_0_ip_funcs, 1785 - }, 1786 - { 1787 - .type = AMD_IP_BLOCK_TYPE_IH, 1788 - .major = 2, 1789 - .minor = 0, 1790 - .rev = 0, 1791 - .funcs = &cik_ih_ip_funcs, 1792 - }, 1793 - { 1794 - .type = AMD_IP_BLOCK_TYPE_SMC, 1795 - .major = 7, 1796 - .minor = 0, 1797 - .rev = 0, 1798 - .funcs = &amdgpu_pp_ip_funcs, 1799 - }, 1800 - { 1801 - .type = AMD_IP_BLOCK_TYPE_DCE, 1802 - .major = 8, 1803 - .minor = 5, 1804 - .rev = 0, 1805 - .funcs = &dce_v8_0_ip_funcs, 1806 - }, 1807 - { 1808 - .type = AMD_IP_BLOCK_TYPE_GFX, 1809 - .major = 7, 1810 - .minor = 3, 1811 - .rev = 0, 1812 - .funcs = &gfx_v7_0_ip_funcs, 1813 - }, 1814 - { 1815 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1816 - .major = 2, 1817 - .minor = 0, 1818 - .rev = 0, 1819 - .funcs = &cik_sdma_ip_funcs, 1820 - }, 1821 - { 1822 - .type = AMD_IP_BLOCK_TYPE_UVD, 1823 - .major = 4, 1824 - .minor = 2, 1825 - .rev = 0, 1826 - .funcs = &uvd_v4_2_ip_funcs, 1827 - }, 1828 - { 1829 - .type = AMD_IP_BLOCK_TYPE_VCE, 1830 - .major = 2, 1831 - .minor = 0, 1832 - .rev = 0, 1833 - .funcs = &vce_v2_0_ip_funcs, 1834 - }, 1835 - }; 1836 - 1837 - static const struct amdgpu_ip_block_version hawaii_ip_blocks_vd[] = 1838 - { 1839 - /* ORDER MATTERS! */ 1840 - { 1841 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1842 - .major = 1, 1843 - .minor = 0, 1844 - .rev = 0, 1845 - .funcs = &cik_common_ip_funcs, 1846 - }, 1847 - { 1848 - .type = AMD_IP_BLOCK_TYPE_GMC, 1849 - .major = 7, 1850 - .minor = 0, 1851 - .rev = 0, 1852 - .funcs = &gmc_v7_0_ip_funcs, 1853 - }, 1854 - { 1855 - .type = AMD_IP_BLOCK_TYPE_IH, 1856 - .major = 2, 1857 - .minor = 0, 1858 - .rev = 0, 1859 - .funcs = &cik_ih_ip_funcs, 1860 - }, 1861 - { 1862 - .type = AMD_IP_BLOCK_TYPE_SMC, 1863 - .major = 7, 1864 - .minor = 0, 1865 - .rev = 0, 1866 - .funcs = &amdgpu_pp_ip_funcs, 1867 - }, 1868 - { 1869 - .type = AMD_IP_BLOCK_TYPE_DCE, 1870 - .major = 8, 1871 - .minor = 5, 1872 - .rev = 0, 1873 - .funcs = &dce_virtual_ip_funcs, 1874 - }, 1875 - { 1876 - .type = AMD_IP_BLOCK_TYPE_GFX, 1877 - .major = 7, 1878 - .minor = 3, 1879 - .rev = 0, 1880 - .funcs = &gfx_v7_0_ip_funcs, 1881 - }, 1882 - { 1883 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1884 - .major = 2, 1885 - .minor = 0, 1886 - .rev = 0, 1887 - .funcs = &cik_sdma_ip_funcs, 1888 - }, 1889 - { 1890 - .type = AMD_IP_BLOCK_TYPE_UVD, 1891 - .major = 4, 1892 - .minor = 2, 1893 - .rev = 0, 1894 - .funcs = &uvd_v4_2_ip_funcs, 1895 - }, 1896 - { 1897 - .type = AMD_IP_BLOCK_TYPE_VCE, 1898 - .major = 2, 1899 - .minor = 0, 1900 - .rev = 0, 1901 - .funcs = &vce_v2_0_ip_funcs, 1902 - }, 1903 - }; 1904 - 1905 - static const struct amdgpu_ip_block_version kabini_ip_blocks[] = 1906 - { 1907 - /* ORDER MATTERS! */ 1908 - { 1909 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1910 - .major = 1, 1911 - .minor = 0, 1912 - .rev = 0, 1913 - .funcs = &cik_common_ip_funcs, 1914 - }, 1915 - { 1916 - .type = AMD_IP_BLOCK_TYPE_GMC, 1917 - .major = 7, 1918 - .minor = 0, 1919 - .rev = 0, 1920 - .funcs = &gmc_v7_0_ip_funcs, 1921 - }, 1922 - { 1923 - .type = AMD_IP_BLOCK_TYPE_IH, 1924 - .major = 2, 1925 - .minor = 0, 1926 - .rev = 0, 1927 - .funcs = &cik_ih_ip_funcs, 1928 - }, 1929 - { 1930 - .type = AMD_IP_BLOCK_TYPE_SMC, 1931 - .major = 7, 1932 - .minor = 0, 1933 - .rev = 0, 1934 - .funcs = &amdgpu_pp_ip_funcs, 1935 - }, 1936 - { 1937 - .type = AMD_IP_BLOCK_TYPE_DCE, 1938 - .major = 8, 1939 - .minor = 3, 1940 - .rev = 0, 1941 - .funcs = &dce_v8_0_ip_funcs, 1942 - }, 1943 - { 1944 - .type = AMD_IP_BLOCK_TYPE_GFX, 1945 - .major = 7, 1946 - .minor = 2, 1947 - .rev = 0, 1948 - .funcs = &gfx_v7_0_ip_funcs, 1949 - }, 1950 - { 1951 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1952 - .major = 2, 1953 - .minor = 0, 1954 - .rev = 0, 1955 - .funcs = &cik_sdma_ip_funcs, 1956 - }, 1957 - { 1958 - .type = AMD_IP_BLOCK_TYPE_UVD, 1959 - .major = 4, 1960 - .minor = 2, 1961 - .rev = 0, 1962 - .funcs = &uvd_v4_2_ip_funcs, 1963 - }, 1964 - { 1965 - .type = AMD_IP_BLOCK_TYPE_VCE, 1966 - .major = 2, 1967 - .minor = 0, 1968 - .rev = 0, 1969 - .funcs = &vce_v2_0_ip_funcs, 1970 - }, 1971 - }; 1972 - 1973 - static const struct amdgpu_ip_block_version kabini_ip_blocks_vd[] = 1974 - { 1975 - /* ORDER MATTERS! */ 1976 - { 1977 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1978 - .major = 1, 1979 - .minor = 0, 1980 - .rev = 0, 1981 - .funcs = &cik_common_ip_funcs, 1982 - }, 1983 - { 1984 - .type = AMD_IP_BLOCK_TYPE_GMC, 1985 - .major = 7, 1986 - .minor = 0, 1987 - .rev = 0, 1988 - .funcs = &gmc_v7_0_ip_funcs, 1989 - }, 1990 - { 1991 - .type = AMD_IP_BLOCK_TYPE_IH, 1992 - .major = 2, 1993 - .minor = 0, 1994 - .rev = 0, 1995 - .funcs = &cik_ih_ip_funcs, 1996 - }, 1997 - { 1998 - .type = AMD_IP_BLOCK_TYPE_SMC, 1999 - .major = 7, 2000 - .minor = 0, 2001 - .rev = 0, 2002 - .funcs = &amdgpu_pp_ip_funcs, 2003 - }, 2004 - { 2005 - .type = AMD_IP_BLOCK_TYPE_DCE, 2006 - .major = 8, 2007 - .minor = 3, 2008 - .rev = 0, 2009 - .funcs = &dce_virtual_ip_funcs, 2010 - }, 2011 - { 2012 - .type = AMD_IP_BLOCK_TYPE_GFX, 2013 - .major = 7, 2014 - .minor = 2, 2015 - .rev = 0, 2016 - .funcs = &gfx_v7_0_ip_funcs, 2017 - }, 2018 - { 2019 - .type = AMD_IP_BLOCK_TYPE_SDMA, 2020 - .major = 2, 2021 - .minor = 0, 2022 - .rev = 0, 2023 - .funcs = &cik_sdma_ip_funcs, 2024 - }, 2025 - { 2026 - .type = AMD_IP_BLOCK_TYPE_UVD, 2027 - .major = 4, 2028 - .minor = 2, 2029 - .rev = 0, 2030 - .funcs = &uvd_v4_2_ip_funcs, 2031 - }, 2032 - { 2033 - .type = AMD_IP_BLOCK_TYPE_VCE, 2034 - .major = 2, 2035 - .minor = 0, 2036 - .rev = 0, 2037 - .funcs = &vce_v2_0_ip_funcs, 2038 - }, 2039 - }; 2040 - 2041 - static const struct amdgpu_ip_block_version mullins_ip_blocks[] = 2042 - { 2043 - /* ORDER MATTERS! */ 2044 - { 2045 - .type = AMD_IP_BLOCK_TYPE_COMMON, 2046 - .major = 1, 2047 - .minor = 0, 2048 - .rev = 0, 2049 - .funcs = &cik_common_ip_funcs, 2050 - }, 2051 - { 2052 - .type = AMD_IP_BLOCK_TYPE_GMC, 2053 - .major = 7, 2054 - .minor = 0, 2055 - .rev = 0, 2056 - .funcs = &gmc_v7_0_ip_funcs, 2057 - }, 2058 - { 2059 - .type = AMD_IP_BLOCK_TYPE_IH, 2060 - .major = 2, 2061 - .minor = 0, 2062 - .rev = 0, 2063 - .funcs = &cik_ih_ip_funcs, 2064 - }, 2065 - { 2066 - .type = AMD_IP_BLOCK_TYPE_SMC, 2067 - .major = 7, 2068 - .minor = 0, 2069 - .rev = 0, 2070 - .funcs = &amdgpu_pp_ip_funcs, 2071 - }, 2072 - { 2073 - .type = AMD_IP_BLOCK_TYPE_DCE, 2074 - .major = 8, 2075 - .minor = 3, 2076 - .rev = 0, 2077 - .funcs = &dce_v8_0_ip_funcs, 2078 - }, 2079 - { 2080 - .type = AMD_IP_BLOCK_TYPE_GFX, 2081 - .major = 7, 2082 - .minor = 2, 2083 - .rev = 0, 2084 - .funcs = &gfx_v7_0_ip_funcs, 2085 - }, 2086 - { 2087 - .type = AMD_IP_BLOCK_TYPE_SDMA, 2088 - .major = 2, 2089 - .minor = 0, 2090 - .rev = 0, 2091 - .funcs = &cik_sdma_ip_funcs, 2092 - }, 2093 - { 2094 - .type = AMD_IP_BLOCK_TYPE_UVD, 2095 - .major = 4, 2096 - .minor = 2, 2097 - .rev = 0, 2098 - .funcs = &uvd_v4_2_ip_funcs, 2099 - }, 2100 - { 2101 - .type = AMD_IP_BLOCK_TYPE_VCE, 2102 - .major = 2, 2103 - .minor = 0, 2104 - .rev = 0, 2105 - .funcs = &vce_v2_0_ip_funcs, 2106 - }, 2107 - }; 2108 - 2109 - static const struct amdgpu_ip_block_version mullins_ip_blocks_vd[] = 2110 - { 2111 - /* ORDER MATTERS! */ 2112 - { 2113 - .type = AMD_IP_BLOCK_TYPE_COMMON, 2114 - .major = 1, 2115 - .minor = 0, 2116 - .rev = 0, 2117 - .funcs = &cik_common_ip_funcs, 2118 - }, 2119 - { 2120 - .type = AMD_IP_BLOCK_TYPE_GMC, 2121 - .major = 7, 2122 - .minor = 0, 2123 - .rev = 0, 2124 - .funcs = &gmc_v7_0_ip_funcs, 2125 - }, 2126 - { 2127 - .type = AMD_IP_BLOCK_TYPE_IH, 2128 - .major = 2, 2129 - .minor = 0, 2130 - .rev = 0, 2131 - .funcs = &cik_ih_ip_funcs, 2132 - }, 2133 - { 2134 - .type = AMD_IP_BLOCK_TYPE_SMC, 2135 - .major = 7, 2136 - .minor = 0, 2137 - .rev = 0, 2138 - .funcs = &amdgpu_pp_ip_funcs, 2139 - }, 2140 - { 2141 - .type = AMD_IP_BLOCK_TYPE_DCE, 2142 - .major = 8, 2143 - .minor = 3, 2144 - .rev = 0, 2145 - .funcs = &dce_virtual_ip_funcs, 2146 - }, 2147 - { 2148 - .type = AMD_IP_BLOCK_TYPE_GFX, 2149 - .major = 7, 2150 - .minor = 2, 2151 - .rev = 0, 2152 - .funcs = &gfx_v7_0_ip_funcs, 2153 - }, 2154 - { 2155 - .type = AMD_IP_BLOCK_TYPE_SDMA, 2156 - .major = 2, 2157 - .minor = 0, 2158 - .rev = 0, 2159 - .funcs = &cik_sdma_ip_funcs, 2160 - }, 2161 - { 2162 - .type = AMD_IP_BLOCK_TYPE_UVD, 2163 - .major = 4, 2164 - .minor = 2, 2165 - .rev = 0, 2166 - .funcs = &uvd_v4_2_ip_funcs, 2167 - }, 2168 - { 2169 - .type = AMD_IP_BLOCK_TYPE_VCE, 2170 - .major = 2, 2171 - .minor = 0, 2172 - .rev = 0, 2173 - .funcs = &vce_v2_0_ip_funcs, 2174 - }, 2175 - }; 2176 - 2177 - static const struct amdgpu_ip_block_version kaveri_ip_blocks[] = 2178 - { 2179 - /* ORDER MATTERS! */ 2180 - { 2181 - .type = AMD_IP_BLOCK_TYPE_COMMON, 2182 - .major = 1, 2183 - .minor = 0, 2184 - .rev = 0, 2185 - .funcs = &cik_common_ip_funcs, 2186 - }, 2187 - { 2188 - .type = AMD_IP_BLOCK_TYPE_GMC, 2189 - .major = 7, 2190 - .minor = 0, 2191 - .rev = 0, 2192 - .funcs = &gmc_v7_0_ip_funcs, 2193 - }, 2194 - { 2195 - .type = AMD_IP_BLOCK_TYPE_IH, 2196 - .major = 2, 2197 - .minor = 0, 2198 - .rev = 0, 2199 - .funcs = &cik_ih_ip_funcs, 2200 - }, 2201 - { 2202 - .type = AMD_IP_BLOCK_TYPE_SMC, 2203 - .major = 7, 2204 - .minor = 0, 2205 - .rev = 0, 2206 - .funcs = &amdgpu_pp_ip_funcs, 2207 - }, 2208 - { 2209 - .type = AMD_IP_BLOCK_TYPE_DCE, 2210 - .major = 8, 2211 - .minor = 1, 2212 - .rev = 0, 2213 - .funcs = &dce_v8_0_ip_funcs, 2214 - }, 2215 - { 2216 - .type = AMD_IP_BLOCK_TYPE_GFX, 2217 - .major = 7, 2218 - .minor = 1, 2219 - .rev = 0, 2220 - .funcs = &gfx_v7_0_ip_funcs, 2221 - }, 2222 - { 2223 - .type = AMD_IP_BLOCK_TYPE_SDMA, 2224 - .major = 2, 2225 - .minor = 0, 2226 - .rev = 0, 2227 - .funcs = &cik_sdma_ip_funcs, 2228 - }, 2229 - { 2230 - .type = AMD_IP_BLOCK_TYPE_UVD, 2231 - .major = 4, 2232 - .minor = 2, 2233 - .rev = 0, 2234 - .funcs = &uvd_v4_2_ip_funcs, 2235 - }, 2236 - { 2237 - .type = AMD_IP_BLOCK_TYPE_VCE, 2238 - .major = 2, 2239 - .minor = 0, 2240 - .rev = 0, 2241 - .funcs = &vce_v2_0_ip_funcs, 2242 - }, 2243 - }; 2244 - 2245 - static const struct amdgpu_ip_block_version kaveri_ip_blocks_vd[] = 2246 - { 2247 - /* ORDER MATTERS! */ 2248 - { 2249 - .type = AMD_IP_BLOCK_TYPE_COMMON, 2250 - .major = 1, 2251 - .minor = 0, 2252 - .rev = 0, 2253 - .funcs = &cik_common_ip_funcs, 2254 - }, 2255 - { 2256 - .type = AMD_IP_BLOCK_TYPE_GMC, 2257 - .major = 7, 2258 - .minor = 0, 2259 - .rev = 0, 2260 - .funcs = &gmc_v7_0_ip_funcs, 2261 - }, 2262 - { 2263 - .type = AMD_IP_BLOCK_TYPE_IH, 2264 - .major = 2, 2265 - .minor = 0, 2266 - .rev = 0, 2267 - .funcs = &cik_ih_ip_funcs, 2268 - }, 2269 - { 2270 - .type = AMD_IP_BLOCK_TYPE_SMC, 2271 - .major = 7, 2272 - .minor = 0, 2273 - .rev = 0, 2274 - .funcs = &amdgpu_pp_ip_funcs, 2275 - }, 2276 - { 2277 - .type = AMD_IP_BLOCK_TYPE_DCE, 2278 - .major = 8, 2279 - .minor = 1, 2280 - .rev = 0, 2281 - .funcs = &dce_virtual_ip_funcs, 2282 - }, 2283 - { 2284 - .type = AMD_IP_BLOCK_TYPE_GFX, 2285 - .major = 7, 2286 - .minor = 1, 2287 - .rev = 0, 2288 - .funcs = &gfx_v7_0_ip_funcs, 2289 - }, 2290 - { 2291 - .type = AMD_IP_BLOCK_TYPE_SDMA, 2292 - .major = 2, 2293 - .minor = 0, 2294 - .rev = 0, 2295 - .funcs = &cik_sdma_ip_funcs, 2296 - }, 2297 - { 2298 - .type = AMD_IP_BLOCK_TYPE_UVD, 2299 - .major = 4, 2300 - .minor = 2, 2301 - .rev = 0, 2302 - .funcs = &uvd_v4_2_ip_funcs, 2303 - }, 2304 - { 2305 - .type = AMD_IP_BLOCK_TYPE_VCE, 2306 - .major = 2, 2307 - .minor = 0, 2308 - .rev = 0, 2309 - .funcs = &vce_v2_0_ip_funcs, 2310 - }, 2311 - }; 2312 - 2313 - int cik_set_ip_blocks(struct amdgpu_device *adev) 2314 - { 2315 - if (adev->enable_virtual_display) { 2316 - switch (adev->asic_type) { 2317 - case CHIP_BONAIRE: 2318 - adev->ip_blocks = bonaire_ip_blocks_vd; 2319 - adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks_vd); 2320 - break; 2321 - case CHIP_HAWAII: 2322 - adev->ip_blocks = hawaii_ip_blocks_vd; 2323 - adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks_vd); 2324 - break; 2325 - case CHIP_KAVERI: 2326 - adev->ip_blocks = kaveri_ip_blocks_vd; 2327 - adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks_vd); 2328 - break; 2329 - case CHIP_KABINI: 2330 - adev->ip_blocks = kabini_ip_blocks_vd; 2331 - adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks_vd); 2332 - break; 2333 - case CHIP_MULLINS: 2334 - adev->ip_blocks = mullins_ip_blocks_vd; 2335 - adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks_vd); 2336 - break; 2337 - default: 2338 - /* FIXME: not supported yet */ 2339 - return -EINVAL; 2340 - } 2341 - } else { 2342 - switch (adev->asic_type) { 2343 - case CHIP_BONAIRE: 2344 - adev->ip_blocks = bonaire_ip_blocks; 2345 - adev->num_ip_blocks = ARRAY_SIZE(bonaire_ip_blocks); 2346 - break; 2347 - case CHIP_HAWAII: 2348 - adev->ip_blocks = hawaii_ip_blocks; 2349 - adev->num_ip_blocks = ARRAY_SIZE(hawaii_ip_blocks); 2350 - break; 2351 - case CHIP_KAVERI: 2352 - adev->ip_blocks = kaveri_ip_blocks; 2353 - adev->num_ip_blocks = ARRAY_SIZE(kaveri_ip_blocks); 2354 - break; 2355 - case CHIP_KABINI: 2356 - adev->ip_blocks = kabini_ip_blocks; 2357 - adev->num_ip_blocks = ARRAY_SIZE(kabini_ip_blocks); 2358 - break; 2359 - case CHIP_MULLINS: 2360 - adev->ip_blocks = mullins_ip_blocks; 2361 - adev->num_ip_blocks = ARRAY_SIZE(mullins_ip_blocks); 2362 - break; 2363 - default: 2364 - /* FIXME: not supported yet */ 2365 - return -EINVAL; 2366 - } 2367 - } 2368 - 2369 - return 0; 2370 - } 2371 - 2372 1644 static const struct amdgpu_asic_funcs cik_asic_funcs = 2373 1645 { 2374 1646 .read_disabled_bios = &cik_read_disabled_bios, ··· 1862 2612 return 0; 1863 2613 } 1864 2614 1865 - const struct amd_ip_funcs cik_common_ip_funcs = { 2615 + static const struct amd_ip_funcs cik_common_ip_funcs = { 1866 2616 .name = "cik_common", 1867 2617 .early_init = cik_common_early_init, 1868 2618 .late_init = NULL, ··· 1878 2628 .set_clockgating_state = cik_common_set_clockgating_state, 1879 2629 .set_powergating_state = cik_common_set_powergating_state, 1880 2630 }; 2631 + 2632 + static const struct amdgpu_ip_block_version cik_common_ip_block = 2633 + { 2634 + .type = AMD_IP_BLOCK_TYPE_COMMON, 2635 + .major = 1, 2636 + .minor = 0, 2637 + .rev = 0, 2638 + .funcs = &cik_common_ip_funcs, 2639 + }; 2640 + 2641 + int cik_set_ip_blocks(struct amdgpu_device *adev) 2642 + { 2643 + switch (adev->asic_type) { 2644 + case CHIP_BONAIRE: 2645 + amdgpu_ip_block_add(adev, &cik_common_ip_block); 2646 + amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); 2647 + amdgpu_ip_block_add(adev, &cik_ih_ip_block); 2648 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 2649 + if (adev->enable_virtual_display) 2650 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 2651 + else 2652 + amdgpu_ip_block_add(adev, &dce_v8_2_ip_block); 2653 + amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); 2654 + amdgpu_ip_block_add(adev, &cik_sdma_ip_block); 2655 + amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); 2656 + amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); 2657 + break; 2658 + case CHIP_HAWAII: 2659 + amdgpu_ip_block_add(adev, &cik_common_ip_block); 2660 + amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); 2661 + amdgpu_ip_block_add(adev, &cik_ih_ip_block); 2662 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 2663 + if (adev->enable_virtual_display) 2664 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 2665 + else 2666 + amdgpu_ip_block_add(adev, &dce_v8_5_ip_block); 2667 + amdgpu_ip_block_add(adev, &gfx_v7_3_ip_block); 2668 + amdgpu_ip_block_add(adev, &cik_sdma_ip_block); 2669 + amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); 2670 + amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); 2671 + break; 2672 + case CHIP_KAVERI: 2673 + amdgpu_ip_block_add(adev, &cik_common_ip_block); 2674 + amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); 2675 + amdgpu_ip_block_add(adev, &cik_ih_ip_block); 2676 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 2677 + if (adev->enable_virtual_display) 2678 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 2679 + else 2680 + amdgpu_ip_block_add(adev, &dce_v8_1_ip_block); 2681 + amdgpu_ip_block_add(adev, &gfx_v7_1_ip_block); 2682 + amdgpu_ip_block_add(adev, &cik_sdma_ip_block); 2683 + amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); 2684 + amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); 2685 + break; 2686 + case CHIP_KABINI: 2687 + case CHIP_MULLINS: 2688 + amdgpu_ip_block_add(adev, &cik_common_ip_block); 2689 + amdgpu_ip_block_add(adev, &gmc_v7_0_ip_block); 2690 + amdgpu_ip_block_add(adev, &cik_ih_ip_block); 2691 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 2692 + if (adev->enable_virtual_display) 2693 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 2694 + else 2695 + amdgpu_ip_block_add(adev, &dce_v8_3_ip_block); 2696 + amdgpu_ip_block_add(adev, &gfx_v7_2_ip_block); 2697 + amdgpu_ip_block_add(adev, &cik_sdma_ip_block); 2698 + amdgpu_ip_block_add(adev, &uvd_v4_2_ip_block); 2699 + amdgpu_ip_block_add(adev, &vce_v2_0_ip_block); 2700 + break; 2701 + default: 2702 + /* FIXME: not supported yet */ 2703 + return -EINVAL; 2704 + } 2705 + return 0; 2706 + }
-2
drivers/gpu/drm/amd/amdgpu/cik.h
··· 24 24 #ifndef __CIK_H__ 25 25 #define __CIK_H__ 26 26 27 - extern const struct amd_ip_funcs cik_common_ip_funcs; 28 - 29 27 void cik_srbm_select(struct amdgpu_device *adev, 30 28 u32 me, u32 pipe, u32 queue, u32 vmid); 31 29 int cik_set_ip_blocks(struct amdgpu_device *adev);
+10 -1
drivers/gpu/drm/amd/amdgpu/cik_ih.c
··· 413 413 return 0; 414 414 } 415 415 416 - const struct amd_ip_funcs cik_ih_ip_funcs = { 416 + static const struct amd_ip_funcs cik_ih_ip_funcs = { 417 417 .name = "cik_ih", 418 418 .early_init = cik_ih_early_init, 419 419 .late_init = NULL, ··· 441 441 if (adev->irq.ih_funcs == NULL) 442 442 adev->irq.ih_funcs = &cik_ih_funcs; 443 443 } 444 + 445 + const struct amdgpu_ip_block_version cik_ih_ip_block = 446 + { 447 + .type = AMD_IP_BLOCK_TYPE_IH, 448 + .major = 2, 449 + .minor = 0, 450 + .rev = 0, 451 + .funcs = &cik_ih_ip_funcs, 452 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/cik_ih.h
··· 24 24 #ifndef __CIK_IH_H__ 25 25 #define __CIK_IH_H__ 26 26 27 - extern const struct amd_ip_funcs cik_ih_ip_funcs; 27 + extern const struct amdgpu_ip_block_version cik_ih_ip_block; 28 28 29 29 #endif
+24 -25
drivers/gpu/drm/amd/amdgpu/cik_sdma.c
··· 206 206 207 207 for (i = 0; i < count; i++) 208 208 if (sdma && sdma->burst_nop && (i == 0)) 209 - amdgpu_ring_write(ring, ring->nop | 209 + amdgpu_ring_write(ring, ring->funcs->nop | 210 210 SDMA_NOP_COUNT(count - 1)); 211 211 else 212 - amdgpu_ring_write(ring, ring->nop); 212 + amdgpu_ring_write(ring, ring->funcs->nop); 213 213 } 214 214 215 215 /** ··· 848 848 amdgpu_ring_write(ring, (0xfff << 16) | 10); /* retry count, poll interval */ 849 849 } 850 850 851 - static unsigned cik_sdma_ring_get_emit_ib_size(struct amdgpu_ring *ring) 852 - { 853 - return 854 - 7 + 4; /* cik_sdma_ring_emit_ib */ 855 - } 856 - 857 - static unsigned cik_sdma_ring_get_dma_frame_size(struct amdgpu_ring *ring) 858 - { 859 - return 860 - 6 + /* cik_sdma_ring_emit_hdp_flush */ 861 - 3 + /* cik_sdma_ring_emit_hdp_invalidate */ 862 - 6 + /* cik_sdma_ring_emit_pipeline_sync */ 863 - 12 + /* cik_sdma_ring_emit_vm_flush */ 864 - 9 + 9 + 9; /* cik_sdma_ring_emit_fence x3 for user fence, vm fence */ 865 - } 866 - 867 851 static void cik_enable_sdma_mgcg(struct amdgpu_device *adev, 868 852 bool enable) 869 853 { ··· 943 959 ring->ring_obj = NULL; 944 960 sprintf(ring->name, "sdma%d", i); 945 961 r = amdgpu_ring_init(adev, ring, 1024, 946 - SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 0xf, 947 962 &adev->sdma.trap_irq, 948 963 (i == 0) ? 949 - AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1, 950 - AMDGPU_RING_TYPE_SDMA); 964 + AMDGPU_SDMA_IRQ_TRAP0 : 965 + AMDGPU_SDMA_IRQ_TRAP1); 951 966 if (r) 952 967 return r; 953 968 } ··· 1190 1207 return 0; 1191 1208 } 1192 1209 1193 - const struct amd_ip_funcs cik_sdma_ip_funcs = { 1210 + static const struct amd_ip_funcs cik_sdma_ip_funcs = { 1194 1211 .name = "cik_sdma", 1195 1212 .early_init = cik_sdma_early_init, 1196 1213 .late_init = NULL, ··· 1208 1225 }; 1209 1226 1210 1227 static const struct amdgpu_ring_funcs cik_sdma_ring_funcs = { 1228 + .type = AMDGPU_RING_TYPE_SDMA, 1229 + .align_mask = 0xf, 1230 + .nop = SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0), 1211 1231 .get_rptr = cik_sdma_ring_get_rptr, 1212 1232 .get_wptr = cik_sdma_ring_get_wptr, 1213 1233 .set_wptr = cik_sdma_ring_set_wptr, 1214 - .parse_cs = NULL, 1234 + .emit_frame_size = 1235 + 6 + /* cik_sdma_ring_emit_hdp_flush */ 1236 + 3 + /* cik_sdma_ring_emit_hdp_invalidate */ 1237 + 6 + /* cik_sdma_ring_emit_pipeline_sync */ 1238 + 12 + /* cik_sdma_ring_emit_vm_flush */ 1239 + 9 + 9 + 9, /* cik_sdma_ring_emit_fence x3 for user fence, vm fence */ 1240 + .emit_ib_size = 7 + 4, /* cik_sdma_ring_emit_ib */ 1215 1241 .emit_ib = cik_sdma_ring_emit_ib, 1216 1242 .emit_fence = cik_sdma_ring_emit_fence, 1217 1243 .emit_pipeline_sync = cik_sdma_ring_emit_pipeline_sync, ··· 1231 1239 .test_ib = cik_sdma_ring_test_ib, 1232 1240 .insert_nop = cik_sdma_ring_insert_nop, 1233 1241 .pad_ib = cik_sdma_ring_pad_ib, 1234 - .get_emit_ib_size = cik_sdma_ring_get_emit_ib_size, 1235 - .get_dma_frame_size = cik_sdma_ring_get_dma_frame_size, 1236 1242 }; 1237 1243 1238 1244 static void cik_sdma_set_ring_funcs(struct amdgpu_device *adev) ··· 1342 1352 adev->vm_manager.vm_pte_num_rings = adev->sdma.num_instances; 1343 1353 } 1344 1354 } 1355 + 1356 + const struct amdgpu_ip_block_version cik_sdma_ip_block = 1357 + { 1358 + .type = AMD_IP_BLOCK_TYPE_SDMA, 1359 + .major = 2, 1360 + .minor = 0, 1361 + .rev = 0, 1362 + .funcs = &cik_sdma_ip_funcs, 1363 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/cik_sdma.h
··· 24 24 #ifndef __CIK_SDMA_H__ 25 25 #define __CIK_SDMA_H__ 26 26 27 - extern const struct amd_ip_funcs cik_sdma_ip_funcs; 27 + extern const struct amdgpu_ip_block_version cik_sdma_ip_block; 28 28 29 29 #endif
+8
drivers/gpu/drm/amd/amdgpu/cikd.h
··· 43 43 #define CRTC4_REGISTER_OFFSET (0x477c - 0x1b7c) 44 44 #define CRTC5_REGISTER_OFFSET (0x4a7c - 0x1b7c) 45 45 46 + /* hpd instance offsets */ 47 + #define HPD0_REGISTER_OFFSET (0x1807 - 0x1807) 48 + #define HPD1_REGISTER_OFFSET (0x180a - 0x1807) 49 + #define HPD2_REGISTER_OFFSET (0x180d - 0x1807) 50 + #define HPD3_REGISTER_OFFSET (0x1810 - 0x1807) 51 + #define HPD4_REGISTER_OFFSET (0x1813 - 0x1807) 52 + #define HPD5_REGISTER_OFFSET (0x1816 - 0x1807) 53 + 46 54 #define BONAIRE_GB_ADDR_CONFIG_GOLDEN 0x12010001 47 55 #define HAWAII_GB_ADDR_CONFIG_GOLDEN 0x12011003 48 56
+26 -2
drivers/gpu/drm/amd/amdgpu/cz_dpm.c
··· 1250 1250 1251 1251 pi->current_ps = *ps; 1252 1252 pi->current_rps = *rps; 1253 - pi->current_rps.ps_priv = ps; 1253 + pi->current_rps.ps_priv = &pi->current_ps; 1254 + adev->pm.dpm.current_ps = &pi->current_rps; 1254 1255 1255 1256 } 1256 1257 ··· 1263 1262 1264 1263 pi->requested_ps = *ps; 1265 1264 pi->requested_rps = *rps; 1266 - pi->requested_rps.ps_priv = ps; 1265 + pi->requested_rps.ps_priv = &pi->requested_ps; 1266 + adev->pm.dpm.requested_ps = &pi->requested_rps; 1267 1267 1268 1268 } 1269 1269 ··· 2259 2257 } 2260 2258 } 2261 2259 2260 + static int cz_check_state_equal(struct amdgpu_device *adev, 2261 + struct amdgpu_ps *cps, 2262 + struct amdgpu_ps *rps, 2263 + bool *equal) 2264 + { 2265 + if (equal == NULL) 2266 + return -EINVAL; 2267 + 2268 + *equal = false; 2269 + return 0; 2270 + } 2271 + 2262 2272 const struct amd_ip_funcs cz_dpm_ip_funcs = { 2263 2273 .name = "cz_dpm", 2264 2274 .early_init = cz_dpm_early_init, ··· 2303 2289 .vblank_too_short = NULL, 2304 2290 .powergate_uvd = cz_dpm_powergate_uvd, 2305 2291 .powergate_vce = cz_dpm_powergate_vce, 2292 + .check_state_equal = cz_check_state_equal, 2306 2293 }; 2307 2294 2308 2295 static void cz_dpm_set_funcs(struct amdgpu_device *adev) ··· 2311 2296 if (NULL == adev->pm.funcs) 2312 2297 adev->pm.funcs = &cz_dpm_funcs; 2313 2298 } 2299 + 2300 + const struct amdgpu_ip_block_version cz_dpm_ip_block = 2301 + { 2302 + .type = AMD_IP_BLOCK_TYPE_SMC, 2303 + .major = 8, 2304 + .minor = 0, 2305 + .rev = 0, 2306 + .funcs = &cz_dpm_ip_funcs, 2307 + };
+9 -1
drivers/gpu/drm/amd/amdgpu/cz_ih.c
··· 394 394 return 0; 395 395 } 396 396 397 - const struct amd_ip_funcs cz_ih_ip_funcs = { 397 + static const struct amd_ip_funcs cz_ih_ip_funcs = { 398 398 .name = "cz_ih", 399 399 .early_init = cz_ih_early_init, 400 400 .late_init = NULL, ··· 423 423 adev->irq.ih_funcs = &cz_ih_funcs; 424 424 } 425 425 426 + const struct amdgpu_ip_block_version cz_ih_ip_block = 427 + { 428 + .type = AMD_IP_BLOCK_TYPE_IH, 429 + .major = 3, 430 + .minor = 0, 431 + .rev = 0, 432 + .funcs = &cz_ih_ip_funcs, 433 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/cz_ih.h
··· 24 24 #ifndef __CZ_IH_H__ 25 25 #define __CZ_IH_H__ 26 26 27 - extern const struct amd_ip_funcs cz_ih_ip_funcs; 27 + extern const struct amdgpu_ip_block_version cz_ih_ip_block; 28 28 29 29 #endif /* __CZ_IH_H__ */
+35 -100
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
··· 31 31 #include "atombios_encoders.h" 32 32 #include "amdgpu_pll.h" 33 33 #include "amdgpu_connectors.h" 34 + #include "dce_v10_0.h" 34 35 35 36 #include "dce/dce_10_0_d.h" 36 37 #include "dce/dce_10_0_sh_mask.h" ··· 331 330 static bool dce_v10_0_hpd_sense(struct amdgpu_device *adev, 332 331 enum amdgpu_hpd_id hpd) 333 332 { 334 - int idx; 335 333 bool connected = false; 336 334 337 - switch (hpd) { 338 - case AMDGPU_HPD_1: 339 - idx = 0; 340 - break; 341 - case AMDGPU_HPD_2: 342 - idx = 1; 343 - break; 344 - case AMDGPU_HPD_3: 345 - idx = 2; 346 - break; 347 - case AMDGPU_HPD_4: 348 - idx = 3; 349 - break; 350 - case AMDGPU_HPD_5: 351 - idx = 4; 352 - break; 353 - case AMDGPU_HPD_6: 354 - idx = 5; 355 - break; 356 - default: 335 + if (hpd >= adev->mode_info.num_hpd) 357 336 return connected; 358 - } 359 337 360 - if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[idx]) & 338 + if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[hpd]) & 361 339 DC_HPD_INT_STATUS__DC_HPD_SENSE_MASK) 362 340 connected = true; 363 341 ··· 356 376 { 357 377 u32 tmp; 358 378 bool connected = dce_v10_0_hpd_sense(adev, hpd); 359 - int idx; 360 379 361 - switch (hpd) { 362 - case AMDGPU_HPD_1: 363 - idx = 0; 364 - break; 365 - case AMDGPU_HPD_2: 366 - idx = 1; 367 - break; 368 - case AMDGPU_HPD_3: 369 - idx = 2; 370 - break; 371 - case AMDGPU_HPD_4: 372 - idx = 3; 373 - break; 374 - case AMDGPU_HPD_5: 375 - idx = 4; 376 - break; 377 - case AMDGPU_HPD_6: 378 - idx = 5; 379 - break; 380 - default: 380 + if (hpd >= adev->mode_info.num_hpd) 381 381 return; 382 - } 383 382 384 - tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); 383 + tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]); 385 384 if (connected) 386 385 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 0); 387 386 else 388 387 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 1); 389 - WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); 388 + WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp); 390 389 } 391 390 392 391 /** ··· 381 422 struct drm_device *dev = adev->ddev; 382 423 struct drm_connector *connector; 383 424 u32 tmp; 384 - int idx; 385 425 386 426 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 387 427 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 388 428 389 - switch (amdgpu_connector->hpd.hpd) { 390 - case AMDGPU_HPD_1: 391 - idx = 0; 392 - break; 393 - case AMDGPU_HPD_2: 394 - idx = 1; 395 - break; 396 - case AMDGPU_HPD_3: 397 - idx = 2; 398 - break; 399 - case AMDGPU_HPD_4: 400 - idx = 3; 401 - break; 402 - case AMDGPU_HPD_5: 403 - idx = 4; 404 - break; 405 - case AMDGPU_HPD_6: 406 - idx = 5; 407 - break; 408 - default: 429 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 409 430 continue; 410 - } 411 431 412 432 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 413 433 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { ··· 395 457 * https://bugzilla.redhat.com/show_bug.cgi?id=726143 396 458 * also avoid interrupt storms during dpms. 397 459 */ 398 - tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); 460 + tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 399 461 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0); 400 - WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); 462 + WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 401 463 continue; 402 464 } 403 465 404 - tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); 466 + tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 405 467 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); 406 - WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); 468 + WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 407 469 408 - tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx]); 470 + tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd]); 409 471 tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL, 410 472 DC_HPD_CONNECT_INT_DELAY, 411 473 AMDGPU_HPD_CONNECT_INT_DELAY_IN_MS); 412 474 tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL, 413 475 DC_HPD_DISCONNECT_INT_DELAY, 414 476 AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS); 415 - WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx], tmp); 477 + WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 416 478 417 479 dce_v10_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); 418 480 amdgpu_irq_get(adev, &adev->hpd_irq, ··· 433 495 struct drm_device *dev = adev->ddev; 434 496 struct drm_connector *connector; 435 497 u32 tmp; 436 - int idx; 437 498 438 499 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 439 500 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 440 501 441 - switch (amdgpu_connector->hpd.hpd) { 442 - case AMDGPU_HPD_1: 443 - idx = 0; 444 - break; 445 - case AMDGPU_HPD_2: 446 - idx = 1; 447 - break; 448 - case AMDGPU_HPD_3: 449 - idx = 2; 450 - break; 451 - case AMDGPU_HPD_4: 452 - idx = 3; 453 - break; 454 - case AMDGPU_HPD_5: 455 - idx = 4; 456 - break; 457 - case AMDGPU_HPD_6: 458 - idx = 5; 459 - break; 460 - default: 502 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 461 503 continue; 462 - } 463 504 464 - tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); 505 + tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 465 506 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 0); 466 - WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); 507 + WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 467 508 468 509 amdgpu_irq_put(adev, &adev->hpd_irq, 469 510 amdgpu_connector->hpd.hpd); ··· 3471 3554 return 0; 3472 3555 } 3473 3556 3474 - const struct amd_ip_funcs dce_v10_0_ip_funcs = { 3557 + static const struct amd_ip_funcs dce_v10_0_ip_funcs = { 3475 3558 .name = "dce_v10_0", 3476 3559 .early_init = dce_v10_0_early_init, 3477 3560 .late_init = NULL, ··· 3802 3885 adev->hpd_irq.num_types = AMDGPU_HPD_LAST; 3803 3886 adev->hpd_irq.funcs = &dce_v10_0_hpd_irq_funcs; 3804 3887 } 3888 + 3889 + const struct amdgpu_ip_block_version dce_v10_0_ip_block = 3890 + { 3891 + .type = AMD_IP_BLOCK_TYPE_DCE, 3892 + .major = 10, 3893 + .minor = 0, 3894 + .rev = 0, 3895 + .funcs = &dce_v10_0_ip_funcs, 3896 + }; 3897 + 3898 + const struct amdgpu_ip_block_version dce_v10_1_ip_block = 3899 + { 3900 + .type = AMD_IP_BLOCK_TYPE_DCE, 3901 + .major = 10, 3902 + .minor = 1, 3903 + .rev = 0, 3904 + .funcs = &dce_v10_0_ip_funcs, 3905 + };
+3 -1
drivers/gpu/drm/amd/amdgpu/dce_v10_0.h
··· 24 24 #ifndef __DCE_V10_0_H__ 25 25 #define __DCE_V10_0_H__ 26 26 27 - extern const struct amd_ip_funcs dce_v10_0_ip_funcs; 27 + 28 + extern const struct amdgpu_ip_block_version dce_v10_0_ip_block; 29 + extern const struct amdgpu_ip_block_version dce_v10_1_ip_block; 28 30 29 31 void dce_v10_0_disable_dce(struct amdgpu_device *adev); 30 32
+35 -100
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
··· 31 31 #include "atombios_encoders.h" 32 32 #include "amdgpu_pll.h" 33 33 #include "amdgpu_connectors.h" 34 + #include "dce_v11_0.h" 34 35 35 36 #include "dce/dce_11_0_d.h" 36 37 #include "dce/dce_11_0_sh_mask.h" ··· 347 346 static bool dce_v11_0_hpd_sense(struct amdgpu_device *adev, 348 347 enum amdgpu_hpd_id hpd) 349 348 { 350 - int idx; 351 349 bool connected = false; 352 350 353 - switch (hpd) { 354 - case AMDGPU_HPD_1: 355 - idx = 0; 356 - break; 357 - case AMDGPU_HPD_2: 358 - idx = 1; 359 - break; 360 - case AMDGPU_HPD_3: 361 - idx = 2; 362 - break; 363 - case AMDGPU_HPD_4: 364 - idx = 3; 365 - break; 366 - case AMDGPU_HPD_5: 367 - idx = 4; 368 - break; 369 - case AMDGPU_HPD_6: 370 - idx = 5; 371 - break; 372 - default: 351 + if (hpd >= adev->mode_info.num_hpd) 373 352 return connected; 374 - } 375 353 376 - if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[idx]) & 354 + if (RREG32(mmDC_HPD_INT_STATUS + hpd_offsets[hpd]) & 377 355 DC_HPD_INT_STATUS__DC_HPD_SENSE_MASK) 378 356 connected = true; 379 357 ··· 372 392 { 373 393 u32 tmp; 374 394 bool connected = dce_v11_0_hpd_sense(adev, hpd); 375 - int idx; 376 395 377 - switch (hpd) { 378 - case AMDGPU_HPD_1: 379 - idx = 0; 380 - break; 381 - case AMDGPU_HPD_2: 382 - idx = 1; 383 - break; 384 - case AMDGPU_HPD_3: 385 - idx = 2; 386 - break; 387 - case AMDGPU_HPD_4: 388 - idx = 3; 389 - break; 390 - case AMDGPU_HPD_5: 391 - idx = 4; 392 - break; 393 - case AMDGPU_HPD_6: 394 - idx = 5; 395 - break; 396 - default: 396 + if (hpd >= adev->mode_info.num_hpd) 397 397 return; 398 - } 399 398 400 - tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); 399 + tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd]); 401 400 if (connected) 402 401 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 0); 403 402 else 404 403 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_POLARITY, 1); 405 - WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); 404 + WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[hpd], tmp); 406 405 } 407 406 408 407 /** ··· 397 438 struct drm_device *dev = adev->ddev; 398 439 struct drm_connector *connector; 399 440 u32 tmp; 400 - int idx; 401 441 402 442 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 403 443 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 404 444 405 - switch (amdgpu_connector->hpd.hpd) { 406 - case AMDGPU_HPD_1: 407 - idx = 0; 408 - break; 409 - case AMDGPU_HPD_2: 410 - idx = 1; 411 - break; 412 - case AMDGPU_HPD_3: 413 - idx = 2; 414 - break; 415 - case AMDGPU_HPD_4: 416 - idx = 3; 417 - break; 418 - case AMDGPU_HPD_5: 419 - idx = 4; 420 - break; 421 - case AMDGPU_HPD_6: 422 - idx = 5; 423 - break; 424 - default: 445 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 425 446 continue; 426 - } 427 447 428 448 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 429 449 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { ··· 411 473 * https://bugzilla.redhat.com/show_bug.cgi?id=726143 412 474 * also avoid interrupt storms during dpms. 413 475 */ 414 - tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx]); 476 + tmp = RREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 415 477 tmp = REG_SET_FIELD(tmp, DC_HPD_INT_CONTROL, DC_HPD_INT_EN, 0); 416 - WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[idx], tmp); 478 + WREG32(mmDC_HPD_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 417 479 continue; 418 480 } 419 481 420 - tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); 482 + tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 421 483 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 1); 422 - WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); 484 + WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 423 485 424 - tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx]); 486 + tmp = RREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd]); 425 487 tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL, 426 488 DC_HPD_CONNECT_INT_DELAY, 427 489 AMDGPU_HPD_CONNECT_INT_DELAY_IN_MS); 428 490 tmp = REG_SET_FIELD(tmp, DC_HPD_TOGGLE_FILT_CNTL, 429 491 DC_HPD_DISCONNECT_INT_DELAY, 430 492 AMDGPU_HPD_DISCONNECT_INT_DELAY_IN_MS); 431 - WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[idx], tmp); 493 + WREG32(mmDC_HPD_TOGGLE_FILT_CNTL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 432 494 433 495 dce_v11_0_hpd_set_polarity(adev, amdgpu_connector->hpd.hpd); 434 496 amdgpu_irq_get(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); ··· 448 510 struct drm_device *dev = adev->ddev; 449 511 struct drm_connector *connector; 450 512 u32 tmp; 451 - int idx; 452 513 453 514 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 454 515 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 455 516 456 - switch (amdgpu_connector->hpd.hpd) { 457 - case AMDGPU_HPD_1: 458 - idx = 0; 459 - break; 460 - case AMDGPU_HPD_2: 461 - idx = 1; 462 - break; 463 - case AMDGPU_HPD_3: 464 - idx = 2; 465 - break; 466 - case AMDGPU_HPD_4: 467 - idx = 3; 468 - break; 469 - case AMDGPU_HPD_5: 470 - idx = 4; 471 - break; 472 - case AMDGPU_HPD_6: 473 - idx = 5; 474 - break; 475 - default: 517 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 476 518 continue; 477 - } 478 519 479 - tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[idx]); 520 + tmp = RREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 480 521 tmp = REG_SET_FIELD(tmp, DC_HPD_CONTROL, DC_HPD_EN, 0); 481 - WREG32(mmDC_HPD_CONTROL + hpd_offsets[idx], tmp); 522 + WREG32(mmDC_HPD_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 482 523 483 524 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 484 525 } ··· 3528 3611 return 0; 3529 3612 } 3530 3613 3531 - const struct amd_ip_funcs dce_v11_0_ip_funcs = { 3614 + static const struct amd_ip_funcs dce_v11_0_ip_funcs = { 3532 3615 .name = "dce_v11_0", 3533 3616 .early_init = dce_v11_0_early_init, 3534 3617 .late_init = NULL, ··· 3858 3941 adev->hpd_irq.num_types = AMDGPU_HPD_LAST; 3859 3942 adev->hpd_irq.funcs = &dce_v11_0_hpd_irq_funcs; 3860 3943 } 3944 + 3945 + const struct amdgpu_ip_block_version dce_v11_0_ip_block = 3946 + { 3947 + .type = AMD_IP_BLOCK_TYPE_DCE, 3948 + .major = 11, 3949 + .minor = 0, 3950 + .rev = 0, 3951 + .funcs = &dce_v11_0_ip_funcs, 3952 + }; 3953 + 3954 + const struct amdgpu_ip_block_version dce_v11_2_ip_block = 3955 + { 3956 + .type = AMD_IP_BLOCK_TYPE_DCE, 3957 + .major = 11, 3958 + .minor = 2, 3959 + .rev = 0, 3960 + .funcs = &dce_v11_0_ip_funcs, 3961 + };
+2 -1
drivers/gpu/drm/amd/amdgpu/dce_v11_0.h
··· 24 24 #ifndef __DCE_V11_0_H__ 25 25 #define __DCE_V11_0_H__ 26 26 27 - extern const struct amd_ip_funcs dce_v11_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version dce_v11_0_ip_block; 28 + extern const struct amdgpu_ip_block_version dce_v11_2_ip_block; 28 29 29 30 void dce_v11_0_disable_dce(struct amdgpu_device *adev); 30 31
+118 -199
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
··· 46 46 SI_CRTC5_REGISTER_OFFSET 47 47 }; 48 48 49 + static const u32 hpd_offsets[] = 50 + { 51 + DC_HPD1_INT_STATUS - DC_HPD1_INT_STATUS, 52 + DC_HPD2_INT_STATUS - DC_HPD1_INT_STATUS, 53 + DC_HPD3_INT_STATUS - DC_HPD1_INT_STATUS, 54 + DC_HPD4_INT_STATUS - DC_HPD1_INT_STATUS, 55 + DC_HPD5_INT_STATUS - DC_HPD1_INT_STATUS, 56 + DC_HPD6_INT_STATUS - DC_HPD1_INT_STATUS, 57 + }; 58 + 49 59 static const uint32_t dig_offsets[] = { 50 60 SI_CRTC0_REGISTER_OFFSET, 51 61 SI_CRTC1_REGISTER_OFFSET, ··· 103 93 .vline = DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VLINE_INTERRUPT_MASK, 104 94 .hpd = DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK 105 95 } }; 106 - 107 - static const uint32_t hpd_int_control_offsets[6] = { 108 - DC_HPD1_INT_CONTROL, 109 - DC_HPD2_INT_CONTROL, 110 - DC_HPD3_INT_CONTROL, 111 - DC_HPD4_INT_CONTROL, 112 - DC_HPD5_INT_CONTROL, 113 - DC_HPD6_INT_CONTROL, 114 - }; 115 96 116 97 static u32 dce_v6_0_audio_endpt_rreg(struct amdgpu_device *adev, 117 98 u32 block_offset, u32 reg) ··· 258 257 { 259 258 bool connected = false; 260 259 261 - switch (hpd) { 262 - case AMDGPU_HPD_1: 263 - if (RREG32(DC_HPD1_INT_STATUS) & DC_HPDx_SENSE) 264 - connected = true; 265 - break; 266 - case AMDGPU_HPD_2: 267 - if (RREG32(DC_HPD2_INT_STATUS) & DC_HPDx_SENSE) 268 - connected = true; 269 - break; 270 - case AMDGPU_HPD_3: 271 - if (RREG32(DC_HPD3_INT_STATUS) & DC_HPDx_SENSE) 272 - connected = true; 273 - break; 274 - case AMDGPU_HPD_4: 275 - if (RREG32(DC_HPD4_INT_STATUS) & DC_HPDx_SENSE) 276 - connected = true; 277 - break; 278 - case AMDGPU_HPD_5: 279 - if (RREG32(DC_HPD5_INT_STATUS) & DC_HPDx_SENSE) 280 - connected = true; 281 - break; 282 - case AMDGPU_HPD_6: 283 - if (RREG32(DC_HPD6_INT_STATUS) & DC_HPDx_SENSE) 284 - connected = true; 285 - break; 286 - default: 287 - break; 288 - } 260 + if (hpd >= adev->mode_info.num_hpd) 261 + return connected; 262 + 263 + if (RREG32(DC_HPD1_INT_STATUS + hpd_offsets[hpd]) & DC_HPDx_SENSE) 264 + connected = true; 289 265 290 266 return connected; 291 267 } ··· 281 303 u32 tmp; 282 304 bool connected = dce_v6_0_hpd_sense(adev, hpd); 283 305 284 - switch (hpd) { 285 - case AMDGPU_HPD_1: 286 - tmp = RREG32(DC_HPD1_INT_CONTROL); 287 - if (connected) 288 - tmp &= ~DC_HPDx_INT_POLARITY; 289 - else 290 - tmp |= DC_HPDx_INT_POLARITY; 291 - WREG32(DC_HPD1_INT_CONTROL, tmp); 292 - break; 293 - case AMDGPU_HPD_2: 294 - tmp = RREG32(DC_HPD2_INT_CONTROL); 295 - if (connected) 296 - tmp &= ~DC_HPDx_INT_POLARITY; 297 - else 298 - tmp |= DC_HPDx_INT_POLARITY; 299 - WREG32(DC_HPD2_INT_CONTROL, tmp); 300 - break; 301 - case AMDGPU_HPD_3: 302 - tmp = RREG32(DC_HPD3_INT_CONTROL); 303 - if (connected) 304 - tmp &= ~DC_HPDx_INT_POLARITY; 305 - else 306 - tmp |= DC_HPDx_INT_POLARITY; 307 - WREG32(DC_HPD3_INT_CONTROL, tmp); 308 - break; 309 - case AMDGPU_HPD_4: 310 - tmp = RREG32(DC_HPD4_INT_CONTROL); 311 - if (connected) 312 - tmp &= ~DC_HPDx_INT_POLARITY; 313 - else 314 - tmp |= DC_HPDx_INT_POLARITY; 315 - WREG32(DC_HPD4_INT_CONTROL, tmp); 316 - break; 317 - case AMDGPU_HPD_5: 318 - tmp = RREG32(DC_HPD5_INT_CONTROL); 319 - if (connected) 320 - tmp &= ~DC_HPDx_INT_POLARITY; 321 - else 322 - tmp |= DC_HPDx_INT_POLARITY; 323 - WREG32(DC_HPD5_INT_CONTROL, tmp); 324 - break; 325 - case AMDGPU_HPD_6: 326 - tmp = RREG32(DC_HPD6_INT_CONTROL); 327 - if (connected) 328 - tmp &= ~DC_HPDx_INT_POLARITY; 329 - else 330 - tmp |= DC_HPDx_INT_POLARITY; 331 - WREG32(DC_HPD6_INT_CONTROL, tmp); 332 - break; 333 - default: 334 - break; 335 - } 306 + if (hpd >= adev->mode_info.num_hpd) 307 + return; 308 + 309 + tmp = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd]); 310 + if (connected) 311 + tmp &= ~DC_HPDx_INT_POLARITY; 312 + else 313 + tmp |= DC_HPDx_INT_POLARITY; 314 + WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); 336 315 } 337 316 338 317 /** ··· 304 369 { 305 370 struct drm_device *dev = adev->ddev; 306 371 struct drm_connector *connector; 307 - u32 tmp = DC_HPDx_CONNECTION_TIMER(0x9c4) | 308 - DC_HPDx_RX_INT_TIMER(0xfa) | DC_HPDx_EN; 372 + u32 tmp; 309 373 310 374 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 311 375 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 312 376 313 - switch (amdgpu_connector->hpd.hpd) { 314 - case AMDGPU_HPD_1: 315 - WREG32(DC_HPD1_CONTROL, tmp); 316 - break; 317 - case AMDGPU_HPD_2: 318 - WREG32(DC_HPD2_CONTROL, tmp); 319 - break; 320 - case AMDGPU_HPD_3: 321 - WREG32(DC_HPD3_CONTROL, tmp); 322 - break; 323 - case AMDGPU_HPD_4: 324 - WREG32(DC_HPD4_CONTROL, tmp); 325 - break; 326 - case AMDGPU_HPD_5: 327 - WREG32(DC_HPD5_CONTROL, tmp); 328 - break; 329 - case AMDGPU_HPD_6: 330 - WREG32(DC_HPD6_CONTROL, tmp); 331 - break; 332 - default: 333 - break; 334 - } 377 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 378 + continue; 379 + 380 + tmp = RREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 381 + tmp |= DC_HPDx_EN; 382 + WREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 335 383 336 384 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 337 385 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { ··· 323 405 * https://bugzilla.redhat.com/show_bug.cgi?id=726143 324 406 * also avoid interrupt storms during dpms. 325 407 */ 326 - u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; 327 - 328 - switch (amdgpu_connector->hpd.hpd) { 329 - case AMDGPU_HPD_1: 330 - dc_hpd_int_cntl_reg = DC_HPD1_INT_CONTROL; 331 - break; 332 - case AMDGPU_HPD_2: 333 - dc_hpd_int_cntl_reg = DC_HPD2_INT_CONTROL; 334 - break; 335 - case AMDGPU_HPD_3: 336 - dc_hpd_int_cntl_reg = DC_HPD3_INT_CONTROL; 337 - break; 338 - case AMDGPU_HPD_4: 339 - dc_hpd_int_cntl_reg = DC_HPD4_INT_CONTROL; 340 - break; 341 - case AMDGPU_HPD_5: 342 - dc_hpd_int_cntl_reg = DC_HPD5_INT_CONTROL; 343 - break; 344 - case AMDGPU_HPD_6: 345 - dc_hpd_int_cntl_reg = DC_HPD6_INT_CONTROL; 346 - break; 347 - default: 348 - continue; 349 - } 350 - 351 - dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 352 - dc_hpd_int_cntl &= ~DC_HPDx_INT_EN; 353 - WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 408 + tmp = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 409 + tmp &= ~DC_HPDx_INT_EN; 410 + WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 354 411 continue; 355 412 } 356 413 ··· 347 454 { 348 455 struct drm_device *dev = adev->ddev; 349 456 struct drm_connector *connector; 457 + u32 tmp; 350 458 351 459 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 352 460 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 353 461 354 - switch (amdgpu_connector->hpd.hpd) { 355 - case AMDGPU_HPD_1: 356 - WREG32(DC_HPD1_CONTROL, 0); 357 - break; 358 - case AMDGPU_HPD_2: 359 - WREG32(DC_HPD2_CONTROL, 0); 360 - break; 361 - case AMDGPU_HPD_3: 362 - WREG32(DC_HPD3_CONTROL, 0); 363 - break; 364 - case AMDGPU_HPD_4: 365 - WREG32(DC_HPD4_CONTROL, 0); 366 - break; 367 - case AMDGPU_HPD_5: 368 - WREG32(DC_HPD5_CONTROL, 0); 369 - break; 370 - case AMDGPU_HPD_6: 371 - WREG32(DC_HPD6_CONTROL, 0); 372 - break; 373 - default: 374 - break; 375 - } 462 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 463 + continue; 464 + 465 + tmp = RREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 466 + tmp &= ~DC_HPDx_EN; 467 + WREG32(DC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], 0); 468 + 376 469 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 377 470 } 378 471 } ··· 490 611 static void dce_v6_0_set_vga_render_state(struct amdgpu_device *adev, 491 612 bool render) 492 613 { 493 - if (!render) 614 + if (!render) 494 615 WREG32(R_000300_VGA_RENDER_CONTROL, 495 616 RREG32(R_000300_VGA_RENDER_CONTROL) & C_000300_VGA_VSTATUS_CNTL); 496 617 618 + } 619 + 620 + static int dce_v6_0_get_num_crtc(struct amdgpu_device *adev) 621 + { 622 + int num_crtc = 0; 623 + 624 + switch (adev->asic_type) { 625 + case CHIP_TAHITI: 626 + case CHIP_PITCAIRN: 627 + case CHIP_VERDE: 628 + num_crtc = 6; 629 + break; 630 + case CHIP_OLAND: 631 + num_crtc = 2; 632 + break; 633 + default: 634 + num_crtc = 0; 635 + } 636 + return num_crtc; 637 + } 638 + 639 + void dce_v6_0_disable_dce(struct amdgpu_device *adev) 640 + { 641 + /*Disable VGA render and enabled crtc, if has DCE engine*/ 642 + if (amdgpu_atombios_has_dce_engine_info(adev)) { 643 + u32 tmp; 644 + int crtc_enabled, i; 645 + 646 + dce_v6_0_set_vga_render_state(adev, false); 647 + 648 + /*Disable crtc*/ 649 + for (i = 0; i < dce_v6_0_get_num_crtc(adev); i++) { 650 + crtc_enabled = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]) & 651 + EVERGREEN_CRTC_MASTER_EN; 652 + if (crtc_enabled) { 653 + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 1); 654 + tmp = RREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i]); 655 + tmp &= ~EVERGREEN_CRTC_MASTER_EN; 656 + WREG32(EVERGREEN_CRTC_CONTROL + crtc_offsets[i], tmp); 657 + WREG32(EVERGREEN_CRTC_UPDATE_LOCK + crtc_offsets[i], 0); 658 + } 659 + } 660 + } 497 661 } 498 662 499 663 static void dce_v6_0_program_fmt(struct drm_encoder *encoder) ··· 2260 2338 dce_v6_0_set_display_funcs(adev); 2261 2339 dce_v6_0_set_irq_funcs(adev); 2262 2340 2341 + adev->mode_info.num_crtc = dce_v6_0_get_num_crtc(adev); 2342 + 2263 2343 switch (adev->asic_type) { 2264 2344 case CHIP_TAHITI: 2265 2345 case CHIP_PITCAIRN: 2266 2346 case CHIP_VERDE: 2267 - adev->mode_info.num_crtc = 6; 2268 2347 adev->mode_info.num_hpd = 6; 2269 2348 adev->mode_info.num_dig = 6; 2270 2349 break; 2271 2350 case CHIP_OLAND: 2272 - adev->mode_info.num_crtc = 2; 2273 2351 adev->mode_info.num_hpd = 2; 2274 2352 adev->mode_info.num_dig = 2; 2275 2353 break; 2276 2354 default: 2277 - /* FIXME: not supported yet */ 2278 2355 return -EINVAL; 2279 2356 } 2280 2357 ··· 2509 2588 unsigned type, 2510 2589 enum amdgpu_interrupt_state state) 2511 2590 { 2512 - u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; 2591 + u32 dc_hpd_int_cntl; 2513 2592 2514 - switch (type) { 2515 - case AMDGPU_HPD_1: 2516 - dc_hpd_int_cntl_reg = DC_HPD1_INT_CONTROL; 2517 - break; 2518 - case AMDGPU_HPD_2: 2519 - dc_hpd_int_cntl_reg = DC_HPD2_INT_CONTROL; 2520 - break; 2521 - case AMDGPU_HPD_3: 2522 - dc_hpd_int_cntl_reg = DC_HPD3_INT_CONTROL; 2523 - break; 2524 - case AMDGPU_HPD_4: 2525 - dc_hpd_int_cntl_reg = DC_HPD4_INT_CONTROL; 2526 - break; 2527 - case AMDGPU_HPD_5: 2528 - dc_hpd_int_cntl_reg = DC_HPD5_INT_CONTROL; 2529 - break; 2530 - case AMDGPU_HPD_6: 2531 - dc_hpd_int_cntl_reg = DC_HPD6_INT_CONTROL; 2532 - break; 2533 - default: 2593 + if (type >= adev->mode_info.num_hpd) { 2534 2594 DRM_DEBUG("invalid hdp %d\n", type); 2535 2595 return 0; 2536 2596 } 2537 2597 2538 2598 switch (state) { 2539 2599 case AMDGPU_IRQ_STATE_DISABLE: 2540 - dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 2541 - dc_hpd_int_cntl &= ~(DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); 2542 - WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 2600 + dc_hpd_int_cntl = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type]); 2601 + dc_hpd_int_cntl &= ~DC_HPDx_INT_EN; 2602 + WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type], dc_hpd_int_cntl); 2543 2603 break; 2544 2604 case AMDGPU_IRQ_STATE_ENABLE: 2545 - dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 2546 - dc_hpd_int_cntl |= (DC_HPDx_INT_EN | DC_HPDx_RX_INT_EN); 2547 - WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 2605 + dc_hpd_int_cntl = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type]); 2606 + dc_hpd_int_cntl |= DC_HPDx_INT_EN; 2607 + WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[type], dc_hpd_int_cntl); 2548 2608 break; 2549 2609 default: 2550 2610 break; ··· 2698 2796 struct amdgpu_irq_src *source, 2699 2797 struct amdgpu_iv_entry *entry) 2700 2798 { 2701 - uint32_t disp_int, mask, int_control, tmp; 2799 + uint32_t disp_int, mask, tmp; 2702 2800 unsigned hpd; 2703 2801 2704 2802 if (entry->src_data >= adev->mode_info.num_hpd) { ··· 2709 2807 hpd = entry->src_data; 2710 2808 disp_int = RREG32(interrupt_status_offsets[hpd].reg); 2711 2809 mask = interrupt_status_offsets[hpd].hpd; 2712 - int_control = hpd_int_control_offsets[hpd]; 2713 2810 2714 2811 if (disp_int & mask) { 2715 - tmp = RREG32(int_control); 2812 + tmp = RREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd]); 2716 2813 tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK; 2717 - WREG32(int_control, tmp); 2814 + WREG32(DC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); 2718 2815 schedule_work(&adev->hotplug_work); 2719 2816 DRM_INFO("IH: HPD%d\n", hpd + 1); 2720 2817 } ··· 2734 2833 return 0; 2735 2834 } 2736 2835 2737 - const struct amd_ip_funcs dce_v6_0_ip_funcs = { 2836 + static const struct amd_ip_funcs dce_v6_0_ip_funcs = { 2738 2837 .name = "dce_v6_0", 2739 2838 .early_init = dce_v6_0_early_init, 2740 2839 .late_init = NULL, ··· 3075 3174 adev->hpd_irq.num_types = AMDGPU_HPD_LAST; 3076 3175 adev->hpd_irq.funcs = &dce_v6_0_hpd_irq_funcs; 3077 3176 } 3177 + 3178 + const struct amdgpu_ip_block_version dce_v6_0_ip_block = 3179 + { 3180 + .type = AMD_IP_BLOCK_TYPE_DCE, 3181 + .major = 6, 3182 + .minor = 0, 3183 + .rev = 0, 3184 + .funcs = &dce_v6_0_ip_funcs, 3185 + }; 3186 + 3187 + const struct amdgpu_ip_block_version dce_v6_4_ip_block = 3188 + { 3189 + .type = AMD_IP_BLOCK_TYPE_DCE, 3190 + .major = 6, 3191 + .minor = 4, 3192 + .rev = 0, 3193 + .funcs = &dce_v6_0_ip_funcs, 3194 + };
+4 -1
drivers/gpu/drm/amd/amdgpu/dce_v6_0.h
··· 24 24 #ifndef __DCE_V6_0_H__ 25 25 #define __DCE_V6_0_H__ 26 26 27 - extern const struct amd_ip_funcs dce_v6_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version dce_v6_0_ip_block; 28 + extern const struct amdgpu_ip_block_version dce_v6_4_ip_block; 29 + 30 + void dce_v6_0_disable_dce(struct amdgpu_device *adev); 28 31 29 32 #endif
+99 -194
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
··· 31 31 #include "atombios_encoders.h" 32 32 #include "amdgpu_pll.h" 33 33 #include "amdgpu_connectors.h" 34 + #include "dce_v8_0.h" 34 35 35 36 #include "dce/dce_8_0_d.h" 36 37 #include "dce/dce_8_0_sh_mask.h" ··· 55 54 CRTC3_REGISTER_OFFSET, 56 55 CRTC4_REGISTER_OFFSET, 57 56 CRTC5_REGISTER_OFFSET 57 + }; 58 + 59 + static const u32 hpd_offsets[] = 60 + { 61 + HPD0_REGISTER_OFFSET, 62 + HPD1_REGISTER_OFFSET, 63 + HPD2_REGISTER_OFFSET, 64 + HPD3_REGISTER_OFFSET, 65 + HPD4_REGISTER_OFFSET, 66 + HPD5_REGISTER_OFFSET 58 67 }; 59 68 60 69 static const uint32_t dig_offsets[] = { ··· 114 103 .vline = DISP_INTERRUPT_STATUS_CONTINUE5__LB_D6_VLINE_INTERRUPT_MASK, 115 104 .hpd = DISP_INTERRUPT_STATUS_CONTINUE5__DC_HPD6_INTERRUPT_MASK 116 105 } }; 117 - 118 - static const uint32_t hpd_int_control_offsets[6] = { 119 - mmDC_HPD1_INT_CONTROL, 120 - mmDC_HPD2_INT_CONTROL, 121 - mmDC_HPD3_INT_CONTROL, 122 - mmDC_HPD4_INT_CONTROL, 123 - mmDC_HPD5_INT_CONTROL, 124 - mmDC_HPD6_INT_CONTROL, 125 - }; 126 106 127 107 static u32 dce_v8_0_audio_endpt_rreg(struct amdgpu_device *adev, 128 108 u32 block_offset, u32 reg) ··· 280 278 { 281 279 bool connected = false; 282 280 283 - switch (hpd) { 284 - case AMDGPU_HPD_1: 285 - if (RREG32(mmDC_HPD1_INT_STATUS) & DC_HPD1_INT_STATUS__DC_HPD1_SENSE_MASK) 286 - connected = true; 287 - break; 288 - case AMDGPU_HPD_2: 289 - if (RREG32(mmDC_HPD2_INT_STATUS) & DC_HPD2_INT_STATUS__DC_HPD2_SENSE_MASK) 290 - connected = true; 291 - break; 292 - case AMDGPU_HPD_3: 293 - if (RREG32(mmDC_HPD3_INT_STATUS) & DC_HPD3_INT_STATUS__DC_HPD3_SENSE_MASK) 294 - connected = true; 295 - break; 296 - case AMDGPU_HPD_4: 297 - if (RREG32(mmDC_HPD4_INT_STATUS) & DC_HPD4_INT_STATUS__DC_HPD4_SENSE_MASK) 298 - connected = true; 299 - break; 300 - case AMDGPU_HPD_5: 301 - if (RREG32(mmDC_HPD5_INT_STATUS) & DC_HPD5_INT_STATUS__DC_HPD5_SENSE_MASK) 302 - connected = true; 303 - break; 304 - case AMDGPU_HPD_6: 305 - if (RREG32(mmDC_HPD6_INT_STATUS) & DC_HPD6_INT_STATUS__DC_HPD6_SENSE_MASK) 306 - connected = true; 307 - break; 308 - default: 309 - break; 310 - } 281 + if (hpd >= adev->mode_info.num_hpd) 282 + return connected; 283 + 284 + if (RREG32(mmDC_HPD1_INT_STATUS + hpd_offsets[hpd]) & 285 + DC_HPD1_INT_STATUS__DC_HPD1_SENSE_MASK) 286 + connected = true; 311 287 312 288 return connected; 313 289 } ··· 304 324 u32 tmp; 305 325 bool connected = dce_v8_0_hpd_sense(adev, hpd); 306 326 307 - switch (hpd) { 308 - case AMDGPU_HPD_1: 309 - tmp = RREG32(mmDC_HPD1_INT_CONTROL); 310 - if (connected) 311 - tmp &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_POLARITY_MASK; 312 - else 313 - tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_POLARITY_MASK; 314 - WREG32(mmDC_HPD1_INT_CONTROL, tmp); 315 - break; 316 - case AMDGPU_HPD_2: 317 - tmp = RREG32(mmDC_HPD2_INT_CONTROL); 318 - if (connected) 319 - tmp &= ~DC_HPD2_INT_CONTROL__DC_HPD2_INT_POLARITY_MASK; 320 - else 321 - tmp |= DC_HPD2_INT_CONTROL__DC_HPD2_INT_POLARITY_MASK; 322 - WREG32(mmDC_HPD2_INT_CONTROL, tmp); 323 - break; 324 - case AMDGPU_HPD_3: 325 - tmp = RREG32(mmDC_HPD3_INT_CONTROL); 326 - if (connected) 327 - tmp &= ~DC_HPD3_INT_CONTROL__DC_HPD3_INT_POLARITY_MASK; 328 - else 329 - tmp |= DC_HPD3_INT_CONTROL__DC_HPD3_INT_POLARITY_MASK; 330 - WREG32(mmDC_HPD3_INT_CONTROL, tmp); 331 - break; 332 - case AMDGPU_HPD_4: 333 - tmp = RREG32(mmDC_HPD4_INT_CONTROL); 334 - if (connected) 335 - tmp &= ~DC_HPD4_INT_CONTROL__DC_HPD4_INT_POLARITY_MASK; 336 - else 337 - tmp |= DC_HPD4_INT_CONTROL__DC_HPD4_INT_POLARITY_MASK; 338 - WREG32(mmDC_HPD4_INT_CONTROL, tmp); 339 - break; 340 - case AMDGPU_HPD_5: 341 - tmp = RREG32(mmDC_HPD5_INT_CONTROL); 342 - if (connected) 343 - tmp &= ~DC_HPD5_INT_CONTROL__DC_HPD5_INT_POLARITY_MASK; 344 - else 345 - tmp |= DC_HPD5_INT_CONTROL__DC_HPD5_INT_POLARITY_MASK; 346 - WREG32(mmDC_HPD5_INT_CONTROL, tmp); 347 - break; 348 - case AMDGPU_HPD_6: 349 - tmp = RREG32(mmDC_HPD6_INT_CONTROL); 350 - if (connected) 351 - tmp &= ~DC_HPD6_INT_CONTROL__DC_HPD6_INT_POLARITY_MASK; 352 - else 353 - tmp |= DC_HPD6_INT_CONTROL__DC_HPD6_INT_POLARITY_MASK; 354 - WREG32(mmDC_HPD6_INT_CONTROL, tmp); 355 - break; 356 - default: 357 - break; 358 - } 327 + if (hpd >= adev->mode_info.num_hpd) 328 + return; 329 + 330 + tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]); 331 + if (connected) 332 + tmp &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_POLARITY_MASK; 333 + else 334 + tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_POLARITY_MASK; 335 + WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); 359 336 } 360 337 361 338 /** ··· 327 390 { 328 391 struct drm_device *dev = adev->ddev; 329 392 struct drm_connector *connector; 330 - u32 tmp = (0x9c4 << DC_HPD1_CONTROL__DC_HPD1_CONNECTION_TIMER__SHIFT) | 331 - (0xfa << DC_HPD1_CONTROL__DC_HPD1_RX_INT_TIMER__SHIFT) | 332 - DC_HPD1_CONTROL__DC_HPD1_EN_MASK; 393 + u32 tmp; 333 394 334 395 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 335 396 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 336 397 337 - switch (amdgpu_connector->hpd.hpd) { 338 - case AMDGPU_HPD_1: 339 - WREG32(mmDC_HPD1_CONTROL, tmp); 340 - break; 341 - case AMDGPU_HPD_2: 342 - WREG32(mmDC_HPD2_CONTROL, tmp); 343 - break; 344 - case AMDGPU_HPD_3: 345 - WREG32(mmDC_HPD3_CONTROL, tmp); 346 - break; 347 - case AMDGPU_HPD_4: 348 - WREG32(mmDC_HPD4_CONTROL, tmp); 349 - break; 350 - case AMDGPU_HPD_5: 351 - WREG32(mmDC_HPD5_CONTROL, tmp); 352 - break; 353 - case AMDGPU_HPD_6: 354 - WREG32(mmDC_HPD6_CONTROL, tmp); 355 - break; 356 - default: 357 - break; 358 - } 398 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 399 + continue; 400 + 401 + tmp = RREG32(mmDC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 402 + tmp |= DC_HPD1_CONTROL__DC_HPD1_EN_MASK; 403 + WREG32(mmDC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 359 404 360 405 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP || 361 406 connector->connector_type == DRM_MODE_CONNECTOR_LVDS) { ··· 346 427 * https://bugzilla.redhat.com/show_bug.cgi?id=726143 347 428 * also avoid interrupt storms during dpms. 348 429 */ 349 - u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; 350 - 351 - switch (amdgpu_connector->hpd.hpd) { 352 - case AMDGPU_HPD_1: 353 - dc_hpd_int_cntl_reg = mmDC_HPD1_INT_CONTROL; 354 - break; 355 - case AMDGPU_HPD_2: 356 - dc_hpd_int_cntl_reg = mmDC_HPD2_INT_CONTROL; 357 - break; 358 - case AMDGPU_HPD_3: 359 - dc_hpd_int_cntl_reg = mmDC_HPD3_INT_CONTROL; 360 - break; 361 - case AMDGPU_HPD_4: 362 - dc_hpd_int_cntl_reg = mmDC_HPD4_INT_CONTROL; 363 - break; 364 - case AMDGPU_HPD_5: 365 - dc_hpd_int_cntl_reg = mmDC_HPD5_INT_CONTROL; 366 - break; 367 - case AMDGPU_HPD_6: 368 - dc_hpd_int_cntl_reg = mmDC_HPD6_INT_CONTROL; 369 - break; 370 - default: 371 - continue; 372 - } 373 - 374 - dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 375 - dc_hpd_int_cntl &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK; 376 - WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 430 + tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 431 + tmp &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK; 432 + WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], tmp); 377 433 continue; 378 434 } 379 435 ··· 369 475 { 370 476 struct drm_device *dev = adev->ddev; 371 477 struct drm_connector *connector; 478 + u32 tmp; 372 479 373 480 list_for_each_entry(connector, &dev->mode_config.connector_list, head) { 374 481 struct amdgpu_connector *amdgpu_connector = to_amdgpu_connector(connector); 375 482 376 - switch (amdgpu_connector->hpd.hpd) { 377 - case AMDGPU_HPD_1: 378 - WREG32(mmDC_HPD1_CONTROL, 0); 379 - break; 380 - case AMDGPU_HPD_2: 381 - WREG32(mmDC_HPD2_CONTROL, 0); 382 - break; 383 - case AMDGPU_HPD_3: 384 - WREG32(mmDC_HPD3_CONTROL, 0); 385 - break; 386 - case AMDGPU_HPD_4: 387 - WREG32(mmDC_HPD4_CONTROL, 0); 388 - break; 389 - case AMDGPU_HPD_5: 390 - WREG32(mmDC_HPD5_CONTROL, 0); 391 - break; 392 - case AMDGPU_HPD_6: 393 - WREG32(mmDC_HPD6_CONTROL, 0); 394 - break; 395 - default: 396 - break; 397 - } 483 + if (amdgpu_connector->hpd.hpd >= adev->mode_info.num_hpd) 484 + continue; 485 + 486 + tmp = RREG32(mmDC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd]); 487 + tmp &= ~DC_HPD1_CONTROL__DC_HPD1_EN_MASK; 488 + WREG32(mmDC_HPD1_CONTROL + hpd_offsets[amdgpu_connector->hpd.hpd], 0); 489 + 398 490 amdgpu_irq_put(adev, &adev->hpd_irq, amdgpu_connector->hpd.hpd); 399 491 } 400 492 } ··· 3084 3204 unsigned type, 3085 3205 enum amdgpu_interrupt_state state) 3086 3206 { 3087 - u32 dc_hpd_int_cntl_reg, dc_hpd_int_cntl; 3207 + u32 dc_hpd_int_cntl; 3088 3208 3089 - switch (type) { 3090 - case AMDGPU_HPD_1: 3091 - dc_hpd_int_cntl_reg = mmDC_HPD1_INT_CONTROL; 3092 - break; 3093 - case AMDGPU_HPD_2: 3094 - dc_hpd_int_cntl_reg = mmDC_HPD2_INT_CONTROL; 3095 - break; 3096 - case AMDGPU_HPD_3: 3097 - dc_hpd_int_cntl_reg = mmDC_HPD3_INT_CONTROL; 3098 - break; 3099 - case AMDGPU_HPD_4: 3100 - dc_hpd_int_cntl_reg = mmDC_HPD4_INT_CONTROL; 3101 - break; 3102 - case AMDGPU_HPD_5: 3103 - dc_hpd_int_cntl_reg = mmDC_HPD5_INT_CONTROL; 3104 - break; 3105 - case AMDGPU_HPD_6: 3106 - dc_hpd_int_cntl_reg = mmDC_HPD6_INT_CONTROL; 3107 - break; 3108 - default: 3209 + if (type >= adev->mode_info.num_hpd) { 3109 3210 DRM_DEBUG("invalid hdp %d\n", type); 3110 3211 return 0; 3111 3212 } 3112 3213 3113 3214 switch (state) { 3114 3215 case AMDGPU_IRQ_STATE_DISABLE: 3115 - dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 3216 + dc_hpd_int_cntl = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[type]); 3116 3217 dc_hpd_int_cntl &= ~DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK; 3117 - WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 3218 + WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[type], dc_hpd_int_cntl); 3118 3219 break; 3119 3220 case AMDGPU_IRQ_STATE_ENABLE: 3120 - dc_hpd_int_cntl = RREG32(dc_hpd_int_cntl_reg); 3221 + dc_hpd_int_cntl = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[type]); 3121 3222 dc_hpd_int_cntl |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_EN_MASK; 3122 - WREG32(dc_hpd_int_cntl_reg, dc_hpd_int_cntl); 3223 + WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[type], dc_hpd_int_cntl); 3123 3224 break; 3124 3225 default: 3125 3226 break; ··· 3273 3412 struct amdgpu_irq_src *source, 3274 3413 struct amdgpu_iv_entry *entry) 3275 3414 { 3276 - uint32_t disp_int, mask, int_control, tmp; 3415 + uint32_t disp_int, mask, tmp; 3277 3416 unsigned hpd; 3278 3417 3279 3418 if (entry->src_data >= adev->mode_info.num_hpd) { ··· 3284 3423 hpd = entry->src_data; 3285 3424 disp_int = RREG32(interrupt_status_offsets[hpd].reg); 3286 3425 mask = interrupt_status_offsets[hpd].hpd; 3287 - int_control = hpd_int_control_offsets[hpd]; 3288 3426 3289 3427 if (disp_int & mask) { 3290 - tmp = RREG32(int_control); 3428 + tmp = RREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd]); 3291 3429 tmp |= DC_HPD1_INT_CONTROL__DC_HPD1_INT_ACK_MASK; 3292 - WREG32(int_control, tmp); 3430 + WREG32(mmDC_HPD1_INT_CONTROL + hpd_offsets[hpd], tmp); 3293 3431 schedule_work(&adev->hotplug_work); 3294 3432 DRM_DEBUG("IH: HPD%d\n", hpd + 1); 3295 3433 } ··· 3309 3449 return 0; 3310 3450 } 3311 3451 3312 - const struct amd_ip_funcs dce_v8_0_ip_funcs = { 3452 + static const struct amd_ip_funcs dce_v8_0_ip_funcs = { 3313 3453 .name = "dce_v8_0", 3314 3454 .early_init = dce_v8_0_early_init, 3315 3455 .late_init = NULL, ··· 3639 3779 adev->hpd_irq.num_types = AMDGPU_HPD_LAST; 3640 3780 adev->hpd_irq.funcs = &dce_v8_0_hpd_irq_funcs; 3641 3781 } 3782 + 3783 + const struct amdgpu_ip_block_version dce_v8_0_ip_block = 3784 + { 3785 + .type = AMD_IP_BLOCK_TYPE_DCE, 3786 + .major = 8, 3787 + .minor = 0, 3788 + .rev = 0, 3789 + .funcs = &dce_v8_0_ip_funcs, 3790 + }; 3791 + 3792 + const struct amdgpu_ip_block_version dce_v8_1_ip_block = 3793 + { 3794 + .type = AMD_IP_BLOCK_TYPE_DCE, 3795 + .major = 8, 3796 + .minor = 1, 3797 + .rev = 0, 3798 + .funcs = &dce_v8_0_ip_funcs, 3799 + }; 3800 + 3801 + const struct amdgpu_ip_block_version dce_v8_2_ip_block = 3802 + { 3803 + .type = AMD_IP_BLOCK_TYPE_DCE, 3804 + .major = 8, 3805 + .minor = 2, 3806 + .rev = 0, 3807 + .funcs = &dce_v8_0_ip_funcs, 3808 + }; 3809 + 3810 + const struct amdgpu_ip_block_version dce_v8_3_ip_block = 3811 + { 3812 + .type = AMD_IP_BLOCK_TYPE_DCE, 3813 + .major = 8, 3814 + .minor = 3, 3815 + .rev = 0, 3816 + .funcs = &dce_v8_0_ip_funcs, 3817 + }; 3818 + 3819 + const struct amdgpu_ip_block_version dce_v8_5_ip_block = 3820 + { 3821 + .type = AMD_IP_BLOCK_TYPE_DCE, 3822 + .major = 8, 3823 + .minor = 5, 3824 + .rev = 0, 3825 + .funcs = &dce_v8_0_ip_funcs, 3826 + };
+5 -1
drivers/gpu/drm/amd/amdgpu/dce_v8_0.h
··· 24 24 #ifndef __DCE_V8_0_H__ 25 25 #define __DCE_V8_0_H__ 26 26 27 - extern const struct amd_ip_funcs dce_v8_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version dce_v8_0_ip_block; 28 + extern const struct amdgpu_ip_block_version dce_v8_1_ip_block; 29 + extern const struct amdgpu_ip_block_version dce_v8_2_ip_block; 30 + extern const struct amdgpu_ip_block_version dce_v8_3_ip_block; 31 + extern const struct amdgpu_ip_block_version dce_v8_5_ip_block; 28 32 29 33 void dce_v8_0_disable_dce(struct amdgpu_device *adev); 30 34
+231 -199
drivers/gpu/drm/amd/amdgpu/dce_virtual.c
··· 27 27 #include "atom.h" 28 28 #include "amdgpu_pll.h" 29 29 #include "amdgpu_connectors.h" 30 + #ifdef CONFIG_DRM_AMDGPU_SI 31 + #include "dce_v6_0.h" 32 + #endif 30 33 #ifdef CONFIG_DRM_AMDGPU_CIK 31 34 #include "dce_v8_0.h" 32 35 #endif ··· 37 34 #include "dce_v11_0.h" 38 35 #include "dce_virtual.h" 39 36 37 + #define DCE_VIRTUAL_VBLANK_PERIOD 16666666 38 + 39 + 40 40 static void dce_virtual_set_display_funcs(struct amdgpu_device *adev); 41 41 static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev); 42 - static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, 43 - struct amdgpu_irq_src *source, 44 - struct amdgpu_iv_entry *entry); 42 + static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev, 43 + int index); 45 44 46 45 /** 47 46 * dce_virtual_vblank_wait - vblank wait asic callback. ··· 104 99 struct amdgpu_mode_mc_save *save) 105 100 { 106 101 switch (adev->asic_type) { 102 + #ifdef CONFIG_DRM_AMDGPU_SI 103 + case CHIP_TAHITI: 104 + case CHIP_PITCAIRN: 105 + case CHIP_VERDE: 106 + case CHIP_OLAND: 107 + dce_v6_0_disable_dce(adev); 108 + break; 109 + #endif 107 110 #ifdef CONFIG_DRM_AMDGPU_CIK 108 111 case CHIP_BONAIRE: 109 112 case CHIP_HAWAII: ··· 132 119 dce_v11_0_disable_dce(adev); 133 120 break; 134 121 case CHIP_TOPAZ: 122 + #ifdef CONFIG_DRM_AMDGPU_SI 123 + case CHIP_HAINAN: 124 + #endif 135 125 /* no DCE */ 136 126 return; 137 127 default: ··· 211 195 switch (mode) { 212 196 case DRM_MODE_DPMS_ON: 213 197 amdgpu_crtc->enabled = true; 214 - /* Make sure VBLANK and PFLIP interrupts are still enabled */ 198 + /* Make sure VBLANK interrupts are still enabled */ 215 199 type = amdgpu_crtc_idx_to_irq_type(adev, amdgpu_crtc->crtc_id); 216 200 amdgpu_irq_update(adev, &adev->crtc_irq, type); 217 - amdgpu_irq_update(adev, &adev->pageflip_irq, type); 218 201 drm_vblank_on(dev, amdgpu_crtc->crtc_id); 219 202 break; 220 203 case DRM_MODE_DPMS_STANDBY: ··· 279 264 const struct drm_display_mode *mode, 280 265 struct drm_display_mode *adjusted_mode) 281 266 { 282 - struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 283 - struct drm_device *dev = crtc->dev; 284 - struct drm_encoder *encoder; 285 - 286 - /* assign the encoder to the amdgpu crtc to avoid repeated lookups later */ 287 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 288 - if (encoder->crtc == crtc) { 289 - amdgpu_crtc->encoder = encoder; 290 - amdgpu_crtc->connector = amdgpu_get_connector_for_encoder(encoder); 291 - break; 292 - } 293 - } 294 - if ((amdgpu_crtc->encoder == NULL) || (amdgpu_crtc->connector == NULL)) { 295 - amdgpu_crtc->encoder = NULL; 296 - amdgpu_crtc->connector = NULL; 297 - return false; 298 - } 299 - 300 267 return true; 301 268 } 302 269 ··· 338 341 amdgpu_crtc->pll_id = ATOM_PPLL_INVALID; 339 342 amdgpu_crtc->encoder = NULL; 340 343 amdgpu_crtc->connector = NULL; 344 + amdgpu_crtc->vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE; 341 345 drm_crtc_helper_add(&amdgpu_crtc->base, &dce_virtual_crtc_helper_funcs); 342 346 343 347 return 0; ··· 348 350 { 349 351 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 350 352 351 - adev->mode_info.vsync_timer_enabled = AMDGPU_IRQ_STATE_DISABLE; 352 353 dce_virtual_set_display_funcs(adev); 353 354 dce_virtual_set_irq_funcs(adev); 354 355 355 - adev->mode_info.num_crtc = 1; 356 356 adev->mode_info.num_hpd = 1; 357 357 adev->mode_info.num_dig = 1; 358 358 return 0; 359 359 } 360 360 361 - static bool dce_virtual_get_connector_info(struct amdgpu_device *adev) 361 + static struct drm_encoder * 362 + dce_virtual_encoder(struct drm_connector *connector) 362 363 { 363 - struct amdgpu_i2c_bus_rec ddc_bus; 364 - struct amdgpu_router router; 365 - struct amdgpu_hpd hpd; 364 + int enc_id = connector->encoder_ids[0]; 365 + struct drm_encoder *encoder; 366 + int i; 366 367 367 - /* look up gpio for ddc, hpd */ 368 - ddc_bus.valid = false; 369 - hpd.hpd = AMDGPU_HPD_NONE; 370 - /* needed for aux chan transactions */ 371 - ddc_bus.hpd = hpd.hpd; 368 + for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) { 369 + if (connector->encoder_ids[i] == 0) 370 + break; 372 371 373 - memset(&router, 0, sizeof(router)); 374 - router.ddc_valid = false; 375 - router.cd_valid = false; 376 - amdgpu_display_add_connector(adev, 377 - 0, 378 - ATOM_DEVICE_CRT1_SUPPORT, 379 - DRM_MODE_CONNECTOR_VIRTUAL, &ddc_bus, 380 - CONNECTOR_OBJECT_ID_VIRTUAL, 381 - &hpd, 382 - &router); 372 + encoder = drm_encoder_find(connector->dev, connector->encoder_ids[i]); 373 + if (!encoder) 374 + continue; 383 375 384 - amdgpu_display_add_encoder(adev, ENCODER_VIRTUAL_ENUM_VIRTUAL, 385 - ATOM_DEVICE_CRT1_SUPPORT, 386 - 0); 376 + if (encoder->encoder_type == DRM_MODE_ENCODER_VIRTUAL) 377 + return encoder; 378 + } 387 379 388 - amdgpu_link_encoder_connector(adev->ddev); 389 - 390 - return true; 380 + /* pick the first one */ 381 + if (enc_id) 382 + return drm_encoder_find(connector->dev, enc_id); 383 + return NULL; 391 384 } 385 + 386 + static int dce_virtual_get_modes(struct drm_connector *connector) 387 + { 388 + struct drm_device *dev = connector->dev; 389 + struct drm_display_mode *mode = NULL; 390 + unsigned i; 391 + static const struct mode_size { 392 + int w; 393 + int h; 394 + } common_modes[17] = { 395 + { 640, 480}, 396 + { 720, 480}, 397 + { 800, 600}, 398 + { 848, 480}, 399 + {1024, 768}, 400 + {1152, 768}, 401 + {1280, 720}, 402 + {1280, 800}, 403 + {1280, 854}, 404 + {1280, 960}, 405 + {1280, 1024}, 406 + {1440, 900}, 407 + {1400, 1050}, 408 + {1680, 1050}, 409 + {1600, 1200}, 410 + {1920, 1080}, 411 + {1920, 1200} 412 + }; 413 + 414 + for (i = 0; i < 17; i++) { 415 + mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false); 416 + drm_mode_probed_add(connector, mode); 417 + } 418 + 419 + return 0; 420 + } 421 + 422 + static int dce_virtual_mode_valid(struct drm_connector *connector, 423 + struct drm_display_mode *mode) 424 + { 425 + return MODE_OK; 426 + } 427 + 428 + static int 429 + dce_virtual_dpms(struct drm_connector *connector, int mode) 430 + { 431 + return 0; 432 + } 433 + 434 + static enum drm_connector_status 435 + dce_virtual_detect(struct drm_connector *connector, bool force) 436 + { 437 + return connector_status_connected; 438 + } 439 + 440 + static int 441 + dce_virtual_set_property(struct drm_connector *connector, 442 + struct drm_property *property, 443 + uint64_t val) 444 + { 445 + return 0; 446 + } 447 + 448 + static void dce_virtual_destroy(struct drm_connector *connector) 449 + { 450 + drm_connector_unregister(connector); 451 + drm_connector_cleanup(connector); 452 + kfree(connector); 453 + } 454 + 455 + static void dce_virtual_force(struct drm_connector *connector) 456 + { 457 + return; 458 + } 459 + 460 + static const struct drm_connector_helper_funcs dce_virtual_connector_helper_funcs = { 461 + .get_modes = dce_virtual_get_modes, 462 + .mode_valid = dce_virtual_mode_valid, 463 + .best_encoder = dce_virtual_encoder, 464 + }; 465 + 466 + static const struct drm_connector_funcs dce_virtual_connector_funcs = { 467 + .dpms = dce_virtual_dpms, 468 + .detect = dce_virtual_detect, 469 + .fill_modes = drm_helper_probe_single_connector_modes, 470 + .set_property = dce_virtual_set_property, 471 + .destroy = dce_virtual_destroy, 472 + .force = dce_virtual_force, 473 + }; 392 474 393 475 static int dce_virtual_sw_init(void *handle) 394 476 { ··· 498 420 adev->ddev->mode_config.max_width = 16384; 499 421 adev->ddev->mode_config.max_height = 16384; 500 422 501 - /* allocate crtcs */ 423 + /* allocate crtcs, encoders, connectors */ 502 424 for (i = 0; i < adev->mode_info.num_crtc; i++) { 503 425 r = dce_virtual_crtc_init(adev, i); 504 426 if (r) 505 427 return r; 428 + r = dce_virtual_connector_encoder_init(adev, i); 429 + if (r) 430 + return r; 506 431 } 507 - 508 - dce_virtual_get_connector_info(adev); 509 - amdgpu_print_display_setup(adev->ddev); 510 432 511 433 drm_kms_helper_poll_init(adev->ddev); 512 434 ··· 574 496 return 0; 575 497 } 576 498 577 - const struct amd_ip_funcs dce_virtual_ip_funcs = { 499 + static const struct amd_ip_funcs dce_virtual_ip_funcs = { 578 500 .name = "dce_virtual", 579 501 .early_init = dce_virtual_early_init, 580 502 .late_init = NULL, ··· 604 526 605 527 static void 606 528 dce_virtual_encoder_mode_set(struct drm_encoder *encoder, 607 - struct drm_display_mode *mode, 608 - struct drm_display_mode *adjusted_mode) 529 + struct drm_display_mode *mode, 530 + struct drm_display_mode *adjusted_mode) 609 531 { 610 532 return; 611 533 } ··· 625 547 const struct drm_display_mode *mode, 626 548 struct drm_display_mode *adjusted_mode) 627 549 { 628 - 629 - /* set the active encoder to connector routing */ 630 - amdgpu_encoder_set_active_device(encoder); 631 - 632 550 return true; 633 551 } 634 552 ··· 650 576 .destroy = dce_virtual_encoder_destroy, 651 577 }; 652 578 653 - static void dce_virtual_encoder_add(struct amdgpu_device *adev, 654 - uint32_t encoder_enum, 655 - uint32_t supported_device, 656 - u16 caps) 579 + static int dce_virtual_connector_encoder_init(struct amdgpu_device *adev, 580 + int index) 657 581 { 658 - struct drm_device *dev = adev->ddev; 659 582 struct drm_encoder *encoder; 660 - struct amdgpu_encoder *amdgpu_encoder; 583 + struct drm_connector *connector; 661 584 662 - /* see if we already added it */ 663 - list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 664 - amdgpu_encoder = to_amdgpu_encoder(encoder); 665 - if (amdgpu_encoder->encoder_enum == encoder_enum) { 666 - amdgpu_encoder->devices |= supported_device; 667 - return; 668 - } 585 + /* add a new encoder */ 586 + encoder = kzalloc(sizeof(struct drm_encoder), GFP_KERNEL); 587 + if (!encoder) 588 + return -ENOMEM; 589 + encoder->possible_crtcs = 1 << index; 590 + drm_encoder_init(adev->ddev, encoder, &dce_virtual_encoder_funcs, 591 + DRM_MODE_ENCODER_VIRTUAL, NULL); 592 + drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs); 669 593 594 + connector = kzalloc(sizeof(struct drm_connector), GFP_KERNEL); 595 + if (!connector) { 596 + kfree(encoder); 597 + return -ENOMEM; 670 598 } 671 599 672 - /* add a new one */ 673 - amdgpu_encoder = kzalloc(sizeof(struct amdgpu_encoder), GFP_KERNEL); 674 - if (!amdgpu_encoder) 675 - return; 600 + /* add a new connector */ 601 + drm_connector_init(adev->ddev, connector, &dce_virtual_connector_funcs, 602 + DRM_MODE_CONNECTOR_VIRTUAL); 603 + drm_connector_helper_add(connector, &dce_virtual_connector_helper_funcs); 604 + connector->display_info.subpixel_order = SubPixelHorizontalRGB; 605 + connector->interlace_allowed = false; 606 + connector->doublescan_allowed = false; 607 + drm_connector_register(connector); 676 608 677 - encoder = &amdgpu_encoder->base; 678 - encoder->possible_crtcs = 0x1; 679 - amdgpu_encoder->enc_priv = NULL; 680 - amdgpu_encoder->encoder_enum = encoder_enum; 681 - amdgpu_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; 682 - amdgpu_encoder->devices = supported_device; 683 - amdgpu_encoder->rmx_type = RMX_OFF; 684 - amdgpu_encoder->underscan_type = UNDERSCAN_OFF; 685 - amdgpu_encoder->is_ext_encoder = false; 686 - amdgpu_encoder->caps = caps; 609 + /* link them */ 610 + drm_mode_connector_attach_encoder(connector, encoder); 687 611 688 - drm_encoder_init(dev, encoder, &dce_virtual_encoder_funcs, 689 - DRM_MODE_ENCODER_VIRTUAL, NULL); 690 - drm_encoder_helper_add(encoder, &dce_virtual_encoder_helper_funcs); 691 - DRM_INFO("[FM]encoder: %d is VIRTUAL\n", amdgpu_encoder->encoder_id); 612 + return 0; 692 613 } 693 614 694 615 static const struct amdgpu_display_funcs dce_virtual_display_funcs = { ··· 699 630 .hpd_get_gpio_reg = &dce_virtual_hpd_get_gpio_reg, 700 631 .page_flip = &dce_virtual_page_flip, 701 632 .page_flip_get_scanoutpos = &dce_virtual_crtc_get_scanoutpos, 702 - .add_encoder = &dce_virtual_encoder_add, 703 - .add_connector = &amdgpu_connector_add, 633 + .add_encoder = NULL, 634 + .add_connector = NULL, 704 635 .stop_mc_access = &dce_virtual_stop_mc_access, 705 636 .resume_mc_access = &dce_virtual_resume_mc_access, 706 637 }; ··· 711 642 adev->mode_info.funcs = &dce_virtual_display_funcs; 712 643 } 713 644 714 - static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer) 715 - { 716 - struct amdgpu_mode_info *mode_info = container_of(vblank_timer, struct amdgpu_mode_info ,vblank_timer); 717 - struct amdgpu_device *adev = container_of(mode_info, struct amdgpu_device ,mode_info); 718 - unsigned crtc = 0; 719 - drm_handle_vblank(adev->ddev, crtc); 720 - dce_virtual_pageflip_irq(adev, NULL, NULL); 721 - hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); 722 - return HRTIMER_NORESTART; 723 - } 724 - 725 - static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev, 726 - int crtc, 727 - enum amdgpu_interrupt_state state) 728 - { 729 - if (crtc >= adev->mode_info.num_crtc) { 730 - DRM_DEBUG("invalid crtc %d\n", crtc); 731 - return; 732 - } 733 - 734 - if (state && !adev->mode_info.vsync_timer_enabled) { 735 - DRM_DEBUG("Enable software vsync timer\n"); 736 - hrtimer_init(&adev->mode_info.vblank_timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL); 737 - hrtimer_set_expires(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD)); 738 - adev->mode_info.vblank_timer.function = dce_virtual_vblank_timer_handle; 739 - hrtimer_start(&adev->mode_info.vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); 740 - } else if (!state && adev->mode_info.vsync_timer_enabled) { 741 - DRM_DEBUG("Disable software vsync timer\n"); 742 - hrtimer_cancel(&adev->mode_info.vblank_timer); 743 - } 744 - 745 - adev->mode_info.vsync_timer_enabled = state; 746 - DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc, state); 747 - } 748 - 749 - 750 - static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, 751 - struct amdgpu_irq_src *source, 752 - unsigned type, 753 - enum amdgpu_interrupt_state state) 754 - { 755 - switch (type) { 756 - case AMDGPU_CRTC_IRQ_VBLANK1: 757 - dce_virtual_set_crtc_vblank_interrupt_state(adev, 0, state); 758 - break; 759 - default: 760 - break; 761 - } 762 - return 0; 763 - } 764 - 765 - static void dce_virtual_crtc_vblank_int_ack(struct amdgpu_device *adev, 766 - int crtc) 767 - { 768 - if (crtc >= adev->mode_info.num_crtc) { 769 - DRM_DEBUG("invalid crtc %d\n", crtc); 770 - return; 771 - } 772 - } 773 - 774 - static int dce_virtual_crtc_irq(struct amdgpu_device *adev, 775 - struct amdgpu_irq_src *source, 776 - struct amdgpu_iv_entry *entry) 777 - { 778 - unsigned crtc = 0; 779 - unsigned irq_type = AMDGPU_CRTC_IRQ_VBLANK1; 780 - 781 - dce_virtual_crtc_vblank_int_ack(adev, crtc); 782 - 783 - if (amdgpu_irq_enabled(adev, source, irq_type)) { 784 - drm_handle_vblank(adev->ddev, crtc); 785 - } 786 - dce_virtual_pageflip_irq(adev, NULL, NULL); 787 - DRM_DEBUG("IH: D%d vblank\n", crtc + 1); 788 - return 0; 789 - } 790 - 791 - static int dce_virtual_set_pageflip_irq_state(struct amdgpu_device *adev, 792 - struct amdgpu_irq_src *src, 793 - unsigned type, 794 - enum amdgpu_interrupt_state state) 795 - { 796 - if (type >= adev->mode_info.num_crtc) { 797 - DRM_ERROR("invalid pageflip crtc %d\n", type); 798 - return -EINVAL; 799 - } 800 - DRM_DEBUG("[FM]set pageflip irq type %d state %d\n", type, state); 801 - 802 - return 0; 803 - } 804 - 805 - static int dce_virtual_pageflip_irq(struct amdgpu_device *adev, 806 - struct amdgpu_irq_src *source, 807 - struct amdgpu_iv_entry *entry) 645 + static int dce_virtual_pageflip(struct amdgpu_device *adev, 646 + unsigned crtc_id) 808 647 { 809 648 unsigned long flags; 810 - unsigned crtc_id = 0; 811 649 struct amdgpu_crtc *amdgpu_crtc; 812 650 struct amdgpu_flip_work *works; 813 651 814 - crtc_id = 0; 815 652 amdgpu_crtc = adev->mode_info.crtcs[crtc_id]; 816 653 817 654 if (crtc_id >= adev->mode_info.num_crtc) { ··· 756 781 return 0; 757 782 } 758 783 784 + static enum hrtimer_restart dce_virtual_vblank_timer_handle(struct hrtimer *vblank_timer) 785 + { 786 + struct amdgpu_crtc *amdgpu_crtc = container_of(vblank_timer, 787 + struct amdgpu_crtc, vblank_timer); 788 + struct drm_device *ddev = amdgpu_crtc->base.dev; 789 + struct amdgpu_device *adev = ddev->dev_private; 790 + 791 + drm_handle_vblank(ddev, amdgpu_crtc->crtc_id); 792 + dce_virtual_pageflip(adev, amdgpu_crtc->crtc_id); 793 + hrtimer_start(vblank_timer, ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), 794 + HRTIMER_MODE_REL); 795 + 796 + return HRTIMER_NORESTART; 797 + } 798 + 799 + static void dce_virtual_set_crtc_vblank_interrupt_state(struct amdgpu_device *adev, 800 + int crtc, 801 + enum amdgpu_interrupt_state state) 802 + { 803 + if (crtc >= adev->mode_info.num_crtc) { 804 + DRM_DEBUG("invalid crtc %d\n", crtc); 805 + return; 806 + } 807 + 808 + if (state && !adev->mode_info.crtcs[crtc]->vsync_timer_enabled) { 809 + DRM_DEBUG("Enable software vsync timer\n"); 810 + hrtimer_init(&adev->mode_info.crtcs[crtc]->vblank_timer, 811 + CLOCK_MONOTONIC, HRTIMER_MODE_REL); 812 + hrtimer_set_expires(&adev->mode_info.crtcs[crtc]->vblank_timer, 813 + ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD)); 814 + adev->mode_info.crtcs[crtc]->vblank_timer.function = 815 + dce_virtual_vblank_timer_handle; 816 + hrtimer_start(&adev->mode_info.crtcs[crtc]->vblank_timer, 817 + ktime_set(0, DCE_VIRTUAL_VBLANK_PERIOD), HRTIMER_MODE_REL); 818 + } else if (!state && adev->mode_info.crtcs[crtc]->vsync_timer_enabled) { 819 + DRM_DEBUG("Disable software vsync timer\n"); 820 + hrtimer_cancel(&adev->mode_info.crtcs[crtc]->vblank_timer); 821 + } 822 + 823 + adev->mode_info.crtcs[crtc]->vsync_timer_enabled = state; 824 + DRM_DEBUG("[FM]set crtc %d vblank interrupt state %d\n", crtc, state); 825 + } 826 + 827 + 828 + static int dce_virtual_set_crtc_irq_state(struct amdgpu_device *adev, 829 + struct amdgpu_irq_src *source, 830 + unsigned type, 831 + enum amdgpu_interrupt_state state) 832 + { 833 + if (type > AMDGPU_CRTC_IRQ_VBLANK6) 834 + return -EINVAL; 835 + 836 + dce_virtual_set_crtc_vblank_interrupt_state(adev, type, state); 837 + 838 + return 0; 839 + } 840 + 759 841 static const struct amdgpu_irq_src_funcs dce_virtual_crtc_irq_funcs = { 760 842 .set = dce_virtual_set_crtc_irq_state, 761 - .process = dce_virtual_crtc_irq, 762 - }; 763 - 764 - static const struct amdgpu_irq_src_funcs dce_virtual_pageflip_irq_funcs = { 765 - .set = dce_virtual_set_pageflip_irq_state, 766 - .process = dce_virtual_pageflip_irq, 843 + .process = NULL, 767 844 }; 768 845 769 846 static void dce_virtual_set_irq_funcs(struct amdgpu_device *adev) 770 847 { 771 848 adev->crtc_irq.num_types = AMDGPU_CRTC_IRQ_LAST; 772 849 adev->crtc_irq.funcs = &dce_virtual_crtc_irq_funcs; 773 - 774 - adev->pageflip_irq.num_types = AMDGPU_PAGEFLIP_IRQ_LAST; 775 - adev->pageflip_irq.funcs = &dce_virtual_pageflip_irq_funcs; 776 850 } 777 851 852 + const struct amdgpu_ip_block_version dce_virtual_ip_block = 853 + { 854 + .type = AMD_IP_BLOCK_TYPE_DCE, 855 + .major = 1, 856 + .minor = 0, 857 + .rev = 0, 858 + .funcs = &dce_virtual_ip_funcs, 859 + };
+1 -2
drivers/gpu/drm/amd/amdgpu/dce_virtual.h
··· 24 24 #ifndef __DCE_VIRTUAL_H__ 25 25 #define __DCE_VIRTUAL_H__ 26 26 27 - extern const struct amd_ip_funcs dce_virtual_ip_funcs; 28 - #define DCE_VIRTUAL_VBLANK_PERIOD 16666666 27 + extern const struct amdgpu_ip_block_version dce_virtual_ip_block; 29 28 30 29 #endif 31 30
+35 -42
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
··· 1940 1940 1941 1941 static void gfx_v6_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring) 1942 1942 { 1943 - int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 1943 + int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 1944 1944 uint32_t seq = ring->fence_drv.sync_seq; 1945 1945 uint64_t addr = ring->fence_drv.gpu_addr; 1946 1946 ··· 1966 1966 static void gfx_v6_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 1967 1967 unsigned vm_id, uint64_t pd_addr) 1968 1968 { 1969 - int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 1969 + int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 1970 1970 1971 1971 /* write new base address */ 1972 1972 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); ··· 2814 2814 amdgpu_ring_write(ring, 0); 2815 2815 } 2816 2816 2817 - static unsigned gfx_v6_0_ring_get_emit_ib_size(struct amdgpu_ring *ring) 2818 - { 2819 - return 2820 - 6; /* gfx_v6_0_ring_emit_ib */ 2821 - } 2822 - 2823 - static unsigned gfx_v6_0_ring_get_dma_frame_size_gfx(struct amdgpu_ring *ring) 2824 - { 2825 - return 2826 - 5 + /* gfx_v6_0_ring_emit_hdp_flush */ 2827 - 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */ 2828 - 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ 2829 - 7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */ 2830 - 17 + 6 + /* gfx_v6_0_ring_emit_vm_flush */ 2831 - 3; /* gfx_v6_ring_emit_cntxcntl */ 2832 - } 2833 - 2834 - static unsigned gfx_v6_0_ring_get_dma_frame_size_compute(struct amdgpu_ring *ring) 2835 - { 2836 - return 2837 - 5 + /* gfx_v6_0_ring_emit_hdp_flush */ 2838 - 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */ 2839 - 7 + /* gfx_v6_0_ring_emit_pipeline_sync */ 2840 - 17 + /* gfx_v6_0_ring_emit_vm_flush */ 2841 - 14 + 14 + 14; /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ 2842 - } 2843 - 2844 2817 static const struct amdgpu_gfx_funcs gfx_v6_0_gfx_funcs = { 2845 2818 .get_gpu_clock_counter = &gfx_v6_0_get_gpu_clock_counter, 2846 2819 .select_se_sh = &gfx_v6_0_select_se_sh, ··· 2869 2896 ring->ring_obj = NULL; 2870 2897 sprintf(ring->name, "gfx"); 2871 2898 r = amdgpu_ring_init(adev, ring, 1024, 2872 - 0x80000000, 0xf, 2873 - &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP, 2874 - AMDGPU_RING_TYPE_GFX); 2899 + &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP); 2875 2900 if (r) 2876 2901 return r; 2877 2902 } ··· 2891 2920 sprintf(ring->name, "comp %d.%d.%d", ring->me, ring->pipe, ring->queue); 2892 2921 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; 2893 2922 r = amdgpu_ring_init(adev, ring, 1024, 2894 - 0x80000000, 0xf, 2895 - &adev->gfx.eop_irq, irq_type, 2896 - AMDGPU_RING_TYPE_COMPUTE); 2923 + &adev->gfx.eop_irq, irq_type); 2897 2924 if (r) 2898 2925 return r; 2899 2926 } ··· 3206 3237 return 0; 3207 3238 } 3208 3239 3209 - const struct amd_ip_funcs gfx_v6_0_ip_funcs = { 3240 + static const struct amd_ip_funcs gfx_v6_0_ip_funcs = { 3210 3241 .name = "gfx_v6_0", 3211 3242 .early_init = gfx_v6_0_early_init, 3212 3243 .late_init = NULL, ··· 3224 3255 }; 3225 3256 3226 3257 static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_gfx = { 3258 + .type = AMDGPU_RING_TYPE_GFX, 3259 + .align_mask = 0xff, 3260 + .nop = 0x80000000, 3227 3261 .get_rptr = gfx_v6_0_ring_get_rptr, 3228 3262 .get_wptr = gfx_v6_0_ring_get_wptr, 3229 3263 .set_wptr = gfx_v6_0_ring_set_wptr_gfx, 3230 - .parse_cs = NULL, 3264 + .emit_frame_size = 3265 + 5 + /* gfx_v6_0_ring_emit_hdp_flush */ 3266 + 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */ 3267 + 14 + 14 + 14 + /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ 3268 + 7 + 4 + /* gfx_v6_0_ring_emit_pipeline_sync */ 3269 + 17 + 6 + /* gfx_v6_0_ring_emit_vm_flush */ 3270 + 3, /* gfx_v6_ring_emit_cntxcntl */ 3271 + .emit_ib_size = 6, /* gfx_v6_0_ring_emit_ib */ 3231 3272 .emit_ib = gfx_v6_0_ring_emit_ib, 3232 3273 .emit_fence = gfx_v6_0_ring_emit_fence, 3233 3274 .emit_pipeline_sync = gfx_v6_0_ring_emit_pipeline_sync, ··· 3248 3269 .test_ib = gfx_v6_0_ring_test_ib, 3249 3270 .insert_nop = amdgpu_ring_insert_nop, 3250 3271 .emit_cntxcntl = gfx_v6_ring_emit_cntxcntl, 3251 - .get_emit_ib_size = gfx_v6_0_ring_get_emit_ib_size, 3252 - .get_dma_frame_size = gfx_v6_0_ring_get_dma_frame_size_gfx, 3253 3272 }; 3254 3273 3255 3274 static const struct amdgpu_ring_funcs gfx_v6_0_ring_funcs_compute = { 3275 + .type = AMDGPU_RING_TYPE_COMPUTE, 3276 + .align_mask = 0xff, 3277 + .nop = 0x80000000, 3256 3278 .get_rptr = gfx_v6_0_ring_get_rptr, 3257 3279 .get_wptr = gfx_v6_0_ring_get_wptr, 3258 3280 .set_wptr = gfx_v6_0_ring_set_wptr_compute, 3259 - .parse_cs = NULL, 3281 + .emit_frame_size = 3282 + 5 + /* gfx_v6_0_ring_emit_hdp_flush */ 3283 + 5 + /* gfx_v6_0_ring_emit_hdp_invalidate */ 3284 + 7 + /* gfx_v6_0_ring_emit_pipeline_sync */ 3285 + 17 + /* gfx_v6_0_ring_emit_vm_flush */ 3286 + 14 + 14 + 14, /* gfx_v6_0_ring_emit_fence x3 for user fence, vm fence */ 3287 + .emit_ib_size = 6, /* gfx_v6_0_ring_emit_ib */ 3260 3288 .emit_ib = gfx_v6_0_ring_emit_ib, 3261 3289 .emit_fence = gfx_v6_0_ring_emit_fence, 3262 3290 .emit_pipeline_sync = gfx_v6_0_ring_emit_pipeline_sync, ··· 3273 3287 .test_ring = gfx_v6_0_ring_test_ring, 3274 3288 .test_ib = gfx_v6_0_ring_test_ib, 3275 3289 .insert_nop = amdgpu_ring_insert_nop, 3276 - .get_emit_ib_size = gfx_v6_0_ring_get_emit_ib_size, 3277 - .get_dma_frame_size = gfx_v6_0_ring_get_dma_frame_size_compute, 3278 3290 }; 3279 3291 3280 3292 static void gfx_v6_0_set_ring_funcs(struct amdgpu_device *adev) ··· 3344 3360 cu_info->number = active_cu_number; 3345 3361 cu_info->ao_cu_mask = ao_cu_mask; 3346 3362 } 3363 + 3364 + const struct amdgpu_ip_block_version gfx_v6_0_ip_block = 3365 + { 3366 + .type = AMD_IP_BLOCK_TYPE_GFX, 3367 + .major = 6, 3368 + .minor = 0, 3369 + .rev = 0, 3370 + .funcs = &gfx_v6_0_ip_funcs, 3371 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/gfx_v6_0.h
··· 24 24 #ifndef __GFX_V6_0_H__ 25 25 #define __GFX_V6_0_H__ 26 26 27 - extern const struct amd_ip_funcs gfx_v6_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version gfx_v6_0_ip_block; 28 28 29 29 #endif
+97 -49
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.c
··· 2077 2077 static void gfx_v7_0_ring_emit_hdp_flush(struct amdgpu_ring *ring) 2078 2078 { 2079 2079 u32 ref_and_mask; 2080 - int usepfp = ring->type == AMDGPU_RING_TYPE_COMPUTE ? 0 : 1; 2080 + int usepfp = ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE ? 0 : 1; 2081 2081 2082 - if (ring->type == AMDGPU_RING_TYPE_COMPUTE) { 2082 + if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) { 2083 2083 switch (ring->me) { 2084 2084 case 1: 2085 2085 ref_and_mask = GPU_HDP_FLUSH_DONE__CP2_MASK << ring->pipe; ··· 3222 3222 */ 3223 3223 static void gfx_v7_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring) 3224 3224 { 3225 - int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 3225 + int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 3226 3226 uint32_t seq = ring->fence_drv.sync_seq; 3227 3227 uint64_t addr = ring->fence_drv.gpu_addr; 3228 3228 ··· 3262 3262 static void gfx_v7_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 3263 3263 unsigned vm_id, uint64_t pd_addr) 3264 3264 { 3265 - int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 3265 + int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 3266 3266 3267 3267 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 3268 3268 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | ··· 3391 3391 if (adev->gfx.rlc.save_restore_obj == NULL) { 3392 3392 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, 3393 3393 AMDGPU_GEM_DOMAIN_VRAM, 3394 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 3394 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 3395 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 3395 3396 NULL, NULL, 3396 3397 &adev->gfx.rlc.save_restore_obj); 3397 3398 if (r) { ··· 3436 3435 if (adev->gfx.rlc.clear_state_obj == NULL) { 3437 3436 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, 3438 3437 AMDGPU_GEM_DOMAIN_VRAM, 3439 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 3438 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 3439 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 3440 3440 NULL, NULL, 3441 3441 &adev->gfx.rlc.clear_state_obj); 3442 3442 if (r) { ··· 3477 3475 if (adev->gfx.rlc.cp_table_obj == NULL) { 3478 3476 r = amdgpu_bo_create(adev, adev->gfx.rlc.cp_table_size, PAGE_SIZE, true, 3479 3477 AMDGPU_GEM_DOMAIN_VRAM, 3480 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 3478 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 3479 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 3481 3480 NULL, NULL, 3482 3481 &adev->gfx.rlc.cp_table_obj); 3483 3482 if (r) { ··· 4357 4354 amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base)); 4358 4355 } 4359 4356 4360 - static unsigned gfx_v7_0_ring_get_emit_ib_size_gfx(struct amdgpu_ring *ring) 4357 + static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address) 4361 4358 { 4362 - return 4363 - 4; /* gfx_v7_0_ring_emit_ib_gfx */ 4359 + WREG32(mmSQ_IND_INDEX, (wave & 0xF) | ((simd & 0x3) << 4) | (address << 16) | (1 << 13)); 4360 + return RREG32(mmSQ_IND_DATA); 4364 4361 } 4365 4362 4366 - static unsigned gfx_v7_0_ring_get_dma_frame_size_gfx(struct amdgpu_ring *ring) 4363 + static void gfx_v7_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) 4367 4364 { 4368 - return 4369 - 20 + /* gfx_v7_0_ring_emit_gds_switch */ 4370 - 7 + /* gfx_v7_0_ring_emit_hdp_flush */ 4371 - 5 + /* gfx_v7_0_ring_emit_hdp_invalidate */ 4372 - 12 + 12 + 12 + /* gfx_v7_0_ring_emit_fence_gfx x3 for user fence, vm fence */ 4373 - 7 + 4 + /* gfx_v7_0_ring_emit_pipeline_sync */ 4374 - 17 + 6 + /* gfx_v7_0_ring_emit_vm_flush */ 4375 - 3; /* gfx_v7_ring_emit_cntxcntl */ 4376 - } 4377 - 4378 - static unsigned gfx_v7_0_ring_get_emit_ib_size_compute(struct amdgpu_ring *ring) 4379 - { 4380 - return 4381 - 4; /* gfx_v7_0_ring_emit_ib_compute */ 4382 - } 4383 - 4384 - static unsigned gfx_v7_0_ring_get_dma_frame_size_compute(struct amdgpu_ring *ring) 4385 - { 4386 - return 4387 - 20 + /* gfx_v7_0_ring_emit_gds_switch */ 4388 - 7 + /* gfx_v7_0_ring_emit_hdp_flush */ 4389 - 5 + /* gfx_v7_0_ring_emit_hdp_invalidate */ 4390 - 7 + /* gfx_v7_0_ring_emit_pipeline_sync */ 4391 - 17 + /* gfx_v7_0_ring_emit_vm_flush */ 4392 - 7 + 7 + 7; /* gfx_v7_0_ring_emit_fence_compute x3 for user fence, vm fence */ 4365 + /* type 0 wave data */ 4366 + dst[(*no_fields)++] = 0; 4367 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS); 4368 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO); 4369 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI); 4370 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO); 4371 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI); 4372 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_HW_ID); 4373 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0); 4374 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1); 4375 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_GPR_ALLOC); 4376 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_LDS_ALLOC); 4377 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TRAPSTS); 4378 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS); 4379 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TBA_LO); 4380 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TBA_HI); 4381 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TMA_LO); 4382 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TMA_HI); 4383 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_DBG0); 4384 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0); 4393 4385 } 4394 4386 4395 4387 static const struct amdgpu_gfx_funcs gfx_v7_0_gfx_funcs = { 4396 4388 .get_gpu_clock_counter = &gfx_v7_0_get_gpu_clock_counter, 4397 4389 .select_se_sh = &gfx_v7_0_select_se_sh, 4390 + .read_wave_data = &gfx_v7_0_read_wave_data, 4398 4391 }; 4399 4392 4400 4393 static const struct amdgpu_rlc_funcs gfx_v7_0_rlc_funcs = { ··· 4642 4643 ring->ring_obj = NULL; 4643 4644 sprintf(ring->name, "gfx"); 4644 4645 r = amdgpu_ring_init(adev, ring, 1024, 4645 - PACKET3(PACKET3_NOP, 0x3FFF), 0xf, 4646 - &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP, 4647 - AMDGPU_RING_TYPE_GFX); 4646 + &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP); 4648 4647 if (r) 4649 4648 return r; 4650 4649 } ··· 4667 4670 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; 4668 4671 /* type-2 packets are deprecated on MEC, use type-3 instead */ 4669 4672 r = amdgpu_ring_init(adev, ring, 1024, 4670 - PACKET3(PACKET3_NOP, 0x3FFF), 0xf, 4671 - &adev->gfx.eop_irq, irq_type, 4672 - AMDGPU_RING_TYPE_COMPUTE); 4673 + &adev->gfx.eop_irq, irq_type); 4673 4674 if (r) 4674 4675 return r; 4675 4676 } ··· 5118 5123 return 0; 5119 5124 } 5120 5125 5121 - const struct amd_ip_funcs gfx_v7_0_ip_funcs = { 5126 + static const struct amd_ip_funcs gfx_v7_0_ip_funcs = { 5122 5127 .name = "gfx_v7_0", 5123 5128 .early_init = gfx_v7_0_early_init, 5124 5129 .late_init = gfx_v7_0_late_init, ··· 5136 5141 }; 5137 5142 5138 5143 static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_gfx = { 5144 + .type = AMDGPU_RING_TYPE_GFX, 5145 + .align_mask = 0xff, 5146 + .nop = PACKET3(PACKET3_NOP, 0x3FFF), 5139 5147 .get_rptr = gfx_v7_0_ring_get_rptr, 5140 5148 .get_wptr = gfx_v7_0_ring_get_wptr_gfx, 5141 5149 .set_wptr = gfx_v7_0_ring_set_wptr_gfx, 5142 - .parse_cs = NULL, 5150 + .emit_frame_size = 5151 + 20 + /* gfx_v7_0_ring_emit_gds_switch */ 5152 + 7 + /* gfx_v7_0_ring_emit_hdp_flush */ 5153 + 5 + /* gfx_v7_0_ring_emit_hdp_invalidate */ 5154 + 12 + 12 + 12 + /* gfx_v7_0_ring_emit_fence_gfx x3 for user fence, vm fence */ 5155 + 7 + 4 + /* gfx_v7_0_ring_emit_pipeline_sync */ 5156 + 17 + 6 + /* gfx_v7_0_ring_emit_vm_flush */ 5157 + 3, /* gfx_v7_ring_emit_cntxcntl */ 5158 + .emit_ib_size = 4, /* gfx_v7_0_ring_emit_ib_gfx */ 5143 5159 .emit_ib = gfx_v7_0_ring_emit_ib_gfx, 5144 5160 .emit_fence = gfx_v7_0_ring_emit_fence_gfx, 5145 5161 .emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync, ··· 5163 5157 .insert_nop = amdgpu_ring_insert_nop, 5164 5158 .pad_ib = amdgpu_ring_generic_pad_ib, 5165 5159 .emit_cntxcntl = gfx_v7_ring_emit_cntxcntl, 5166 - .get_emit_ib_size = gfx_v7_0_ring_get_emit_ib_size_gfx, 5167 - .get_dma_frame_size = gfx_v7_0_ring_get_dma_frame_size_gfx, 5168 5160 }; 5169 5161 5170 5162 static const struct amdgpu_ring_funcs gfx_v7_0_ring_funcs_compute = { 5163 + .type = AMDGPU_RING_TYPE_COMPUTE, 5164 + .align_mask = 0xff, 5165 + .nop = PACKET3(PACKET3_NOP, 0x3FFF), 5171 5166 .get_rptr = gfx_v7_0_ring_get_rptr, 5172 5167 .get_wptr = gfx_v7_0_ring_get_wptr_compute, 5173 5168 .set_wptr = gfx_v7_0_ring_set_wptr_compute, 5174 - .parse_cs = NULL, 5169 + .emit_frame_size = 5170 + 20 + /* gfx_v7_0_ring_emit_gds_switch */ 5171 + 7 + /* gfx_v7_0_ring_emit_hdp_flush */ 5172 + 5 + /* gfx_v7_0_ring_emit_hdp_invalidate */ 5173 + 7 + /* gfx_v7_0_ring_emit_pipeline_sync */ 5174 + 17 + /* gfx_v7_0_ring_emit_vm_flush */ 5175 + 7 + 7 + 7, /* gfx_v7_0_ring_emit_fence_compute x3 for user fence, vm fence */ 5176 + .emit_ib_size = 4, /* gfx_v7_0_ring_emit_ib_compute */ 5175 5177 .emit_ib = gfx_v7_0_ring_emit_ib_compute, 5176 5178 .emit_fence = gfx_v7_0_ring_emit_fence_compute, 5177 5179 .emit_pipeline_sync = gfx_v7_0_ring_emit_pipeline_sync, ··· 5191 5177 .test_ib = gfx_v7_0_ring_test_ib, 5192 5178 .insert_nop = amdgpu_ring_insert_nop, 5193 5179 .pad_ib = amdgpu_ring_generic_pad_ib, 5194 - .get_emit_ib_size = gfx_v7_0_ring_get_emit_ib_size_compute, 5195 - .get_dma_frame_size = gfx_v7_0_ring_get_dma_frame_size_compute, 5196 5180 }; 5197 5181 5198 5182 static void gfx_v7_0_set_ring_funcs(struct amdgpu_device *adev) ··· 5301 5289 cu_info->number = active_cu_number; 5302 5290 cu_info->ao_cu_mask = ao_cu_mask; 5303 5291 } 5292 + 5293 + const struct amdgpu_ip_block_version gfx_v7_0_ip_block = 5294 + { 5295 + .type = AMD_IP_BLOCK_TYPE_GFX, 5296 + .major = 7, 5297 + .minor = 0, 5298 + .rev = 0, 5299 + .funcs = &gfx_v7_0_ip_funcs, 5300 + }; 5301 + 5302 + const struct amdgpu_ip_block_version gfx_v7_1_ip_block = 5303 + { 5304 + .type = AMD_IP_BLOCK_TYPE_GFX, 5305 + .major = 7, 5306 + .minor = 1, 5307 + .rev = 0, 5308 + .funcs = &gfx_v7_0_ip_funcs, 5309 + }; 5310 + 5311 + const struct amdgpu_ip_block_version gfx_v7_2_ip_block = 5312 + { 5313 + .type = AMD_IP_BLOCK_TYPE_GFX, 5314 + .major = 7, 5315 + .minor = 2, 5316 + .rev = 0, 5317 + .funcs = &gfx_v7_0_ip_funcs, 5318 + }; 5319 + 5320 + const struct amdgpu_ip_block_version gfx_v7_3_ip_block = 5321 + { 5322 + .type = AMD_IP_BLOCK_TYPE_GFX, 5323 + .major = 7, 5324 + .minor = 3, 5325 + .rev = 0, 5326 + .funcs = &gfx_v7_0_ip_funcs, 5327 + };
+4 -1
drivers/gpu/drm/amd/amdgpu/gfx_v7_0.h
··· 24 24 #ifndef __GFX_V7_0_H__ 25 25 #define __GFX_V7_0_H__ 26 26 27 - extern const struct amd_ip_funcs gfx_v7_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version gfx_v7_0_ip_block; 28 + extern const struct amdgpu_ip_block_version gfx_v7_1_ip_block; 29 + extern const struct amdgpu_ip_block_version gfx_v7_2_ip_block; 30 + extern const struct amdgpu_ip_block_version gfx_v7_3_ip_block; 28 31 29 32 #endif
+120 -89
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.c
··· 1058 1058 adev->firmware.fw_size += 1059 1059 ALIGN(le32_to_cpu(header->ucode_size_bytes), PAGE_SIZE); 1060 1060 1061 + /* we need account JT in */ 1062 + cp_hdr = (const struct gfx_firmware_header_v1_0 *)adev->gfx.mec_fw->data; 1063 + adev->firmware.fw_size += 1064 + ALIGN(le32_to_cpu(cp_hdr->jt_size) << 2, PAGE_SIZE); 1065 + 1066 + if (amdgpu_sriov_vf(adev)) { 1067 + info = &adev->firmware.ucode[AMDGPU_UCODE_ID_STORAGE]; 1068 + info->ucode_id = AMDGPU_UCODE_ID_STORAGE; 1069 + info->fw = adev->gfx.mec_fw; 1070 + adev->firmware.fw_size += 1071 + ALIGN(le32_to_cpu(64 * PAGE_SIZE), PAGE_SIZE); 1072 + } 1073 + 1061 1074 if (adev->gfx.mec2_fw) { 1062 1075 info = &adev->firmware.ucode[AMDGPU_UCODE_ID_CP_MEC2]; 1063 1076 info->ucode_id = AMDGPU_UCODE_ID_CP_MEC2; ··· 1140 1127 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 2)); 1141 1128 buffer[count++] = cpu_to_le32(mmPA_SC_RASTER_CONFIG - 1142 1129 PACKET3_SET_CONTEXT_REG_START); 1143 - switch (adev->asic_type) { 1144 - case CHIP_TONGA: 1145 - case CHIP_POLARIS10: 1146 - buffer[count++] = cpu_to_le32(0x16000012); 1147 - buffer[count++] = cpu_to_le32(0x0000002A); 1148 - break; 1149 - case CHIP_POLARIS11: 1150 - buffer[count++] = cpu_to_le32(0x16000012); 1151 - buffer[count++] = cpu_to_le32(0x00000000); 1152 - break; 1153 - case CHIP_FIJI: 1154 - buffer[count++] = cpu_to_le32(0x3a00161a); 1155 - buffer[count++] = cpu_to_le32(0x0000002e); 1156 - break; 1157 - case CHIP_TOPAZ: 1158 - case CHIP_CARRIZO: 1159 - buffer[count++] = cpu_to_le32(0x00000002); 1160 - buffer[count++] = cpu_to_le32(0x00000000); 1161 - break; 1162 - case CHIP_STONEY: 1163 - buffer[count++] = cpu_to_le32(0x00000000); 1164 - buffer[count++] = cpu_to_le32(0x00000000); 1165 - break; 1166 - default: 1167 - buffer[count++] = cpu_to_le32(0x00000000); 1168 - buffer[count++] = cpu_to_le32(0x00000000); 1169 - break; 1170 - } 1130 + buffer[count++] = cpu_to_le32(adev->gfx.config.rb_config[0][0].raster_config); 1131 + buffer[count++] = cpu_to_le32(adev->gfx.config.rb_config[0][0].raster_config_1); 1171 1132 1172 1133 buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); 1173 1134 buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE); ··· 1260 1273 if (adev->gfx.rlc.clear_state_obj == NULL) { 1261 1274 r = amdgpu_bo_create(adev, dws * 4, PAGE_SIZE, true, 1262 1275 AMDGPU_GEM_DOMAIN_VRAM, 1263 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1276 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 1277 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1264 1278 NULL, NULL, 1265 1279 &adev->gfx.rlc.clear_state_obj); 1266 1280 if (r) { ··· 1303 1315 if (adev->gfx.rlc.cp_table_obj == NULL) { 1304 1316 r = amdgpu_bo_create(adev, adev->gfx.rlc.cp_table_size, PAGE_SIZE, true, 1305 1317 AMDGPU_GEM_DOMAIN_VRAM, 1306 - AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED, 1318 + AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED | 1319 + AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, 1307 1320 NULL, NULL, 1308 1321 &adev->gfx.rlc.cp_table_obj); 1309 1322 if (r) { ··· 2034 2045 ring->doorbell_index = AMDGPU_DOORBELL_GFX_RING0; 2035 2046 } 2036 2047 2037 - r = amdgpu_ring_init(adev, ring, 1024, 2038 - PACKET3(PACKET3_NOP, 0x3FFF), 0xf, 2039 - &adev->gfx.eop_irq, AMDGPU_CP_IRQ_GFX_EOP, 2040 - AMDGPU_RING_TYPE_GFX); 2048 + r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, 2049 + AMDGPU_CP_IRQ_GFX_EOP); 2041 2050 if (r) 2042 2051 return r; 2043 2052 } ··· 2059 2072 sprintf(ring->name, "comp_%d.%d.%d", ring->me, ring->pipe, ring->queue); 2060 2073 irq_type = AMDGPU_CP_IRQ_COMPUTE_MEC1_PIPE0_EOP + ring->pipe; 2061 2074 /* type-2 packets are deprecated on MEC, use type-3 instead */ 2062 - r = amdgpu_ring_init(adev, ring, 1024, 2063 - PACKET3(PACKET3_NOP, 0x3FFF), 0xf, 2064 - &adev->gfx.eop_irq, irq_type, 2065 - AMDGPU_RING_TYPE_COMPUTE); 2075 + r = amdgpu_ring_init(adev, ring, 1024, &adev->gfx.eop_irq, 2076 + irq_type); 2066 2077 if (r) 2067 2078 return r; 2068 2079 } ··· 3664 3679 num_rb_pipes); 3665 3680 } 3666 3681 3682 + /* cache the values for userspace */ 3683 + for (i = 0; i < adev->gfx.config.max_shader_engines; i++) { 3684 + for (j = 0; j < adev->gfx.config.max_sh_per_se; j++) { 3685 + gfx_v8_0_select_se_sh(adev, i, j, 0xffffffff); 3686 + adev->gfx.config.rb_config[i][j].rb_backend_disable = 3687 + RREG32(mmCC_RB_BACKEND_DISABLE); 3688 + adev->gfx.config.rb_config[i][j].user_rb_backend_disable = 3689 + RREG32(mmGC_USER_RB_BACKEND_DISABLE); 3690 + adev->gfx.config.rb_config[i][j].raster_config = 3691 + RREG32(mmPA_SC_RASTER_CONFIG); 3692 + adev->gfx.config.rb_config[i][j].raster_config_1 = 3693 + RREG32(mmPA_SC_RASTER_CONFIG_1); 3694 + } 3695 + } 3696 + gfx_v8_0_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 3667 3697 mutex_unlock(&adev->grbm_idx_mutex); 3668 3698 } 3669 3699 ··· 4331 4331 struct amdgpu_ring *ring; 4332 4332 u32 tmp; 4333 4333 u32 rb_bufsz; 4334 - u64 rb_addr, rptr_addr; 4334 + u64 rb_addr, rptr_addr, wptr_gpu_addr; 4335 4335 int r; 4336 4336 4337 4337 /* Set the write pointer delay */ ··· 4362 4362 WREG32(mmCP_RB0_RPTR_ADDR, lower_32_bits(rptr_addr)); 4363 4363 WREG32(mmCP_RB0_RPTR_ADDR_HI, upper_32_bits(rptr_addr) & 0xFF); 4364 4364 4365 + wptr_gpu_addr = adev->wb.gpu_addr + (ring->wptr_offs * 4); 4366 + WREG32(mmCP_RB_WPTR_POLL_ADDR_LO, lower_32_bits(wptr_gpu_addr)); 4367 + WREG32(mmCP_RB_WPTR_POLL_ADDR_HI, upper_32_bits(wptr_gpu_addr)); 4365 4368 mdelay(1); 4366 4369 WREG32(mmCP_RB0_CNTL, tmp); 4367 4370 ··· 5441 5438 amdgpu_ring_write(ring, (1 << (oa_size + oa_base)) - (1 << oa_base)); 5442 5439 } 5443 5440 5441 + static uint32_t wave_read_ind(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t address) 5442 + { 5443 + WREG32(mmSQ_IND_INDEX, (wave & 0xF) | ((simd & 0x3) << 4) | (address << 16) | (1 << 13)); 5444 + return RREG32(mmSQ_IND_DATA); 5445 + } 5446 + 5447 + static void gfx_v8_0_read_wave_data(struct amdgpu_device *adev, uint32_t simd, uint32_t wave, uint32_t *dst, int *no_fields) 5448 + { 5449 + /* type 0 wave data */ 5450 + dst[(*no_fields)++] = 0; 5451 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_STATUS); 5452 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_LO); 5453 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_PC_HI); 5454 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_LO); 5455 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_EXEC_HI); 5456 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_HW_ID); 5457 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW0); 5458 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_INST_DW1); 5459 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_GPR_ALLOC); 5460 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_LDS_ALLOC); 5461 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TRAPSTS); 5462 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_STS); 5463 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TBA_LO); 5464 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TBA_HI); 5465 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TMA_LO); 5466 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_TMA_HI); 5467 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_IB_DBG0); 5468 + dst[(*no_fields)++] = wave_read_ind(adev, simd, wave, ixSQ_WAVE_M0); 5469 + } 5470 + 5471 + 5444 5472 static const struct amdgpu_gfx_funcs gfx_v8_0_gfx_funcs = { 5445 5473 .get_gpu_clock_counter = &gfx_v8_0_get_gpu_clock_counter, 5446 5474 .select_se_sh = &gfx_v8_0_select_se_sh, 5475 + .read_wave_data = &gfx_v8_0_read_wave_data, 5447 5476 }; 5448 5477 5449 5478 static int gfx_v8_0_early_init(void *handle) ··· 6155 6120 { 6156 6121 u32 ref_and_mask, reg_mem_engine; 6157 6122 6158 - if (ring->type == AMDGPU_RING_TYPE_COMPUTE) { 6123 + if (ring->funcs->type == AMDGPU_RING_TYPE_COMPUTE) { 6159 6124 switch (ring->me) { 6160 6125 case 1: 6161 6126 ref_and_mask = GPU_HDP_FLUSH_DONE__CP2_MASK << ring->pipe; ··· 6257 6222 6258 6223 static void gfx_v8_0_ring_emit_pipeline_sync(struct amdgpu_ring *ring) 6259 6224 { 6260 - int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 6225 + int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 6261 6226 uint32_t seq = ring->fence_drv.sync_seq; 6262 6227 uint64_t addr = ring->fence_drv.gpu_addr; 6263 6228 ··· 6275 6240 static void gfx_v8_0_ring_emit_vm_flush(struct amdgpu_ring *ring, 6276 6241 unsigned vm_id, uint64_t pd_addr) 6277 6242 { 6278 - int usepfp = (ring->type == AMDGPU_RING_TYPE_GFX); 6279 - 6280 - /* GFX8 emits 128 dw nop to prevent DE do vm_flush before CE finish CEIB */ 6281 - if (usepfp) 6282 - amdgpu_ring_insert_nop(ring, 128); 6243 + int usepfp = (ring->funcs->type == AMDGPU_RING_TYPE_GFX); 6283 6244 6284 6245 amdgpu_ring_write(ring, PACKET3(PACKET3_WRITE_DATA, 3)); 6285 6246 amdgpu_ring_write(ring, (WRITE_DATA_ENGINE_SEL(usepfp) | ··· 6389 6358 amdgpu_ring_write(ring, PACKET3(PACKET3_CONTEXT_CONTROL, 1)); 6390 6359 amdgpu_ring_write(ring, dw2); 6391 6360 amdgpu_ring_write(ring, 0); 6392 - } 6393 - 6394 - static unsigned gfx_v8_0_ring_get_emit_ib_size_gfx(struct amdgpu_ring *ring) 6395 - { 6396 - return 6397 - 4; /* gfx_v8_0_ring_emit_ib_gfx */ 6398 - } 6399 - 6400 - static unsigned gfx_v8_0_ring_get_dma_frame_size_gfx(struct amdgpu_ring *ring) 6401 - { 6402 - return 6403 - 20 + /* gfx_v8_0_ring_emit_gds_switch */ 6404 - 7 + /* gfx_v8_0_ring_emit_hdp_flush */ 6405 - 5 + /* gfx_v8_0_ring_emit_hdp_invalidate */ 6406 - 6 + 6 + 6 +/* gfx_v8_0_ring_emit_fence_gfx x3 for user fence, vm fence */ 6407 - 7 + /* gfx_v8_0_ring_emit_pipeline_sync */ 6408 - 256 + 19 + /* gfx_v8_0_ring_emit_vm_flush */ 6409 - 2 + /* gfx_v8_ring_emit_sb */ 6410 - 3; /* gfx_v8_ring_emit_cntxcntl */ 6411 - } 6412 - 6413 - static unsigned gfx_v8_0_ring_get_emit_ib_size_compute(struct amdgpu_ring *ring) 6414 - { 6415 - return 6416 - 4; /* gfx_v8_0_ring_emit_ib_compute */ 6417 - } 6418 - 6419 - static unsigned gfx_v8_0_ring_get_dma_frame_size_compute(struct amdgpu_ring *ring) 6420 - { 6421 - return 6422 - 20 + /* gfx_v8_0_ring_emit_gds_switch */ 6423 - 7 + /* gfx_v8_0_ring_emit_hdp_flush */ 6424 - 5 + /* gfx_v8_0_ring_emit_hdp_invalidate */ 6425 - 7 + /* gfx_v8_0_ring_emit_pipeline_sync */ 6426 - 17 + /* gfx_v8_0_ring_emit_vm_flush */ 6427 - 7 + 7 + 7; /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */ 6428 6361 } 6429 6362 6430 6363 static void gfx_v8_0_set_gfx_eop_interrupt_state(struct amdgpu_device *adev, ··· 6536 6541 return 0; 6537 6542 } 6538 6543 6539 - const struct amd_ip_funcs gfx_v8_0_ip_funcs = { 6544 + static const struct amd_ip_funcs gfx_v8_0_ip_funcs = { 6540 6545 .name = "gfx_v8_0", 6541 6546 .early_init = gfx_v8_0_early_init, 6542 6547 .late_init = gfx_v8_0_late_init, ··· 6557 6562 }; 6558 6563 6559 6564 static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_gfx = { 6565 + .type = AMDGPU_RING_TYPE_GFX, 6566 + .align_mask = 0xff, 6567 + .nop = PACKET3(PACKET3_NOP, 0x3FFF), 6560 6568 .get_rptr = gfx_v8_0_ring_get_rptr, 6561 6569 .get_wptr = gfx_v8_0_ring_get_wptr_gfx, 6562 6570 .set_wptr = gfx_v8_0_ring_set_wptr_gfx, 6563 - .parse_cs = NULL, 6571 + .emit_frame_size = 6572 + 20 + /* gfx_v8_0_ring_emit_gds_switch */ 6573 + 7 + /* gfx_v8_0_ring_emit_hdp_flush */ 6574 + 5 + /* gfx_v8_0_ring_emit_hdp_invalidate */ 6575 + 6 + 6 + 6 +/* gfx_v8_0_ring_emit_fence_gfx x3 for user fence, vm fence */ 6576 + 7 + /* gfx_v8_0_ring_emit_pipeline_sync */ 6577 + 128 + 19 + /* gfx_v8_0_ring_emit_vm_flush */ 6578 + 2 + /* gfx_v8_ring_emit_sb */ 6579 + 3, /* gfx_v8_ring_emit_cntxcntl */ 6580 + .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_gfx */ 6564 6581 .emit_ib = gfx_v8_0_ring_emit_ib_gfx, 6565 6582 .emit_fence = gfx_v8_0_ring_emit_fence_gfx, 6566 6583 .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync, ··· 6586 6579 .pad_ib = amdgpu_ring_generic_pad_ib, 6587 6580 .emit_switch_buffer = gfx_v8_ring_emit_sb, 6588 6581 .emit_cntxcntl = gfx_v8_ring_emit_cntxcntl, 6589 - .get_emit_ib_size = gfx_v8_0_ring_get_emit_ib_size_gfx, 6590 - .get_dma_frame_size = gfx_v8_0_ring_get_dma_frame_size_gfx, 6591 6582 }; 6592 6583 6593 6584 static const struct amdgpu_ring_funcs gfx_v8_0_ring_funcs_compute = { 6585 + .type = AMDGPU_RING_TYPE_COMPUTE, 6586 + .align_mask = 0xff, 6587 + .nop = PACKET3(PACKET3_NOP, 0x3FFF), 6594 6588 .get_rptr = gfx_v8_0_ring_get_rptr, 6595 6589 .get_wptr = gfx_v8_0_ring_get_wptr_compute, 6596 6590 .set_wptr = gfx_v8_0_ring_set_wptr_compute, 6597 - .parse_cs = NULL, 6591 + .emit_frame_size = 6592 + 20 + /* gfx_v8_0_ring_emit_gds_switch */ 6593 + 7 + /* gfx_v8_0_ring_emit_hdp_flush */ 6594 + 5 + /* gfx_v8_0_ring_emit_hdp_invalidate */ 6595 + 7 + /* gfx_v8_0_ring_emit_pipeline_sync */ 6596 + 17 + /* gfx_v8_0_ring_emit_vm_flush */ 6597 + 7 + 7 + 7, /* gfx_v8_0_ring_emit_fence_compute x3 for user fence, vm fence */ 6598 + .emit_ib_size = 4, /* gfx_v8_0_ring_emit_ib_compute */ 6598 6599 .emit_ib = gfx_v8_0_ring_emit_ib_compute, 6599 6600 .emit_fence = gfx_v8_0_ring_emit_fence_compute, 6600 6601 .emit_pipeline_sync = gfx_v8_0_ring_emit_pipeline_sync, ··· 6614 6599 .test_ib = gfx_v8_0_ring_test_ib, 6615 6600 .insert_nop = amdgpu_ring_insert_nop, 6616 6601 .pad_ib = amdgpu_ring_generic_pad_ib, 6617 - .get_emit_ib_size = gfx_v8_0_ring_get_emit_ib_size_compute, 6618 - .get_dma_frame_size = gfx_v8_0_ring_get_dma_frame_size_compute, 6619 6602 }; 6620 6603 6621 6604 static void gfx_v8_0_set_ring_funcs(struct amdgpu_device *adev) ··· 6766 6753 cu_info->number = active_cu_number; 6767 6754 cu_info->ao_cu_mask = ao_cu_mask; 6768 6755 } 6756 + 6757 + const struct amdgpu_ip_block_version gfx_v8_0_ip_block = 6758 + { 6759 + .type = AMD_IP_BLOCK_TYPE_GFX, 6760 + .major = 8, 6761 + .minor = 0, 6762 + .rev = 0, 6763 + .funcs = &gfx_v8_0_ip_funcs, 6764 + }; 6765 + 6766 + const struct amdgpu_ip_block_version gfx_v8_1_ip_block = 6767 + { 6768 + .type = AMD_IP_BLOCK_TYPE_GFX, 6769 + .major = 8, 6770 + .minor = 1, 6771 + .rev = 0, 6772 + .funcs = &gfx_v8_0_ip_funcs, 6773 + };
+2 -1
drivers/gpu/drm/amd/amdgpu/gfx_v8_0.h
··· 24 24 #ifndef __GFX_V8_0_H__ 25 25 #define __GFX_V8_0_H__ 26 26 27 - extern const struct amd_ip_funcs gfx_v8_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version gfx_v8_0_ip_block; 28 + extern const struct amdgpu_ip_block_version gfx_v8_1_ip_block; 28 29 29 30 #endif
+9 -1
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c
··· 1030 1030 return 0; 1031 1031 } 1032 1032 1033 - const struct amd_ip_funcs gmc_v6_0_ip_funcs = { 1033 + static const struct amd_ip_funcs gmc_v6_0_ip_funcs = { 1034 1034 .name = "gmc_v6_0", 1035 1035 .early_init = gmc_v6_0_early_init, 1036 1036 .late_init = gmc_v6_0_late_init, ··· 1069 1069 adev->mc.vm_fault.funcs = &gmc_v6_0_irq_funcs; 1070 1070 } 1071 1071 1072 + const struct amdgpu_ip_block_version gmc_v6_0_ip_block = 1073 + { 1074 + .type = AMD_IP_BLOCK_TYPE_GMC, 1075 + .major = 6, 1076 + .minor = 0, 1077 + .rev = 0, 1078 + .funcs = &gmc_v6_0_ip_funcs, 1079 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/gmc_v6_0.h
··· 24 24 #ifndef __GMC_V6_0_H__ 25 25 #define __GMC_V6_0_H__ 26 26 27 - extern const struct amd_ip_funcs gmc_v6_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version gmc_v6_0_ip_block; 28 28 29 29 #endif
+19 -1
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c
··· 1235 1235 return 0; 1236 1236 } 1237 1237 1238 - const struct amd_ip_funcs gmc_v7_0_ip_funcs = { 1238 + static const struct amd_ip_funcs gmc_v7_0_ip_funcs = { 1239 1239 .name = "gmc_v7_0", 1240 1240 .early_init = gmc_v7_0_early_init, 1241 1241 .late_init = gmc_v7_0_late_init, ··· 1273 1273 adev->mc.vm_fault.num_types = 1; 1274 1274 adev->mc.vm_fault.funcs = &gmc_v7_0_irq_funcs; 1275 1275 } 1276 + 1277 + const struct amdgpu_ip_block_version gmc_v7_0_ip_block = 1278 + { 1279 + .type = AMD_IP_BLOCK_TYPE_GMC, 1280 + .major = 7, 1281 + .minor = 0, 1282 + .rev = 0, 1283 + .funcs = &gmc_v7_0_ip_funcs, 1284 + }; 1285 + 1286 + const struct amdgpu_ip_block_version gmc_v7_4_ip_block = 1287 + { 1288 + .type = AMD_IP_BLOCK_TYPE_GMC, 1289 + .major = 7, 1290 + .minor = 4, 1291 + .rev = 0, 1292 + .funcs = &gmc_v7_0_ip_funcs, 1293 + };
+2 -1
drivers/gpu/drm/amd/amdgpu/gmc_v7_0.h
··· 24 24 #ifndef __GMC_V7_0_H__ 25 25 #define __GMC_V7_0_H__ 26 26 27 - extern const struct amd_ip_funcs gmc_v7_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version gmc_v7_0_ip_block; 28 + extern const struct amdgpu_ip_block_version gmc_v7_4_ip_block; 28 29 29 30 #endif
+28 -1
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c
··· 1436 1436 return 0; 1437 1437 } 1438 1438 1439 - const struct amd_ip_funcs gmc_v8_0_ip_funcs = { 1439 + static const struct amd_ip_funcs gmc_v8_0_ip_funcs = { 1440 1440 .name = "gmc_v8_0", 1441 1441 .early_init = gmc_v8_0_early_init, 1442 1442 .late_init = gmc_v8_0_late_init, ··· 1477 1477 adev->mc.vm_fault.num_types = 1; 1478 1478 adev->mc.vm_fault.funcs = &gmc_v8_0_irq_funcs; 1479 1479 } 1480 + 1481 + const struct amdgpu_ip_block_version gmc_v8_0_ip_block = 1482 + { 1483 + .type = AMD_IP_BLOCK_TYPE_GMC, 1484 + .major = 8, 1485 + .minor = 0, 1486 + .rev = 0, 1487 + .funcs = &gmc_v8_0_ip_funcs, 1488 + }; 1489 + 1490 + const struct amdgpu_ip_block_version gmc_v8_1_ip_block = 1491 + { 1492 + .type = AMD_IP_BLOCK_TYPE_GMC, 1493 + .major = 8, 1494 + .minor = 1, 1495 + .rev = 0, 1496 + .funcs = &gmc_v8_0_ip_funcs, 1497 + }; 1498 + 1499 + const struct amdgpu_ip_block_version gmc_v8_5_ip_block = 1500 + { 1501 + .type = AMD_IP_BLOCK_TYPE_GMC, 1502 + .major = 8, 1503 + .minor = 5, 1504 + .rev = 0, 1505 + .funcs = &gmc_v8_0_ip_funcs, 1506 + };
+3 -1
drivers/gpu/drm/amd/amdgpu/gmc_v8_0.h
··· 24 24 #ifndef __GMC_V8_0_H__ 25 25 #define __GMC_V8_0_H__ 26 26 27 - extern const struct amd_ip_funcs gmc_v8_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version gmc_v8_0_ip_block; 28 + extern const struct amdgpu_ip_block_version gmc_v8_1_ip_block; 29 + extern const struct amdgpu_ip_block_version gmc_v8_5_ip_block; 28 30 29 31 #endif
+9 -1
drivers/gpu/drm/amd/amdgpu/iceland_ih.c
··· 392 392 return 0; 393 393 } 394 394 395 - const struct amd_ip_funcs iceland_ih_ip_funcs = { 395 + static const struct amd_ip_funcs iceland_ih_ip_funcs = { 396 396 .name = "iceland_ih", 397 397 .early_init = iceland_ih_early_init, 398 398 .late_init = NULL, ··· 421 421 adev->irq.ih_funcs = &iceland_ih_funcs; 422 422 } 423 423 424 + const struct amdgpu_ip_block_version iceland_ih_ip_block = 425 + { 426 + .type = AMD_IP_BLOCK_TYPE_IH, 427 + .major = 2, 428 + .minor = 4, 429 + .rev = 0, 430 + .funcs = &iceland_ih_ip_funcs, 431 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/iceland_ih.h
··· 24 24 #ifndef __ICELAND_IH_H__ 25 25 #define __ICELAND_IH_H__ 26 26 27 - extern const struct amd_ip_funcs iceland_ih_ip_funcs; 27 + extern const struct amdgpu_ip_block_version iceland_ih_ip_block; 28 28 29 29 #endif /* __ICELAND_IH_H__ */
+24 -1
drivers/gpu/drm/amd/amdgpu/kv_dpm.c
··· 2796 2796 adev->pm.dpm.num_ps = state_array->ucNumEntries; 2797 2797 2798 2798 /* fill in the vce power states */ 2799 - for (i = 0; i < AMDGPU_MAX_VCE_LEVELS; i++) { 2799 + for (i = 0; i < adev->pm.dpm.num_of_vce_states; i++) { 2800 2800 u32 sclk; 2801 2801 clock_array_index = adev->pm.dpm.vce_states[i].clk_idx; 2802 2802 clock_info = (union pplib_clock_info *) ··· 3243 3243 return 0; 3244 3244 } 3245 3245 3246 + static int kv_check_state_equal(struct amdgpu_device *adev, 3247 + struct amdgpu_ps *cps, 3248 + struct amdgpu_ps *rps, 3249 + bool *equal) 3250 + { 3251 + if (equal == NULL) 3252 + return -EINVAL; 3253 + 3254 + *equal = false; 3255 + return 0; 3256 + } 3257 + 3246 3258 const struct amd_ip_funcs kv_dpm_ip_funcs = { 3247 3259 .name = "kv_dpm", 3248 3260 .early_init = kv_dpm_early_init, ··· 3285 3273 .force_performance_level = &kv_dpm_force_performance_level, 3286 3274 .powergate_uvd = &kv_dpm_powergate_uvd, 3287 3275 .enable_bapm = &kv_dpm_enable_bapm, 3276 + .get_vce_clock_state = amdgpu_get_vce_clock_state, 3277 + .check_state_equal = kv_check_state_equal, 3288 3278 }; 3289 3279 3290 3280 static void kv_dpm_set_dpm_funcs(struct amdgpu_device *adev) ··· 3305 3291 adev->pm.dpm.thermal.irq.num_types = AMDGPU_THERMAL_IRQ_LAST; 3306 3292 adev->pm.dpm.thermal.irq.funcs = &kv_dpm_irq_funcs; 3307 3293 } 3294 + 3295 + const struct amdgpu_ip_block_version kv_dpm_ip_block = 3296 + { 3297 + .type = AMD_IP_BLOCK_TYPE_SMC, 3298 + .major = 7, 3299 + .minor = 0, 3300 + .rev = 0, 3301 + .funcs = &kv_dpm_ip_funcs, 3302 + };
+24 -25
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.c
··· 232 232 233 233 for (i = 0; i < count; i++) 234 234 if (sdma && sdma->burst_nop && (i == 0)) 235 - amdgpu_ring_write(ring, ring->nop | 235 + amdgpu_ring_write(ring, ring->funcs->nop | 236 236 SDMA_PKT_NOP_HEADER_COUNT(count - 1)); 237 237 else 238 - amdgpu_ring_write(ring, ring->nop); 238 + amdgpu_ring_write(ring, ring->funcs->nop); 239 239 } 240 240 241 241 /** ··· 902 902 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */ 903 903 } 904 904 905 - static unsigned sdma_v2_4_ring_get_emit_ib_size(struct amdgpu_ring *ring) 906 - { 907 - return 908 - 7 + 6; /* sdma_v2_4_ring_emit_ib */ 909 - } 910 - 911 - static unsigned sdma_v2_4_ring_get_dma_frame_size(struct amdgpu_ring *ring) 912 - { 913 - return 914 - 6 + /* sdma_v2_4_ring_emit_hdp_flush */ 915 - 3 + /* sdma_v2_4_ring_emit_hdp_invalidate */ 916 - 6 + /* sdma_v2_4_ring_emit_pipeline_sync */ 917 - 12 + /* sdma_v2_4_ring_emit_vm_flush */ 918 - 10 + 10 + 10; /* sdma_v2_4_ring_emit_fence x3 for user fence, vm fence */ 919 - } 920 - 921 905 static int sdma_v2_4_early_init(void *handle) 922 906 { 923 907 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 949 965 ring->use_doorbell = false; 950 966 sprintf(ring->name, "sdma%d", i); 951 967 r = amdgpu_ring_init(adev, ring, 1024, 952 - SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf, 953 968 &adev->sdma.trap_irq, 954 969 (i == 0) ? 955 - AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1, 956 - AMDGPU_RING_TYPE_SDMA); 970 + AMDGPU_SDMA_IRQ_TRAP0 : 971 + AMDGPU_SDMA_IRQ_TRAP1); 957 972 if (r) 958 973 return r; 959 974 } ··· 1187 1204 return 0; 1188 1205 } 1189 1206 1190 - const struct amd_ip_funcs sdma_v2_4_ip_funcs = { 1207 + static const struct amd_ip_funcs sdma_v2_4_ip_funcs = { 1191 1208 .name = "sdma_v2_4", 1192 1209 .early_init = sdma_v2_4_early_init, 1193 1210 .late_init = NULL, ··· 1205 1222 }; 1206 1223 1207 1224 static const struct amdgpu_ring_funcs sdma_v2_4_ring_funcs = { 1225 + .type = AMDGPU_RING_TYPE_SDMA, 1226 + .align_mask = 0xf, 1227 + .nop = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 1208 1228 .get_rptr = sdma_v2_4_ring_get_rptr, 1209 1229 .get_wptr = sdma_v2_4_ring_get_wptr, 1210 1230 .set_wptr = sdma_v2_4_ring_set_wptr, 1211 - .parse_cs = NULL, 1231 + .emit_frame_size = 1232 + 6 + /* sdma_v2_4_ring_emit_hdp_flush */ 1233 + 3 + /* sdma_v2_4_ring_emit_hdp_invalidate */ 1234 + 6 + /* sdma_v2_4_ring_emit_pipeline_sync */ 1235 + 12 + /* sdma_v2_4_ring_emit_vm_flush */ 1236 + 10 + 10 + 10, /* sdma_v2_4_ring_emit_fence x3 for user fence, vm fence */ 1237 + .emit_ib_size = 7 + 6, /* sdma_v2_4_ring_emit_ib */ 1212 1238 .emit_ib = sdma_v2_4_ring_emit_ib, 1213 1239 .emit_fence = sdma_v2_4_ring_emit_fence, 1214 1240 .emit_pipeline_sync = sdma_v2_4_ring_emit_pipeline_sync, ··· 1228 1236 .test_ib = sdma_v2_4_ring_test_ib, 1229 1237 .insert_nop = sdma_v2_4_ring_insert_nop, 1230 1238 .pad_ib = sdma_v2_4_ring_pad_ib, 1231 - .get_emit_ib_size = sdma_v2_4_ring_get_emit_ib_size, 1232 - .get_dma_frame_size = sdma_v2_4_ring_get_dma_frame_size, 1233 1239 }; 1234 1240 1235 1241 static void sdma_v2_4_set_ring_funcs(struct amdgpu_device *adev) ··· 1340 1350 adev->vm_manager.vm_pte_num_rings = adev->sdma.num_instances; 1341 1351 } 1342 1352 } 1353 + 1354 + const struct amdgpu_ip_block_version sdma_v2_4_ip_block = 1355 + { 1356 + .type = AMD_IP_BLOCK_TYPE_SDMA, 1357 + .major = 2, 1358 + .minor = 4, 1359 + .rev = 0, 1360 + .funcs = &sdma_v2_4_ip_funcs, 1361 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/sdma_v2_4.h
··· 24 24 #ifndef __SDMA_V2_4_H__ 25 25 #define __SDMA_V2_4_H__ 26 26 27 - extern const struct amd_ip_funcs sdma_v2_4_ip_funcs; 27 + extern const struct amdgpu_ip_block_version sdma_v2_4_ip_block; 28 28 29 29 #endif
+33 -25
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.c
··· 392 392 393 393 for (i = 0; i < count; i++) 394 394 if (sdma && sdma->burst_nop && (i == 0)) 395 - amdgpu_ring_write(ring, ring->nop | 395 + amdgpu_ring_write(ring, ring->funcs->nop | 396 396 SDMA_PKT_NOP_HEADER_COUNT(count - 1)); 397 397 else 398 - amdgpu_ring_write(ring, ring->nop); 398 + amdgpu_ring_write(ring, ring->funcs->nop); 399 399 } 400 400 401 401 /** ··· 1104 1104 SDMA_PKT_POLL_REGMEM_DW5_INTERVAL(10)); /* retry count, poll interval */ 1105 1105 } 1106 1106 1107 - static unsigned sdma_v3_0_ring_get_emit_ib_size(struct amdgpu_ring *ring) 1108 - { 1109 - return 1110 - 7 + 6; /* sdma_v3_0_ring_emit_ib */ 1111 - } 1112 - 1113 - static unsigned sdma_v3_0_ring_get_dma_frame_size(struct amdgpu_ring *ring) 1114 - { 1115 - return 1116 - 6 + /* sdma_v3_0_ring_emit_hdp_flush */ 1117 - 3 + /* sdma_v3_0_ring_emit_hdp_invalidate */ 1118 - 6 + /* sdma_v3_0_ring_emit_pipeline_sync */ 1119 - 12 + /* sdma_v3_0_ring_emit_vm_flush */ 1120 - 10 + 10 + 10; /* sdma_v3_0_ring_emit_fence x3 for user fence, vm fence */ 1121 - } 1122 - 1123 1107 static int sdma_v3_0_early_init(void *handle) 1124 1108 { 1125 1109 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 1161 1177 1162 1178 sprintf(ring->name, "sdma%d", i); 1163 1179 r = amdgpu_ring_init(adev, ring, 1024, 1164 - SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 0xf, 1165 1180 &adev->sdma.trap_irq, 1166 1181 (i == 0) ? 1167 - AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1, 1168 - AMDGPU_RING_TYPE_SDMA); 1182 + AMDGPU_SDMA_IRQ_TRAP0 : 1183 + AMDGPU_SDMA_IRQ_TRAP1); 1169 1184 if (r) 1170 1185 return r; 1171 1186 } ··· 1527 1544 return 0; 1528 1545 } 1529 1546 1530 - const struct amd_ip_funcs sdma_v3_0_ip_funcs = { 1547 + static const struct amd_ip_funcs sdma_v3_0_ip_funcs = { 1531 1548 .name = "sdma_v3_0", 1532 1549 .early_init = sdma_v3_0_early_init, 1533 1550 .late_init = NULL, ··· 1548 1565 }; 1549 1566 1550 1567 static const struct amdgpu_ring_funcs sdma_v3_0_ring_funcs = { 1568 + .type = AMDGPU_RING_TYPE_SDMA, 1569 + .align_mask = 0xf, 1570 + .nop = SDMA_PKT_NOP_HEADER_OP(SDMA_OP_NOP), 1551 1571 .get_rptr = sdma_v3_0_ring_get_rptr, 1552 1572 .get_wptr = sdma_v3_0_ring_get_wptr, 1553 1573 .set_wptr = sdma_v3_0_ring_set_wptr, 1554 - .parse_cs = NULL, 1574 + .emit_frame_size = 1575 + 6 + /* sdma_v3_0_ring_emit_hdp_flush */ 1576 + 3 + /* sdma_v3_0_ring_emit_hdp_invalidate */ 1577 + 6 + /* sdma_v3_0_ring_emit_pipeline_sync */ 1578 + 12 + /* sdma_v3_0_ring_emit_vm_flush */ 1579 + 10 + 10 + 10, /* sdma_v3_0_ring_emit_fence x3 for user fence, vm fence */ 1580 + .emit_ib_size = 7 + 6, /* sdma_v3_0_ring_emit_ib */ 1555 1581 .emit_ib = sdma_v3_0_ring_emit_ib, 1556 1582 .emit_fence = sdma_v3_0_ring_emit_fence, 1557 1583 .emit_pipeline_sync = sdma_v3_0_ring_emit_pipeline_sync, ··· 1571 1579 .test_ib = sdma_v3_0_ring_test_ib, 1572 1580 .insert_nop = sdma_v3_0_ring_insert_nop, 1573 1581 .pad_ib = sdma_v3_0_ring_pad_ib, 1574 - .get_emit_ib_size = sdma_v3_0_ring_get_emit_ib_size, 1575 - .get_dma_frame_size = sdma_v3_0_ring_get_dma_frame_size, 1576 1582 }; 1577 1583 1578 1584 static void sdma_v3_0_set_ring_funcs(struct amdgpu_device *adev) ··· 1683 1693 adev->vm_manager.vm_pte_num_rings = adev->sdma.num_instances; 1684 1694 } 1685 1695 } 1696 + 1697 + const struct amdgpu_ip_block_version sdma_v3_0_ip_block = 1698 + { 1699 + .type = AMD_IP_BLOCK_TYPE_SDMA, 1700 + .major = 3, 1701 + .minor = 0, 1702 + .rev = 0, 1703 + .funcs = &sdma_v3_0_ip_funcs, 1704 + }; 1705 + 1706 + const struct amdgpu_ip_block_version sdma_v3_1_ip_block = 1707 + { 1708 + .type = AMD_IP_BLOCK_TYPE_SDMA, 1709 + .major = 3, 1710 + .minor = 1, 1711 + .rev = 0, 1712 + .funcs = &sdma_v3_0_ip_funcs, 1713 + };
+2 -1
drivers/gpu/drm/amd/amdgpu/sdma_v3_0.h
··· 24 24 #ifndef __SDMA_V3_0_H__ 25 25 #define __SDMA_V3_0_H__ 26 26 27 - extern const struct amd_ip_funcs sdma_v3_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version sdma_v3_0_ip_block; 28 + extern const struct amdgpu_ip_block_version sdma_v3_1_ip_block; 28 29 29 30 #endif
+43 -119
drivers/gpu/drm/amd/amdgpu/si.c
··· 39 39 #include "si_dma.h" 40 40 #include "dce_v6_0.h" 41 41 #include "si.h" 42 + #include "dce_virtual.h" 42 43 43 44 static const u32 tahiti_golden_registers[] = 44 45 { ··· 906 905 spin_unlock_irqrestore(&adev->pcie_idx_lock, flags); 907 906 } 908 907 909 - u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg) 908 + static u32 si_pciep_rreg(struct amdgpu_device *adev, u32 reg) 910 909 { 911 910 unsigned long flags; 912 911 u32 r; ··· 919 918 return r; 920 919 } 921 920 922 - void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 921 + static void si_pciep_wreg(struct amdgpu_device *adev, u32 reg, u32 v) 923 922 { 924 923 unsigned long flags; 925 924 ··· 1812 1811 return 0; 1813 1812 } 1814 1813 1815 - const struct amd_ip_funcs si_common_ip_funcs = { 1814 + static const struct amd_ip_funcs si_common_ip_funcs = { 1816 1815 .name = "si_common", 1817 1816 .early_init = si_common_early_init, 1818 1817 .late_init = NULL, ··· 1829 1828 .set_powergating_state = si_common_set_powergating_state, 1830 1829 }; 1831 1830 1832 - static const struct amdgpu_ip_block_version verde_ip_blocks[] = 1831 + static const struct amdgpu_ip_block_version si_common_ip_block = 1833 1832 { 1834 - { 1835 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1836 - .major = 1, 1837 - .minor = 0, 1838 - .rev = 0, 1839 - .funcs = &si_common_ip_funcs, 1840 - }, 1841 - { 1842 - .type = AMD_IP_BLOCK_TYPE_GMC, 1843 - .major = 6, 1844 - .minor = 0, 1845 - .rev = 0, 1846 - .funcs = &gmc_v6_0_ip_funcs, 1847 - }, 1848 - { 1849 - .type = AMD_IP_BLOCK_TYPE_IH, 1850 - .major = 1, 1851 - .minor = 0, 1852 - .rev = 0, 1853 - .funcs = &si_ih_ip_funcs, 1854 - }, 1855 - { 1856 - .type = AMD_IP_BLOCK_TYPE_SMC, 1857 - .major = 6, 1858 - .minor = 0, 1859 - .rev = 0, 1860 - .funcs = &amdgpu_pp_ip_funcs, 1861 - }, 1862 - { 1863 - .type = AMD_IP_BLOCK_TYPE_DCE, 1864 - .major = 6, 1865 - .minor = 0, 1866 - .rev = 0, 1867 - .funcs = &dce_v6_0_ip_funcs, 1868 - }, 1869 - { 1870 - .type = AMD_IP_BLOCK_TYPE_GFX, 1871 - .major = 6, 1872 - .minor = 0, 1873 - .rev = 0, 1874 - .funcs = &gfx_v6_0_ip_funcs, 1875 - }, 1876 - { 1877 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1878 - .major = 1, 1879 - .minor = 0, 1880 - .rev = 0, 1881 - .funcs = &si_dma_ip_funcs, 1882 - }, 1883 - /* { 1884 - .type = AMD_IP_BLOCK_TYPE_UVD, 1885 - .major = 3, 1886 - .minor = 1, 1887 - .rev = 0, 1888 - .funcs = &si_null_ip_funcs, 1889 - }, 1890 - { 1891 - .type = AMD_IP_BLOCK_TYPE_VCE, 1892 - .major = 1, 1893 - .minor = 0, 1894 - .rev = 0, 1895 - .funcs = &si_null_ip_funcs, 1896 - }, 1897 - */ 1898 - }; 1899 - 1900 - 1901 - static const struct amdgpu_ip_block_version hainan_ip_blocks[] = 1902 - { 1903 - { 1904 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1905 - .major = 1, 1906 - .minor = 0, 1907 - .rev = 0, 1908 - .funcs = &si_common_ip_funcs, 1909 - }, 1910 - { 1911 - .type = AMD_IP_BLOCK_TYPE_GMC, 1912 - .major = 6, 1913 - .minor = 0, 1914 - .rev = 0, 1915 - .funcs = &gmc_v6_0_ip_funcs, 1916 - }, 1917 - { 1918 - .type = AMD_IP_BLOCK_TYPE_IH, 1919 - .major = 1, 1920 - .minor = 0, 1921 - .rev = 0, 1922 - .funcs = &si_ih_ip_funcs, 1923 - }, 1924 - { 1925 - .type = AMD_IP_BLOCK_TYPE_SMC, 1926 - .major = 6, 1927 - .minor = 0, 1928 - .rev = 0, 1929 - .funcs = &amdgpu_pp_ip_funcs, 1930 - }, 1931 - { 1932 - .type = AMD_IP_BLOCK_TYPE_GFX, 1933 - .major = 6, 1934 - .minor = 0, 1935 - .rev = 0, 1936 - .funcs = &gfx_v6_0_ip_funcs, 1937 - }, 1938 - { 1939 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1940 - .major = 1, 1941 - .minor = 0, 1942 - .rev = 0, 1943 - .funcs = &si_dma_ip_funcs, 1944 - }, 1833 + .type = AMD_IP_BLOCK_TYPE_COMMON, 1834 + .major = 1, 1835 + .minor = 0, 1836 + .rev = 0, 1837 + .funcs = &si_common_ip_funcs, 1945 1838 }; 1946 1839 1947 1840 int si_set_ip_blocks(struct amdgpu_device *adev) ··· 1844 1949 case CHIP_VERDE: 1845 1950 case CHIP_TAHITI: 1846 1951 case CHIP_PITCAIRN: 1952 + amdgpu_ip_block_add(adev, &si_common_ip_block); 1953 + amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block); 1954 + amdgpu_ip_block_add(adev, &si_ih_ip_block); 1955 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1956 + if (adev->enable_virtual_display) 1957 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1958 + else 1959 + amdgpu_ip_block_add(adev, &dce_v6_0_ip_block); 1960 + amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block); 1961 + amdgpu_ip_block_add(adev, &si_dma_ip_block); 1962 + /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */ 1963 + /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */ 1964 + break; 1847 1965 case CHIP_OLAND: 1848 - adev->ip_blocks = verde_ip_blocks; 1849 - adev->num_ip_blocks = ARRAY_SIZE(verde_ip_blocks); 1966 + amdgpu_ip_block_add(adev, &si_common_ip_block); 1967 + amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block); 1968 + amdgpu_ip_block_add(adev, &si_ih_ip_block); 1969 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1970 + if (adev->enable_virtual_display) 1971 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1972 + else 1973 + amdgpu_ip_block_add(adev, &dce_v6_4_ip_block); 1974 + amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block); 1975 + amdgpu_ip_block_add(adev, &si_dma_ip_block); 1976 + /* amdgpu_ip_block_add(adev, &uvd_v3_1_ip_block); */ 1977 + /* amdgpu_ip_block_add(adev, &vce_v1_0_ip_block); */ 1850 1978 break; 1851 1979 case CHIP_HAINAN: 1852 - adev->ip_blocks = hainan_ip_blocks; 1853 - adev->num_ip_blocks = ARRAY_SIZE(hainan_ip_blocks); 1980 + amdgpu_ip_block_add(adev, &si_common_ip_block); 1981 + amdgpu_ip_block_add(adev, &gmc_v6_0_ip_block); 1982 + amdgpu_ip_block_add(adev, &si_ih_ip_block); 1983 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1984 + if (adev->enable_virtual_display) 1985 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1986 + amdgpu_ip_block_add(adev, &gfx_v6_0_ip_block); 1987 + amdgpu_ip_block_add(adev, &si_dma_ip_block); 1854 1988 break; 1855 1989 default: 1856 1990 BUG();
-2
drivers/gpu/drm/amd/amdgpu/si.h
··· 24 24 #ifndef __SI_H__ 25 25 #define __SI_H__ 26 26 27 - extern const struct amd_ip_funcs si_common_ip_funcs; 28 - 29 27 void si_srbm_select(struct amdgpu_device *adev, 30 28 u32 me, u32 pipe, u32 queue, u32 vmid); 31 29 int si_set_ip_blocks(struct amdgpu_device *adev);
+22 -23
drivers/gpu/drm/amd/amdgpu/si_dma.c
··· 495 495 amdgpu_ring_write(ring, (0 << 28) | 0x20); /* func(always) | poll interval */ 496 496 } 497 497 498 - static unsigned si_dma_ring_get_emit_ib_size(struct amdgpu_ring *ring) 499 - { 500 - return 501 - 7 + 3; /* si_dma_ring_emit_ib */ 502 - } 503 - 504 - static unsigned si_dma_ring_get_dma_frame_size(struct amdgpu_ring *ring) 505 - { 506 - return 507 - 3 + /* si_dma_ring_emit_hdp_flush */ 508 - 3 + /* si_dma_ring_emit_hdp_invalidate */ 509 - 6 + /* si_dma_ring_emit_pipeline_sync */ 510 - 12 + /* si_dma_ring_emit_vm_flush */ 511 - 9 + 9 + 9; /* si_dma_ring_emit_fence x3 for user fence, vm fence */ 512 - } 513 - 514 498 static int si_dma_early_init(void *handle) 515 499 { 516 500 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 531 547 ring->use_doorbell = false; 532 548 sprintf(ring->name, "sdma%d", i); 533 549 r = amdgpu_ring_init(adev, ring, 1024, 534 - DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0), 0xf, 535 550 &adev->sdma.trap_irq, 536 551 (i == 0) ? 537 - AMDGPU_SDMA_IRQ_TRAP0 : AMDGPU_SDMA_IRQ_TRAP1, 538 - AMDGPU_RING_TYPE_SDMA); 552 + AMDGPU_SDMA_IRQ_TRAP0 : 553 + AMDGPU_SDMA_IRQ_TRAP1); 539 554 if (r) 540 555 return r; 541 556 } ··· 745 762 return 0; 746 763 } 747 764 748 - const struct amd_ip_funcs si_dma_ip_funcs = { 765 + static const struct amd_ip_funcs si_dma_ip_funcs = { 749 766 .name = "si_dma", 750 767 .early_init = si_dma_early_init, 751 768 .late_init = NULL, ··· 763 780 }; 764 781 765 782 static const struct amdgpu_ring_funcs si_dma_ring_funcs = { 783 + .type = AMDGPU_RING_TYPE_SDMA, 784 + .align_mask = 0xf, 785 + .nop = DMA_PACKET(DMA_PACKET_NOP, 0, 0, 0, 0), 766 786 .get_rptr = si_dma_ring_get_rptr, 767 787 .get_wptr = si_dma_ring_get_wptr, 768 788 .set_wptr = si_dma_ring_set_wptr, 769 - .parse_cs = NULL, 789 + .emit_frame_size = 790 + 3 + /* si_dma_ring_emit_hdp_flush */ 791 + 3 + /* si_dma_ring_emit_hdp_invalidate */ 792 + 6 + /* si_dma_ring_emit_pipeline_sync */ 793 + 12 + /* si_dma_ring_emit_vm_flush */ 794 + 9 + 9 + 9, /* si_dma_ring_emit_fence x3 for user fence, vm fence */ 795 + .emit_ib_size = 7 + 3, /* si_dma_ring_emit_ib */ 770 796 .emit_ib = si_dma_ring_emit_ib, 771 797 .emit_fence = si_dma_ring_emit_fence, 772 798 .emit_pipeline_sync = si_dma_ring_emit_pipeline_sync, ··· 786 794 .test_ib = si_dma_ring_test_ib, 787 795 .insert_nop = amdgpu_ring_insert_nop, 788 796 .pad_ib = si_dma_ring_pad_ib, 789 - .get_emit_ib_size = si_dma_ring_get_emit_ib_size, 790 - .get_dma_frame_size = si_dma_ring_get_dma_frame_size, 791 797 }; 792 798 793 799 static void si_dma_set_ring_funcs(struct amdgpu_device *adev) ··· 903 913 adev->vm_manager.vm_pte_num_rings = adev->sdma.num_instances; 904 914 } 905 915 } 916 + 917 + const struct amdgpu_ip_block_version si_dma_ip_block = 918 + { 919 + .type = AMD_IP_BLOCK_TYPE_SDMA, 920 + .major = 1, 921 + .minor = 0, 922 + .rev = 0, 923 + .funcs = &si_dma_ip_funcs, 924 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/si_dma.h
··· 24 24 #ifndef __SI_DMA_H__ 25 25 #define __SI_DMA_H__ 26 26 27 - extern const struct amd_ip_funcs si_dma_ip_funcs; 27 + extern const struct amdgpu_ip_block_version si_dma_ip_block; 28 28 29 29 #endif
+64 -1
drivers/gpu/drm/amd/amdgpu/si_dpm.c
··· 3171 3171 eg_pi->current_rps = *rps; 3172 3172 ni_pi->current_ps = *new_ps; 3173 3173 eg_pi->current_rps.ps_priv = &ni_pi->current_ps; 3174 + adev->pm.dpm.current_ps = &eg_pi->current_rps; 3174 3175 } 3175 3176 3176 3177 static void ni_update_requested_ps(struct amdgpu_device *adev, ··· 3184 3183 eg_pi->requested_rps = *rps; 3185 3184 ni_pi->requested_ps = *new_ps; 3186 3185 eg_pi->requested_rps.ps_priv = &ni_pi->requested_ps; 3186 + adev->pm.dpm.requested_ps = &eg_pi->requested_rps; 3187 3187 } 3188 3188 3189 3189 static void ni_set_uvd_clock_before_set_eng_clock(struct amdgpu_device *adev, ··· 7322 7320 adev->pm.dpm.num_ps = state_array->ucNumEntries; 7323 7321 7324 7322 /* fill in the vce power states */ 7325 - for (i = 0; i < AMDGPU_MAX_VCE_LEVELS; i++) { 7323 + for (i = 0; i < adev->pm.dpm.num_of_vce_states; i++) { 7326 7324 u32 sclk, mclk; 7327 7325 clock_array_index = adev->pm.dpm.vce_states[i].clk_idx; 7328 7326 clock_info = (union pplib_clock_info *) ··· 7959 7957 return 0; 7960 7958 } 7961 7959 7960 + static inline bool si_are_power_levels_equal(const struct rv7xx_pl *si_cpl1, 7961 + const struct rv7xx_pl *si_cpl2) 7962 + { 7963 + return ((si_cpl1->mclk == si_cpl2->mclk) && 7964 + (si_cpl1->sclk == si_cpl2->sclk) && 7965 + (si_cpl1->pcie_gen == si_cpl2->pcie_gen) && 7966 + (si_cpl1->vddc == si_cpl2->vddc) && 7967 + (si_cpl1->vddci == si_cpl2->vddci)); 7968 + } 7969 + 7970 + static int si_check_state_equal(struct amdgpu_device *adev, 7971 + struct amdgpu_ps *cps, 7972 + struct amdgpu_ps *rps, 7973 + bool *equal) 7974 + { 7975 + struct si_ps *si_cps; 7976 + struct si_ps *si_rps; 7977 + int i; 7978 + 7979 + if (adev == NULL || cps == NULL || rps == NULL || equal == NULL) 7980 + return -EINVAL; 7981 + 7982 + si_cps = si_get_ps(cps); 7983 + si_rps = si_get_ps(rps); 7984 + 7985 + if (si_cps == NULL) { 7986 + printk("si_cps is NULL\n"); 7987 + *equal = false; 7988 + return 0; 7989 + } 7990 + 7991 + if (si_cps->performance_level_count != si_rps->performance_level_count) { 7992 + *equal = false; 7993 + return 0; 7994 + } 7995 + 7996 + for (i = 0; i < si_cps->performance_level_count; i++) { 7997 + if (!si_are_power_levels_equal(&(si_cps->performance_levels[i]), 7998 + &(si_rps->performance_levels[i]))) { 7999 + *equal = false; 8000 + return 0; 8001 + } 8002 + } 8003 + 8004 + /* If all performance levels are the same try to use the UVD clocks to break the tie.*/ 8005 + *equal = ((cps->vclk == rps->vclk) && (cps->dclk == rps->dclk)); 8006 + *equal &= ((cps->evclk == rps->evclk) && (cps->ecclk == rps->ecclk)); 8007 + 8008 + return 0; 8009 + } 8010 + 7962 8011 7963 8012 const struct amd_ip_funcs si_dpm_ip_funcs = { 7964 8013 .name = "si_dpm", ··· 8044 7991 .get_fan_control_mode = &si_dpm_get_fan_control_mode, 8045 7992 .set_fan_speed_percent = &si_dpm_set_fan_speed_percent, 8046 7993 .get_fan_speed_percent = &si_dpm_get_fan_speed_percent, 7994 + .check_state_equal = &si_check_state_equal, 7995 + .get_vce_clock_state = amdgpu_get_vce_clock_state, 8047 7996 }; 8048 7997 8049 7998 static void si_dpm_set_dpm_funcs(struct amdgpu_device *adev) ··· 8065 8010 adev->pm.dpm.thermal.irq.funcs = &si_dpm_irq_funcs; 8066 8011 } 8067 8012 8013 + const struct amdgpu_ip_block_version si_dpm_ip_block = 8014 + { 8015 + .type = AMD_IP_BLOCK_TYPE_SMC, 8016 + .major = 6, 8017 + .minor = 0, 8018 + .rev = 0, 8019 + .funcs = &si_dpm_ip_funcs, 8020 + };
+9 -1
drivers/gpu/drm/amd/amdgpu/si_ih.c
··· 268 268 return 0; 269 269 } 270 270 271 - const struct amd_ip_funcs si_ih_ip_funcs = { 271 + static const struct amd_ip_funcs si_ih_ip_funcs = { 272 272 .name = "si_ih", 273 273 .early_init = si_ih_early_init, 274 274 .late_init = NULL, ··· 297 297 adev->irq.ih_funcs = &si_ih_funcs; 298 298 } 299 299 300 + const struct amdgpu_ip_block_version si_ih_ip_block = 301 + { 302 + .type = AMD_IP_BLOCK_TYPE_IH, 303 + .major = 1, 304 + .minor = 0, 305 + .rev = 0, 306 + .funcs = &si_ih_ip_funcs, 307 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/si_ih.h
··· 24 24 #ifndef __SI_IH_H__ 25 25 #define __SI_IH_H__ 26 26 27 - extern const struct amd_ip_funcs si_ih_ip_funcs; 27 + extern const struct amdgpu_ip_block_version si_ih_ip_block; 28 28 29 29 #endif
+9 -1
drivers/gpu/drm/amd/amdgpu/tonga_ih.c
··· 455 455 return 0; 456 456 } 457 457 458 - const struct amd_ip_funcs tonga_ih_ip_funcs = { 458 + static const struct amd_ip_funcs tonga_ih_ip_funcs = { 459 459 .name = "tonga_ih", 460 460 .early_init = tonga_ih_early_init, 461 461 .late_init = NULL, ··· 487 487 adev->irq.ih_funcs = &tonga_ih_funcs; 488 488 } 489 489 490 + const struct amdgpu_ip_block_version tonga_ih_ip_block = 491 + { 492 + .type = AMD_IP_BLOCK_TYPE_IH, 493 + .major = 3, 494 + .minor = 0, 495 + .rev = 0, 496 + .funcs = &tonga_ih_ip_funcs, 497 + };
+2 -2
drivers/gpu/drm/amd/amdgpu/tonga_ih.h
··· 24 24 #ifndef __TONGA_IH_H__ 25 25 #define __TONGA_IH_H__ 26 26 27 - extern const struct amd_ip_funcs tonga_ih_ip_funcs; 27 + extern const struct amdgpu_ip_block_version tonga_ih_ip_block; 28 28 29 - #endif /* __CZ_IH_H__ */ 29 + #endif /* __TONGA_IH_H__ */
+41 -22
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.c
··· 36 36 37 37 #include "bif/bif_4_1_d.h" 38 38 39 + #include "smu/smu_7_0_1_d.h" 40 + #include "smu/smu_7_0_1_sh_mask.h" 41 + 39 42 static void uvd_v4_2_mc_resume(struct amdgpu_device *adev); 40 43 static void uvd_v4_2_init_cg(struct amdgpu_device *adev); 41 44 static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev); ··· 119 116 120 117 ring = &adev->uvd.ring; 121 118 sprintf(ring->name, "uvd"); 122 - r = amdgpu_ring_init(adev, ring, 512, PACKET0(mmUVD_NO_OP, 0), 0xf, 123 - &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD); 119 + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); 124 120 125 121 return r; 126 122 } ··· 528 526 amdgpu_ring_write(ring, ib->length_dw); 529 527 } 530 528 531 - static unsigned uvd_v4_2_ring_get_emit_ib_size(struct amdgpu_ring *ring) 532 - { 533 - return 534 - 4; /* uvd_v4_2_ring_emit_ib */ 535 - } 536 - 537 - static unsigned uvd_v4_2_ring_get_dma_frame_size(struct amdgpu_ring *ring) 538 - { 539 - return 540 - 2 + /* uvd_v4_2_ring_emit_hdp_flush */ 541 - 2 + /* uvd_v4_2_ring_emit_hdp_invalidate */ 542 - 14; /* uvd_v4_2_ring_emit_fence x1 no user fence */ 543 - } 544 - 545 529 /** 546 530 * uvd_v4_2_mc_resume - memory controller programming 547 531 * ··· 686 698 return 0; 687 699 } 688 700 701 + static void uvd_v5_0_set_bypass_mode(struct amdgpu_device *adev, bool enable) 702 + { 703 + u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); 704 + 705 + if (enable) 706 + tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | 707 + GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); 708 + else 709 + tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | 710 + GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); 711 + 712 + WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp); 713 + } 714 + 689 715 static int uvd_v4_2_set_clockgating_state(void *handle, 690 716 enum amd_clockgating_state state) 691 717 { 692 718 bool gate = false; 693 719 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 694 720 695 - if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) 696 - return 0; 697 - 698 721 if (state == AMD_CG_STATE_GATE) 699 722 gate = true; 723 + 724 + uvd_v5_0_set_bypass_mode(adev, gate); 725 + 726 + if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) 727 + return 0; 700 728 701 729 uvd_v4_2_enable_mgcg(adev, gate); 702 730 ··· 742 738 } 743 739 } 744 740 745 - const struct amd_ip_funcs uvd_v4_2_ip_funcs = { 741 + static const struct amd_ip_funcs uvd_v4_2_ip_funcs = { 746 742 .name = "uvd_v4_2", 747 743 .early_init = uvd_v4_2_early_init, 748 744 .late_init = NULL, ··· 760 756 }; 761 757 762 758 static const struct amdgpu_ring_funcs uvd_v4_2_ring_funcs = { 759 + .type = AMDGPU_RING_TYPE_UVD, 760 + .align_mask = 0xf, 761 + .nop = PACKET0(mmUVD_NO_OP, 0), 763 762 .get_rptr = uvd_v4_2_ring_get_rptr, 764 763 .get_wptr = uvd_v4_2_ring_get_wptr, 765 764 .set_wptr = uvd_v4_2_ring_set_wptr, 766 765 .parse_cs = amdgpu_uvd_ring_parse_cs, 766 + .emit_frame_size = 767 + 2 + /* uvd_v4_2_ring_emit_hdp_flush */ 768 + 2 + /* uvd_v4_2_ring_emit_hdp_invalidate */ 769 + 14, /* uvd_v4_2_ring_emit_fence x1 no user fence */ 770 + .emit_ib_size = 4, /* uvd_v4_2_ring_emit_ib */ 767 771 .emit_ib = uvd_v4_2_ring_emit_ib, 768 772 .emit_fence = uvd_v4_2_ring_emit_fence, 769 773 .emit_hdp_flush = uvd_v4_2_ring_emit_hdp_flush, ··· 782 770 .pad_ib = amdgpu_ring_generic_pad_ib, 783 771 .begin_use = amdgpu_uvd_ring_begin_use, 784 772 .end_use = amdgpu_uvd_ring_end_use, 785 - .get_emit_ib_size = uvd_v4_2_ring_get_emit_ib_size, 786 - .get_dma_frame_size = uvd_v4_2_ring_get_dma_frame_size, 787 773 }; 788 774 789 775 static void uvd_v4_2_set_ring_funcs(struct amdgpu_device *adev) ··· 799 789 adev->uvd.irq.num_types = 1; 800 790 adev->uvd.irq.funcs = &uvd_v4_2_irq_funcs; 801 791 } 792 + 793 + const struct amdgpu_ip_block_version uvd_v4_2_ip_block = 794 + { 795 + .type = AMD_IP_BLOCK_TYPE_UVD, 796 + .major = 4, 797 + .minor = 2, 798 + .rev = 0, 799 + .funcs = &uvd_v4_2_ip_funcs, 800 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/uvd_v4_2.h
··· 24 24 #ifndef __UVD_V4_2_H__ 25 25 #define __UVD_V4_2_H__ 26 26 27 - extern const struct amd_ip_funcs uvd_v4_2_ip_funcs; 27 + extern const struct amdgpu_ip_block_version uvd_v4_2_ip_block; 28 28 29 29 #endif
+37 -19
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.c
··· 33 33 #include "oss/oss_2_0_sh_mask.h" 34 34 #include "bif/bif_5_0_d.h" 35 35 #include "vi.h" 36 + #include "smu/smu_7_1_2_d.h" 37 + #include "smu/smu_7_1_2_sh_mask.h" 36 38 37 39 static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev); 38 40 static void uvd_v5_0_set_irq_funcs(struct amdgpu_device *adev); ··· 114 112 115 113 ring = &adev->uvd.ring; 116 114 sprintf(ring->name, "uvd"); 117 - r = amdgpu_ring_init(adev, ring, 512, PACKET0(mmUVD_NO_OP, 0), 0xf, 118 - &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD); 115 + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); 119 116 120 117 return r; 121 118 } ··· 578 577 amdgpu_ring_write(ring, ib->length_dw); 579 578 } 580 579 581 - static unsigned uvd_v5_0_ring_get_emit_ib_size(struct amdgpu_ring *ring) 582 - { 583 - return 584 - 6; /* uvd_v5_0_ring_emit_ib */ 585 - } 586 - 587 - static unsigned uvd_v5_0_ring_get_dma_frame_size(struct amdgpu_ring *ring) 588 - { 589 - return 590 - 2 + /* uvd_v5_0_ring_emit_hdp_flush */ 591 - 2 + /* uvd_v5_0_ring_emit_hdp_invalidate */ 592 - 14; /* uvd_v5_0_ring_emit_fence x1 no user fence */ 593 - } 594 - 595 580 static bool uvd_v5_0_is_idle(void *handle) 596 581 { 597 582 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 724 737 } 725 738 #endif 726 739 740 + static void uvd_v5_0_set_bypass_mode(struct amdgpu_device *adev, bool enable) 741 + { 742 + u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); 743 + 744 + if (enable) 745 + tmp |= (GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | 746 + GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); 747 + else 748 + tmp &= ~(GCK_DFS_BYPASS_CNTL__BYPASSDCLK_MASK | 749 + GCK_DFS_BYPASS_CNTL__BYPASSVCLK_MASK); 750 + 751 + WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp); 752 + } 753 + 727 754 static int uvd_v5_0_set_clockgating_state(void *handle, 728 755 enum amd_clockgating_state state) 729 756 { 730 757 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 731 758 bool enable = (state == AMD_CG_STATE_GATE) ? true : false; 732 759 static int curstate = -1; 760 + 761 + uvd_v5_0_set_bypass_mode(adev, enable); 733 762 734 763 if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) 735 764 return 0; ··· 792 789 } 793 790 } 794 791 795 - const struct amd_ip_funcs uvd_v5_0_ip_funcs = { 792 + static const struct amd_ip_funcs uvd_v5_0_ip_funcs = { 796 793 .name = "uvd_v5_0", 797 794 .early_init = uvd_v5_0_early_init, 798 795 .late_init = NULL, ··· 810 807 }; 811 808 812 809 static const struct amdgpu_ring_funcs uvd_v5_0_ring_funcs = { 810 + .type = AMDGPU_RING_TYPE_UVD, 811 + .align_mask = 0xf, 812 + .nop = PACKET0(mmUVD_NO_OP, 0), 813 813 .get_rptr = uvd_v5_0_ring_get_rptr, 814 814 .get_wptr = uvd_v5_0_ring_get_wptr, 815 815 .set_wptr = uvd_v5_0_ring_set_wptr, 816 816 .parse_cs = amdgpu_uvd_ring_parse_cs, 817 + .emit_frame_size = 818 + 2 + /* uvd_v5_0_ring_emit_hdp_flush */ 819 + 2 + /* uvd_v5_0_ring_emit_hdp_invalidate */ 820 + 14, /* uvd_v5_0_ring_emit_fence x1 no user fence */ 821 + .emit_ib_size = 6, /* uvd_v5_0_ring_emit_ib */ 817 822 .emit_ib = uvd_v5_0_ring_emit_ib, 818 823 .emit_fence = uvd_v5_0_ring_emit_fence, 819 824 .emit_hdp_flush = uvd_v5_0_ring_emit_hdp_flush, ··· 832 821 .pad_ib = amdgpu_ring_generic_pad_ib, 833 822 .begin_use = amdgpu_uvd_ring_begin_use, 834 823 .end_use = amdgpu_uvd_ring_end_use, 835 - .get_emit_ib_size = uvd_v5_0_ring_get_emit_ib_size, 836 - .get_dma_frame_size = uvd_v5_0_ring_get_dma_frame_size, 837 824 }; 838 825 839 826 static void uvd_v5_0_set_ring_funcs(struct amdgpu_device *adev) ··· 849 840 adev->uvd.irq.num_types = 1; 850 841 adev->uvd.irq.funcs = &uvd_v5_0_irq_funcs; 851 842 } 843 + 844 + const struct amdgpu_ip_block_version uvd_v5_0_ip_block = 845 + { 846 + .type = AMD_IP_BLOCK_TYPE_UVD, 847 + .major = 5, 848 + .minor = 0, 849 + .rev = 0, 850 + .funcs = &uvd_v5_0_ip_funcs, 851 + };
+1 -1
drivers/gpu/drm/amd/amdgpu/uvd_v5_0.h
··· 24 24 #ifndef __UVD_V5_0_H__ 25 25 #define __UVD_V5_0_H__ 26 26 27 - extern const struct amd_ip_funcs uvd_v5_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version uvd_v5_0_ip_block; 28 28 29 29 #endif
+52 -38
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.c
··· 116 116 117 117 ring = &adev->uvd.ring; 118 118 sprintf(ring->name, "uvd"); 119 - r = amdgpu_ring_init(adev, ring, 512, PACKET0(mmUVD_NO_OP, 0), 0xf, 120 - &adev->uvd.irq, 0, AMDGPU_RING_TYPE_UVD); 119 + r = amdgpu_ring_init(adev, ring, 512, &adev->uvd.irq, 0); 121 120 122 121 return r; 123 122 } ··· 724 725 amdgpu_ring_write(ring, 0xE); 725 726 } 726 727 727 - static unsigned uvd_v6_0_ring_get_emit_ib_size(struct amdgpu_ring *ring) 728 - { 729 - return 730 - 8; /* uvd_v6_0_ring_emit_ib */ 731 - } 732 - 733 - static unsigned uvd_v6_0_ring_get_dma_frame_size(struct amdgpu_ring *ring) 734 - { 735 - return 736 - 2 + /* uvd_v6_0_ring_emit_hdp_flush */ 737 - 2 + /* uvd_v6_0_ring_emit_hdp_invalidate */ 738 - 10 + /* uvd_v6_0_ring_emit_pipeline_sync */ 739 - 14; /* uvd_v6_0_ring_emit_fence x1 no user fence */ 740 - } 741 - 742 - static unsigned uvd_v6_0_ring_get_dma_frame_size_vm(struct amdgpu_ring *ring) 743 - { 744 - return 745 - 2 + /* uvd_v6_0_ring_emit_hdp_flush */ 746 - 2 + /* uvd_v6_0_ring_emit_hdp_invalidate */ 747 - 10 + /* uvd_v6_0_ring_emit_pipeline_sync */ 748 - 20 + /* uvd_v6_0_ring_emit_vm_flush */ 749 - 14 + 14; /* uvd_v6_0_ring_emit_fence x2 vm fence */ 750 - } 751 - 752 728 static bool uvd_v6_0_is_idle(void *handle) 753 729 { 754 730 struct amdgpu_device *adev = (struct amdgpu_device *)handle; ··· 935 961 } 936 962 #endif 937 963 938 - static void uvd_v6_set_bypass_mode(struct amdgpu_device *adev, bool enable) 964 + static void uvd_v6_0_set_bypass_mode(struct amdgpu_device *adev, bool enable) 939 965 { 940 966 u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL); 941 967 ··· 953 979 enum amd_clockgating_state state) 954 980 { 955 981 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 982 + bool enable = (state == AMD_CG_STATE_GATE) ? true : false; 956 983 957 - if (adev->asic_type == CHIP_FIJI || 958 - adev->asic_type == CHIP_POLARIS10) 959 - uvd_v6_set_bypass_mode(adev, state == AMD_CG_STATE_GATE ? true : false); 984 + uvd_v6_0_set_bypass_mode(adev, enable); 960 985 961 986 if (!(adev->cg_flags & AMD_CG_SUPPORT_UVD_MGCG)) 962 987 return 0; 963 988 964 - if (state == AMD_CG_STATE_GATE) { 989 + if (enable) { 965 990 /* disable HW gating and enable Sw gating */ 966 991 uvd_v6_0_set_sw_clock_gating(adev); 967 992 } else { ··· 1000 1027 } 1001 1028 } 1002 1029 1003 - const struct amd_ip_funcs uvd_v6_0_ip_funcs = { 1030 + static const struct amd_ip_funcs uvd_v6_0_ip_funcs = { 1004 1031 .name = "uvd_v6_0", 1005 1032 .early_init = uvd_v6_0_early_init, 1006 1033 .late_init = NULL, ··· 1021 1048 }; 1022 1049 1023 1050 static const struct amdgpu_ring_funcs uvd_v6_0_ring_phys_funcs = { 1051 + .type = AMDGPU_RING_TYPE_UVD, 1052 + .align_mask = 0xf, 1053 + .nop = PACKET0(mmUVD_NO_OP, 0), 1024 1054 .get_rptr = uvd_v6_0_ring_get_rptr, 1025 1055 .get_wptr = uvd_v6_0_ring_get_wptr, 1026 1056 .set_wptr = uvd_v6_0_ring_set_wptr, 1027 1057 .parse_cs = amdgpu_uvd_ring_parse_cs, 1058 + .emit_frame_size = 1059 + 2 + /* uvd_v6_0_ring_emit_hdp_flush */ 1060 + 2 + /* uvd_v6_0_ring_emit_hdp_invalidate */ 1061 + 10 + /* uvd_v6_0_ring_emit_pipeline_sync */ 1062 + 14, /* uvd_v6_0_ring_emit_fence x1 no user fence */ 1063 + .emit_ib_size = 8, /* uvd_v6_0_ring_emit_ib */ 1028 1064 .emit_ib = uvd_v6_0_ring_emit_ib, 1029 1065 .emit_fence = uvd_v6_0_ring_emit_fence, 1030 1066 .emit_hdp_flush = uvd_v6_0_ring_emit_hdp_flush, ··· 1044 1062 .pad_ib = amdgpu_ring_generic_pad_ib, 1045 1063 .begin_use = amdgpu_uvd_ring_begin_use, 1046 1064 .end_use = amdgpu_uvd_ring_end_use, 1047 - .get_emit_ib_size = uvd_v6_0_ring_get_emit_ib_size, 1048 - .get_dma_frame_size = uvd_v6_0_ring_get_dma_frame_size, 1049 1065 }; 1050 1066 1051 1067 static const struct amdgpu_ring_funcs uvd_v6_0_ring_vm_funcs = { 1068 + .type = AMDGPU_RING_TYPE_UVD, 1069 + .align_mask = 0xf, 1070 + .nop = PACKET0(mmUVD_NO_OP, 0), 1052 1071 .get_rptr = uvd_v6_0_ring_get_rptr, 1053 1072 .get_wptr = uvd_v6_0_ring_get_wptr, 1054 1073 .set_wptr = uvd_v6_0_ring_set_wptr, 1055 - .parse_cs = NULL, 1074 + .emit_frame_size = 1075 + 2 + /* uvd_v6_0_ring_emit_hdp_flush */ 1076 + 2 + /* uvd_v6_0_ring_emit_hdp_invalidate */ 1077 + 10 + /* uvd_v6_0_ring_emit_pipeline_sync */ 1078 + 20 + /* uvd_v6_0_ring_emit_vm_flush */ 1079 + 14 + 14, /* uvd_v6_0_ring_emit_fence x2 vm fence */ 1080 + .emit_ib_size = 8, /* uvd_v6_0_ring_emit_ib */ 1056 1081 .emit_ib = uvd_v6_0_ring_emit_ib, 1057 1082 .emit_fence = uvd_v6_0_ring_emit_fence, 1058 1083 .emit_vm_flush = uvd_v6_0_ring_emit_vm_flush, ··· 1072 1083 .pad_ib = amdgpu_ring_generic_pad_ib, 1073 1084 .begin_use = amdgpu_uvd_ring_begin_use, 1074 1085 .end_use = amdgpu_uvd_ring_end_use, 1075 - .get_emit_ib_size = uvd_v6_0_ring_get_emit_ib_size, 1076 - .get_dma_frame_size = uvd_v6_0_ring_get_dma_frame_size_vm, 1077 1086 }; 1078 1087 1079 1088 static void uvd_v6_0_set_ring_funcs(struct amdgpu_device *adev) ··· 1095 1108 adev->uvd.irq.num_types = 1; 1096 1109 adev->uvd.irq.funcs = &uvd_v6_0_irq_funcs; 1097 1110 } 1111 + 1112 + const struct amdgpu_ip_block_version uvd_v6_0_ip_block = 1113 + { 1114 + .type = AMD_IP_BLOCK_TYPE_UVD, 1115 + .major = 6, 1116 + .minor = 0, 1117 + .rev = 0, 1118 + .funcs = &uvd_v6_0_ip_funcs, 1119 + }; 1120 + 1121 + const struct amdgpu_ip_block_version uvd_v6_2_ip_block = 1122 + { 1123 + .type = AMD_IP_BLOCK_TYPE_UVD, 1124 + .major = 6, 1125 + .minor = 2, 1126 + .rev = 0, 1127 + .funcs = &uvd_v6_0_ip_funcs, 1128 + }; 1129 + 1130 + const struct amdgpu_ip_block_version uvd_v6_3_ip_block = 1131 + { 1132 + .type = AMD_IP_BLOCK_TYPE_UVD, 1133 + .major = 6, 1134 + .minor = 3, 1135 + .rev = 0, 1136 + .funcs = &uvd_v6_0_ip_funcs, 1137 + };
+3 -1
drivers/gpu/drm/amd/amdgpu/uvd_v6_0.h
··· 24 24 #ifndef __UVD_V6_0_H__ 25 25 #define __UVD_V6_0_H__ 26 26 27 - extern const struct amd_ip_funcs uvd_v6_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version uvd_v6_0_ip_block; 28 + extern const struct amdgpu_ip_block_version uvd_v6_2_ip_block; 29 + extern const struct amdgpu_ip_block_version uvd_v6_3_ip_block; 28 30 29 31 #endif
+17 -5
drivers/gpu/drm/amd/amdgpu/vce_v2_0.c
··· 224 224 for (i = 0; i < adev->vce.num_rings; i++) { 225 225 ring = &adev->vce.ring[i]; 226 226 sprintf(ring->name, "vce%d", i); 227 - r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, 228 - &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); 227 + r = amdgpu_ring_init(adev, ring, 512, 228 + &adev->vce.irq, 0); 229 229 if (r) 230 230 return r; 231 231 } ··· 592 592 return vce_v2_0_start(adev); 593 593 } 594 594 595 - const struct amd_ip_funcs vce_v2_0_ip_funcs = { 595 + static const struct amd_ip_funcs vce_v2_0_ip_funcs = { 596 596 .name = "vce_v2_0", 597 597 .early_init = vce_v2_0_early_init, 598 598 .late_init = NULL, ··· 610 610 }; 611 611 612 612 static const struct amdgpu_ring_funcs vce_v2_0_ring_funcs = { 613 + .type = AMDGPU_RING_TYPE_VCE, 614 + .align_mask = 0xf, 615 + .nop = VCE_CMD_NO_OP, 613 616 .get_rptr = vce_v2_0_ring_get_rptr, 614 617 .get_wptr = vce_v2_0_ring_get_wptr, 615 618 .set_wptr = vce_v2_0_ring_set_wptr, 616 619 .parse_cs = amdgpu_vce_ring_parse_cs, 620 + .emit_frame_size = 6, /* amdgpu_vce_ring_emit_fence x1 no user fence */ 621 + .emit_ib_size = 4, /* amdgpu_vce_ring_emit_ib */ 617 622 .emit_ib = amdgpu_vce_ring_emit_ib, 618 623 .emit_fence = amdgpu_vce_ring_emit_fence, 619 624 .test_ring = amdgpu_vce_ring_test_ring, ··· 627 622 .pad_ib = amdgpu_ring_generic_pad_ib, 628 623 .begin_use = amdgpu_vce_ring_begin_use, 629 624 .end_use = amdgpu_vce_ring_end_use, 630 - .get_emit_ib_size = amdgpu_vce_ring_get_emit_ib_size, 631 - .get_dma_frame_size = amdgpu_vce_ring_get_dma_frame_size, 632 625 }; 633 626 634 627 static void vce_v2_0_set_ring_funcs(struct amdgpu_device *adev) ··· 646 643 { 647 644 adev->vce.irq.num_types = 1; 648 645 adev->vce.irq.funcs = &vce_v2_0_irq_funcs; 646 + }; 647 + 648 + const struct amdgpu_ip_block_version vce_v2_0_ip_block = 649 + { 650 + .type = AMD_IP_BLOCK_TYPE_VCE, 651 + .major = 2, 652 + .minor = 0, 653 + .rev = 0, 654 + .funcs = &vce_v2_0_ip_funcs, 649 655 };
+1 -1
drivers/gpu/drm/amd/amdgpu/vce_v2_0.h
··· 24 24 #ifndef __VCE_V2_0_H__ 25 25 #define __VCE_V2_0_H__ 26 26 27 - extern const struct amd_ip_funcs vce_v2_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version vce_v2_0_ip_block; 28 28 29 29 #endif
+45 -29
drivers/gpu/drm/amd/amdgpu/vce_v3_0.c
··· 389 389 for (i = 0; i < adev->vce.num_rings; i++) { 390 390 ring = &adev->vce.ring[i]; 391 391 sprintf(ring->name, "vce%d", i); 392 - r = amdgpu_ring_init(adev, ring, 512, VCE_CMD_NO_OP, 0xf, 393 - &adev->vce.irq, 0, AMDGPU_RING_TYPE_VCE); 392 + r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0); 394 393 if (r) 395 394 return r; 396 395 } ··· 807 808 amdgpu_ring_write(ring, seq); 808 809 } 809 810 810 - static unsigned vce_v3_0_ring_get_emit_ib_size(struct amdgpu_ring *ring) 811 - { 812 - return 813 - 5; /* vce_v3_0_ring_emit_ib */ 814 - } 815 - 816 - static unsigned vce_v3_0_ring_get_dma_frame_size(struct amdgpu_ring *ring) 817 - { 818 - return 819 - 4 + /* vce_v3_0_emit_pipeline_sync */ 820 - 6; /* amdgpu_vce_ring_emit_fence x1 no user fence */ 821 - } 822 - 823 - static unsigned vce_v3_0_ring_get_dma_frame_size_vm(struct amdgpu_ring *ring) 824 - { 825 - return 826 - 6 + /* vce_v3_0_emit_vm_flush */ 827 - 4 + /* vce_v3_0_emit_pipeline_sync */ 828 - 6 + 6; /* amdgpu_vce_ring_emit_fence x2 vm fence */ 829 - } 830 - 831 - const struct amd_ip_funcs vce_v3_0_ip_funcs = { 811 + static const struct amd_ip_funcs vce_v3_0_ip_funcs = { 832 812 .name = "vce_v3_0", 833 813 .early_init = vce_v3_0_early_init, 834 814 .late_init = NULL, ··· 828 850 }; 829 851 830 852 static const struct amdgpu_ring_funcs vce_v3_0_ring_phys_funcs = { 853 + .type = AMDGPU_RING_TYPE_VCE, 854 + .align_mask = 0xf, 855 + .nop = VCE_CMD_NO_OP, 831 856 .get_rptr = vce_v3_0_ring_get_rptr, 832 857 .get_wptr = vce_v3_0_ring_get_wptr, 833 858 .set_wptr = vce_v3_0_ring_set_wptr, 834 859 .parse_cs = amdgpu_vce_ring_parse_cs, 860 + .emit_frame_size = 861 + 4 + /* vce_v3_0_emit_pipeline_sync */ 862 + 6, /* amdgpu_vce_ring_emit_fence x1 no user fence */ 863 + .emit_ib_size = 5, /* vce_v3_0_ring_emit_ib */ 835 864 .emit_ib = amdgpu_vce_ring_emit_ib, 836 865 .emit_fence = amdgpu_vce_ring_emit_fence, 837 866 .test_ring = amdgpu_vce_ring_test_ring, ··· 847 862 .pad_ib = amdgpu_ring_generic_pad_ib, 848 863 .begin_use = amdgpu_vce_ring_begin_use, 849 864 .end_use = amdgpu_vce_ring_end_use, 850 - .get_emit_ib_size = vce_v3_0_ring_get_emit_ib_size, 851 - .get_dma_frame_size = vce_v3_0_ring_get_dma_frame_size, 852 865 }; 853 866 854 867 static const struct amdgpu_ring_funcs vce_v3_0_ring_vm_funcs = { 868 + .type = AMDGPU_RING_TYPE_VCE, 869 + .align_mask = 0xf, 870 + .nop = VCE_CMD_NO_OP, 855 871 .get_rptr = vce_v3_0_ring_get_rptr, 856 872 .get_wptr = vce_v3_0_ring_get_wptr, 857 873 .set_wptr = vce_v3_0_ring_set_wptr, 858 - .parse_cs = NULL, 874 + .parse_cs = amdgpu_vce_ring_parse_cs_vm, 875 + .emit_frame_size = 876 + 6 + /* vce_v3_0_emit_vm_flush */ 877 + 4 + /* vce_v3_0_emit_pipeline_sync */ 878 + 6 + 6, /* amdgpu_vce_ring_emit_fence x2 vm fence */ 879 + .emit_ib_size = 4, /* amdgpu_vce_ring_emit_ib */ 859 880 .emit_ib = vce_v3_0_ring_emit_ib, 860 881 .emit_vm_flush = vce_v3_0_emit_vm_flush, 861 882 .emit_pipeline_sync = vce_v3_0_emit_pipeline_sync, ··· 872 881 .pad_ib = amdgpu_ring_generic_pad_ib, 873 882 .begin_use = amdgpu_vce_ring_begin_use, 874 883 .end_use = amdgpu_vce_ring_end_use, 875 - .get_emit_ib_size = vce_v3_0_ring_get_emit_ib_size, 876 - .get_dma_frame_size = vce_v3_0_ring_get_dma_frame_size_vm, 877 884 }; 878 885 879 886 static void vce_v3_0_set_ring_funcs(struct amdgpu_device *adev) ··· 898 909 { 899 910 adev->vce.irq.num_types = 1; 900 911 adev->vce.irq.funcs = &vce_v3_0_irq_funcs; 912 + }; 913 + 914 + const struct amdgpu_ip_block_version vce_v3_0_ip_block = 915 + { 916 + .type = AMD_IP_BLOCK_TYPE_VCE, 917 + .major = 3, 918 + .minor = 0, 919 + .rev = 0, 920 + .funcs = &vce_v3_0_ip_funcs, 921 + }; 922 + 923 + const struct amdgpu_ip_block_version vce_v3_1_ip_block = 924 + { 925 + .type = AMD_IP_BLOCK_TYPE_VCE, 926 + .major = 3, 927 + .minor = 1, 928 + .rev = 0, 929 + .funcs = &vce_v3_0_ip_funcs, 930 + }; 931 + 932 + const struct amdgpu_ip_block_version vce_v3_4_ip_block = 933 + { 934 + .type = AMD_IP_BLOCK_TYPE_VCE, 935 + .major = 3, 936 + .minor = 4, 937 + .rev = 0, 938 + .funcs = &vce_v3_0_ip_funcs, 901 939 };
+3 -1
drivers/gpu/drm/amd/amdgpu/vce_v3_0.h
··· 24 24 #ifndef __VCE_V3_0_H__ 25 25 #define __VCE_V3_0_H__ 26 26 27 - extern const struct amd_ip_funcs vce_v3_0_ip_funcs; 27 + extern const struct amdgpu_ip_block_version vce_v3_0_ip_block; 28 + extern const struct amdgpu_ip_block_version vce_v3_1_ip_block; 29 + extern const struct amdgpu_ip_block_version vce_v3_4_ip_block; 28 30 29 31 #endif
+215 -771
drivers/gpu/drm/amd/amdgpu/vi.c
··· 121 121 u32 r; 122 122 123 123 spin_lock_irqsave(&adev->smc_idx_lock, flags); 124 - WREG32(mmSMC_IND_INDEX_0, (reg)); 125 - r = RREG32(mmSMC_IND_DATA_0); 124 + WREG32(mmSMC_IND_INDEX_11, (reg)); 125 + r = RREG32(mmSMC_IND_DATA_11); 126 126 spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 127 127 return r; 128 128 } ··· 132 132 unsigned long flags; 133 133 134 134 spin_lock_irqsave(&adev->smc_idx_lock, flags); 135 - WREG32(mmSMC_IND_INDEX_0, (reg)); 136 - WREG32(mmSMC_IND_DATA_0, (v)); 135 + WREG32(mmSMC_IND_INDEX_11, (reg)); 136 + WREG32(mmSMC_IND_DATA_11, (v)); 137 137 spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 138 138 } 139 139 ··· 437 437 /* take the smc lock since we are using the smc index */ 438 438 spin_lock_irqsave(&adev->smc_idx_lock, flags); 439 439 /* set rom index to 0 */ 440 - WREG32(mmSMC_IND_INDEX_0, ixROM_INDEX); 441 - WREG32(mmSMC_IND_DATA_0, 0); 440 + WREG32(mmSMC_IND_INDEX_11, ixROM_INDEX); 441 + WREG32(mmSMC_IND_DATA_11, 0); 442 442 /* set index to data for continous read */ 443 - WREG32(mmSMC_IND_INDEX_0, ixROM_DATA); 443 + WREG32(mmSMC_IND_INDEX_11, ixROM_DATA); 444 444 for (i = 0; i < length_dw; i++) 445 - dw_ptr[i] = RREG32(mmSMC_IND_DATA_0); 445 + dw_ptr[i] = RREG32(mmSMC_IND_DATA_11); 446 446 spin_unlock_irqrestore(&adev->smc_idx_lock, flags); 447 447 448 448 return true; ··· 556 556 {mmPA_SC_RASTER_CONFIG_1, false, true}, 557 557 }; 558 558 559 - static uint32_t vi_read_indexed_register(struct amdgpu_device *adev, u32 se_num, 560 - u32 sh_num, u32 reg_offset) 559 + static uint32_t vi_get_register_value(struct amdgpu_device *adev, 560 + bool indexed, u32 se_num, 561 + u32 sh_num, u32 reg_offset) 561 562 { 562 - uint32_t val; 563 + if (indexed) { 564 + uint32_t val; 565 + unsigned se_idx = (se_num == 0xffffffff) ? 0 : se_num; 566 + unsigned sh_idx = (sh_num == 0xffffffff) ? 0 : sh_num; 563 567 564 - mutex_lock(&adev->grbm_idx_mutex); 565 - if (se_num != 0xffffffff || sh_num != 0xffffffff) 566 - amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); 568 + switch (reg_offset) { 569 + case mmCC_RB_BACKEND_DISABLE: 570 + return adev->gfx.config.rb_config[se_idx][sh_idx].rb_backend_disable; 571 + case mmGC_USER_RB_BACKEND_DISABLE: 572 + return adev->gfx.config.rb_config[se_idx][sh_idx].user_rb_backend_disable; 573 + case mmPA_SC_RASTER_CONFIG: 574 + return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config; 575 + case mmPA_SC_RASTER_CONFIG_1: 576 + return adev->gfx.config.rb_config[se_idx][sh_idx].raster_config_1; 577 + } 567 578 568 - val = RREG32(reg_offset); 579 + mutex_lock(&adev->grbm_idx_mutex); 580 + if (se_num != 0xffffffff || sh_num != 0xffffffff) 581 + amdgpu_gfx_select_se_sh(adev, se_num, sh_num, 0xffffffff); 569 582 570 - if (se_num != 0xffffffff || sh_num != 0xffffffff) 571 - amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 572 - mutex_unlock(&adev->grbm_idx_mutex); 573 - return val; 583 + val = RREG32(reg_offset); 584 + 585 + if (se_num != 0xffffffff || sh_num != 0xffffffff) 586 + amdgpu_gfx_select_se_sh(adev, 0xffffffff, 0xffffffff, 0xffffffff); 587 + mutex_unlock(&adev->grbm_idx_mutex); 588 + return val; 589 + } else { 590 + unsigned idx; 591 + 592 + switch (reg_offset) { 593 + case mmGB_ADDR_CONFIG: 594 + return adev->gfx.config.gb_addr_config; 595 + case mmMC_ARB_RAMCFG: 596 + return adev->gfx.config.mc_arb_ramcfg; 597 + case mmGB_TILE_MODE0: 598 + case mmGB_TILE_MODE1: 599 + case mmGB_TILE_MODE2: 600 + case mmGB_TILE_MODE3: 601 + case mmGB_TILE_MODE4: 602 + case mmGB_TILE_MODE5: 603 + case mmGB_TILE_MODE6: 604 + case mmGB_TILE_MODE7: 605 + case mmGB_TILE_MODE8: 606 + case mmGB_TILE_MODE9: 607 + case mmGB_TILE_MODE10: 608 + case mmGB_TILE_MODE11: 609 + case mmGB_TILE_MODE12: 610 + case mmGB_TILE_MODE13: 611 + case mmGB_TILE_MODE14: 612 + case mmGB_TILE_MODE15: 613 + case mmGB_TILE_MODE16: 614 + case mmGB_TILE_MODE17: 615 + case mmGB_TILE_MODE18: 616 + case mmGB_TILE_MODE19: 617 + case mmGB_TILE_MODE20: 618 + case mmGB_TILE_MODE21: 619 + case mmGB_TILE_MODE22: 620 + case mmGB_TILE_MODE23: 621 + case mmGB_TILE_MODE24: 622 + case mmGB_TILE_MODE25: 623 + case mmGB_TILE_MODE26: 624 + case mmGB_TILE_MODE27: 625 + case mmGB_TILE_MODE28: 626 + case mmGB_TILE_MODE29: 627 + case mmGB_TILE_MODE30: 628 + case mmGB_TILE_MODE31: 629 + idx = (reg_offset - mmGB_TILE_MODE0); 630 + return adev->gfx.config.tile_mode_array[idx]; 631 + case mmGB_MACROTILE_MODE0: 632 + case mmGB_MACROTILE_MODE1: 633 + case mmGB_MACROTILE_MODE2: 634 + case mmGB_MACROTILE_MODE3: 635 + case mmGB_MACROTILE_MODE4: 636 + case mmGB_MACROTILE_MODE5: 637 + case mmGB_MACROTILE_MODE6: 638 + case mmGB_MACROTILE_MODE7: 639 + case mmGB_MACROTILE_MODE8: 640 + case mmGB_MACROTILE_MODE9: 641 + case mmGB_MACROTILE_MODE10: 642 + case mmGB_MACROTILE_MODE11: 643 + case mmGB_MACROTILE_MODE12: 644 + case mmGB_MACROTILE_MODE13: 645 + case mmGB_MACROTILE_MODE14: 646 + case mmGB_MACROTILE_MODE15: 647 + idx = (reg_offset - mmGB_MACROTILE_MODE0); 648 + return adev->gfx.config.macrotile_mode_array[idx]; 649 + default: 650 + return RREG32(reg_offset); 651 + } 652 + } 574 653 } 575 654 576 655 static int vi_read_register(struct amdgpu_device *adev, u32 se_num, ··· 684 605 if (reg_offset != asic_register_entry->reg_offset) 685 606 continue; 686 607 if (!asic_register_entry->untouched) 687 - *value = asic_register_entry->grbm_indexed ? 688 - vi_read_indexed_register(adev, se_num, 689 - sh_num, reg_offset) : 690 - RREG32(reg_offset); 608 + *value = vi_get_register_value(adev, 609 + asic_register_entry->grbm_indexed, 610 + se_num, sh_num, reg_offset); 691 611 return 0; 692 612 } 693 613 } ··· 696 618 continue; 697 619 698 620 if (!vi_allowed_read_registers[i].untouched) 699 - *value = vi_allowed_read_registers[i].grbm_indexed ? 700 - vi_read_indexed_register(adev, se_num, 701 - sh_num, reg_offset) : 702 - RREG32(reg_offset); 621 + *value = vi_get_register_value(adev, 622 + vi_allowed_read_registers[i].grbm_indexed, 623 + se_num, sh_num, reg_offset); 703 624 return 0; 704 625 } 705 626 return -EINVAL; ··· 729 652 return -EINVAL; 730 653 } 731 654 732 - static void vi_set_bios_scratch_engine_hung(struct amdgpu_device *adev, bool hung) 733 - { 734 - u32 tmp = RREG32(mmBIOS_SCRATCH_3); 735 - 736 - if (hung) 737 - tmp |= ATOM_S3_ASIC_GUI_ENGINE_HUNG; 738 - else 739 - tmp &= ~ATOM_S3_ASIC_GUI_ENGINE_HUNG; 740 - 741 - WREG32(mmBIOS_SCRATCH_3, tmp); 742 - } 743 - 744 655 /** 745 656 * vi_asic_reset - soft reset GPU 746 657 * ··· 742 677 { 743 678 int r; 744 679 745 - vi_set_bios_scratch_engine_hung(adev, true); 680 + amdgpu_atombios_scratch_regs_engine_hung(adev, true); 746 681 747 682 r = vi_gpu_pci_config_reset(adev); 748 683 749 - vi_set_bios_scratch_engine_hung(adev, false); 684 + amdgpu_atombios_scratch_regs_engine_hung(adev, false); 750 685 751 686 return r; 752 687 } ··· 846 781 WREG32(mmBIF_DOORBELL_APER_EN, tmp); 847 782 } 848 783 849 - /* topaz has no DCE, UVD, VCE */ 850 - static const struct amdgpu_ip_block_version topaz_ip_blocks[] = 851 - { 852 - /* ORDER MATTERS! */ 853 - { 854 - .type = AMD_IP_BLOCK_TYPE_COMMON, 855 - .major = 2, 856 - .minor = 0, 857 - .rev = 0, 858 - .funcs = &vi_common_ip_funcs, 859 - }, 860 - { 861 - .type = AMD_IP_BLOCK_TYPE_GMC, 862 - .major = 7, 863 - .minor = 4, 864 - .rev = 0, 865 - .funcs = &gmc_v7_0_ip_funcs, 866 - }, 867 - { 868 - .type = AMD_IP_BLOCK_TYPE_IH, 869 - .major = 2, 870 - .minor = 4, 871 - .rev = 0, 872 - .funcs = &iceland_ih_ip_funcs, 873 - }, 874 - { 875 - .type = AMD_IP_BLOCK_TYPE_SMC, 876 - .major = 7, 877 - .minor = 1, 878 - .rev = 0, 879 - .funcs = &amdgpu_pp_ip_funcs, 880 - }, 881 - { 882 - .type = AMD_IP_BLOCK_TYPE_GFX, 883 - .major = 8, 884 - .minor = 0, 885 - .rev = 0, 886 - .funcs = &gfx_v8_0_ip_funcs, 887 - }, 888 - { 889 - .type = AMD_IP_BLOCK_TYPE_SDMA, 890 - .major = 2, 891 - .minor = 4, 892 - .rev = 0, 893 - .funcs = &sdma_v2_4_ip_funcs, 894 - }, 895 - }; 896 - 897 - static const struct amdgpu_ip_block_version topaz_ip_blocks_vd[] = 898 - { 899 - /* ORDER MATTERS! */ 900 - { 901 - .type = AMD_IP_BLOCK_TYPE_COMMON, 902 - .major = 2, 903 - .minor = 0, 904 - .rev = 0, 905 - .funcs = &vi_common_ip_funcs, 906 - }, 907 - { 908 - .type = AMD_IP_BLOCK_TYPE_GMC, 909 - .major = 7, 910 - .minor = 4, 911 - .rev = 0, 912 - .funcs = &gmc_v7_0_ip_funcs, 913 - }, 914 - { 915 - .type = AMD_IP_BLOCK_TYPE_IH, 916 - .major = 2, 917 - .minor = 4, 918 - .rev = 0, 919 - .funcs = &iceland_ih_ip_funcs, 920 - }, 921 - { 922 - .type = AMD_IP_BLOCK_TYPE_SMC, 923 - .major = 7, 924 - .minor = 1, 925 - .rev = 0, 926 - .funcs = &amdgpu_pp_ip_funcs, 927 - }, 928 - { 929 - .type = AMD_IP_BLOCK_TYPE_DCE, 930 - .major = 1, 931 - .minor = 0, 932 - .rev = 0, 933 - .funcs = &dce_virtual_ip_funcs, 934 - }, 935 - { 936 - .type = AMD_IP_BLOCK_TYPE_GFX, 937 - .major = 8, 938 - .minor = 0, 939 - .rev = 0, 940 - .funcs = &gfx_v8_0_ip_funcs, 941 - }, 942 - { 943 - .type = AMD_IP_BLOCK_TYPE_SDMA, 944 - .major = 2, 945 - .minor = 4, 946 - .rev = 0, 947 - .funcs = &sdma_v2_4_ip_funcs, 948 - }, 949 - }; 950 - 951 - static const struct amdgpu_ip_block_version tonga_ip_blocks[] = 952 - { 953 - /* ORDER MATTERS! */ 954 - { 955 - .type = AMD_IP_BLOCK_TYPE_COMMON, 956 - .major = 2, 957 - .minor = 0, 958 - .rev = 0, 959 - .funcs = &vi_common_ip_funcs, 960 - }, 961 - { 962 - .type = AMD_IP_BLOCK_TYPE_GMC, 963 - .major = 8, 964 - .minor = 0, 965 - .rev = 0, 966 - .funcs = &gmc_v8_0_ip_funcs, 967 - }, 968 - { 969 - .type = AMD_IP_BLOCK_TYPE_IH, 970 - .major = 3, 971 - .minor = 0, 972 - .rev = 0, 973 - .funcs = &tonga_ih_ip_funcs, 974 - }, 975 - { 976 - .type = AMD_IP_BLOCK_TYPE_SMC, 977 - .major = 7, 978 - .minor = 1, 979 - .rev = 0, 980 - .funcs = &amdgpu_pp_ip_funcs, 981 - }, 982 - { 983 - .type = AMD_IP_BLOCK_TYPE_DCE, 984 - .major = 10, 985 - .minor = 0, 986 - .rev = 0, 987 - .funcs = &dce_v10_0_ip_funcs, 988 - }, 989 - { 990 - .type = AMD_IP_BLOCK_TYPE_GFX, 991 - .major = 8, 992 - .minor = 0, 993 - .rev = 0, 994 - .funcs = &gfx_v8_0_ip_funcs, 995 - }, 996 - { 997 - .type = AMD_IP_BLOCK_TYPE_SDMA, 998 - .major = 3, 999 - .minor = 0, 1000 - .rev = 0, 1001 - .funcs = &sdma_v3_0_ip_funcs, 1002 - }, 1003 - { 1004 - .type = AMD_IP_BLOCK_TYPE_UVD, 1005 - .major = 5, 1006 - .minor = 0, 1007 - .rev = 0, 1008 - .funcs = &uvd_v5_0_ip_funcs, 1009 - }, 1010 - { 1011 - .type = AMD_IP_BLOCK_TYPE_VCE, 1012 - .major = 3, 1013 - .minor = 0, 1014 - .rev = 0, 1015 - .funcs = &vce_v3_0_ip_funcs, 1016 - }, 1017 - }; 1018 - 1019 - static const struct amdgpu_ip_block_version tonga_ip_blocks_vd[] = 1020 - { 1021 - /* ORDER MATTERS! */ 1022 - { 1023 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1024 - .major = 2, 1025 - .minor = 0, 1026 - .rev = 0, 1027 - .funcs = &vi_common_ip_funcs, 1028 - }, 1029 - { 1030 - .type = AMD_IP_BLOCK_TYPE_GMC, 1031 - .major = 8, 1032 - .minor = 0, 1033 - .rev = 0, 1034 - .funcs = &gmc_v8_0_ip_funcs, 1035 - }, 1036 - { 1037 - .type = AMD_IP_BLOCK_TYPE_IH, 1038 - .major = 3, 1039 - .minor = 0, 1040 - .rev = 0, 1041 - .funcs = &tonga_ih_ip_funcs, 1042 - }, 1043 - { 1044 - .type = AMD_IP_BLOCK_TYPE_SMC, 1045 - .major = 7, 1046 - .minor = 1, 1047 - .rev = 0, 1048 - .funcs = &amdgpu_pp_ip_funcs, 1049 - }, 1050 - { 1051 - .type = AMD_IP_BLOCK_TYPE_DCE, 1052 - .major = 10, 1053 - .minor = 0, 1054 - .rev = 0, 1055 - .funcs = &dce_virtual_ip_funcs, 1056 - }, 1057 - { 1058 - .type = AMD_IP_BLOCK_TYPE_GFX, 1059 - .major = 8, 1060 - .minor = 0, 1061 - .rev = 0, 1062 - .funcs = &gfx_v8_0_ip_funcs, 1063 - }, 1064 - { 1065 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1066 - .major = 3, 1067 - .minor = 0, 1068 - .rev = 0, 1069 - .funcs = &sdma_v3_0_ip_funcs, 1070 - }, 1071 - { 1072 - .type = AMD_IP_BLOCK_TYPE_UVD, 1073 - .major = 5, 1074 - .minor = 0, 1075 - .rev = 0, 1076 - .funcs = &uvd_v5_0_ip_funcs, 1077 - }, 1078 - { 1079 - .type = AMD_IP_BLOCK_TYPE_VCE, 1080 - .major = 3, 1081 - .minor = 0, 1082 - .rev = 0, 1083 - .funcs = &vce_v3_0_ip_funcs, 1084 - }, 1085 - }; 1086 - 1087 - static const struct amdgpu_ip_block_version fiji_ip_blocks[] = 1088 - { 1089 - /* ORDER MATTERS! */ 1090 - { 1091 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1092 - .major = 2, 1093 - .minor = 0, 1094 - .rev = 0, 1095 - .funcs = &vi_common_ip_funcs, 1096 - }, 1097 - { 1098 - .type = AMD_IP_BLOCK_TYPE_GMC, 1099 - .major = 8, 1100 - .minor = 5, 1101 - .rev = 0, 1102 - .funcs = &gmc_v8_0_ip_funcs, 1103 - }, 1104 - { 1105 - .type = AMD_IP_BLOCK_TYPE_IH, 1106 - .major = 3, 1107 - .minor = 0, 1108 - .rev = 0, 1109 - .funcs = &tonga_ih_ip_funcs, 1110 - }, 1111 - { 1112 - .type = AMD_IP_BLOCK_TYPE_SMC, 1113 - .major = 7, 1114 - .minor = 1, 1115 - .rev = 0, 1116 - .funcs = &amdgpu_pp_ip_funcs, 1117 - }, 1118 - { 1119 - .type = AMD_IP_BLOCK_TYPE_DCE, 1120 - .major = 10, 1121 - .minor = 1, 1122 - .rev = 0, 1123 - .funcs = &dce_v10_0_ip_funcs, 1124 - }, 1125 - { 1126 - .type = AMD_IP_BLOCK_TYPE_GFX, 1127 - .major = 8, 1128 - .minor = 0, 1129 - .rev = 0, 1130 - .funcs = &gfx_v8_0_ip_funcs, 1131 - }, 1132 - { 1133 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1134 - .major = 3, 1135 - .minor = 0, 1136 - .rev = 0, 1137 - .funcs = &sdma_v3_0_ip_funcs, 1138 - }, 1139 - { 1140 - .type = AMD_IP_BLOCK_TYPE_UVD, 1141 - .major = 6, 1142 - .minor = 0, 1143 - .rev = 0, 1144 - .funcs = &uvd_v6_0_ip_funcs, 1145 - }, 1146 - { 1147 - .type = AMD_IP_BLOCK_TYPE_VCE, 1148 - .major = 3, 1149 - .minor = 0, 1150 - .rev = 0, 1151 - .funcs = &vce_v3_0_ip_funcs, 1152 - }, 1153 - }; 1154 - 1155 - static const struct amdgpu_ip_block_version fiji_ip_blocks_vd[] = 1156 - { 1157 - /* ORDER MATTERS! */ 1158 - { 1159 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1160 - .major = 2, 1161 - .minor = 0, 1162 - .rev = 0, 1163 - .funcs = &vi_common_ip_funcs, 1164 - }, 1165 - { 1166 - .type = AMD_IP_BLOCK_TYPE_GMC, 1167 - .major = 8, 1168 - .minor = 5, 1169 - .rev = 0, 1170 - .funcs = &gmc_v8_0_ip_funcs, 1171 - }, 1172 - { 1173 - .type = AMD_IP_BLOCK_TYPE_IH, 1174 - .major = 3, 1175 - .minor = 0, 1176 - .rev = 0, 1177 - .funcs = &tonga_ih_ip_funcs, 1178 - }, 1179 - { 1180 - .type = AMD_IP_BLOCK_TYPE_SMC, 1181 - .major = 7, 1182 - .minor = 1, 1183 - .rev = 0, 1184 - .funcs = &amdgpu_pp_ip_funcs, 1185 - }, 1186 - { 1187 - .type = AMD_IP_BLOCK_TYPE_DCE, 1188 - .major = 10, 1189 - .minor = 1, 1190 - .rev = 0, 1191 - .funcs = &dce_virtual_ip_funcs, 1192 - }, 1193 - { 1194 - .type = AMD_IP_BLOCK_TYPE_GFX, 1195 - .major = 8, 1196 - .minor = 0, 1197 - .rev = 0, 1198 - .funcs = &gfx_v8_0_ip_funcs, 1199 - }, 1200 - { 1201 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1202 - .major = 3, 1203 - .minor = 0, 1204 - .rev = 0, 1205 - .funcs = &sdma_v3_0_ip_funcs, 1206 - }, 1207 - { 1208 - .type = AMD_IP_BLOCK_TYPE_UVD, 1209 - .major = 6, 1210 - .minor = 0, 1211 - .rev = 0, 1212 - .funcs = &uvd_v6_0_ip_funcs, 1213 - }, 1214 - { 1215 - .type = AMD_IP_BLOCK_TYPE_VCE, 1216 - .major = 3, 1217 - .minor = 0, 1218 - .rev = 0, 1219 - .funcs = &vce_v3_0_ip_funcs, 1220 - }, 1221 - }; 1222 - 1223 - static const struct amdgpu_ip_block_version polaris11_ip_blocks[] = 1224 - { 1225 - /* ORDER MATTERS! */ 1226 - { 1227 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1228 - .major = 2, 1229 - .minor = 0, 1230 - .rev = 0, 1231 - .funcs = &vi_common_ip_funcs, 1232 - }, 1233 - { 1234 - .type = AMD_IP_BLOCK_TYPE_GMC, 1235 - .major = 8, 1236 - .minor = 1, 1237 - .rev = 0, 1238 - .funcs = &gmc_v8_0_ip_funcs, 1239 - }, 1240 - { 1241 - .type = AMD_IP_BLOCK_TYPE_IH, 1242 - .major = 3, 1243 - .minor = 1, 1244 - .rev = 0, 1245 - .funcs = &tonga_ih_ip_funcs, 1246 - }, 1247 - { 1248 - .type = AMD_IP_BLOCK_TYPE_SMC, 1249 - .major = 7, 1250 - .minor = 2, 1251 - .rev = 0, 1252 - .funcs = &amdgpu_pp_ip_funcs, 1253 - }, 1254 - { 1255 - .type = AMD_IP_BLOCK_TYPE_DCE, 1256 - .major = 11, 1257 - .minor = 2, 1258 - .rev = 0, 1259 - .funcs = &dce_v11_0_ip_funcs, 1260 - }, 1261 - { 1262 - .type = AMD_IP_BLOCK_TYPE_GFX, 1263 - .major = 8, 1264 - .minor = 0, 1265 - .rev = 0, 1266 - .funcs = &gfx_v8_0_ip_funcs, 1267 - }, 1268 - { 1269 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1270 - .major = 3, 1271 - .minor = 1, 1272 - .rev = 0, 1273 - .funcs = &sdma_v3_0_ip_funcs, 1274 - }, 1275 - { 1276 - .type = AMD_IP_BLOCK_TYPE_UVD, 1277 - .major = 6, 1278 - .minor = 3, 1279 - .rev = 0, 1280 - .funcs = &uvd_v6_0_ip_funcs, 1281 - }, 1282 - { 1283 - .type = AMD_IP_BLOCK_TYPE_VCE, 1284 - .major = 3, 1285 - .minor = 4, 1286 - .rev = 0, 1287 - .funcs = &vce_v3_0_ip_funcs, 1288 - }, 1289 - }; 1290 - 1291 - static const struct amdgpu_ip_block_version polaris11_ip_blocks_vd[] = 1292 - { 1293 - /* ORDER MATTERS! */ 1294 - { 1295 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1296 - .major = 2, 1297 - .minor = 0, 1298 - .rev = 0, 1299 - .funcs = &vi_common_ip_funcs, 1300 - }, 1301 - { 1302 - .type = AMD_IP_BLOCK_TYPE_GMC, 1303 - .major = 8, 1304 - .minor = 1, 1305 - .rev = 0, 1306 - .funcs = &gmc_v8_0_ip_funcs, 1307 - }, 1308 - { 1309 - .type = AMD_IP_BLOCK_TYPE_IH, 1310 - .major = 3, 1311 - .minor = 1, 1312 - .rev = 0, 1313 - .funcs = &tonga_ih_ip_funcs, 1314 - }, 1315 - { 1316 - .type = AMD_IP_BLOCK_TYPE_SMC, 1317 - .major = 7, 1318 - .minor = 2, 1319 - .rev = 0, 1320 - .funcs = &amdgpu_pp_ip_funcs, 1321 - }, 1322 - { 1323 - .type = AMD_IP_BLOCK_TYPE_DCE, 1324 - .major = 11, 1325 - .minor = 2, 1326 - .rev = 0, 1327 - .funcs = &dce_virtual_ip_funcs, 1328 - }, 1329 - { 1330 - .type = AMD_IP_BLOCK_TYPE_GFX, 1331 - .major = 8, 1332 - .minor = 0, 1333 - .rev = 0, 1334 - .funcs = &gfx_v8_0_ip_funcs, 1335 - }, 1336 - { 1337 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1338 - .major = 3, 1339 - .minor = 1, 1340 - .rev = 0, 1341 - .funcs = &sdma_v3_0_ip_funcs, 1342 - }, 1343 - { 1344 - .type = AMD_IP_BLOCK_TYPE_UVD, 1345 - .major = 6, 1346 - .minor = 3, 1347 - .rev = 0, 1348 - .funcs = &uvd_v6_0_ip_funcs, 1349 - }, 1350 - { 1351 - .type = AMD_IP_BLOCK_TYPE_VCE, 1352 - .major = 3, 1353 - .minor = 4, 1354 - .rev = 0, 1355 - .funcs = &vce_v3_0_ip_funcs, 1356 - }, 1357 - }; 1358 - 1359 - static const struct amdgpu_ip_block_version cz_ip_blocks[] = 1360 - { 1361 - /* ORDER MATTERS! */ 1362 - { 1363 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1364 - .major = 2, 1365 - .minor = 0, 1366 - .rev = 0, 1367 - .funcs = &vi_common_ip_funcs, 1368 - }, 1369 - { 1370 - .type = AMD_IP_BLOCK_TYPE_GMC, 1371 - .major = 8, 1372 - .minor = 0, 1373 - .rev = 0, 1374 - .funcs = &gmc_v8_0_ip_funcs, 1375 - }, 1376 - { 1377 - .type = AMD_IP_BLOCK_TYPE_IH, 1378 - .major = 3, 1379 - .minor = 0, 1380 - .rev = 0, 1381 - .funcs = &cz_ih_ip_funcs, 1382 - }, 1383 - { 1384 - .type = AMD_IP_BLOCK_TYPE_SMC, 1385 - .major = 8, 1386 - .minor = 0, 1387 - .rev = 0, 1388 - .funcs = &amdgpu_pp_ip_funcs 1389 - }, 1390 - { 1391 - .type = AMD_IP_BLOCK_TYPE_DCE, 1392 - .major = 11, 1393 - .minor = 0, 1394 - .rev = 0, 1395 - .funcs = &dce_v11_0_ip_funcs, 1396 - }, 1397 - { 1398 - .type = AMD_IP_BLOCK_TYPE_GFX, 1399 - .major = 8, 1400 - .minor = 0, 1401 - .rev = 0, 1402 - .funcs = &gfx_v8_0_ip_funcs, 1403 - }, 1404 - { 1405 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1406 - .major = 3, 1407 - .minor = 0, 1408 - .rev = 0, 1409 - .funcs = &sdma_v3_0_ip_funcs, 1410 - }, 1411 - { 1412 - .type = AMD_IP_BLOCK_TYPE_UVD, 1413 - .major = 6, 1414 - .minor = 0, 1415 - .rev = 0, 1416 - .funcs = &uvd_v6_0_ip_funcs, 1417 - }, 1418 - { 1419 - .type = AMD_IP_BLOCK_TYPE_VCE, 1420 - .major = 3, 1421 - .minor = 0, 1422 - .rev = 0, 1423 - .funcs = &vce_v3_0_ip_funcs, 1424 - }, 1425 - #if defined(CONFIG_DRM_AMD_ACP) 1426 - { 1427 - .type = AMD_IP_BLOCK_TYPE_ACP, 1428 - .major = 2, 1429 - .minor = 2, 1430 - .rev = 0, 1431 - .funcs = &acp_ip_funcs, 1432 - }, 1433 - #endif 1434 - }; 1435 - 1436 - static const struct amdgpu_ip_block_version cz_ip_blocks_vd[] = 1437 - { 1438 - /* ORDER MATTERS! */ 1439 - { 1440 - .type = AMD_IP_BLOCK_TYPE_COMMON, 1441 - .major = 2, 1442 - .minor = 0, 1443 - .rev = 0, 1444 - .funcs = &vi_common_ip_funcs, 1445 - }, 1446 - { 1447 - .type = AMD_IP_BLOCK_TYPE_GMC, 1448 - .major = 8, 1449 - .minor = 0, 1450 - .rev = 0, 1451 - .funcs = &gmc_v8_0_ip_funcs, 1452 - }, 1453 - { 1454 - .type = AMD_IP_BLOCK_TYPE_IH, 1455 - .major = 3, 1456 - .minor = 0, 1457 - .rev = 0, 1458 - .funcs = &cz_ih_ip_funcs, 1459 - }, 1460 - { 1461 - .type = AMD_IP_BLOCK_TYPE_SMC, 1462 - .major = 8, 1463 - .minor = 0, 1464 - .rev = 0, 1465 - .funcs = &amdgpu_pp_ip_funcs 1466 - }, 1467 - { 1468 - .type = AMD_IP_BLOCK_TYPE_DCE, 1469 - .major = 11, 1470 - .minor = 0, 1471 - .rev = 0, 1472 - .funcs = &dce_virtual_ip_funcs, 1473 - }, 1474 - { 1475 - .type = AMD_IP_BLOCK_TYPE_GFX, 1476 - .major = 8, 1477 - .minor = 0, 1478 - .rev = 0, 1479 - .funcs = &gfx_v8_0_ip_funcs, 1480 - }, 1481 - { 1482 - .type = AMD_IP_BLOCK_TYPE_SDMA, 1483 - .major = 3, 1484 - .minor = 0, 1485 - .rev = 0, 1486 - .funcs = &sdma_v3_0_ip_funcs, 1487 - }, 1488 - { 1489 - .type = AMD_IP_BLOCK_TYPE_UVD, 1490 - .major = 6, 1491 - .minor = 0, 1492 - .rev = 0, 1493 - .funcs = &uvd_v6_0_ip_funcs, 1494 - }, 1495 - { 1496 - .type = AMD_IP_BLOCK_TYPE_VCE, 1497 - .major = 3, 1498 - .minor = 0, 1499 - .rev = 0, 1500 - .funcs = &vce_v3_0_ip_funcs, 1501 - }, 1502 - #if defined(CONFIG_DRM_AMD_ACP) 1503 - { 1504 - .type = AMD_IP_BLOCK_TYPE_ACP, 1505 - .major = 2, 1506 - .minor = 2, 1507 - .rev = 0, 1508 - .funcs = &acp_ip_funcs, 1509 - }, 1510 - #endif 1511 - }; 1512 - 1513 - int vi_set_ip_blocks(struct amdgpu_device *adev) 1514 - { 1515 - if (adev->enable_virtual_display) { 1516 - switch (adev->asic_type) { 1517 - case CHIP_TOPAZ: 1518 - adev->ip_blocks = topaz_ip_blocks_vd; 1519 - adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks_vd); 1520 - break; 1521 - case CHIP_FIJI: 1522 - adev->ip_blocks = fiji_ip_blocks_vd; 1523 - adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks_vd); 1524 - break; 1525 - case CHIP_TONGA: 1526 - adev->ip_blocks = tonga_ip_blocks_vd; 1527 - adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks_vd); 1528 - break; 1529 - case CHIP_POLARIS11: 1530 - case CHIP_POLARIS10: 1531 - adev->ip_blocks = polaris11_ip_blocks_vd; 1532 - adev->num_ip_blocks = ARRAY_SIZE(polaris11_ip_blocks_vd); 1533 - break; 1534 - 1535 - case CHIP_CARRIZO: 1536 - case CHIP_STONEY: 1537 - adev->ip_blocks = cz_ip_blocks_vd; 1538 - adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks_vd); 1539 - break; 1540 - default: 1541 - /* FIXME: not supported yet */ 1542 - return -EINVAL; 1543 - } 1544 - } else { 1545 - switch (adev->asic_type) { 1546 - case CHIP_TOPAZ: 1547 - adev->ip_blocks = topaz_ip_blocks; 1548 - adev->num_ip_blocks = ARRAY_SIZE(topaz_ip_blocks); 1549 - break; 1550 - case CHIP_FIJI: 1551 - adev->ip_blocks = fiji_ip_blocks; 1552 - adev->num_ip_blocks = ARRAY_SIZE(fiji_ip_blocks); 1553 - break; 1554 - case CHIP_TONGA: 1555 - adev->ip_blocks = tonga_ip_blocks; 1556 - adev->num_ip_blocks = ARRAY_SIZE(tonga_ip_blocks); 1557 - break; 1558 - case CHIP_POLARIS11: 1559 - case CHIP_POLARIS10: 1560 - adev->ip_blocks = polaris11_ip_blocks; 1561 - adev->num_ip_blocks = ARRAY_SIZE(polaris11_ip_blocks); 1562 - break; 1563 - case CHIP_CARRIZO: 1564 - case CHIP_STONEY: 1565 - adev->ip_blocks = cz_ip_blocks; 1566 - adev->num_ip_blocks = ARRAY_SIZE(cz_ip_blocks); 1567 - break; 1568 - default: 1569 - /* FIXME: not supported yet */ 1570 - return -EINVAL; 1571 - } 1572 - } 1573 - 1574 - return 0; 1575 - } 1576 - 1577 784 #define ATI_REV_ID_FUSE_MACRO__ADDRESS 0xC0014044 1578 785 #define ATI_REV_ID_FUSE_MACRO__SHIFT 9 1579 786 #define ATI_REV_ID_FUSE_MACRO__MASK 0x00001E00 ··· 930 1593 break; 931 1594 case CHIP_TONGA: 932 1595 adev->cg_flags = AMD_CG_SUPPORT_UVD_MGCG; 933 - adev->pg_flags = 0; 1596 + adev->pg_flags = AMD_PG_SUPPORT_UVD; 934 1597 adev->external_rev_id = adev->rev_id + 0x14; 935 1598 break; 936 1599 case CHIP_POLARIS11: ··· 1245 1908 return 0; 1246 1909 } 1247 1910 1248 - const struct amd_ip_funcs vi_common_ip_funcs = { 1911 + static const struct amd_ip_funcs vi_common_ip_funcs = { 1249 1912 .name = "vi_common", 1250 1913 .early_init = vi_common_early_init, 1251 1914 .late_init = NULL, ··· 1262 1925 .set_powergating_state = vi_common_set_powergating_state, 1263 1926 }; 1264 1927 1928 + static const struct amdgpu_ip_block_version vi_common_ip_block = 1929 + { 1930 + .type = AMD_IP_BLOCK_TYPE_COMMON, 1931 + .major = 1, 1932 + .minor = 0, 1933 + .rev = 0, 1934 + .funcs = &vi_common_ip_funcs, 1935 + }; 1936 + 1937 + int vi_set_ip_blocks(struct amdgpu_device *adev) 1938 + { 1939 + switch (adev->asic_type) { 1940 + case CHIP_TOPAZ: 1941 + /* topaz has no DCE, UVD, VCE */ 1942 + amdgpu_ip_block_add(adev, &vi_common_ip_block); 1943 + amdgpu_ip_block_add(adev, &gmc_v7_4_ip_block); 1944 + amdgpu_ip_block_add(adev, &iceland_ih_ip_block); 1945 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1946 + if (adev->enable_virtual_display) 1947 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1948 + amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1949 + amdgpu_ip_block_add(adev, &sdma_v2_4_ip_block); 1950 + break; 1951 + case CHIP_FIJI: 1952 + amdgpu_ip_block_add(adev, &vi_common_ip_block); 1953 + amdgpu_ip_block_add(adev, &gmc_v8_5_ip_block); 1954 + amdgpu_ip_block_add(adev, &tonga_ih_ip_block); 1955 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1956 + if (adev->enable_virtual_display) 1957 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1958 + else 1959 + amdgpu_ip_block_add(adev, &dce_v10_1_ip_block); 1960 + amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1961 + amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block); 1962 + amdgpu_ip_block_add(adev, &uvd_v6_0_ip_block); 1963 + amdgpu_ip_block_add(adev, &vce_v3_0_ip_block); 1964 + break; 1965 + case CHIP_TONGA: 1966 + amdgpu_ip_block_add(adev, &vi_common_ip_block); 1967 + amdgpu_ip_block_add(adev, &gmc_v8_0_ip_block); 1968 + amdgpu_ip_block_add(adev, &tonga_ih_ip_block); 1969 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1970 + if (adev->enable_virtual_display) 1971 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1972 + else 1973 + amdgpu_ip_block_add(adev, &dce_v10_0_ip_block); 1974 + amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1975 + amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block); 1976 + amdgpu_ip_block_add(adev, &uvd_v5_0_ip_block); 1977 + amdgpu_ip_block_add(adev, &vce_v3_0_ip_block); 1978 + break; 1979 + case CHIP_POLARIS11: 1980 + case CHIP_POLARIS10: 1981 + amdgpu_ip_block_add(adev, &vi_common_ip_block); 1982 + amdgpu_ip_block_add(adev, &gmc_v8_1_ip_block); 1983 + amdgpu_ip_block_add(adev, &tonga_ih_ip_block); 1984 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1985 + if (adev->enable_virtual_display) 1986 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 1987 + else 1988 + amdgpu_ip_block_add(adev, &dce_v11_2_ip_block); 1989 + amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 1990 + amdgpu_ip_block_add(adev, &sdma_v3_1_ip_block); 1991 + amdgpu_ip_block_add(adev, &uvd_v6_3_ip_block); 1992 + amdgpu_ip_block_add(adev, &vce_v3_4_ip_block); 1993 + break; 1994 + case CHIP_CARRIZO: 1995 + amdgpu_ip_block_add(adev, &vi_common_ip_block); 1996 + amdgpu_ip_block_add(adev, &gmc_v8_0_ip_block); 1997 + amdgpu_ip_block_add(adev, &cz_ih_ip_block); 1998 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 1999 + if (adev->enable_virtual_display) 2000 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 2001 + else 2002 + amdgpu_ip_block_add(adev, &dce_v11_0_ip_block); 2003 + amdgpu_ip_block_add(adev, &gfx_v8_0_ip_block); 2004 + amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block); 2005 + amdgpu_ip_block_add(adev, &uvd_v6_0_ip_block); 2006 + amdgpu_ip_block_add(adev, &vce_v3_1_ip_block); 2007 + #if defined(CONFIG_DRM_AMD_ACP) 2008 + amdgpu_ip_block_add(adev, &acp_ip_block); 2009 + #endif 2010 + break; 2011 + case CHIP_STONEY: 2012 + amdgpu_ip_block_add(adev, &vi_common_ip_block); 2013 + amdgpu_ip_block_add(adev, &gmc_v8_0_ip_block); 2014 + amdgpu_ip_block_add(adev, &cz_ih_ip_block); 2015 + amdgpu_ip_block_add(adev, &amdgpu_pp_ip_block); 2016 + if (adev->enable_virtual_display) 2017 + amdgpu_ip_block_add(adev, &dce_virtual_ip_block); 2018 + else 2019 + amdgpu_ip_block_add(adev, &dce_v11_0_ip_block); 2020 + amdgpu_ip_block_add(adev, &gfx_v8_1_ip_block); 2021 + amdgpu_ip_block_add(adev, &sdma_v3_0_ip_block); 2022 + amdgpu_ip_block_add(adev, &uvd_v6_2_ip_block); 2023 + amdgpu_ip_block_add(adev, &vce_v3_4_ip_block); 2024 + #if defined(CONFIG_DRM_AMD_ACP) 2025 + amdgpu_ip_block_add(adev, &acp_ip_block); 2026 + #endif 2027 + break; 2028 + default: 2029 + /* FIXME: not supported yet */ 2030 + return -EINVAL; 2031 + } 2032 + 2033 + return 0; 2034 + }
-2
drivers/gpu/drm/amd/amdgpu/vi.h
··· 24 24 #ifndef __VI_H__ 25 25 #define __VI_H__ 26 26 27 - extern const struct amd_ip_funcs vi_common_ip_funcs; 28 - 29 27 void vi_srbm_select(struct amdgpu_device *adev, 30 28 u32 me, u32 pipe, u32 queue, u32 vmid); 31 29 int vi_set_ip_blocks(struct amdgpu_device *adev);
+23
drivers/gpu/drm/amd/include/amd_shared.h
··· 84 84 AMD_PG_STATE_UNGATE, 85 85 }; 86 86 87 + struct amd_vce_state { 88 + /* vce clocks */ 89 + u32 evclk; 90 + u32 ecclk; 91 + /* gpu clocks */ 92 + u32 sclk; 93 + u32 mclk; 94 + u8 clk_idx; 95 + u8 pstate; 96 + }; 97 + 98 + 99 + #define AMD_MAX_VCE_LEVELS 6 100 + 101 + enum amd_vce_level { 102 + AMD_VCE_LEVEL_AC_ALL = 0, /* AC, All cases */ 103 + AMD_VCE_LEVEL_DC_EE = 1, /* DC, entropy encoding */ 104 + AMD_VCE_LEVEL_DC_LL_LOW = 2, /* DC, low latency queue, res <= 720 */ 105 + AMD_VCE_LEVEL_DC_LL_HIGH = 3, /* DC, low latency queue, 1080 >= res > 720 */ 106 + AMD_VCE_LEVEL_DC_GP_LOW = 4, /* DC, general purpose queue, res <= 720 */ 107 + AMD_VCE_LEVEL_DC_GP_HIGH = 5, /* DC, general purpose queue, 1080 >= res > 720 */ 108 + }; 109 + 87 110 /* CG flags */ 88 111 #define AMD_CG_SUPPORT_GFX_MGCG (1 << 0) 89 112 #define AMD_CG_SUPPORT_GFX_MGLS (1 << 1)
+2
drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_1_d.h
··· 176 176 #define mmSMU1_SMU_SMC_IND_DATA 0x83 177 177 #define mmSMU2_SMU_SMC_IND_DATA 0x85 178 178 #define mmSMU3_SMU_SMC_IND_DATA 0x87 179 + #define mmSMC_IND_INDEX_11 0x1AC 180 + #define mmSMC_IND_DATA_11 0x1AD 179 181 #define ixRCU_UC_EVENTS 0xc0000004 180 182 #define ixRCU_MISC_CTRL 0xc0000010 181 183 #define ixCC_RCU_FUSES 0xc00c0000
+2
drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_2_d.h
··· 87 87 #define mmSMC_IND_DATA_6 0x8d 88 88 #define mmSMC_IND_INDEX_7 0x8e 89 89 #define mmSMC_IND_DATA_7 0x8f 90 + #define mmSMC_IND_INDEX_11 0x1AC 91 + #define mmSMC_IND_DATA_11 0x1AD 90 92 #define mmSMC_IND_ACCESS_CNTL 0x92 91 93 #define mmSMC_MESSAGE_0 0x94 92 94 #define mmSMC_RESP_0 0x95
+2
drivers/gpu/drm/amd/include/asic_reg/smu/smu_7_1_3_d.h
··· 90 90 #define mmSMC_IND_DATA_6 0x8d 91 91 #define mmSMC_IND_INDEX_7 0x8e 92 92 #define mmSMC_IND_DATA_7 0x8f 93 + #define mmSMC_IND_INDEX_11 0x1AC 94 + #define mmSMC_IND_DATA_11 0x1AD 93 95 #define mmSMC_IND_ACCESS_CNTL 0x92 94 96 #define mmSMC_MESSAGE_0 0x94 95 97 #define mmSMC_RESP_0 0x95
+6
drivers/gpu/drm/amd/include/cgs_common.h
··· 106 106 CGS_UCODE_ID_CP_MEC_JT2, 107 107 CGS_UCODE_ID_GMCON_RENG, 108 108 CGS_UCODE_ID_RLC_G, 109 + CGS_UCODE_ID_STORAGE, 109 110 CGS_UCODE_ID_MAXIMUM, 110 111 }; 111 112 ··· 620 619 typedef int (*cgs_query_system_info)(struct cgs_device *cgs_device, 621 620 struct cgs_system_info *sys_info); 622 621 622 + typedef int (*cgs_is_virtualization_enabled_t)(void *cgs_device); 623 + 623 624 struct cgs_ops { 624 625 /* memory management calls (similar to KFD interface) */ 625 626 cgs_gpu_mem_info_t gpu_mem_info; ··· 673 670 cgs_call_acpi_method call_acpi_method; 674 671 /* get system info */ 675 672 cgs_query_system_info query_system_info; 673 + cgs_is_virtualization_enabled_t is_virtualization_enabled; 676 674 }; 677 675 678 676 struct cgs_os_ops; /* To be define in OS-specific CGS header */ ··· 777 773 CGS_CALL(get_pci_resource, cgs_device, resource_type, size, offset, \ 778 774 resource_base) 779 775 776 + #define cgs_is_virtualization_enabled(cgs_device) \ 777 + CGS_CALL(is_virtualization_enabled, cgs_device) 780 778 #endif /* _CGS_COMMON_H */
+19 -2
drivers/gpu/drm/amd/powerplay/amd_powerplay.c
··· 436 436 } 437 437 } 438 438 439 - int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, void *input, void *output) 439 + static int pp_dpm_dispatch_tasks(void *handle, enum amd_pp_event event_id, 440 + void *input, void *output) 440 441 { 441 442 int ret = 0; 442 443 struct pp_instance *pp_handle; ··· 476 475 return ret; 477 476 } 478 477 479 - enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle) 478 + static enum amd_pm_state_type pp_dpm_get_current_power_state(void *handle) 480 479 { 481 480 struct pp_hwmgr *hwmgr; 482 481 struct pp_power_state *state; ··· 821 820 return hwmgr->hwmgr_func->read_sensor(hwmgr, idx, value); 822 821 } 823 822 823 + static struct amd_vce_state* 824 + pp_dpm_get_vce_clock_state(void *handle, unsigned idx) 825 + { 826 + struct pp_hwmgr *hwmgr; 827 + 828 + if (handle) { 829 + hwmgr = ((struct pp_instance *)handle)->hwmgr; 830 + 831 + if (hwmgr && idx < hwmgr->num_vce_state_tables) 832 + return &hwmgr->vce_states[idx]; 833 + } 834 + 835 + return NULL; 836 + } 837 + 824 838 const struct amd_powerplay_funcs pp_dpm_funcs = { 825 839 .get_temperature = pp_dpm_get_temperature, 826 840 .load_firmware = pp_dpm_load_fw, ··· 862 846 .get_mclk_od = pp_dpm_get_mclk_od, 863 847 .set_mclk_od = pp_dpm_set_mclk_od, 864 848 .read_sensor = pp_dpm_read_sensor, 849 + .get_vce_clock_state = pp_dpm_get_vce_clock_state, 865 850 }; 866 851 867 852 static int amd_pp_instance_init(struct amd_pp_init *pp_init,
+6 -6
drivers/gpu/drm/amd/powerplay/hwmgr/cz_hwmgr.c
··· 66 66 return (struct cz_power_state *)hw_ps; 67 67 } 68 68 69 - uint32_t cz_get_eclk_level(struct pp_hwmgr *hwmgr, 69 + static uint32_t cz_get_eclk_level(struct pp_hwmgr *hwmgr, 70 70 uint32_t clock, uint32_t msg) 71 71 { 72 72 int i = 0; ··· 1017 1017 return 0; 1018 1018 } 1019 1019 1020 - int cz_tf_reset_acp_boot_level(struct pp_hwmgr *hwmgr, void *input, 1020 + static int cz_tf_reset_acp_boot_level(struct pp_hwmgr *hwmgr, void *input, 1021 1021 void *output, void *storage, int result) 1022 1022 { 1023 1023 struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); ··· 1225 1225 return 0; 1226 1226 } 1227 1227 1228 - int cz_phm_force_dpm_highest(struct pp_hwmgr *hwmgr) 1228 + static int cz_phm_force_dpm_highest(struct pp_hwmgr *hwmgr) 1229 1229 { 1230 1230 struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); 1231 1231 ··· 1239 1239 return 0; 1240 1240 } 1241 1241 1242 - int cz_phm_unforce_dpm_levels(struct pp_hwmgr *hwmgr) 1242 + static int cz_phm_unforce_dpm_levels(struct pp_hwmgr *hwmgr) 1243 1243 { 1244 1244 struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); 1245 1245 struct phm_clock_voltage_dependency_table *table = ··· 1277 1277 return 0; 1278 1278 } 1279 1279 1280 - int cz_phm_force_dpm_lowest(struct pp_hwmgr *hwmgr) 1280 + static int cz_phm_force_dpm_lowest(struct pp_hwmgr *hwmgr) 1281 1281 { 1282 1282 struct cz_hwmgr *cz_hwmgr = (struct cz_hwmgr *)(hwmgr->backend); 1283 1283 ··· 1533 1533 return result; 1534 1534 } 1535 1535 1536 - int cz_get_power_state_size(struct pp_hwmgr *hwmgr) 1536 + static int cz_get_power_state_size(struct pp_hwmgr *hwmgr) 1537 1537 { 1538 1538 return sizeof(struct cz_power_state); 1539 1539 }
+1
drivers/gpu/drm/amd/powerplay/hwmgr/pp_acpi.c
··· 25 25 #include "linux/delay.h" 26 26 #include "hwmgr.h" 27 27 #include "amd_acpi.h" 28 + #include "pp_acpi.h" 28 29 29 30 bool acpi_atcs_functions_supported(void *device, uint32_t index) 30 31 {
+5 -5
drivers/gpu/drm/amd/powerplay/hwmgr/process_pptables_v1_0.c
··· 131 131 /** 132 132 * Private Function to get the PowerPlay Table Address. 133 133 */ 134 - const void *get_powerplay_table(struct pp_hwmgr *hwmgr) 134 + static const void *get_powerplay_table(struct pp_hwmgr *hwmgr) 135 135 { 136 136 int index = GetIndexIntoMasterTable(DATA, PowerPlayInfo); 137 137 ··· 1049 1049 return 0; 1050 1050 } 1051 1051 1052 - int pp_tables_v1_0_initialize(struct pp_hwmgr *hwmgr) 1052 + static int pp_tables_v1_0_initialize(struct pp_hwmgr *hwmgr) 1053 1053 { 1054 1054 int result = 0; 1055 1055 const ATOM_Tonga_POWERPLAYTABLE *powerplay_table; ··· 1100 1100 return result; 1101 1101 } 1102 1102 1103 - int pp_tables_v1_0_uninitialize(struct pp_hwmgr *hwmgr) 1103 + static int pp_tables_v1_0_uninitialize(struct pp_hwmgr *hwmgr) 1104 1104 { 1105 1105 struct phm_ppt_v1_information *pp_table_information = 1106 1106 (struct phm_ppt_v1_information *)(hwmgr->pptable); ··· 1211 1211 } 1212 1212 1213 1213 static int ppt_get_vce_state_table_entry_v1_0(struct pp_hwmgr *hwmgr, uint32_t i, 1214 - struct pp_vce_state *vce_state, void **clock_info, uint32_t *flag) 1214 + struct amd_vce_state *vce_state, void **clock_info, uint32_t *flag) 1215 1215 { 1216 1216 const ATOM_Tonga_VCE_State_Record *vce_state_record; 1217 1217 ATOM_Tonga_SCLK_Dependency_Record *sclk_dep_record; ··· 1315 1315 1316 1316 hwmgr->num_vce_state_tables = i = ppt_get_num_of_vce_state_table_entries_v1_0(hwmgr); 1317 1317 1318 - if ((i != 0) && (i <= PP_MAX_VCE_LEVELS)) { 1318 + if ((i != 0) && (i <= AMD_MAX_VCE_LEVELS)) { 1319 1319 for (j = 0; j < i; j++) 1320 1320 ppt_get_vce_state_table_entry_v1_0(hwmgr, j, &(hwmgr->vce_states[j]), NULL, &flags); 1321 1321 }
+3 -3
drivers/gpu/drm/amd/powerplay/hwmgr/processpptables.c
··· 1507 1507 return 0; 1508 1508 } 1509 1509 1510 - int get_number_of_vce_state_table_entries( 1510 + static int get_number_of_vce_state_table_entries( 1511 1511 struct pp_hwmgr *hwmgr) 1512 1512 { 1513 1513 const ATOM_PPLIB_POWERPLAYTABLE *table = ··· 1521 1521 return 0; 1522 1522 } 1523 1523 1524 - int get_vce_state_table_entry(struct pp_hwmgr *hwmgr, 1524 + static int get_vce_state_table_entry(struct pp_hwmgr *hwmgr, 1525 1525 unsigned long i, 1526 - struct pp_vce_state *vce_state, 1526 + struct amd_vce_state *vce_state, 1527 1527 void **clock_info, 1528 1528 unsigned long *flag) 1529 1529 {
+14 -8
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_clockpowergating.c
··· 75 75 return 0; 76 76 } 77 77 78 - int smu7_powerup_uvd(struct pp_hwmgr *hwmgr) 78 + static int smu7_powerup_uvd(struct pp_hwmgr *hwmgr) 79 79 { 80 80 if (phm_cf_want_uvd_power_gating(hwmgr)) { 81 81 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, ··· 91 91 return 0; 92 92 } 93 93 94 - int smu7_powerdown_vce(struct pp_hwmgr *hwmgr) 94 + static int smu7_powerdown_vce(struct pp_hwmgr *hwmgr) 95 95 { 96 96 if (phm_cf_want_vce_power_gating(hwmgr)) 97 97 return smum_send_msg_to_smc(hwmgr->smumgr, ··· 99 99 return 0; 100 100 } 101 101 102 - int smu7_powerup_vce(struct pp_hwmgr *hwmgr) 102 + static int smu7_powerup_vce(struct pp_hwmgr *hwmgr) 103 103 { 104 104 if (phm_cf_want_vce_power_gating(hwmgr)) 105 105 return smum_send_msg_to_smc(hwmgr->smumgr, ··· 107 107 return 0; 108 108 } 109 109 110 - int smu7_powerdown_samu(struct pp_hwmgr *hwmgr) 110 + static int smu7_powerdown_samu(struct pp_hwmgr *hwmgr) 111 111 { 112 112 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 113 113 PHM_PlatformCaps_SamuPowerGating)) ··· 116 116 return 0; 117 117 } 118 118 119 - int smu7_powerup_samu(struct pp_hwmgr *hwmgr) 119 + static int smu7_powerup_samu(struct pp_hwmgr *hwmgr) 120 120 { 121 121 if (phm_cap_enabled(hwmgr->platform_descriptor.platformCaps, 122 122 PHM_PlatformCaps_SamuPowerGating)) ··· 149 149 if (bgate) { 150 150 cgs_set_clockgating_state(hwmgr->device, 151 151 AMD_IP_BLOCK_TYPE_UVD, 152 - AMD_CG_STATE_GATE); 152 + AMD_CG_STATE_UNGATE); 153 + cgs_set_powergating_state(hwmgr->device, 154 + AMD_IP_BLOCK_TYPE_UVD, 155 + AMD_PG_STATE_GATE); 153 156 smu7_update_uvd_dpm(hwmgr, true); 154 157 smu7_powerdown_uvd(hwmgr); 155 158 } else { 156 159 smu7_powerup_uvd(hwmgr); 157 - smu7_update_uvd_dpm(hwmgr, false); 160 + cgs_set_powergating_state(hwmgr->device, 161 + AMD_IP_BLOCK_TYPE_UVD, 162 + AMD_CG_STATE_UNGATE); 158 163 cgs_set_clockgating_state(hwmgr->device, 159 164 AMD_IP_BLOCK_TYPE_UVD, 160 - AMD_CG_STATE_UNGATE); 165 + AMD_CG_STATE_GATE); 166 + smu7_update_uvd_dpm(hwmgr, false); 161 167 } 162 168 163 169 return 0;
+39 -20
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c
··· 89 89 90 90 static const unsigned long PhwVIslands_Magic = (unsigned long)(PHM_VIslands_Magic); 91 91 92 - struct smu7_power_state *cast_phw_smu7_power_state( 92 + static struct smu7_power_state *cast_phw_smu7_power_state( 93 93 struct pp_hw_power_state *hw_ps) 94 94 { 95 95 PP_ASSERT_WITH_CODE((PhwVIslands_Magic == hw_ps->magic), ··· 99 99 return (struct smu7_power_state *)hw_ps; 100 100 } 101 101 102 - const struct smu7_power_state *cast_const_phw_smu7_power_state( 102 + static const struct smu7_power_state *cast_const_phw_smu7_power_state( 103 103 const struct pp_hw_power_state *hw_ps) 104 104 { 105 105 PP_ASSERT_WITH_CODE((PhwVIslands_Magic == hw_ps->magic), ··· 115 115 * @param hwmgr the address of the powerplay hardware manager. 116 116 * @return always 0 117 117 */ 118 - int smu7_get_mc_microcode_version (struct pp_hwmgr *hwmgr) 118 + static int smu7_get_mc_microcode_version(struct pp_hwmgr *hwmgr) 119 119 { 120 120 cgs_write_register(hwmgr->device, mmMC_SEQ_IO_DEBUG_INDEX, 0x9F); 121 121 ··· 124 124 return 0; 125 125 } 126 126 127 - uint16_t smu7_get_current_pcie_speed(struct pp_hwmgr *hwmgr) 127 + static uint16_t smu7_get_current_pcie_speed(struct pp_hwmgr *hwmgr) 128 128 { 129 129 uint32_t speedCntl = 0; 130 130 ··· 135 135 PCIE_LC_SPEED_CNTL, LC_CURRENT_DATA_RATE)); 136 136 } 137 137 138 - int smu7_get_current_pcie_lane_number(struct pp_hwmgr *hwmgr) 138 + static int smu7_get_current_pcie_lane_number(struct pp_hwmgr *hwmgr) 139 139 { 140 140 uint32_t link_width; 141 141 ··· 155 155 * @param pHwMgr the address of the powerplay hardware manager. 156 156 * @return always PP_Result_OK 157 157 */ 158 - int smu7_enable_smc_voltage_controller(struct pp_hwmgr *hwmgr) 158 + static int smu7_enable_smc_voltage_controller(struct pp_hwmgr *hwmgr) 159 159 { 160 160 if (hwmgr->feature_mask & PP_SMC_VOLTAGE_CONTROL_MASK) 161 161 smum_send_msg_to_smc(hwmgr->smumgr, PPSMC_MSG_Voltage_Cntl_Enable); ··· 802 802 return 0; 803 803 } 804 804 805 - int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr) 805 + static int smu7_setup_default_dpm_tables(struct pp_hwmgr *hwmgr) 806 806 { 807 807 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 808 808 ··· 1153 1153 return smu7_disable_auto_throttle_source(hwmgr, PHM_AutoThrottleSource_Thermal); 1154 1154 } 1155 1155 1156 - int smu7_pcie_performance_request(struct pp_hwmgr *hwmgr) 1156 + static int smu7_pcie_performance_request(struct pp_hwmgr *hwmgr) 1157 1157 { 1158 1158 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 1159 1159 data->pcie_performance_request = true; ··· 1161 1161 return 0; 1162 1162 } 1163 1163 1164 - int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 1164 + static int smu7_enable_dpm_tasks(struct pp_hwmgr *hwmgr) 1165 1165 { 1166 1166 int tmp_result = 0; 1167 1167 int result = 0; ··· 1352 1352 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 1353 1353 struct phm_ppt_v1_information *table_info = 1354 1354 (struct phm_ppt_v1_information *)(hwmgr->pptable); 1355 + struct cgs_system_info sys_info = {0}; 1356 + int result; 1355 1357 1356 1358 data->dll_default_on = false; 1357 1359 data->mclk_dpm0_activity_target = 0xa; ··· 1441 1439 data->pcie_lane_performance.min = 16; 1442 1440 data->pcie_lane_power_saving.max = 0; 1443 1441 data->pcie_lane_power_saving.min = 16; 1442 + 1443 + sys_info.size = sizeof(struct cgs_system_info); 1444 + sys_info.info_id = CGS_SYSTEM_INFO_PG_FLAGS; 1445 + result = cgs_query_system_info(hwmgr->device, &sys_info); 1446 + if (!result) { 1447 + if (sys_info.value & AMD_PG_SUPPORT_UVD) 1448 + phm_cap_set(hwmgr->platform_descriptor.platformCaps, 1449 + PHM_PlatformCaps_UVDPowerGating); 1450 + if (sys_info.value & AMD_PG_SUPPORT_VCE) 1451 + phm_cap_set(hwmgr->platform_descriptor.platformCaps, 1452 + PHM_PlatformCaps_VCEPowerGating); 1453 + } 1444 1454 } 1445 1455 1446 1456 /** ··· 1878 1864 return 0; 1879 1865 } 1880 1866 1881 - int smu7_patch_voltage_workaround(struct pp_hwmgr *hwmgr) 1867 + static int smu7_patch_voltage_workaround(struct pp_hwmgr *hwmgr) 1882 1868 { 1883 1869 struct phm_ppt_v1_information *table_info = 1884 1870 (struct phm_ppt_v1_information *)(hwmgr->pptable); ··· 2267 2253 return 0; 2268 2254 } 2269 2255 2270 - int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr) 2256 + static int smu7_hwmgr_backend_init(struct pp_hwmgr *hwmgr) 2271 2257 { 2272 2258 struct smu7_hwmgr *data; 2273 2259 int result; ··· 3686 3672 PPSMC_MSG_SetFanPwmMax, us_max_fan_pwm); 3687 3673 } 3688 3674 3689 - int smu7_notify_smc_display_change(struct pp_hwmgr *hwmgr, bool has_display) 3675 + static int 3676 + smu7_notify_smc_display_change(struct pp_hwmgr *hwmgr, bool has_display) 3690 3677 { 3691 3678 PPSMC_Msg msg = has_display ? (PPSMC_Msg)PPSMC_HasDisplay : (PPSMC_Msg)PPSMC_NoDisplay; 3692 3679 3693 3680 return (smum_send_msg_to_smc(hwmgr->smumgr, msg) == 0) ? 0 : -1; 3694 3681 } 3695 3682 3696 - int smu7_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr) 3683 + static int 3684 + smu7_notify_smc_display_config_after_ps_adjustment(struct pp_hwmgr *hwmgr) 3697 3685 { 3698 3686 uint32_t num_active_displays = 0; 3699 3687 struct cgs_display_info info = {0}; ··· 3717 3701 * @param hwmgr the address of the powerplay hardware manager. 3718 3702 * @return always OK 3719 3703 */ 3720 - int smu7_program_display_gap(struct pp_hwmgr *hwmgr) 3704 + static int smu7_program_display_gap(struct pp_hwmgr *hwmgr) 3721 3705 { 3722 3706 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 3723 3707 uint32_t num_active_displays = 0; ··· 3767 3751 return 0; 3768 3752 } 3769 3753 3770 - int smu7_display_configuration_changed_task(struct pp_hwmgr *hwmgr) 3754 + static int smu7_display_configuration_changed_task(struct pp_hwmgr *hwmgr) 3771 3755 { 3772 3756 return smu7_program_display_gap(hwmgr); 3773 3757 } ··· 3791 3775 PPSMC_MSG_SetFanRpmMax, us_max_fan_rpm); 3792 3776 } 3793 3777 3794 - int smu7_register_internal_thermal_interrupt(struct pp_hwmgr *hwmgr, 3778 + static int smu7_register_internal_thermal_interrupt(struct pp_hwmgr *hwmgr, 3795 3779 const void *thermal_interrupt_info) 3796 3780 { 3797 3781 return 0; 3798 3782 } 3799 3783 3800 - bool smu7_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hwmgr) 3784 + static bool 3785 + smu7_check_smc_update_required_for_display_configuration(struct pp_hwmgr *hwmgr) 3801 3786 { 3802 3787 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 3803 3788 bool is_update_required = false; ··· 3827 3810 (pl1->pcie_lane == pl2->pcie_lane)); 3828 3811 } 3829 3812 3830 - int smu7_check_states_equal(struct pp_hwmgr *hwmgr, const struct pp_hw_power_state *pstate1, const struct pp_hw_power_state *pstate2, bool *equal) 3813 + static int smu7_check_states_equal(struct pp_hwmgr *hwmgr, 3814 + const struct pp_hw_power_state *pstate1, 3815 + const struct pp_hw_power_state *pstate2, bool *equal) 3831 3816 { 3832 3817 const struct smu7_power_state *psa; 3833 3818 const struct smu7_power_state *psb; ··· 3862 3843 return 0; 3863 3844 } 3864 3845 3865 - int smu7_upload_mc_firmware(struct pp_hwmgr *hwmgr) 3846 + static int smu7_upload_mc_firmware(struct pp_hwmgr *hwmgr) 3866 3847 { 3867 3848 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 3868 3849 ··· 3991 3972 return 0; 3992 3973 } 3993 3974 3994 - int smu7_setup_asic_task(struct pp_hwmgr *hwmgr) 3975 + static int smu7_setup_asic_task(struct pp_hwmgr *hwmgr) 3995 3976 { 3996 3977 int tmp_result, result = 0; 3997 3978
+1
drivers/gpu/drm/amd/powerplay/inc/amd_powerplay.h
··· 359 359 int (*get_mclk_od)(void *handle); 360 360 int (*set_mclk_od)(void *handle, uint32_t value); 361 361 int (*read_sensor)(void *handle, int idx, int32_t *value); 362 + struct amd_vce_state* (*get_vce_clock_state)(void *handle, unsigned idx); 362 363 }; 363 364 364 365 struct amd_powerplay {
+2 -14
drivers/gpu/drm/amd/powerplay/inc/hwmgr.h
··· 367 367 int (*pptable_get_vce_state_table_entry)( 368 368 struct pp_hwmgr *hwmgr, 369 369 unsigned long i, 370 - struct pp_vce_state *vce_state, 370 + struct amd_vce_state *vce_state, 371 371 void **clock_info, 372 372 unsigned long *flag); 373 373 }; ··· 586 586 uint32_t NB; 587 587 }; 588 588 589 - #define PP_MAX_VCE_LEVELS 6 590 - 591 - enum PP_VCE_LEVEL { 592 - PP_VCE_LEVEL_AC_ALL = 0, /* AC, All cases */ 593 - PP_VCE_LEVEL_DC_EE = 1, /* DC, entropy encoding */ 594 - PP_VCE_LEVEL_DC_LL_LOW = 2, /* DC, low latency queue, res <= 720 */ 595 - PP_VCE_LEVEL_DC_LL_HIGH = 3, /* DC, low latency queue, 1080 >= res > 720 */ 596 - PP_VCE_LEVEL_DC_GP_LOW = 4, /* DC, general purpose queue, res <= 720 */ 597 - PP_VCE_LEVEL_DC_GP_HIGH = 5, /* DC, general purpose queue, 1080 >= res > 720 */ 598 - }; 599 - 600 - 601 589 enum PP_TABLE_VERSION { 602 590 PP_TABLE_V0 = 0, 603 591 PP_TABLE_V1, ··· 608 620 void *hardcode_pp_table; 609 621 bool need_pp_table_upload; 610 622 611 - struct pp_vce_state vce_states[PP_MAX_VCE_LEVELS]; 623 + struct amd_vce_state vce_states[AMD_MAX_VCE_LEVELS]; 612 624 uint32_t num_vce_state_tables; 613 625 614 626 enum amd_dpm_forced_level dpm_level;
-9
drivers/gpu/drm/amd/powerplay/inc/power_state.h
··· 156 156 struct pp_hw_power_state hardware; 157 157 }; 158 158 159 - 160 - /*Structure to hold a VCE state entry*/ 161 - struct pp_vce_state { 162 - uint32_t evclk; 163 - uint32_t ecclk; 164 - uint32_t sclk; 165 - uint32_t mclk; 166 - }; 167 - 168 159 enum PP_MMProfilingState { 169 160 PP_MMProfilingState_NA = 0, 170 161 PP_MMProfilingState_Started,
+3 -6
drivers/gpu/drm/amd/powerplay/inc/pp_acpi.h
··· 21 21 * 22 22 */ 23 23 24 - extern bool acpi_atcs_functions_supported(void *device, 25 - uint32_t index); 26 - extern int acpi_pcie_perf_request(void *device, 27 - uint8_t perf_req, 28 - bool advertise); 29 - extern bool acpi_atcs_notify_pcie_device_ready(void *device); 24 + bool acpi_atcs_functions_supported(void *device, uint32_t index); 25 + int acpi_pcie_perf_request(void *device, uint8_t perf_req, bool advertise); 26 + bool acpi_atcs_notify_pcie_device_ready(void *device);
+3 -3
drivers/gpu/drm/amd/powerplay/smumgr/fiji_smc.c
··· 2049 2049 return 0; 2050 2050 } 2051 2051 2052 - int fiji_program_mem_timing_parameters(struct pp_hwmgr *hwmgr) 2052 + static int fiji_program_mem_timing_parameters(struct pp_hwmgr *hwmgr) 2053 2053 { 2054 2054 struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); 2055 2055 ··· 2125 2125 return offsetof(SMU73_Discrete_DpmTable, LowSclkInterruptThreshold); 2126 2126 } 2127 2127 } 2128 - printk("cant't get the offset of type %x member %x \n", type, member); 2128 + printk(KERN_WARNING "can't get the offset of type %x member %x\n", type, member); 2129 2129 return 0; 2130 2130 } 2131 2131 ··· 2150 2150 return SMU73_MAX_LEVELS_MVDD; 2151 2151 } 2152 2152 2153 - printk("cant't get the mac of %x \n", value); 2153 + printk(KERN_WARNING "can't get the mac of %x\n", value); 2154 2154 return 0; 2155 2155 } 2156 2156
+6 -6
drivers/gpu/drm/amd/powerplay/smumgr/fiji_smumgr.c
··· 159 159 return result; 160 160 } 161 161 162 - int fiji_setup_pwr_virus(struct pp_smumgr *smumgr) 162 + static int fiji_setup_pwr_virus(struct pp_smumgr *smumgr) 163 163 { 164 164 int i, result = -1; 165 165 uint32_t reg, data; ··· 224 224 return result; 225 225 } 226 226 227 - int fiji_setup_pm_fuse_for_avfs(struct pp_smumgr *smumgr) 227 + static int fiji_setup_pm_fuse_for_avfs(struct pp_smumgr *smumgr) 228 228 { 229 229 int result = 0; 230 230 uint32_t table_start; ··· 260 260 return result; 261 261 } 262 262 263 - int fiji_setup_graphics_level_structure(struct pp_smumgr *smumgr) 263 + static int fiji_setup_graphics_level_structure(struct pp_smumgr *smumgr) 264 264 { 265 265 int32_t vr_config; 266 266 uint32_t table_start; ··· 299 299 } 300 300 301 301 /* Work in Progress */ 302 - int fiji_restore_vft_table(struct pp_smumgr *smumgr) 302 + static int fiji_restore_vft_table(struct pp_smumgr *smumgr) 303 303 { 304 304 struct fiji_smumgr *priv = (struct fiji_smumgr *)(smumgr->backend); 305 305 ··· 311 311 } 312 312 313 313 /* Work in Progress */ 314 - int fiji_save_vft_table(struct pp_smumgr *smumgr) 314 + static int fiji_save_vft_table(struct pp_smumgr *smumgr) 315 315 { 316 316 struct fiji_smumgr *priv = (struct fiji_smumgr *)(smumgr->backend); 317 317 ··· 322 322 return -EINVAL; 323 323 } 324 324 325 - int fiji_avfs_event_mgr(struct pp_smumgr *smumgr, bool smu_started) 325 + static int fiji_avfs_event_mgr(struct pp_smumgr *smumgr, bool smu_started) 326 326 { 327 327 struct fiji_smumgr *priv = (struct fiji_smumgr *)(smumgr->backend); 328 328
+2 -2
drivers/gpu/drm/amd/powerplay/smumgr/iceland_smc.c
··· 2140 2140 return offsetof(SMU71_Discrete_DpmTable, LowSclkInterruptThreshold); 2141 2141 } 2142 2142 } 2143 - printk("cant't get the offset of type %x member %x \n", type, member); 2143 + printk(KERN_WARNING "can't get the offset of type %x member %x\n", type, member); 2144 2144 return 0; 2145 2145 } 2146 2146 ··· 2163 2163 return SMU71_MAX_LEVELS_MVDD; 2164 2164 } 2165 2165 2166 - printk("cant't get the mac of %x \n", value); 2166 + printk(KERN_WARNING "can't get the mac of %x\n", value); 2167 2167 return 0; 2168 2168 } 2169 2169
+2 -2
drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smc.c
··· 2174 2174 return offsetof(SMU74_Discrete_DpmTable, LowSclkInterruptThreshold); 2175 2175 } 2176 2176 } 2177 - printk("cant't get the offset of type %x member %x \n", type, member); 2177 + printk(KERN_WARNING "can't get the offset of type %x member %x\n", type, member); 2178 2178 return 0; 2179 2179 } 2180 2180 ··· 2201 2201 return SMU7_UVD_MCLK_HANDSHAKE_DISABLE; 2202 2202 } 2203 2203 2204 - printk("cant't get the mac of %x \n", value); 2204 + printk(KERN_WARNING "can't get the mac of %x\n", value); 2205 2205 return 0; 2206 2206 } 2207 2207
+3 -2
drivers/gpu/drm/amd/powerplay/smumgr/polaris10_smumgr.c
··· 118 118 } 119 119 120 120 121 - int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr) 121 + static int polaris10_setup_graphics_level_structure(struct pp_smumgr *smumgr) 122 122 { 123 123 uint32_t vr_config; 124 124 uint32_t dpm_table_start; ··· 172 172 return 0; 173 173 } 174 174 175 - int polaris10_avfs_event_mgr(struct pp_smumgr *smumgr, bool SMU_VFT_INTACT) 175 + static int 176 + polaris10_avfs_event_mgr(struct pp_smumgr *smumgr, bool SMU_VFT_INTACT) 176 177 { 177 178 struct polaris10_smumgr *smu_data = (struct polaris10_smumgr *)(smumgr->backend); 178 179
+7
drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.c
··· 278 278 case UCODE_ID_RLC_G: 279 279 result = CGS_UCODE_ID_RLC_G; 280 280 break; 281 + case UCODE_ID_MEC_STORAGE: 282 + result = CGS_UCODE_ID_STORAGE; 283 + break; 281 284 default: 282 285 break; 283 286 } ··· 454 451 "Failed to Get Firmware Entry.", return -EINVAL); 455 452 PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr, 456 453 UCODE_ID_SDMA1, &toc->entry[toc->num_entries++]), 454 + "Failed to Get Firmware Entry.", return -EINVAL); 455 + if (cgs_is_virtualization_enabled(smumgr->device)) 456 + PP_ASSERT_WITH_CODE(0 == smu7_populate_single_firmware_entry(smumgr, 457 + UCODE_ID_MEC_STORAGE, &toc->entry[toc->num_entries++]), 457 458 "Failed to Get Firmware Entry.", return -EINVAL); 458 459 459 460 smu7_send_msg_to_smc_with_parameter(smumgr, PPSMC_MSG_DRV_DRAM_ADDR_HI, smu_data->header_buffer.mc_addr_high);
-2
drivers/gpu/drm/amd/powerplay/smumgr/smu7_smumgr.h
··· 28 28 #include <pp_endian.h> 29 29 30 30 #define SMC_RAM_END 0x40000 31 - #define mmSMC_IND_INDEX_11 0x01AC 32 - #define mmSMC_IND_DATA_11 0x01AD 33 31 34 32 struct smu7_buffer_entry { 35 33 uint32_t data_size;
+2 -2
drivers/gpu/drm/amd/powerplay/smumgr/tonga_smc.c
··· 2651 2651 return offsetof(SMU72_Discrete_DpmTable, LowSclkInterruptThreshold); 2652 2652 } 2653 2653 } 2654 - printk("cant't get the offset of type %x member %x\n", type, member); 2654 + printk(KERN_WARNING "can't get the offset of type %x member %x\n", type, member); 2655 2655 return 0; 2656 2656 } 2657 2657 ··· 2675 2675 case SMU_MAX_LEVELS_MVDD: 2676 2676 return SMU72_MAX_LEVELS_MVDD; 2677 2677 } 2678 - printk("cant't get the mac value %x\n", value); 2678 + printk(KERN_WARNING "can't get the mac value %x\n", value); 2679 2679 2680 2680 return 0; 2681 2681 }
+1
drivers/gpu/drm/ast/ast_ttm.c
··· 230 230 .ttm_tt_populate = ast_ttm_tt_populate, 231 231 .ttm_tt_unpopulate = ast_ttm_tt_unpopulate, 232 232 .init_mem_type = ast_bo_init_mem_type, 233 + .eviction_valuable = ttm_bo_eviction_valuable, 233 234 .evict_flags = ast_bo_evict_flags, 234 235 .move = NULL, 235 236 .verify_access = ast_bo_verify_access,
+1
drivers/gpu/drm/bochs/bochs_mm.c
··· 199 199 .ttm_tt_populate = ttm_pool_populate, 200 200 .ttm_tt_unpopulate = ttm_pool_unpopulate, 201 201 .init_mem_type = bochs_bo_init_mem_type, 202 + .eviction_valuable = ttm_bo_eviction_valuable, 202 203 .evict_flags = bochs_bo_evict_flags, 203 204 .move = NULL, 204 205 .verify_access = bochs_bo_verify_access,
+1
drivers/gpu/drm/cirrus/cirrus_ttm.c
··· 230 230 .ttm_tt_populate = cirrus_ttm_tt_populate, 231 231 .ttm_tt_unpopulate = cirrus_ttm_tt_unpopulate, 232 232 .init_mem_type = cirrus_bo_init_mem_type, 233 + .eviction_valuable = ttm_bo_eviction_valuable, 233 234 .evict_flags = cirrus_bo_evict_flags, 234 235 .move = NULL, 235 236 .verify_access = cirrus_bo_verify_access,
+1
drivers/gpu/drm/mgag200/mgag200_ttm.c
··· 230 230 .ttm_tt_populate = mgag200_ttm_tt_populate, 231 231 .ttm_tt_unpopulate = mgag200_ttm_tt_unpopulate, 232 232 .init_mem_type = mgag200_bo_init_mem_type, 233 + .eviction_valuable = ttm_bo_eviction_valuable, 233 234 .evict_flags = mgag200_bo_evict_flags, 234 235 .move = NULL, 235 236 .verify_access = mgag200_bo_verify_access,
+1
drivers/gpu/drm/nouveau/nouveau_bo.c
··· 1561 1561 .ttm_tt_unpopulate = &nouveau_ttm_tt_unpopulate, 1562 1562 .invalidate_caches = nouveau_bo_invalidate_caches, 1563 1563 .init_mem_type = nouveau_bo_init_mem_type, 1564 + .eviction_valuable = ttm_bo_eviction_valuable, 1564 1565 .evict_flags = nouveau_bo_evict_flags, 1565 1566 .move_notify = nouveau_bo_move_ntfy, 1566 1567 .move = nouveau_bo_move,
+1
drivers/gpu/drm/qxl/qxl_ttm.c
··· 387 387 .ttm_tt_unpopulate = &qxl_ttm_tt_unpopulate, 388 388 .invalidate_caches = &qxl_invalidate_caches, 389 389 .init_mem_type = &qxl_init_mem_type, 390 + .eviction_valuable = ttm_bo_eviction_valuable, 390 391 .evict_flags = &qxl_evict_flags, 391 392 .move = &qxl_bo_move, 392 393 .verify_access = &qxl_verify_access,
+1
drivers/gpu/drm/radeon/atombios_encoders.c
··· 28 28 #include <drm/radeon_drm.h> 29 29 #include "radeon.h" 30 30 #include "radeon_audio.h" 31 + #include "radeon_asic.h" 31 32 #include "atom.h" 32 33 #include <linux/backlight.h> 33 34
+1
drivers/gpu/drm/radeon/evergreen_cs.c
··· 27 27 */ 28 28 #include <drm/drmP.h> 29 29 #include "radeon.h" 30 + #include "radeon_asic.h" 30 31 #include "evergreend.h" 31 32 #include "evergreen_reg_safe.h" 32 33 #include "cayman_reg_safe.h"
+1
drivers/gpu/drm/radeon/r600_cs.c
··· 28 28 #include <linux/kernel.h> 29 29 #include <drm/drmP.h> 30 30 #include "radeon.h" 31 + #include "radeon_asic.h" 31 32 #include "r600d.h" 32 33 #include "r600_reg_safe.h" 33 34
+1
drivers/gpu/drm/radeon/radeon_atombios.c
··· 29 29 30 30 #include "atom.h" 31 31 #include "atom-bits.h" 32 + #include "radeon_asic.h" 32 33 33 34 extern void 34 35 radeon_add_atom_encoder(struct drm_device *dev, uint32_t encoder_enum,
+1
drivers/gpu/drm/radeon/radeon_clocks.c
··· 29 29 #include <drm/radeon_drm.h> 30 30 #include "radeon_reg.h" 31 31 #include "radeon.h" 32 + #include "radeon_asic.h" 32 33 #include "atom.h" 33 34 34 35 /* 10 khz */
+4 -1
drivers/gpu/drm/radeon/radeon_device.c
··· 1651 1651 1652 1652 radeon_suspend(rdev); 1653 1653 radeon_hpd_fini(rdev); 1654 - /* evict remaining vram memory */ 1654 + /* evict remaining vram memory 1655 + * This second call to evict vram is to evict the gart page table 1656 + * using the CPU. 1657 + */ 1655 1658 radeon_bo_evict_vram(rdev); 1656 1659 1657 1660 radeon_agp_suspend(rdev);
+5 -3
drivers/gpu/drm/radeon/radeon_dp_mst.c
··· 223 223 return MODE_OK; 224 224 } 225 225 226 - struct drm_encoder *radeon_mst_best_encoder(struct drm_connector *connector) 226 + static struct 227 + drm_encoder *radeon_mst_best_encoder(struct drm_connector *connector) 227 228 { 228 229 struct radeon_connector *radeon_connector = to_radeon_connector(connector); 229 230 ··· 342 341 .hotplug = radeon_dp_mst_hotplug, 343 342 }; 344 343 345 - struct radeon_connector *radeon_mst_find_connector(struct drm_encoder *encoder) 344 + static struct 345 + radeon_connector *radeon_mst_find_connector(struct drm_encoder *encoder) 346 346 { 347 347 struct drm_device *dev = encoder->dev; 348 348 struct drm_connector *connector; ··· 599 597 .commit = radeon_mst_encoder_commit, 600 598 }; 601 599 602 - void radeon_dp_mst_encoder_destroy(struct drm_encoder *encoder) 600 + static void radeon_dp_mst_encoder_destroy(struct drm_encoder *encoder) 603 601 { 604 602 drm_encoder_cleanup(encoder); 605 603 kfree(encoder);
+1
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
··· 27 27 #include <drm/drm_crtc_helper.h> 28 28 #include <drm/radeon_drm.h> 29 29 #include "radeon.h" 30 + #include "radeon_asic.h" 30 31 #include "atom.h" 31 32 #include <linux/backlight.h> 32 33 #ifdef CONFIG_PMAC_BACKLIGHT
+5 -1
drivers/gpu/drm/radeon/radeon_pm.c
··· 47 47 static bool radeon_pm_debug_check_in_vbl(struct radeon_device *rdev, bool finish); 48 48 static void radeon_pm_update_profile(struct radeon_device *rdev); 49 49 static void radeon_pm_set_clocks(struct radeon_device *rdev); 50 + static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev); 50 51 51 52 int radeon_pm_get_type_index(struct radeon_device *rdev, 52 53 enum radeon_pm_state_type ps_type, ··· 80 79 radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power); 81 80 } 82 81 mutex_unlock(&rdev->pm.mutex); 82 + /* allow new DPM state to be picked */ 83 + radeon_pm_compute_clocks_dpm(rdev); 83 84 } else if (rdev->pm.pm_method == PM_METHOD_PROFILE) { 84 85 if (rdev->pm.profile == PM_PROFILE_AUTO) { 85 86 mutex_lock(&rdev->pm.mutex); ··· 885 882 dpm_state = POWER_STATE_TYPE_INTERNAL_3DPERF; 886 883 /* balanced states don't exist at the moment */ 887 884 if (dpm_state == POWER_STATE_TYPE_BALANCED) 888 - dpm_state = POWER_STATE_TYPE_PERFORMANCE; 885 + dpm_state = rdev->pm.dpm.ac_power ? 886 + POWER_STATE_TYPE_PERFORMANCE : POWER_STATE_TYPE_BATTERY; 889 887 890 888 restart_search: 891 889 /* Pick the best power state based on current conditions */
+1
drivers/gpu/drm/radeon/radeon_ttm.c
··· 863 863 .ttm_tt_unpopulate = &radeon_ttm_tt_unpopulate, 864 864 .invalidate_caches = &radeon_invalidate_caches, 865 865 .init_mem_type = &radeon_init_mem_type, 866 + .eviction_valuable = ttm_bo_eviction_valuable, 866 867 .evict_flags = &radeon_evict_flags, 867 868 .move = &radeon_bo_move, 868 869 .verify_access = &radeon_verify_access,
+1 -1
drivers/gpu/drm/radeon/si.c
··· 7858 7858 } 7859 7859 } 7860 7860 7861 - int si_vce_send_vcepll_ctlreq(struct radeon_device *rdev) 7861 + static int si_vce_send_vcepll_ctlreq(struct radeon_device *rdev) 7862 7862 { 7863 7863 unsigned i; 7864 7864
+22 -13
drivers/gpu/drm/ttm/ttm_bo.c
··· 717 717 return ret; 718 718 } 719 719 720 + bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 721 + const struct ttm_place *place) 722 + { 723 + /* Don't evict this BO if it's outside of the 724 + * requested placement range 725 + */ 726 + if (place->fpfn >= (bo->mem.start + bo->mem.size) || 727 + (place->lpfn && place->lpfn <= bo->mem.start)) 728 + return false; 729 + 730 + return true; 731 + } 732 + EXPORT_SYMBOL(ttm_bo_eviction_valuable); 733 + 720 734 static int ttm_mem_evict_first(struct ttm_bo_device *bdev, 721 735 uint32_t mem_type, 722 736 const struct ttm_place *place, ··· 745 731 spin_lock(&glob->lru_lock); 746 732 list_for_each_entry(bo, &man->lru, lru) { 747 733 ret = __ttm_bo_reserve(bo, false, true, NULL); 748 - if (!ret) { 749 - if (place && (place->fpfn || place->lpfn)) { 750 - /* Don't evict this BO if it's outside of the 751 - * requested placement range 752 - */ 753 - if (place->fpfn >= (bo->mem.start + bo->mem.size) || 754 - (place->lpfn && place->lpfn <= bo->mem.start)) { 755 - __ttm_bo_unreserve(bo); 756 - ret = -EBUSY; 757 - continue; 758 - } 759 - } 734 + if (ret) 735 + continue; 760 736 761 - break; 737 + if (place && !bdev->driver->eviction_valuable(bo, place)) { 738 + __ttm_bo_unreserve(bo); 739 + ret = -EBUSY; 740 + continue; 762 741 } 742 + 743 + break; 763 744 } 764 745 765 746 if (ret) {
+1
drivers/gpu/drm/virtio/virtgpu_ttm.c
··· 425 425 .ttm_tt_unpopulate = &virtio_gpu_ttm_tt_unpopulate, 426 426 .invalidate_caches = &virtio_gpu_invalidate_caches, 427 427 .init_mem_type = &virtio_gpu_init_mem_type, 428 + .eviction_valuable = ttm_bo_eviction_valuable, 428 429 .evict_flags = &virtio_gpu_evict_flags, 429 430 .move = &virtio_gpu_bo_move, 430 431 .verify_access = &virtio_gpu_verify_access,
+1
drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
··· 849 849 .ttm_tt_unpopulate = &vmw_ttm_unpopulate, 850 850 .invalidate_caches = vmw_invalidate_caches, 851 851 .init_mem_type = vmw_init_mem_type, 852 + .eviction_valuable = ttm_bo_eviction_valuable, 852 853 .evict_flags = vmw_evict_flags, 853 854 .move = NULL, 854 855 .verify_access = vmw_verify_access,
+13
include/drm/ttm/ttm_bo_api.h
··· 47 47 48 48 struct ttm_placement; 49 49 50 + struct ttm_place; 51 + 50 52 /** 51 53 * struct ttm_bus_placement 52 54 * ··· 396 394 */ 397 395 extern void ttm_bo_unlock_delayed_workqueue(struct ttm_bo_device *bdev, 398 396 int resched); 397 + 398 + /** 399 + * ttm_bo_eviction_valuable 400 + * 401 + * @bo: The buffer object to evict 402 + * @place: the placement we need to make room for 403 + * 404 + * Check if it is valuable to evict the BO to make room for the given placement. 405 + */ 406 + bool ttm_bo_eviction_valuable(struct ttm_buffer_object *bo, 407 + const struct ttm_place *place); 399 408 400 409 /** 401 410 * ttm_bo_synccpu_write_grab
+28 -14
include/drm/ttm/ttm_bo_driver.h
··· 371 371 * submission as a consequence. 372 372 */ 373 373 374 - int (*invalidate_caches) (struct ttm_bo_device *bdev, uint32_t flags); 375 - int (*init_mem_type) (struct ttm_bo_device *bdev, uint32_t type, 376 - struct ttm_mem_type_manager *man); 374 + int (*invalidate_caches)(struct ttm_bo_device *bdev, uint32_t flags); 375 + int (*init_mem_type)(struct ttm_bo_device *bdev, uint32_t type, 376 + struct ttm_mem_type_manager *man); 377 + 378 + /** 379 + * struct ttm_bo_driver member eviction_valuable 380 + * 381 + * @bo: the buffer object to be evicted 382 + * @place: placement we need room for 383 + * 384 + * Check with the driver if it is valuable to evict a BO to make room 385 + * for a certain placement. 386 + */ 387 + bool (*eviction_valuable)(struct ttm_buffer_object *bo, 388 + const struct ttm_place *place); 377 389 /** 378 390 * struct ttm_bo_driver member evict_flags: 379 391 * ··· 396 384 * finished, they'll end up in bo->mem.flags 397 385 */ 398 386 399 - void(*evict_flags) (struct ttm_buffer_object *bo, 400 - struct ttm_placement *placement); 387 + void (*evict_flags)(struct ttm_buffer_object *bo, 388 + struct ttm_placement *placement); 389 + 401 390 /** 402 391 * struct ttm_bo_driver member move: 403 392 * ··· 412 399 * 413 400 * Move a buffer between two memory regions. 414 401 */ 415 - int (*move) (struct ttm_buffer_object *bo, 416 - bool evict, bool interruptible, 417 - bool no_wait_gpu, 418 - struct ttm_mem_reg *new_mem); 402 + int (*move)(struct ttm_buffer_object *bo, bool evict, 403 + bool interruptible, bool no_wait_gpu, 404 + struct ttm_mem_reg *new_mem); 419 405 420 406 /** 421 407 * struct ttm_bo_driver_member verify_access ··· 428 416 * access for all buffer objects. 429 417 * This function should return 0 if access is granted, -EPERM otherwise. 430 418 */ 431 - int (*verify_access) (struct ttm_buffer_object *bo, 432 - struct file *filp); 419 + int (*verify_access)(struct ttm_buffer_object *bo, 420 + struct file *filp); 433 421 434 422 /* hook to notify driver about a driver move so it 435 423 * can do tiling things */ ··· 442 430 /** 443 431 * notify the driver that we're about to swap out this bo 444 432 */ 445 - void (*swap_notify) (struct ttm_buffer_object *bo); 433 + void (*swap_notify)(struct ttm_buffer_object *bo); 446 434 447 435 /** 448 436 * Driver callback on when mapping io memory (for bo_move_memcpy ··· 450 438 * the mapping is not use anymore. io_mem_reserve & io_mem_free 451 439 * are balanced. 452 440 */ 453 - int (*io_mem_reserve)(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem); 454 - void (*io_mem_free)(struct ttm_bo_device *bdev, struct ttm_mem_reg *mem); 441 + int (*io_mem_reserve)(struct ttm_bo_device *bdev, 442 + struct ttm_mem_reg *mem); 443 + void (*io_mem_free)(struct ttm_bo_device *bdev, 444 + struct ttm_mem_reg *mem); 455 445 456 446 /** 457 447 * Optional driver callback for when BO is removed from the LRU.
+53
include/uapi/drm/amdgpu_drm.h
··· 81 81 #define AMDGPU_GEM_CREATE_VRAM_CLEARED (1 << 3) 82 82 /* Flag that create shadow bo(GTT) while allocating vram bo */ 83 83 #define AMDGPU_GEM_CREATE_SHADOW (1 << 4) 84 + /* Flag that allocating the BO should use linear VRAM */ 85 + #define AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS (1 << 5) 84 86 85 87 struct drm_amdgpu_gem_create_in { 86 88 /** the requested memory size */ ··· 438 436 * 439 437 */ 440 438 #define AMDGPU_IDS_FLAGS_FUSION 0x1 439 + #define AMDGPU_IDS_FLAGS_PREEMPTION 0x2 441 440 442 441 /* indicate if acceleration can be working */ 443 442 #define AMDGPU_INFO_ACCEL_WORKING 0x00 ··· 490 487 #define AMDGPU_INFO_VIS_VRAM_USAGE 0x17 491 488 /* number of TTM buffer evictions */ 492 489 #define AMDGPU_INFO_NUM_EVICTIONS 0x18 490 + /* Query memory about VRAM and GTT domains */ 491 + #define AMDGPU_INFO_MEMORY 0x19 492 + /* Query vce clock table */ 493 + #define AMDGPU_INFO_VCE_CLOCK_TABLE 0x1A 493 494 494 495 #define AMDGPU_INFO_MMR_SE_INDEX_SHIFT 0 495 496 #define AMDGPU_INFO_MMR_SE_INDEX_MASK 0xff ··· 579 572 __u64 gtt_size; 580 573 }; 581 574 575 + struct drm_amdgpu_heap_info { 576 + /** max. physical memory */ 577 + __u64 total_heap_size; 578 + 579 + /** Theoretical max. available memory in the given heap */ 580 + __u64 usable_heap_size; 581 + 582 + /** 583 + * Number of bytes allocated in the heap. This includes all processes 584 + * and private allocations in the kernel. It changes when new buffers 585 + * are allocated, freed, and moved. It cannot be larger than 586 + * heap_size. 587 + */ 588 + __u64 heap_usage; 589 + 590 + /** 591 + * Theoretical possible max. size of buffer which 592 + * could be allocated in the given heap 593 + */ 594 + __u64 max_allocation; 595 + }; 596 + 597 + struct drm_amdgpu_memory_info { 598 + struct drm_amdgpu_heap_info vram; 599 + struct drm_amdgpu_heap_info cpu_accessible_vram; 600 + struct drm_amdgpu_heap_info gtt; 601 + }; 602 + 582 603 struct drm_amdgpu_info_firmware { 583 604 __u32 ver; 584 605 __u32 feature; ··· 678 643 /** Bitmask of available rings. Bit 0 means ring 0, etc. */ 679 644 __u32 available_rings; 680 645 __u32 _pad; 646 + }; 647 + 648 + #define AMDGPU_VCE_CLOCK_TABLE_ENTRIES 6 649 + 650 + struct drm_amdgpu_info_vce_clock_table_entry { 651 + /** System clock */ 652 + __u32 sclk; 653 + /** Memory clock */ 654 + __u32 mclk; 655 + /** VCE clock */ 656 + __u32 eclk; 657 + __u32 pad; 658 + }; 659 + 660 + struct drm_amdgpu_info_vce_clock_table { 661 + struct drm_amdgpu_info_vce_clock_table_entry entries[AMDGPU_VCE_CLOCK_TABLE_ENTRIES]; 662 + __u32 num_valid_entries; 663 + __u32 pad; 681 664 }; 682 665 683 666 /*