|
@@ -33,10 +33,21 @@ static bool set_cache_memory_policy_vi(struct device_queue_manager *dqm,
|
|
|
enum cache_policy alternate_policy,
|
|
|
void __user *alternate_aperture_base,
|
|
|
uint64_t alternate_aperture_size);
|
|
|
+static bool set_cache_memory_policy_vi_tonga(struct device_queue_manager *dqm,
|
|
|
+ struct qcm_process_device *qpd,
|
|
|
+ enum cache_policy default_policy,
|
|
|
+ enum cache_policy alternate_policy,
|
|
|
+ void __user *alternate_aperture_base,
|
|
|
+ uint64_t alternate_aperture_size);
|
|
|
static int update_qpd_vi(struct device_queue_manager *dqm,
|
|
|
struct qcm_process_device *qpd);
|
|
|
+static int update_qpd_vi_tonga(struct device_queue_manager *dqm,
|
|
|
+ struct qcm_process_device *qpd);
|
|
|
static void init_sdma_vm(struct device_queue_manager *dqm, struct queue *q,
|
|
|
struct qcm_process_device *qpd);
|
|
|
+static void init_sdma_vm_tonga(struct device_queue_manager *dqm,
|
|
|
+ struct queue *q,
|
|
|
+ struct qcm_process_device *qpd);
|
|
|
|
|
|
void device_queue_manager_init_vi(
|
|
|
struct device_queue_manager_asic_ops *asic_ops)
|
|
@@ -46,6 +57,14 @@ void device_queue_manager_init_vi(
|
|
|
asic_ops->init_sdma_vm = init_sdma_vm;
|
|
|
}
|
|
|
|
|
|
+void device_queue_manager_init_vi_tonga(
|
|
|
+ struct device_queue_manager_asic_ops *asic_ops)
|
|
|
+{
|
|
|
+ asic_ops->set_cache_memory_policy = set_cache_memory_policy_vi_tonga;
|
|
|
+ asic_ops->update_qpd = update_qpd_vi_tonga;
|
|
|
+ asic_ops->init_sdma_vm = init_sdma_vm_tonga;
|
|
|
+}
|
|
|
+
|
|
|
static uint32_t compute_sh_mem_bases_64bit(unsigned int top_address_nybble)
|
|
|
{
|
|
|
/* In 64-bit mode, we can only control the top 3 bits of the LDS,
|
|
@@ -103,6 +122,33 @@ static bool set_cache_memory_policy_vi(struct device_queue_manager *dqm,
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+static bool set_cache_memory_policy_vi_tonga(struct device_queue_manager *dqm,
|
|
|
+ struct qcm_process_device *qpd,
|
|
|
+ enum cache_policy default_policy,
|
|
|
+ enum cache_policy alternate_policy,
|
|
|
+ void __user *alternate_aperture_base,
|
|
|
+ uint64_t alternate_aperture_size)
|
|
|
+{
|
|
|
+ uint32_t default_mtype;
|
|
|
+ uint32_t ape1_mtype;
|
|
|
+
|
|
|
+ default_mtype = (default_policy == cache_policy_coherent) ?
|
|
|
+ MTYPE_UC :
|
|
|
+ MTYPE_NC;
|
|
|
+
|
|
|
+ ape1_mtype = (alternate_policy == cache_policy_coherent) ?
|
|
|
+ MTYPE_UC :
|
|
|
+ MTYPE_NC;
|
|
|
+
|
|
|
+ qpd->sh_mem_config =
|
|
|
+ SH_MEM_ALIGNMENT_MODE_UNALIGNED <<
|
|
|
+ SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT |
|
|
|
+ default_mtype << SH_MEM_CONFIG__DEFAULT_MTYPE__SHIFT |
|
|
|
+ ape1_mtype << SH_MEM_CONFIG__APE1_MTYPE__SHIFT;
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+
|
|
|
static int update_qpd_vi(struct device_queue_manager *dqm,
|
|
|
struct qcm_process_device *qpd)
|
|
|
{
|
|
@@ -144,6 +190,40 @@ static int update_qpd_vi(struct device_queue_manager *dqm,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int update_qpd_vi_tonga(struct device_queue_manager *dqm,
|
|
|
+ struct qcm_process_device *qpd)
|
|
|
+{
|
|
|
+ struct kfd_process_device *pdd;
|
|
|
+ unsigned int temp;
|
|
|
+
|
|
|
+ pdd = qpd_to_pdd(qpd);
|
|
|
+
|
|
|
+ /* check if sh_mem_config register already configured */
|
|
|
+ if (qpd->sh_mem_config == 0) {
|
|
|
+ qpd->sh_mem_config =
|
|
|
+ SH_MEM_ALIGNMENT_MODE_UNALIGNED <<
|
|
|
+ SH_MEM_CONFIG__ALIGNMENT_MODE__SHIFT |
|
|
|
+ MTYPE_UC <<
|
|
|
+ SH_MEM_CONFIG__DEFAULT_MTYPE__SHIFT |
|
|
|
+ MTYPE_UC <<
|
|
|
+ SH_MEM_CONFIG__APE1_MTYPE__SHIFT;
|
|
|
+
|
|
|
+ qpd->sh_mem_ape1_limit = 0;
|
|
|
+ qpd->sh_mem_ape1_base = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* On dGPU we're always in GPUVM64 addressing mode with 64-bit
|
|
|
+ * aperture addresses.
|
|
|
+ */
|
|
|
+ temp = get_sh_mem_bases_nybble_64(pdd);
|
|
|
+ qpd->sh_mem_bases = compute_sh_mem_bases_64bit(temp);
|
|
|
+
|
|
|
+ pr_debug("sh_mem_bases nybble: 0x%X and register 0x%X\n",
|
|
|
+ temp, qpd->sh_mem_bases);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void init_sdma_vm(struct device_queue_manager *dqm, struct queue *q,
|
|
|
struct qcm_process_device *qpd)
|
|
|
{
|
|
@@ -159,3 +239,16 @@ static void init_sdma_vm(struct device_queue_manager *dqm, struct queue *q,
|
|
|
|
|
|
q->properties.sdma_vm_addr = value;
|
|
|
}
|
|
|
+
|
|
|
+static void init_sdma_vm_tonga(struct device_queue_manager *dqm,
|
|
|
+ struct queue *q,
|
|
|
+ struct qcm_process_device *qpd)
|
|
|
+{
|
|
|
+ /* On dGPU we're always in GPUVM64 addressing mode with 64-bit
|
|
|
+ * aperture addresses.
|
|
|
+ */
|
|
|
+ q->properties.sdma_vm_addr =
|
|
|
+ ((get_sh_mem_bases_nybble_64(qpd_to_pdd(qpd))) <<
|
|
|
+ SDMA0_RLC0_VIRTUAL_ADDR__SHARED_BASE__SHIFT) &
|
|
|
+ SDMA0_RLC0_VIRTUAL_ADDR__SHARED_BASE_MASK;
|
|
|
+}
|