0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #include <linux/delay.h>
0027
0028 #include "dcn20_vmid.h"
0029 #include "reg_helper.h"
0030
0031 #define REG(reg)\
0032 vmid->regs->reg
0033
0034 #define CTX \
0035 vmid->ctx
0036
0037 #undef FN
0038 #define FN(reg_name, field_name) \
0039 vmid->shifts->field_name, vmid->masks->field_name
0040
0041 static void dcn20_wait_for_vmid_ready(struct dcn20_vmid *vmid)
0042 {
0043
0044
0045
0046
0047
0048
0049
0050
0051 int max_times = 10000;
0052 int delay_us = 5;
0053 int i;
0054
0055 for (i = 0; i < max_times; ++i) {
0056 uint32_t entry_lo32;
0057
0058 REG_GET(PAGE_TABLE_BASE_ADDR_LO32,
0059 VM_CONTEXT0_PAGE_DIRECTORY_ENTRY_LO32,
0060 &entry_lo32);
0061
0062 if (entry_lo32 & 0x1)
0063 return;
0064
0065 udelay(delay_us);
0066 }
0067
0068
0069 DC_LOG_WARNING("Timeout while waiting for GPUVM context update\n");
0070 ASSERT(0);
0071 }
0072
0073 void dcn20_vmid_setup(struct dcn20_vmid *vmid, const struct dcn_vmid_page_table_config *config)
0074 {
0075 REG_SET(PAGE_TABLE_START_ADDR_HI32, 0,
0076 VM_CONTEXT0_START_LOGICAL_PAGE_NUMBER_HI4, (config->page_table_start_addr >> 32) & 0xF);
0077 REG_SET(PAGE_TABLE_START_ADDR_LO32, 0,
0078 VM_CONTEXT0_START_LOGICAL_PAGE_NUMBER_LO32, config->page_table_start_addr & 0xFFFFFFFF);
0079
0080 REG_SET(PAGE_TABLE_END_ADDR_HI32, 0,
0081 VM_CONTEXT0_END_LOGICAL_PAGE_NUMBER_HI4, (config->page_table_end_addr >> 32) & 0xF);
0082 REG_SET(PAGE_TABLE_END_ADDR_LO32, 0,
0083 VM_CONTEXT0_END_LOGICAL_PAGE_NUMBER_LO32, config->page_table_end_addr & 0xFFFFFFFF);
0084
0085 REG_SET_2(CNTL, 0,
0086 VM_CONTEXT0_PAGE_TABLE_DEPTH, config->depth,
0087 VM_CONTEXT0_PAGE_TABLE_BLOCK_SIZE, config->block_size);
0088
0089 REG_SET(PAGE_TABLE_BASE_ADDR_HI32, 0,
0090 VM_CONTEXT0_PAGE_DIRECTORY_ENTRY_HI32, (config->page_table_base_addr >> 32) & 0xFFFFFFFF);
0091
0092 REG_SET(PAGE_TABLE_BASE_ADDR_LO32, 0,
0093 VM_CONTEXT0_PAGE_DIRECTORY_ENTRY_LO32, config->page_table_base_addr & 0xFFFFFFFF);
0094
0095 dcn20_wait_for_vmid_ready(vmid);
0096 }