Message ID | 20191122012645.7430-1-masneyb@onstation.org |
---|---|
Headers | show |
Series | drm/msm/gpu: add support for ocmem interconnect | expand |
On Thu 21 Nov 17:26 PST 2019, Brian Masney wrote: > Some A3xx and all A4xx Adreno GPUs do not have GMEM inside the GPU core > and must use the On Chip MEMory (OCMEM) in order to be functional. > There's a separate interconnect path that needs to be setup to OCMEM. > Add support for this second path to the GPU core. > > In the downstream MSM 3.4 sources, the two interconnect paths for the > GPU are between: > > - MSM_BUS_MASTER_GRAPHICS_3D and MSM_BUS_SLAVE_EBI_CH0 > - MSM_BUS_MASTER_V_OCMEM_GFX3D and MSM_BUS_SLAVE_OCMEM > Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> > Signed-off-by: Brian Masney <masneyb@onstation.org> > --- > drivers/gpu/drm/msm/adreno/adreno_gpu.c | 14 +++++++++++++- > drivers/gpu/drm/msm/msm_gpu.h | 7 +++++++ > 2 files changed, 20 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c > index 0783e4b5486a..d27bdc999777 100644 > --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c > +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c > @@ -887,10 +887,21 @@ static int adreno_get_pwrlevels(struct device *dev, > DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate); > > /* Check for an interconnect path for the bus */ > - gpu->icc_path = of_icc_get(dev, NULL); > + gpu->icc_path = of_icc_get(dev, "gfx-mem"); > + if (!gpu->icc_path) { > + /* > + * Keep compatbility with device trees that don't have an > + * interconnect-names property. > + */ > + gpu->icc_path = of_icc_get(dev, NULL); > + } > if (IS_ERR(gpu->icc_path)) > gpu->icc_path = NULL; > > + gpu->ocmem_icc_path = of_icc_get(dev, "ocmem"); > + if (IS_ERR(gpu->ocmem_icc_path)) > + gpu->ocmem_icc_path = NULL; > + > return 0; > } > > @@ -977,6 +988,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *adreno_gpu) > release_firmware(adreno_gpu->fw[i]); > > icc_put(gpu->icc_path); > + icc_put(gpu->ocmem_icc_path); > > msm_gpu_cleanup(&adreno_gpu->base); > } > diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h > index ab8f0f9c9dc8..be5bc2e8425c 100644 > --- a/drivers/gpu/drm/msm/msm_gpu.h > +++ b/drivers/gpu/drm/msm/msm_gpu.h > @@ -111,8 +111,15 @@ struct msm_gpu { > struct clk *ebi1_clk, *core_clk, *rbbmtimer_clk; > uint32_t fast_rate; > > + /* The gfx-mem interconnect path that's used by all GPU types. */ > struct icc_path *icc_path; > > + /* > + * Second interconnect path for some A3xx and all A4xx GPUs to the > + * On Chip MEMory (OCMEM). > + */ > + struct icc_path *ocmem_icc_path; > + > /* Hang and Inactivity Detection: > */ > #define DRM_MSM_INACTIVE_PERIOD 66 /* in ms (roughly four frames) */ > -- > 2.21.0 >
On Thu 21 Nov 17:26 PST 2019, Brian Masney wrote: > Set the two interconnect paths for the GPU to maximum speed for now to > work towards getting the GPU working upstream. We can revisit a later > time to optimize this for battery life. > > Signed-off-by: Brian Masney <masneyb@onstation.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> > --- > drivers/gpu/drm/msm/adreno/a3xx_gpu.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c > index 07ddcc529573..eff0ecd4e81a 100644 > --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c > +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c > @@ -504,6 +504,14 @@ struct msm_gpu *a3xx_gpu_init(struct drm_device *dev) > DRM_DEV_ERROR(dev->dev, "No memory protection without IOMMU\n"); > } > > + /* > + * Set the ICC path to maximum speed for now by multiplying the fastest > + * frequency by the bus width (8). We'll want to scale this later on to > + * improve battery life. I would expect that you have to worry about temperature before battery life... Regards, Bjorn > + */ > + icc_set_bw(gpu->icc_path, 0, Bps_to_icc(gpu->fast_rate) * 8); > + icc_set_bw(gpu->ocmem_icc_path, 0, Bps_to_icc(gpu->fast_rate) * 8); > + > return gpu; > > fail: > -- > 2.21.0 >
On Thu 21 Nov 17:26 PST 2019, Brian Masney wrote: > Set the two interconnect paths for the GPU to maximum speed for now to > work towards getting the GPU working upstream. We can revisit a later > time to optimize this for battery life. > > Signed-off-by: Brian Masney <masneyb@onstation.org> Reviewed-by: Bjorn Andersson <bjorn.andersson@linaro.org> > --- > drivers/gpu/drm/msm/adreno/a4xx_gpu.c | 8 ++++++++ > 1 file changed, 8 insertions(+) > > diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c > index b01388a9e89e..253d8d85daad 100644 > --- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c > +++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c > @@ -591,6 +591,14 @@ struct msm_gpu *a4xx_gpu_init(struct drm_device *dev) > goto fail; > } > > + /* > + * Set the ICC path to maximum speed for now by multiplying the fastest > + * frequency by the bus width (8). We'll want to scale this later on to > + * improve battery life. > + */ > + icc_set_bw(gpu->icc_path, 0, Bps_to_icc(gpu->fast_rate) * 8); > + icc_set_bw(gpu->ocmem_icc_path, 0, Bps_to_icc(gpu->fast_rate) * 8); > + > return gpu; > > fail: > -- > 2.21.0 >