<div dir="ltr"><span style="color:rgb(33,33,33);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;line-height:19.5px">With your patch, we do get past a4xx_me_init().  However a simple gl test (just a gl clear) isn't working.  Kernel log shows the following, then the gpu is restarted.</span><div style="color:rgb(33,33,33);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;line-height:19.5px"><br></div><div style="color:rgb(33,33,33);font-family:'Helvetica Neue',Helvetica,Arial,sans-serif;font-size:13px;line-height:19.5px"><div>[11252.988097] A430: Int status 00000200</div><div>[11253.949306] msm qcom,msm_drm_dummy.20: A430: hangcheck detected gpu lockup!</div><div>[11253.955240] msm qcom,msm_drm_dummy.20: A430:     completed fence: 1421</div><div>[11253.961756] msm qcom,msm_drm_dummy.20: A430:     submitted fence: 1422</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Dec 3, 2015 at 1:20 PM, Rob Clark <span dir="ltr"><<a href="mailto:robdclark@gmail.com" target="_blank">robdclark@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Note: temporary hack to avoid regenerating the autogenerated register<br>
headers, which would likely be conflict-y depending on what kernel you<br>
are based on.<br>
<br>
If you get past a4xx_me_init() without any timeout msgs, that is a good<br>
sign that the gpu is alive.<br>
<br>
In theory, this should be all we need for userspace:<br>
<br>
 diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c b/src/gallium/drivers/freedreno/freedreno_screen.c<br>
 index 5bbe401..97c4edd 100644<br>
 --- a/src/gallium/drivers/freedreno/freedreno_screen.c<br>
 +++ b/src/gallium/drivers/freedreno/freedreno_screen.c<br>
 @@ -555,6 +555,7 @@ fd_screen_create(struct fd_device *dev)<br>
                fd3_screen_init(pscreen);<br>
                break;<br>
        case 420:<br>
 +      case 430:<br>
                fd4_screen_init(pscreen);<br>
                break;<br>
        default:<br>
<br>
---<br>
 drivers/gpu/drm/msm/adreno/a4xx_gpu.c      | 28 ++++++++++++++++++++++++++--<br>
 drivers/gpu/drm/msm/adreno/adreno_device.c |  8 ++++++++<br>
 drivers/gpu/drm/msm/adreno/adreno_gpu.h    |  5 +++++<br>
 3 files changed, 39 insertions(+), 2 deletions(-)<br>
<br>
diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c<br>
index a53f1be..b00e69e 100644<br>
--- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c<br>
+++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c<br>
@@ -15,6 +15,11 @@<br>
 #  include <soc/qcom/ocmem.h><br>
 #endif<br>
