Commit 48d92e8e authored by Dmytro Laktyushkin's avatar Dmytro Laktyushkin Committed by Alex Deucher

drm/amd/display: enable hostvm based on roimmu active for dcn2.1

Enabling hostvm when ROIMMU is not active seems to break GPUVM.
This fixes the issue by not enabling hostvm if ROIMMU is not
activated.
Signed-off-by: default avatarDmytro Laktyushkin <Dmytro.Laktyushkin@amd.com>
Acked-by: default avatarBhawanpreet Lakha <Bhawanpreet.Lakha@amd.com>
Reviewed-by: default avatarRoman Li <Roman.Li@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 15fdbcc5
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
* Authors: AMD * Authors: AMD
* *
*/ */
#include <linux/delay.h>
#include "dm_services.h" #include "dm_services.h"
#include "dcn20/dcn20_hubbub.h" #include "dcn20/dcn20_hubbub.h"
#include "dcn21_hubbub.h" #include "dcn21_hubbub.h"
...@@ -71,14 +72,23 @@ static uint32_t convert_and_clamp( ...@@ -71,14 +72,23 @@ static uint32_t convert_and_clamp(
void dcn21_dchvm_init(struct hubbub *hubbub) void dcn21_dchvm_init(struct hubbub *hubbub)
{ {
struct dcn20_hubbub *hubbub1 = TO_DCN20_HUBBUB(hubbub); struct dcn20_hubbub *hubbub1 = TO_DCN20_HUBBUB(hubbub);
uint32_t riommu_active;
int i;
//Init DCHVM block //Init DCHVM block
REG_UPDATE(DCHVM_CTRL0, HOSTVM_INIT_REQ, 1); REG_UPDATE(DCHVM_CTRL0, HOSTVM_INIT_REQ, 1);
//Poll until RIOMMU_ACTIVE = 1 //Poll until RIOMMU_ACTIVE = 1
//TODO: Figure out interval us and retry count for (i = 0; i < 100; i++) {
REG_WAIT(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, 1, 5, 100); REG_GET(DCHVM_RIOMMU_STAT0, RIOMMU_ACTIVE, &riommu_active);
if (riommu_active)
break;
else
udelay(5);
}
if (riommu_active) {
//Reflect the power status of DCHUBBUB //Reflect the power status of DCHUBBUB
REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_POWERSTATUS, 1); REG_UPDATE(DCHVM_RIOMMU_CTRL0, HOSTVM_POWERSTATUS, 1);
...@@ -93,8 +103,8 @@ void dcn21_dchvm_init(struct hubbub *hubbub) ...@@ -93,8 +103,8 @@ void dcn21_dchvm_init(struct hubbub *hubbub)
HVM_DCFCLK_G_GATE_DIS, 0); HVM_DCFCLK_G_GATE_DIS, 0);
//Poll until HOSTVM_PREFETCH_DONE = 1 //Poll until HOSTVM_PREFETCH_DONE = 1
//TODO: Figure out interval us and retry count
REG_WAIT(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, 1, 5, 100); REG_WAIT(DCHVM_RIOMMU_STAT0, HOSTVM_PREFETCH_DONE, 1, 5, 100);
}
} }
int hubbub21_init_dchub(struct hubbub *hubbub, int hubbub21_init_dchub(struct hubbub *hubbub,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment