root/drivers/gpu/drm/amd/amdgpu/vce_v4_0.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. vce_v4_0_ring_get_rptr
  2. vce_v4_0_ring_get_wptr
  3. vce_v4_0_ring_set_wptr
  4. vce_v4_0_firmware_loaded
  5. vce_v4_0_mmsch_start
  6. vce_v4_0_sriov_start
  7. vce_v4_0_start
  8. vce_v4_0_stop
  9. vce_v4_0_early_init
  10. vce_v4_0_sw_init
  11. vce_v4_0_sw_fini
  12. vce_v4_0_hw_init
  13. vce_v4_0_hw_fini
  14. vce_v4_0_suspend
  15. vce_v4_0_resume
  16. vce_v4_0_mc_resume
  17. vce_v4_0_set_clockgating_state
  18. vce_v4_0_is_idle
  19. vce_v4_0_wait_for_idle
  20. vce_v4_0_check_soft_reset
  21. vce_v4_0_soft_reset
  22. vce_v4_0_pre_soft_reset
  23. vce_v4_0_post_soft_reset
  24. vce_v4_0_override_vce_clock_gating
  25. vce_v4_0_set_vce_sw_clock_gating
  26. vce_v4_0_set_bypass_mode
  27. vce_v4_0_set_clockgating_state
  28. vce_v4_0_set_powergating_state
  29. vce_v4_0_ring_emit_ib
  30. vce_v4_0_ring_emit_fence
  31. vce_v4_0_ring_insert_end
  32. vce_v4_0_emit_reg_wait
  33. vce_v4_0_emit_vm_flush
  34. vce_v4_0_emit_wreg
  35. vce_v4_0_set_interrupt_state
  36. vce_v4_0_process_interrupt
  37. vce_v4_0_set_ring_funcs
  38. vce_v4_0_set_irq_funcs

   1 /*
   2  * Copyright 2016 Advanced Micro Devices, Inc.
   3  * All Rights Reserved.
   4  *
   5  * Permission is hereby granted, free of charge, to any person obtaining a
   6  * copy of this software and associated documentation files (the
   7  * "Software"), to deal in the Software without restriction, including
   8  * without limitation the rights to use, copy, modify, merge, publish,
   9  * distribute, sub license, and/or sell copies of the Software, and to
  10  * permit persons to whom the Software is furnished to do so, subject to
  11  * the following conditions:
  12  *
  13  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  14  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  15  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  16  * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
  17  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
  18  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
  19  * USE OR OTHER DEALINGS IN THE SOFTWARE.
  20  *
  21  * The above copyright notice and this permission notice (including the
  22  * next paragraph) shall be included in all copies or substantial portions
  23  * of the Software.
  24  *
  25  */
  26 
  27 #include <linux/firmware.h>
  28 
  29 #include "amdgpu.h"
  30 #include "amdgpu_vce.h"
  31 #include "soc15.h"
  32 #include "soc15d.h"
  33 #include "soc15_common.h"
  34 #include "mmsch_v1_0.h"
  35 
  36 #include "vce/vce_4_0_offset.h"
  37 #include "vce/vce_4_0_default.h"
  38 #include "vce/vce_4_0_sh_mask.h"
  39 #include "mmhub/mmhub_1_0_offset.h"
  40 #include "mmhub/mmhub_1_0_sh_mask.h"
  41 
  42 #include "ivsrcid/vce/irqsrcs_vce_4_0.h"
  43 
  44 #define VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK   0x02
  45 
  46 #define VCE_V4_0_FW_SIZE        (384 * 1024)
  47 #define VCE_V4_0_STACK_SIZE     (64 * 1024)
  48 #define VCE_V4_0_DATA_SIZE      ((16 * 1024 * AMDGPU_MAX_VCE_HANDLES) + (52 * 1024))
  49 
  50 static void vce_v4_0_mc_resume(struct amdgpu_device *adev);
  51 static void vce_v4_0_set_ring_funcs(struct amdgpu_device *adev);
  52 static void vce_v4_0_set_irq_funcs(struct amdgpu_device *adev);
  53 
  54 /**
  55  * vce_v4_0_ring_get_rptr - get read pointer
  56  *
  57  * @ring: amdgpu_ring pointer
  58  *
  59  * Returns the current hardware read pointer
  60  */
  61 static uint64_t vce_v4_0_ring_get_rptr(struct amdgpu_ring *ring)
  62 {
  63         struct amdgpu_device *adev = ring->adev;
  64 
  65         if (ring->me == 0)
  66                 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR));
  67         else if (ring->me == 1)
  68                 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR2));
  69         else
  70                 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR3));
  71 }
  72 
  73 /**
  74  * vce_v4_0_ring_get_wptr - get write pointer
  75  *
  76  * @ring: amdgpu_ring pointer
  77  *
  78  * Returns the current hardware write pointer
  79  */
  80 static uint64_t vce_v4_0_ring_get_wptr(struct amdgpu_ring *ring)
  81 {
  82         struct amdgpu_device *adev = ring->adev;
  83 
  84         if (ring->use_doorbell)
  85                 return adev->wb.wb[ring->wptr_offs];
  86 
  87         if (ring->me == 0)
  88                 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR));
  89         else if (ring->me == 1)
  90                 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR2));
  91         else
  92                 return RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR3));
  93 }
  94 
  95 /**
  96  * vce_v4_0_ring_set_wptr - set write pointer
  97  *
  98  * @ring: amdgpu_ring pointer
  99  *
 100  * Commits the write pointer to the hardware
 101  */
 102 static void vce_v4_0_ring_set_wptr(struct amdgpu_ring *ring)
 103 {
 104         struct amdgpu_device *adev = ring->adev;
 105 
 106         if (ring->use_doorbell) {
 107                 /* XXX check if swapping is necessary on BE */
 108                 adev->wb.wb[ring->wptr_offs] = lower_32_bits(ring->wptr);
 109                 WDOORBELL32(ring->doorbell_index, lower_32_bits(ring->wptr));
 110                 return;
 111         }
 112 
 113         if (ring->me == 0)
 114                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR),
 115                         lower_32_bits(ring->wptr));
 116         else if (ring->me == 1)
 117                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR2),
 118                         lower_32_bits(ring->wptr));
 119         else
 120                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR3),
 121                         lower_32_bits(ring->wptr));
 122 }
 123 
 124 static int vce_v4_0_firmware_loaded(struct amdgpu_device *adev)
 125 {
 126         int i, j;
 127 
 128         for (i = 0; i < 10; ++i) {
 129                 for (j = 0; j < 100; ++j) {
 130                         uint32_t status =
 131                                 RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS));
 132 
 133                         if (status & VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK)
 134                                 return 0;
 135                         mdelay(10);
 136                 }
 137 
 138                 DRM_ERROR("VCE not responding, trying to reset the ECPU!!!\n");
 139                 WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET),
 140                                 VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
 141                                 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
 142                 mdelay(10);
 143                 WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET), 0,
 144                                 ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
 145                 mdelay(10);
 146 
 147         }
 148 
 149         return -ETIMEDOUT;
 150 }
 151 
 152 static int vce_v4_0_mmsch_start(struct amdgpu_device *adev,
 153                                 struct amdgpu_mm_table *table)
 154 {
 155         uint32_t data = 0, loop;
 156         uint64_t addr = table->gpu_addr;
 157         struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)table->cpu_addr;
 158         uint32_t size;
 159 
 160         size = header->header_size + header->vce_table_size + header->uvd_table_size;
 161 
 162         /* 1, write to vce_mmsch_vf_ctx_addr_lo/hi register with GPU mc addr of memory descriptor location */
 163         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_CTX_ADDR_LO), lower_32_bits(addr));
 164         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_CTX_ADDR_HI), upper_32_bits(addr));
 165 
 166         /* 2, update vmid of descriptor */
 167         data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_VMID));
 168         data &= ~VCE_MMSCH_VF_VMID__VF_CTX_VMID_MASK;
 169         data |= (0 << VCE_MMSCH_VF_VMID__VF_CTX_VMID__SHIFT); /* use domain0 for MM scheduler */
 170         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_VMID), data);
 171 
 172         /* 3, notify mmsch about the size of this descriptor */
 173         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_CTX_SIZE), size);
 174 
 175         /* 4, set resp to zero */
 176         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP), 0);
 177 
 178         WDOORBELL32(adev->vce.ring[0].doorbell_index, 0);
 179         adev->wb.wb[adev->vce.ring[0].wptr_offs] = 0;
 180         adev->vce.ring[0].wptr = 0;
 181         adev->vce.ring[0].wptr_old = 0;
 182 
 183         /* 5, kick off the initialization and wait until VCE_MMSCH_VF_MAILBOX_RESP becomes non-zero */
 184         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_HOST), 0x10000001);
 185 
 186         data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP));
 187         loop = 1000;
 188         while ((data & 0x10000002) != 0x10000002) {
 189                 udelay(10);
 190                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_MMSCH_VF_MAILBOX_RESP));
 191                 loop--;
 192                 if (!loop)
 193                         break;
 194         }
 195 
 196         if (!loop) {
 197                 dev_err(adev->dev, "failed to init MMSCH, mmVCE_MMSCH_VF_MAILBOX_RESP = %x\n", data);
 198                 return -EBUSY;
 199         }
 200 
 201         return 0;
 202 }
 203 
 204 static int vce_v4_0_sriov_start(struct amdgpu_device *adev)
 205 {
 206         struct amdgpu_ring *ring;
 207         uint32_t offset, size;
 208         uint32_t table_size = 0;
 209         struct mmsch_v1_0_cmd_direct_write direct_wt = { { 0 } };
 210         struct mmsch_v1_0_cmd_direct_read_modify_write direct_rd_mod_wt = { { 0 } };
 211         struct mmsch_v1_0_cmd_direct_polling direct_poll = { { 0 } };
 212         struct mmsch_v1_0_cmd_end end = { { 0 } };
 213         uint32_t *init_table = adev->virt.mm_table.cpu_addr;
 214         struct mmsch_v1_0_init_header *header = (struct mmsch_v1_0_init_header *)init_table;
 215 
 216         direct_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_WRITE;
 217         direct_rd_mod_wt.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_READ_MODIFY_WRITE;
 218         direct_poll.cmd_header.command_type = MMSCH_COMMAND__DIRECT_REG_POLLING;
 219         end.cmd_header.command_type = MMSCH_COMMAND__END;
 220 
 221         if (header->vce_table_offset == 0 && header->vce_table_size == 0) {
 222                 header->version = MMSCH_VERSION;
 223                 header->header_size = sizeof(struct mmsch_v1_0_init_header) >> 2;
 224 
 225                 if (header->uvd_table_offset == 0 && header->uvd_table_size == 0)
 226                         header->vce_table_offset = header->header_size;
 227                 else
 228                         header->vce_table_offset = header->uvd_table_size + header->uvd_table_offset;
 229 
 230                 init_table += header->vce_table_offset;
 231 
 232                 ring = &adev->vce.ring[0];
 233                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_LO),
 234                                             lower_32_bits(ring->gpu_addr));
 235                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_HI),
 236                                             upper_32_bits(ring->gpu_addr));
 237                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_SIZE),
 238                                             ring->ring_size / 4);
 239 
 240                 /* BEGING OF MC_RESUME */
 241                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL), 0x398000);
 242                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CACHE_CTRL), ~0x1, 0);
 243                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL), 0);
 244                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL1), 0);
 245                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VM_CTRL), 0);
 246 
 247                 offset = AMDGPU_VCE_FIRMWARE_OFFSET;
 248                 if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
 249                         uint32_t low = adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].tmr_mc_addr_lo;
 250                         uint32_t hi = adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].tmr_mc_addr_hi;
 251                         uint64_t tmr_mc_addr = (uint64_t)(hi) << 32 | low;
 252 
 253                         MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 254                                                 mmVCE_LMI_VCPU_CACHE_40BIT_BAR0), tmr_mc_addr >> 8);
 255                         MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 256                                                 mmVCE_LMI_VCPU_CACHE_64BIT_BAR0),
 257                                                 (tmr_mc_addr >> 40) & 0xff);
 258                         MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET0), 0);
 259                 } else {
 260                         MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 261                                                 mmVCE_LMI_VCPU_CACHE_40BIT_BAR0),
 262                                                 adev->vce.gpu_addr >> 8);
 263                         MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 264                                                 mmVCE_LMI_VCPU_CACHE_64BIT_BAR0),
 265                                                 (adev->vce.gpu_addr >> 40) & 0xff);
 266                         MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET0),
 267                                                 offset & ~0x0f000000);
 268 
 269                 }
 270                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 271                                                 mmVCE_LMI_VCPU_CACHE_40BIT_BAR1),
 272                                                 adev->vce.gpu_addr >> 8);
 273                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 274                                                 mmVCE_LMI_VCPU_CACHE_64BIT_BAR1),
 275                                                 (adev->vce.gpu_addr >> 40) & 0xff);
 276                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 277                                                 mmVCE_LMI_VCPU_CACHE_40BIT_BAR2),
 278                                                 adev->vce.gpu_addr >> 8);
 279                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0,
 280                                                 mmVCE_LMI_VCPU_CACHE_64BIT_BAR2),
 281                                                 (adev->vce.gpu_addr >> 40) & 0xff);
 282 
 283                 size = VCE_V4_0_FW_SIZE;
 284                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE0), size);
 285 
 286                 offset = (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) ? offset + size : 0;
 287                 size = VCE_V4_0_STACK_SIZE;
 288                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET1),
 289                                         (offset & ~0x0f000000) | (1 << 24));
 290                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE1), size);
 291 
 292                 offset += size;
 293                 size = VCE_V4_0_DATA_SIZE;
 294                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET2),
 295                                         (offset & ~0x0f000000) | (2 << 24));
 296                 MMSCH_V1_0_INSERT_DIRECT_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE2), size);
 297 
 298                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL2), ~0x100, 0);
 299                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_SYS_INT_EN),
 300                                                    VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK,
 301                                                    VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
 302 
 303                 /* end of MC_RESUME */
 304                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS),
 305                                                    VCE_STATUS__JOB_BUSY_MASK, ~VCE_STATUS__JOB_BUSY_MASK);
 306                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL),
 307                                                    ~0x200001, VCE_VCPU_CNTL__CLK_EN_MASK);
 308                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET),
 309                                                    ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK, 0);
 310 
 311                 MMSCH_V1_0_INSERT_DIRECT_POLL(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS),
 312                                               VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK,
 313                                               VCE_STATUS_VCPU_REPORT_FW_LOADED_MASK);
 314 
 315                 /* clear BUSY flag */
 316                 MMSCH_V1_0_INSERT_DIRECT_RD_MOD_WT(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS),
 317                                                    ~VCE_STATUS__JOB_BUSY_MASK, 0);
 318 
 319                 /* add end packet */
 320                 memcpy((void *)init_table, &end, sizeof(struct mmsch_v1_0_cmd_end));
 321                 table_size += sizeof(struct mmsch_v1_0_cmd_end) / 4;
 322                 header->vce_table_size = table_size;
 323         }
 324 
 325         return vce_v4_0_mmsch_start(adev, &adev->virt.mm_table);
 326 }
 327 
 328 /**
 329  * vce_v4_0_start - start VCE block
 330  *
 331  * @adev: amdgpu_device pointer
 332  *
 333  * Setup and start the VCE block
 334  */
 335 static int vce_v4_0_start(struct amdgpu_device *adev)
 336 {
 337         struct amdgpu_ring *ring;
 338         int r;
 339 
 340         ring = &adev->vce.ring[0];
 341 
 342         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR), lower_32_bits(ring->wptr));
 343         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR), lower_32_bits(ring->wptr));
 344         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_LO), ring->gpu_addr);
 345         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_HI), upper_32_bits(ring->gpu_addr));
 346         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_SIZE), ring->ring_size / 4);
 347 
 348         ring = &adev->vce.ring[1];
 349 
 350         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR2), lower_32_bits(ring->wptr));
 351         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR2), lower_32_bits(ring->wptr));
 352         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_LO2), ring->gpu_addr);
 353         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_HI2), upper_32_bits(ring->gpu_addr));
 354         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_SIZE2), ring->ring_size / 4);
 355 
 356         ring = &adev->vce.ring[2];
 357 
 358         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_RPTR3), lower_32_bits(ring->wptr));
 359         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_WPTR3), lower_32_bits(ring->wptr));
 360         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_LO3), ring->gpu_addr);
 361         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_BASE_HI3), upper_32_bits(ring->gpu_addr));
 362         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_SIZE3), ring->ring_size / 4);
 363 
 364         vce_v4_0_mc_resume(adev);
 365         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), VCE_STATUS__JOB_BUSY_MASK,
 366                         ~VCE_STATUS__JOB_BUSY_MASK);
 367 
 368         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL), 1, ~0x200001);
 369 
 370         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET), 0,
 371                         ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
 372         mdelay(100);
 373 
 374         r = vce_v4_0_firmware_loaded(adev);
 375 
 376         /* clear BUSY flag */
 377         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), 0, ~VCE_STATUS__JOB_BUSY_MASK);
 378 
 379         if (r) {
 380                 DRM_ERROR("VCE not responding, giving up!!!\n");
 381                 return r;
 382         }
 383 
 384         return 0;
 385 }
 386 
 387 static int vce_v4_0_stop(struct amdgpu_device *adev)
 388 {
 389 
 390         /* Disable VCPU */
 391         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CNTL), 0, ~0x200001);
 392 
 393         /* hold on ECPU */
 394         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_SOFT_RESET),
 395                         VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK,
 396                         ~VCE_SOFT_RESET__ECPU_SOFT_RESET_MASK);
 397 
 398         /* clear VCE_STATUS */
 399         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS), 0);
 400 
 401         /* Set Clock-Gating off */
 402         /* if (adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG)
 403                 vce_v4_0_set_vce_sw_clock_gating(adev, false);
 404         */
 405 
 406         return 0;
 407 }
 408 
 409 static int vce_v4_0_early_init(void *handle)
 410 {
 411         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 412 
 413         if (amdgpu_sriov_vf(adev)) /* currently only VCN0 support SRIOV */
 414                 adev->vce.num_rings = 1;
 415         else
 416                 adev->vce.num_rings = 3;
 417 
 418         vce_v4_0_set_ring_funcs(adev);
 419         vce_v4_0_set_irq_funcs(adev);
 420 
 421         return 0;
 422 }
 423 
 424 static int vce_v4_0_sw_init(void *handle)
 425 {
 426         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 427         struct amdgpu_ring *ring;
 428 
 429         unsigned size;
 430         int r, i;
 431 
 432         r = amdgpu_irq_add_id(adev, SOC15_IH_CLIENTID_VCE0, 167, &adev->vce.irq);
 433         if (r)
 434                 return r;
 435 
 436         size  = VCE_V4_0_STACK_SIZE + VCE_V4_0_DATA_SIZE;
 437         if (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP)
 438                 size += VCE_V4_0_FW_SIZE;
 439 
 440         r = amdgpu_vce_sw_init(adev, size);
 441         if (r)
 442                 return r;
 443 
 444         if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
 445                 const struct common_firmware_header *hdr;
 446                 unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
 447 
 448                 adev->vce.saved_bo = kvmalloc(size, GFP_KERNEL);
 449                 if (!adev->vce.saved_bo)
 450                         return -ENOMEM;
 451 
 452                 hdr = (const struct common_firmware_header *)adev->vce.fw->data;
 453                 adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].ucode_id = AMDGPU_UCODE_ID_VCE;
 454                 adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].fw = adev->vce.fw;
 455                 adev->firmware.fw_size +=
 456                         ALIGN(le32_to_cpu(hdr->ucode_size_bytes), PAGE_SIZE);
 457                 DRM_INFO("PSP loading VCE firmware\n");
 458         } else {
 459                 r = amdgpu_vce_resume(adev);
 460                 if (r)
 461                         return r;
 462         }
 463 
 464         for (i = 0; i < adev->vce.num_rings; i++) {
 465                 ring = &adev->vce.ring[i];
 466                 sprintf(ring->name, "vce%d", i);
 467                 if (amdgpu_sriov_vf(adev)) {
 468                         /* DOORBELL only works under SRIOV */
 469                         ring->use_doorbell = true;
 470 
 471                         /* currently only use the first encoding ring for sriov,
 472                          * so set unused location for other unused rings.
 473                          */
 474                         if (i == 0)
 475                                 ring->doorbell_index = adev->doorbell_index.uvd_vce.vce_ring0_1 * 2;
 476                         else
 477                                 ring->doorbell_index = adev->doorbell_index.uvd_vce.vce_ring2_3 * 2 + 1;
 478                 }
 479                 r = amdgpu_ring_init(adev, ring, 512, &adev->vce.irq, 0);
 480                 if (r)
 481                         return r;
 482         }
 483 
 484 
 485         r = amdgpu_vce_entity_init(adev);
 486         if (r)
 487                 return r;
 488 
 489         r = amdgpu_virt_alloc_mm_table(adev);
 490         if (r)
 491                 return r;
 492 
 493         return r;
 494 }
 495 
 496 static int vce_v4_0_sw_fini(void *handle)
 497 {
 498         int r;
 499         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 500 
 501         /* free MM table */
 502         amdgpu_virt_free_mm_table(adev);
 503 
 504         if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
 505                 kvfree(adev->vce.saved_bo);
 506                 adev->vce.saved_bo = NULL;
 507         }
 508 
 509         r = amdgpu_vce_suspend(adev);
 510         if (r)
 511                 return r;
 512 
 513         return amdgpu_vce_sw_fini(adev);
 514 }
 515 
 516 static int vce_v4_0_hw_init(void *handle)
 517 {
 518         int r, i;
 519         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 520 
 521         if (amdgpu_sriov_vf(adev))
 522                 r = vce_v4_0_sriov_start(adev);
 523         else
 524                 r = vce_v4_0_start(adev);
 525         if (r)
 526                 return r;
 527 
 528         for (i = 0; i < adev->vce.num_rings; i++) {
 529                 r = amdgpu_ring_test_helper(&adev->vce.ring[i]);
 530                 if (r)
 531                         return r;
 532         }
 533 
 534         DRM_INFO("VCE initialized successfully.\n");
 535 
 536         return 0;
 537 }
 538 
 539 static int vce_v4_0_hw_fini(void *handle)
 540 {
 541         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 542         int i;
 543 
 544         if (!amdgpu_sriov_vf(adev)) {
 545                 /* vce_v4_0_wait_for_idle(handle); */
 546                 vce_v4_0_stop(adev);
 547         } else {
 548                 /* full access mode, so don't touch any VCE register */
 549                 DRM_DEBUG("For SRIOV client, shouldn't do anything.\n");
 550         }
 551 
 552         for (i = 0; i < adev->vce.num_rings; i++)
 553                 adev->vce.ring[i].sched.ready = false;
 554 
 555         return 0;
 556 }
 557 
 558 static int vce_v4_0_suspend(void *handle)
 559 {
 560         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 561         int r;
 562 
 563         if (adev->vce.vcpu_bo == NULL)
 564                 return 0;
 565 
 566         if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
 567                 unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
 568                 void *ptr = adev->vce.cpu_addr;
 569 
 570                 memcpy_fromio(adev->vce.saved_bo, ptr, size);
 571         }
 572 
 573         r = vce_v4_0_hw_fini(adev);
 574         if (r)
 575                 return r;
 576 
 577         return amdgpu_vce_suspend(adev);
 578 }
 579 
 580 static int vce_v4_0_resume(void *handle)
 581 {
 582         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 583         int r;
 584 
 585         if (adev->vce.vcpu_bo == NULL)
 586                 return -EINVAL;
 587 
 588         if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
 589                 unsigned size = amdgpu_bo_size(adev->vce.vcpu_bo);
 590                 void *ptr = adev->vce.cpu_addr;
 591 
 592                 memcpy_toio(ptr, adev->vce.saved_bo, size);
 593         } else {
 594                 r = amdgpu_vce_resume(adev);
 595                 if (r)
 596                         return r;
 597         }
 598 
 599         return vce_v4_0_hw_init(adev);
 600 }
 601 
 602 static void vce_v4_0_mc_resume(struct amdgpu_device *adev)
 603 {
 604         uint32_t offset, size;
 605         uint64_t tmr_mc_addr;
 606 
 607         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_A), 0, ~(1 << 16));
 608         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING), 0x1FF000, ~0xFF9FF000);
 609         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_REG_CLOCK_GATING), 0x3F, ~0x3F);
 610         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_B), 0x1FF);
 611 
 612         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL), 0x00398000);
 613         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CACHE_CTRL), 0x0, ~0x1);
 614         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL), 0);
 615         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_SWAP_CNTL1), 0);
 616         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VM_CTRL), 0);
 617 
 618         offset = AMDGPU_VCE_FIRMWARE_OFFSET;
 619 
 620         if (adev->firmware.load_type == AMDGPU_FW_LOAD_PSP) {
 621                 tmr_mc_addr = (uint64_t)(adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].tmr_mc_addr_hi) << 32 |
 622                                                                                 adev->firmware.ucode[AMDGPU_UCODE_ID_VCE].tmr_mc_addr_lo;
 623                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR0),
 624                         (tmr_mc_addr >> 8));
 625                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_64BIT_BAR0),
 626                         (tmr_mc_addr >> 40) & 0xff);
 627                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET0), 0);
 628         } else {
 629                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR0),
 630                         (adev->vce.gpu_addr >> 8));
 631                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_64BIT_BAR0),
 632                         (adev->vce.gpu_addr >> 40) & 0xff);
 633                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET0), offset & ~0x0f000000);
 634         }
 635 
 636         size = VCE_V4_0_FW_SIZE;
 637         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE0), size);
 638 
 639         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR1), (adev->vce.gpu_addr >> 8));
 640         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_64BIT_BAR1), (adev->vce.gpu_addr >> 40) & 0xff);
 641         offset = (adev->firmware.load_type != AMDGPU_FW_LOAD_PSP) ? offset + size : 0;
 642         size = VCE_V4_0_STACK_SIZE;
 643         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET1), (offset & ~0x0f000000) | (1 << 24));
 644         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE1), size);
 645 
 646         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_40BIT_BAR2), (adev->vce.gpu_addr >> 8));
 647         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_VCPU_CACHE_64BIT_BAR2), (adev->vce.gpu_addr >> 40) & 0xff);
 648         offset += size;
 649         size = VCE_V4_0_DATA_SIZE;
 650         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_OFFSET2), (offset & ~0x0f000000) | (2 << 24));
 651         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_VCPU_CACHE_SIZE2), size);
 652 
 653         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_LMI_CTRL2), 0x0, ~0x100);
 654         WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_SYS_INT_EN),
 655                         VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK,
 656                         ~VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
 657 }
 658 
 659 static int vce_v4_0_set_clockgating_state(void *handle,
 660                                           enum amd_clockgating_state state)
 661 {
 662         /* needed for driver unload*/
 663         return 0;
 664 }
 665 
 666 #if 0
 667 static bool vce_v4_0_is_idle(void *handle)
 668 {
 669         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 670         u32 mask = 0;
 671 
 672         mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE0) ? 0 : SRBM_STATUS2__VCE0_BUSY_MASK;
 673         mask |= (adev->vce.harvest_config & AMDGPU_VCE_HARVEST_VCE1) ? 0 : SRBM_STATUS2__VCE1_BUSY_MASK;
 674 
 675         return !(RREG32(mmSRBM_STATUS2) & mask);
 676 }
 677 
 678 static int vce_v4_0_wait_for_idle(void *handle)
 679 {
 680         unsigned i;
 681         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 682 
 683         for (i = 0; i < adev->usec_timeout; i++)
 684                 if (vce_v4_0_is_idle(handle))
 685                         return 0;
 686 
 687         return -ETIMEDOUT;
 688 }
 689 
 690 #define  VCE_STATUS_VCPU_REPORT_AUTO_BUSY_MASK  0x00000008L   /* AUTO_BUSY */
 691 #define  VCE_STATUS_VCPU_REPORT_RB0_BUSY_MASK   0x00000010L   /* RB0_BUSY */
 692 #define  VCE_STATUS_VCPU_REPORT_RB1_BUSY_MASK   0x00000020L   /* RB1_BUSY */
 693 #define  AMDGPU_VCE_STATUS_BUSY_MASK (VCE_STATUS_VCPU_REPORT_AUTO_BUSY_MASK | \
 694                                       VCE_STATUS_VCPU_REPORT_RB0_BUSY_MASK)
 695 
 696 static bool vce_v4_0_check_soft_reset(void *handle)
 697 {
 698         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 699         u32 srbm_soft_reset = 0;
 700 
 701         /* According to VCE team , we should use VCE_STATUS instead
 702          * SRBM_STATUS.VCE_BUSY bit for busy status checking.
 703          * GRBM_GFX_INDEX.INSTANCE_INDEX is used to specify which VCE
 704          * instance's registers are accessed
 705          * (0 for 1st instance, 10 for 2nd instance).
 706          *
 707          *VCE_STATUS
 708          *|UENC|ACPI|AUTO ACTIVE|RB1 |RB0 |RB2 |          |FW_LOADED|JOB |
 709          *|----+----+-----------+----+----+----+----------+---------+----|
 710          *|bit8|bit7|    bit6   |bit5|bit4|bit3|   bit2   |  bit1   |bit0|
 711          *
 712          * VCE team suggest use bit 3--bit 6 for busy status check
 713          */
 714         mutex_lock(&adev->grbm_idx_mutex);
 715         WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0);
 716         if (RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS) & AMDGPU_VCE_STATUS_BUSY_MASK) {
 717                 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE0, 1);
 718                 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1);
 719         }
 720         WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0x10);
 721         if (RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_STATUS) & AMDGPU_VCE_STATUS_BUSY_MASK) {
 722                 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE0, 1);
 723                 srbm_soft_reset = REG_SET_FIELD(srbm_soft_reset, SRBM_SOFT_RESET, SOFT_RESET_VCE1, 1);
 724         }
 725         WREG32_FIELD(GRBM_GFX_INDEX, INSTANCE_INDEX, 0);
 726         mutex_unlock(&adev->grbm_idx_mutex);
 727 
 728         if (srbm_soft_reset) {
 729                 adev->vce.srbm_soft_reset = srbm_soft_reset;
 730                 return true;
 731         } else {
 732                 adev->vce.srbm_soft_reset = 0;
 733                 return false;
 734         }
 735 }
 736 
 737 static int vce_v4_0_soft_reset(void *handle)
 738 {
 739         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 740         u32 srbm_soft_reset;
 741 
 742         if (!adev->vce.srbm_soft_reset)
 743                 return 0;
 744         srbm_soft_reset = adev->vce.srbm_soft_reset;
 745 
 746         if (srbm_soft_reset) {
 747                 u32 tmp;
 748 
 749                 tmp = RREG32(mmSRBM_SOFT_RESET);
 750                 tmp |= srbm_soft_reset;
 751                 dev_info(adev->dev, "SRBM_SOFT_RESET=0x%08X\n", tmp);
 752                 WREG32(mmSRBM_SOFT_RESET, tmp);
 753                 tmp = RREG32(mmSRBM_SOFT_RESET);
 754 
 755                 udelay(50);
 756 
 757                 tmp &= ~srbm_soft_reset;
 758                 WREG32(mmSRBM_SOFT_RESET, tmp);
 759                 tmp = RREG32(mmSRBM_SOFT_RESET);
 760 
 761                 /* Wait a little for things to settle down */
 762                 udelay(50);
 763         }
 764 
 765         return 0;
 766 }
 767 
 768 static int vce_v4_0_pre_soft_reset(void *handle)
 769 {
 770         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 771 
 772         if (!adev->vce.srbm_soft_reset)
 773                 return 0;
 774 
 775         mdelay(5);
 776 
 777         return vce_v4_0_suspend(adev);
 778 }
 779 
 780 
 781 static int vce_v4_0_post_soft_reset(void *handle)
 782 {
 783         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 784 
 785         if (!adev->vce.srbm_soft_reset)
 786                 return 0;
 787 
 788         mdelay(5);
 789 
 790         return vce_v4_0_resume(adev);
 791 }
 792 
 793 static void vce_v4_0_override_vce_clock_gating(struct amdgpu_device *adev, bool override)
 794 {
 795         u32 tmp, data;
 796 
 797         tmp = data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_ARB_CTRL));
 798         if (override)
 799                 data |= VCE_RB_ARB_CTRL__VCE_CGTT_OVERRIDE_MASK;
 800         else
 801                 data &= ~VCE_RB_ARB_CTRL__VCE_CGTT_OVERRIDE_MASK;
 802 
 803         if (tmp != data)
 804                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_RB_ARB_CTRL), data);
 805 }
 806 
 807 static void vce_v4_0_set_vce_sw_clock_gating(struct amdgpu_device *adev,
 808                                              bool gated)
 809 {
 810         u32 data;
 811 
 812         /* Set Override to disable Clock Gating */
 813         vce_v4_0_override_vce_clock_gating(adev, true);
 814 
 815         /* This function enables MGCG which is controlled by firmware.
 816            With the clocks in the gated state the core is still
 817            accessible but the firmware will throttle the clocks on the
 818            fly as necessary.
 819         */
 820         if (gated) {
 821                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_B));
 822                 data |= 0x1ff;
 823                 data &= ~0xef0000;
 824                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_B), data);
 825 
 826                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING));
 827                 data |= 0x3ff000;
 828                 data &= ~0xffc00000;
 829                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING), data);
 830 
 831                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING_2));
 832                 data |= 0x2;
 833                 data &= ~0x00010000;
 834                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING_2), data);
 835 
 836                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_REG_CLOCK_GATING));
 837                 data |= 0x37f;
 838                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_REG_CLOCK_GATING), data);
 839 
 840                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_DMA_DCLK_CTRL));
 841                 data |= VCE_UENC_DMA_DCLK_CTRL__WRDMCLK_FORCEON_MASK |
 842                         VCE_UENC_DMA_DCLK_CTRL__RDDMCLK_FORCEON_MASK |
 843                         VCE_UENC_DMA_DCLK_CTRL__REGCLK_FORCEON_MASK  |
 844                         0x8;
 845                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_DMA_DCLK_CTRL), data);
 846         } else {
 847                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_B));
 848                 data &= ~0x80010;
 849                 data |= 0xe70008;
 850                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_B), data);
 851 
 852                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING));
 853                 data |= 0xffc00000;
 854                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING), data);
 855 
 856                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING_2));
 857                 data |= 0x10000;
 858                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING_2), data);
 859 
 860                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_REG_CLOCK_GATING));
 861                 data &= ~0xffc00000;
 862                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_REG_CLOCK_GATING), data);
 863 
 864                 data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_DMA_DCLK_CTRL));
 865                 data &= ~(VCE_UENC_DMA_DCLK_CTRL__WRDMCLK_FORCEON_MASK |
 866                           VCE_UENC_DMA_DCLK_CTRL__RDDMCLK_FORCEON_MASK |
 867                           VCE_UENC_DMA_DCLK_CTRL__REGCLK_FORCEON_MASK  |
 868                           0x8);
 869                 WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_DMA_DCLK_CTRL), data);
 870         }
 871         vce_v4_0_override_vce_clock_gating(adev, false);
 872 }
 873 
 874 static void vce_v4_0_set_bypass_mode(struct amdgpu_device *adev, bool enable)
 875 {
 876         u32 tmp = RREG32_SMC(ixGCK_DFS_BYPASS_CNTL);
 877 
 878         if (enable)
 879                 tmp |= GCK_DFS_BYPASS_CNTL__BYPASSECLK_MASK;
 880         else
 881                 tmp &= ~GCK_DFS_BYPASS_CNTL__BYPASSECLK_MASK;
 882 
 883         WREG32_SMC(ixGCK_DFS_BYPASS_CNTL, tmp);
 884 }
 885 
 886 static int vce_v4_0_set_clockgating_state(void *handle,
 887                                           enum amd_clockgating_state state)
 888 {
 889         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 890         bool enable = (state == AMD_CG_STATE_GATE) ? true : false;
 891         int i;
 892 
 893         if ((adev->asic_type == CHIP_POLARIS10) ||
 894                 (adev->asic_type == CHIP_TONGA) ||
 895                 (adev->asic_type == CHIP_FIJI))
 896                 vce_v4_0_set_bypass_mode(adev, enable);
 897 
 898         if (!(adev->cg_flags & AMD_CG_SUPPORT_VCE_MGCG))
 899                 return 0;
 900 
 901         mutex_lock(&adev->grbm_idx_mutex);
 902         for (i = 0; i < 2; i++) {
 903                 /* Program VCE Instance 0 or 1 if not harvested */
 904                 if (adev->vce.harvest_config & (1 << i))
 905                         continue;
 906 
 907                 WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, i);
 908 
 909                 if (enable) {
 910                         /* initialize VCE_CLOCK_GATING_A: Clock ON/OFF delay */
 911                         uint32_t data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_A);
 912                         data &= ~(0xf | 0xff0);
 913                         data |= ((0x0 << 0) | (0x04 << 4));
 914                         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_CLOCK_GATING_A, data);
 915 
 916                         /* initialize VCE_UENC_CLOCK_GATING: Clock ON/OFF delay */
 917                         data = RREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING);
 918                         data &= ~(0xf | 0xff0);
 919                         data |= ((0x0 << 0) | (0x04 << 4));
 920                         WREG32(SOC15_REG_OFFSET(VCE, 0, mmVCE_UENC_CLOCK_GATING, data);
 921                 }
 922 
 923                 vce_v4_0_set_vce_sw_clock_gating(adev, enable);
 924         }
 925 
 926         WREG32_FIELD(GRBM_GFX_INDEX, VCE_INSTANCE, 0);
 927         mutex_unlock(&adev->grbm_idx_mutex);
 928 
 929         return 0;
 930 }
 931 #endif
 932 
 933 static int vce_v4_0_set_powergating_state(void *handle,
 934                                           enum amd_powergating_state state)
 935 {
 936         /* This doesn't actually powergate the VCE block.
 937          * That's done in the dpm code via the SMC.  This
 938          * just re-inits the block as necessary.  The actual
 939          * gating still happens in the dpm code.  We should
 940          * revisit this when there is a cleaner line between
 941          * the smc and the hw blocks
 942          */
 943         struct amdgpu_device *adev = (struct amdgpu_device *)handle;
 944 
 945         if (state == AMD_PG_STATE_GATE)
 946                 return vce_v4_0_stop(adev);
 947         else
 948                 return vce_v4_0_start(adev);
 949 }
 950 
 951 static void vce_v4_0_ring_emit_ib(struct amdgpu_ring *ring, struct amdgpu_job *job,
 952                                         struct amdgpu_ib *ib, uint32_t flags)
 953 {
 954         unsigned vmid = AMDGPU_JOB_GET_VMID(job);
 955 
 956         amdgpu_ring_write(ring, VCE_CMD_IB_VM);
 957         amdgpu_ring_write(ring, vmid);
 958         amdgpu_ring_write(ring, lower_32_bits(ib->gpu_addr));
 959         amdgpu_ring_write(ring, upper_32_bits(ib->gpu_addr));
 960         amdgpu_ring_write(ring, ib->length_dw);
 961 }
 962 
 963 static void vce_v4_0_ring_emit_fence(struct amdgpu_ring *ring, u64 addr,
 964                         u64 seq, unsigned flags)
 965 {
 966         WARN_ON(flags & AMDGPU_FENCE_FLAG_64BIT);
 967 
 968         amdgpu_ring_write(ring, VCE_CMD_FENCE);
 969         amdgpu_ring_write(ring, addr);
 970         amdgpu_ring_write(ring, upper_32_bits(addr));
 971         amdgpu_ring_write(ring, seq);
 972         amdgpu_ring_write(ring, VCE_CMD_TRAP);
 973 }
 974 
 975 static void vce_v4_0_ring_insert_end(struct amdgpu_ring *ring)
 976 {
 977         amdgpu_ring_write(ring, VCE_CMD_END);
 978 }
 979 
 980 static void vce_v4_0_emit_reg_wait(struct amdgpu_ring *ring, uint32_t reg,
 981                                    uint32_t val, uint32_t mask)
 982 {
 983         amdgpu_ring_write(ring, VCE_CMD_REG_WAIT);
 984         amdgpu_ring_write(ring, reg << 2);
 985         amdgpu_ring_write(ring, mask);
 986         amdgpu_ring_write(ring, val);
 987 }
 988 
 989 static void vce_v4_0_emit_vm_flush(struct amdgpu_ring *ring,
 990                                    unsigned int vmid, uint64_t pd_addr)
 991 {
 992         struct amdgpu_vmhub *hub = &ring->adev->vmhub[ring->funcs->vmhub];
 993 
 994         pd_addr = amdgpu_gmc_emit_flush_gpu_tlb(ring, vmid, pd_addr);
 995 
 996         /* wait for reg writes */
 997         vce_v4_0_emit_reg_wait(ring, hub->ctx0_ptb_addr_lo32 + vmid * 2,
 998                                lower_32_bits(pd_addr), 0xffffffff);
 999 }
1000 
1001 static void vce_v4_0_emit_wreg(struct amdgpu_ring *ring,
1002                                uint32_t reg, uint32_t val)
1003 {
1004         amdgpu_ring_write(ring, VCE_CMD_REG_WRITE);
1005         amdgpu_ring_write(ring, reg << 2);
1006         amdgpu_ring_write(ring, val);
1007 }
1008 
1009 static int vce_v4_0_set_interrupt_state(struct amdgpu_device *adev,
1010                                         struct amdgpu_irq_src *source,
1011                                         unsigned type,
1012                                         enum amdgpu_interrupt_state state)
1013 {
1014         uint32_t val = 0;
1015 
1016         if (!amdgpu_sriov_vf(adev)) {
1017                 if (state == AMDGPU_IRQ_STATE_ENABLE)
1018                         val |= VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK;
1019 
1020                 WREG32_P(SOC15_REG_OFFSET(VCE, 0, mmVCE_SYS_INT_EN), val,
1021                                 ~VCE_SYS_INT_EN__VCE_SYS_INT_TRAP_INTERRUPT_EN_MASK);
1022         }
1023         return 0;
1024 }
1025 
1026 static int vce_v4_0_process_interrupt(struct amdgpu_device *adev,
1027                                       struct amdgpu_irq_src *source,
1028                                       struct amdgpu_iv_entry *entry)
1029 {
1030         DRM_DEBUG("IH: VCE\n");
1031 
1032         switch (entry->src_data[0]) {
1033         case 0:
1034         case 1:
1035         case 2:
1036                 amdgpu_fence_process(&adev->vce.ring[entry->src_data[0]]);
1037                 break;
1038         default:
1039                 DRM_ERROR("Unhandled interrupt: %d %d\n",
1040                           entry->src_id, entry->src_data[0]);
1041                 break;
1042         }
1043 
1044         return 0;
1045 }
1046 
1047 const struct amd_ip_funcs vce_v4_0_ip_funcs = {
1048         .name = "vce_v4_0",
1049         .early_init = vce_v4_0_early_init,
1050         .late_init = NULL,
1051         .sw_init = vce_v4_0_sw_init,
1052         .sw_fini = vce_v4_0_sw_fini,
1053         .hw_init = vce_v4_0_hw_init,
1054         .hw_fini = vce_v4_0_hw_fini,
1055         .suspend = vce_v4_0_suspend,
1056         .resume = vce_v4_0_resume,
1057         .is_idle = NULL /* vce_v4_0_is_idle */,
1058         .wait_for_idle = NULL /* vce_v4_0_wait_for_idle */,
1059         .check_soft_reset = NULL /* vce_v4_0_check_soft_reset */,
1060         .pre_soft_reset = NULL /* vce_v4_0_pre_soft_reset */,
1061         .soft_reset = NULL /* vce_v4_0_soft_reset */,
1062         .post_soft_reset = NULL /* vce_v4_0_post_soft_reset */,
1063         .set_clockgating_state = vce_v4_0_set_clockgating_state,
1064         .set_powergating_state = vce_v4_0_set_powergating_state,
1065 };
1066 
1067 static const struct amdgpu_ring_funcs vce_v4_0_ring_vm_funcs = {
1068         .type = AMDGPU_RING_TYPE_VCE,
1069         .align_mask = 0x3f,
1070         .nop = VCE_CMD_NO_OP,
1071         .support_64bit_ptrs = false,
1072         .no_user_fence = true,
1073         .vmhub = AMDGPU_MMHUB_0,
1074         .get_rptr = vce_v4_0_ring_get_rptr,
1075         .get_wptr = vce_v4_0_ring_get_wptr,
1076         .set_wptr = vce_v4_0_ring_set_wptr,
1077         .parse_cs = amdgpu_vce_ring_parse_cs_vm,
1078         .emit_frame_size =
1079                 SOC15_FLUSH_GPU_TLB_NUM_WREG * 3 +
1080                 SOC15_FLUSH_GPU_TLB_NUM_REG_WAIT * 4 +
1081                 4 + /* vce_v4_0_emit_vm_flush */
1082                 5 + 5 + /* amdgpu_vce_ring_emit_fence x2 vm fence */
1083                 1, /* vce_v4_0_ring_insert_end */
1084         .emit_ib_size = 5, /* vce_v4_0_ring_emit_ib */
1085         .emit_ib = vce_v4_0_ring_emit_ib,
1086         .emit_vm_flush = vce_v4_0_emit_vm_flush,
1087         .emit_fence = vce_v4_0_ring_emit_fence,
1088         .test_ring = amdgpu_vce_ring_test_ring,
1089         .test_ib = amdgpu_vce_ring_test_ib,
1090         .insert_nop = amdgpu_ring_insert_nop,
1091         .insert_end = vce_v4_0_ring_insert_end,
1092         .pad_ib = amdgpu_ring_generic_pad_ib,
1093         .begin_use = amdgpu_vce_ring_begin_use,
1094         .end_use = amdgpu_vce_ring_end_use,
1095         .emit_wreg = vce_v4_0_emit_wreg,
1096         .emit_reg_wait = vce_v4_0_emit_reg_wait,
1097         .emit_reg_write_reg_wait = amdgpu_ring_emit_reg_write_reg_wait_helper,
1098 };
1099 
1100 static void vce_v4_0_set_ring_funcs(struct amdgpu_device *adev)
1101 {
1102         int i;
1103 
1104         for (i = 0; i < adev->vce.num_rings; i++) {
1105                 adev->vce.ring[i].funcs = &vce_v4_0_ring_vm_funcs;
1106                 adev->vce.ring[i].me = i;
1107         }
1108         DRM_INFO("VCE enabled in VM mode\n");
1109 }
1110 
1111 static const struct amdgpu_irq_src_funcs vce_v4_0_irq_funcs = {
1112         .set = vce_v4_0_set_interrupt_state,
1113         .process = vce_v4_0_process_interrupt,
1114 };
1115 
1116 static void vce_v4_0_set_irq_funcs(struct amdgpu_device *adev)
1117 {
1118         adev->vce.irq.num_types = 1;
1119         adev->vce.irq.funcs = &vce_v4_0_irq_funcs;
1120 };
1121 
1122 const struct amdgpu_ip_block_version vce_v4_0_ip_block =
1123 {
1124         .type = AMD_IP_BLOCK_TYPE_VCE,
1125         .major = 4,
1126         .minor = 0,
1127         .rev = 0,
1128         .funcs = &vce_v4_0_ip_funcs,
1129 };

/* [<][>][^][v][top][bottom][index][help] */