<br>
+// XXX temp hack until rnndb updated and a4xx.xml.h regenerated:<br>
+#define REG_A4XX_RBBM_WAIT_IDLE_CLOCKS_CTL2            0x1b8<br>
+#define REG_A4XX_RBBM_SP_REGFILE_SLEEP_CNTL_0  0x99<br>
+#define REG_A4XX_RBBM_SP_REGFILE_SLEEP_CNTL_1  0x9a<br>
+<br>
 #define A4XX_INT0_MASK \<br>
        (A4XX_INT0_RBBM_AHB_ERROR |        \<br>
         A4XX_INT0_RBBM_ATB_BUS_OVERFLOW | \<br>
@@ -141,7 +146,7 @@ static int a4xx_hw_init(struct msm_gpu *gpu)<br>
        uint32_t *ptr, len;<br>
        int i, ret;<br>
<br>
-       if (adreno_is_a4xx(adreno_gpu)) {<br>
+       if (adreno_is_a420(adreno_gpu)) {<br>
                gpu_write(gpu, REG_A4XX_VBIF_ABIT_SORT, 0x0001001F);<br>
                gpu_write(gpu, REG_A4XX_VBIF_ABIT_SORT_CONF, 0x000000A4);<br>
                gpu_write(gpu, REG_A4XX_VBIF_GATE_OFF_WRREQ_EN, 0x00000001);<br>
@@ -150,6 +155,13 @@ static int a4xx_hw_init(struct msm_gpu *gpu)<br>
                gpu_write(gpu, REG_A4XX_VBIF_IN_WR_LIM_CONF0, 0x18181818);<br>
                gpu_write(gpu, REG_A4XX_VBIF_IN_WR_LIM_CONF1, 0x00000018);<br>
                gpu_write(gpu, REG_A4XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x00000003);<br>
+       } else if (adreno_is_a430(adreno_gpu)) {<br>
+               gpu_write(gpu, REG_A4XX_VBIF_GATE_OFF_WRREQ_EN, 0x00000001);<br>
+               gpu_write(gpu, REG_A4XX_VBIF_IN_RD_LIM_CONF0, 0x18181818);<br>
+               gpu_write(gpu, REG_A4XX_VBIF_IN_RD_LIM_CONF1, 0x00000018);<br>
+               gpu_write(gpu, REG_A4XX_VBIF_IN_WR_LIM_CONF0, 0x18181818);<br>
+               gpu_write(gpu, REG_A4XX_VBIF_IN_WR_LIM_CONF1, 0x00000018);<br>
+               gpu_write(gpu, REG_A4XX_VBIF_ROUND_ROBIN_QOS_ARB, 0x00000003);<br>
        } else {<br>
                BUG();<br>
        }<br>
@@ -160,8 +172,11 @@ static int a4xx_hw_init(struct msm_gpu *gpu)<br>
        /* Tune the hystersis counters for SP and CP idle detection */<br>
        gpu_write(gpu, REG_A4XX_RBBM_SP_HYST_CNT, 0x10);<br>
        gpu_write(gpu, REG_A4XX_RBBM_WAIT_IDLE_CLOCKS_CTL, 0x10);<br>
+       if (adreno_is_a430(adreno_gpu)) {<br>
+               gpu_write(gpu, REG_A4XX_RBBM_WAIT_IDLE_CLOCKS_CTL2, 0x30);<br>
+       }<br>
<br>
-        /* Enable the RBBM error reporting bits */<br>
+       /* Enable the RBBM error reporting bits */<br>
        gpu_write(gpu, REG_A4XX_RBBM_AHB_CTL0, 0x00000001);<br>
<br>
        /* Enable AHB error reporting*/<br>
@@ -190,6 +205,15 @@ static int a4xx_hw_init(struct msm_gpu *gpu)<br>
        gpu_write(gpu, REG_A4XX_CP_DEBUG, (1 << 25) |<br>
                        (adreno_is_a420(adreno_gpu) ? (1 << 29) : 0));<br>
<br>
+       /* On A430 enable SP regfile sleep for power savings */<br>
+       /* TODO downstream does this for !420, so maybe applies for 405 too? */<br>
+       if (!adreno_is_a420(adreno_gpu)) {<br>
+               gpu_write(gpu, REG_A4XX_RBBM_SP_REGFILE_SLEEP_CNTL_0,<br>
+                               0x00000441);<br>
+               gpu_write(gpu, REG_A4XX_RBBM_SP_REGFILE_SLEEP_CNTL_1,<br>
+                               0x00000441);<br>
+       }<br>
+<br>
        a4xx_enable_hwcg(gpu);<br>
<br>
        /*<br>
diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c<br>
index 1ea2df5..43d5aaa 100644<br>
--- a/drivers/gpu/drm/msm/adreno/adreno_device.c<br>
+++ b/drivers/gpu/drm/msm/adreno/adreno_device.c<br>
@@ -73,6 +73,14 @@ static const struct adreno_info gpulist[] = {<br>
                .pfpfw = "a420_pfp.fw",<br>
                .gmem  = (SZ_1M + SZ_512K),<br>
                .init  = a4xx_gpu_init,<br>
+       }, {<br>
+               .rev   = ADRENO_REV(4, 3, 0, ANY_ID),<br>
+               .revn  = 430,<br>
+               .name  = "A430",<br>
+               .pm4fw = "a420_pm4.fw",<br>
+               .pfpfw = "a420_pfp.fw",<br>
+               .gmem  = (SZ_1M + SZ_512K),<br>
+               .init  = a4xx_gpu_init,<br>
        },<br>
 };<br>
<br>
diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h<br>
index 0a312e9..8db0055 100644<br>
--- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h<br>
+++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h<br>
@@ -228,6 +228,11 @@ static inline int adreno_is_a420(struct adreno_gpu *gpu)<br>
        return gpu->revn == 420;<br>
 }<br>
<br>
+static inline int adreno_is_a430(struct adreno_gpu *gpu)<br>
+{<br>
+       return gpu->revn == 430;<br>
+}<br>
+<br>
 int adreno_get_param(struct msm_gpu *gpu, uint32_t param, uint64_t *value);<br>
 int adreno_hw_init(struct msm_gpu *gpu);<br>
 uint32_t adreno_last_fence(struct msm_gpu *gpu);<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.5.0<br>
<br>
</font></span></blockquote></div><br></div>