diff options
Diffstat (limited to 'drivers/gpu/drm/msm')
115 files changed, 6495 insertions, 4598 deletions
diff --git a/drivers/gpu/drm/msm/Kconfig b/drivers/gpu/drm/msm/Kconfig index 949b18a29a55..85f5ab1d552c 100644 --- a/drivers/gpu/drm/msm/Kconfig +++ b/drivers/gpu/drm/msm/Kconfig @@ -9,6 +9,7 @@ config DRM_MSM  	depends on QCOM_OCMEM || QCOM_OCMEM=n  	depends on QCOM_LLCC || QCOM_LLCC=n  	depends on QCOM_COMMAND_DB || QCOM_COMMAND_DB=n +	depends on PM  	select IOMMU_IO_PGTABLE  	select QCOM_MDT_LOADER if ARCH_QCOM  	select REGULATOR @@ -28,6 +29,7 @@ config DRM_MSM  	select SYNC_FILE  	select PM_OPP  	select NVMEM +	select PM_GENERIC_DOMAINS  	help  	  DRM/KMS driver for MSM/snapdragon. diff --git a/drivers/gpu/drm/msm/adreno/a2xx.xml.h b/drivers/gpu/drm/msm/adreno/a2xx.xml.h index afa6023346c4..f87a1312f580 100644 --- a/drivers/gpu/drm/msm/adreno/a2xx.xml.h +++ b/drivers/gpu/drm/msm/adreno/a2xx.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2023 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -1060,6 +1060,12 @@ enum a2xx_mh_perfcnt_select {  	AXI_TOTAL_READ_REQUEST_DATA_BEATS = 181,  }; +enum perf_mode_cnt { +	PERF_STATE_RESET = 0, +	PERF_STATE_ENABLE = 1, +	PERF_STATE_FREEZE = 2, +}; +  enum adreno_mmu_clnt_beh {  	BEH_NEVR = 0,  	BEH_TRAN_RNG = 1, @@ -1307,6 +1313,18 @@ static inline uint32_t A2XX_MH_MMU_VA_RANGE_VA_BASE(uint32_t val)  #define A2XX_RBBM_PM_OVERRIDE1_MH_TCROQ_SCLK_PM_OVERRIDE	0x80000000  #define REG_A2XX_RBBM_PM_OVERRIDE2				0x0000039d +#define A2XX_RBBM_PM_OVERRIDE2_PA_REG_SCLK_PM_OVERRIDE		0x00000001 +#define A2XX_RBBM_PM_OVERRIDE2_PA_PA_SCLK_PM_OVERRIDE		0x00000002 +#define A2XX_RBBM_PM_OVERRIDE2_PA_AG_SCLK_PM_OVERRIDE		0x00000004 +#define A2XX_RBBM_PM_OVERRIDE2_VGT_REG_SCLK_PM_OVERRIDE		0x00000008 +#define A2XX_RBBM_PM_OVERRIDE2_VGT_FIFOS_SCLK_PM_OVERRIDE	0x00000010 +#define A2XX_RBBM_PM_OVERRIDE2_VGT_VGT_SCLK_PM_OVERRIDE		0x00000020 +#define A2XX_RBBM_PM_OVERRIDE2_DEBUG_PERF_SCLK_PM_OVERRIDE	0x00000040 +#define A2XX_RBBM_PM_OVERRIDE2_PERM_SCLK_PM_OVERRIDE		0x00000080 +#define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM0_PM_OVERRIDE		0x00000100 +#define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM1_PM_OVERRIDE		0x00000200 +#define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM2_PM_OVERRIDE		0x00000400 +#define A2XX_RBBM_PM_OVERRIDE2_GC_GA_GMEM3_PM_OVERRIDE		0x00000800  #define REG_A2XX_RBBM_DEBUG_OUT					0x000003a0 @@ -1334,6 +1352,12 @@ static inline uint32_t A2XX_MH_MMU_VA_RANGE_VA_BASE(uint32_t val)  #define REG_A2XX_RBBM_PERIPHID2					0x000003fa  #define REG_A2XX_CP_PERFMON_CNTL				0x00000444 +#define A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__MASK		0x00000007 +#define A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__SHIFT		0 +static inline uint32_t A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT(enum perf_mode_cnt val) +{ +	return ((val) << A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__SHIFT) & A2XX_CP_PERFMON_CNTL_PERF_MODE_CNT__MASK; +}  #define REG_A2XX_CP_PERFCOUNTER_SELECT				0x00000445 diff --git a/drivers/gpu/drm/msm/adreno/a3xx.xml.h b/drivers/gpu/drm/msm/adreno/a3xx.xml.h index 520ae3f375a1..237b564445be 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx.xml.h +++ b/drivers/gpu/drm/msm/adreno/a3xx.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c index 948785ed07bb..c86b377f6f0d 100644 --- a/drivers/gpu/drm/msm/adreno/a3xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a3xx_gpu.c @@ -477,6 +477,16 @@ static struct msm_gpu_state *a3xx_gpu_state_get(struct msm_gpu *gpu)  	return state;  } +static u64 a3xx_gpu_busy(struct msm_gpu *gpu, unsigned long *out_sample_rate) +{ +	u64 busy_cycles; + +	busy_cycles = gpu_read64(gpu, REG_A3XX_RBBM_PERFCTR_RBBM_1_LO); +	*out_sample_rate = clk_get_rate(gpu->core_clk); + +	return busy_cycles; +} +  static u32 a3xx_get_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring)  {  	ring->memptrs->rptr = gpu_read(gpu, REG_AXXX_CP_RB_RPTR); @@ -498,6 +508,7 @@ static const struct adreno_gpu_funcs funcs = {  #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP)  		.show = adreno_show,  #endif +		.gpu_busy = a3xx_gpu_busy,  		.gpu_state_get = a3xx_gpu_state_get,  		.gpu_state_put = adreno_gpu_state_put,  		.create_address_space = adreno_create_address_space, diff --git a/drivers/gpu/drm/msm/adreno/a4xx.xml.h b/drivers/gpu/drm/msm/adreno/a4xx.xml.h index 7e5c21015d10..ff5f1e98a5fc 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx.xml.h +++ b/drivers/gpu/drm/msm/adreno/a4xx.xml.h @@ -8,19 +8,19 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52)  Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark) @@ -3159,6 +3159,18 @@ static inline uint32_t A4XX_TPL1_TP_TEX_COUNT_GS(uint32_t val)  #define REG_A4XX_TPL1_TP_GS_BORDER_COLOR_BASE_ADDR		0x0000238d  #define REG_A4XX_TPL1_TP_FS_TEX_COUNT				0x000023a0 +#define A4XX_TPL1_TP_FS_TEX_COUNT_FS__MASK			0x000000ff +#define A4XX_TPL1_TP_FS_TEX_COUNT_FS__SHIFT			0 +static inline uint32_t A4XX_TPL1_TP_FS_TEX_COUNT_FS(uint32_t val) +{ +	return ((val) << A4XX_TPL1_TP_FS_TEX_COUNT_FS__SHIFT) & A4XX_TPL1_TP_FS_TEX_COUNT_FS__MASK; +} +#define A4XX_TPL1_TP_FS_TEX_COUNT_CS__MASK			0x0000ff00 +#define A4XX_TPL1_TP_FS_TEX_COUNT_CS__SHIFT			8 +static inline uint32_t A4XX_TPL1_TP_FS_TEX_COUNT_CS(uint32_t val) +{ +	return ((val) << A4XX_TPL1_TP_FS_TEX_COUNT_CS__SHIFT) & A4XX_TPL1_TP_FS_TEX_COUNT_CS__MASK; +}  #define REG_A4XX_TPL1_TP_FS_BORDER_COLOR_BASE_ADDR		0x000023a1 diff --git a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c index 3e09d3a7a0ac..715436cb3996 100644 --- a/drivers/gpu/drm/msm/adreno/a4xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a4xx_gpu.c @@ -611,6 +611,16 @@ static int a4xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value)  	return 0;  } +static u64 a4xx_gpu_busy(struct msm_gpu *gpu, unsigned long *out_sample_rate) +{ +	u64 busy_cycles; + +	busy_cycles = gpu_read64(gpu, REG_A4XX_RBBM_PERFCTR_RBBM_1_LO); +	*out_sample_rate = clk_get_rate(gpu->core_clk); + +	return busy_cycles; +} +  static u32 a4xx_get_rptr(struct msm_gpu *gpu, struct msm_ringbuffer *ring)  {  	ring->memptrs->rptr = gpu_read(gpu, REG_A4XX_CP_RB_RPTR); @@ -632,6 +642,7 @@ static const struct adreno_gpu_funcs funcs = {  #if defined(CONFIG_DEBUG_FS) || defined(CONFIG_DEV_COREDUMP)  		.show = adreno_show,  #endif +		.gpu_busy = a4xx_gpu_busy,  		.gpu_state_get = a4xx_gpu_state_get,  		.gpu_state_put = adreno_gpu_state_put,  		.create_address_space = adreno_create_address_space, diff --git a/drivers/gpu/drm/msm/adreno/a5xx.xml.h b/drivers/gpu/drm/msm/adreno/a5xx.xml.h index 2505b4e43ca0..03b7ee592b11 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx.xml.h +++ b/drivers/gpu/drm/msm/adreno/a5xx.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2022 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2023 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -4218,6 +4218,7 @@ static inline uint32_t A5XX_SP_CS_CONFIG_SHADEROBJOFFSET(uint32_t val)  #define REG_A5XX_SP_FS_CONFIG_MAX_CONST				0x0000e58b  #define REG_A5XX_SP_VS_CTRL_REG0				0x0000e590 +#define A5XX_SP_VS_CTRL_REG0_BUFFER				0x00000004  #define A5XX_SP_VS_CTRL_REG0_THREADSIZE__MASK			0x00000008  #define A5XX_SP_VS_CTRL_REG0_THREADSIZE__SHIFT			3  static inline uint32_t A5XX_SP_VS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) @@ -4316,6 +4317,7 @@ static inline uint32_t A5XX_SP_VS_VPC_DST_REG_OUTLOC3(uint32_t val)  #define REG_A5XX_SP_VS_OBJ_START_HI				0x0000e5ad  #define REG_A5XX_SP_FS_CTRL_REG0				0x0000e5c0 +#define A5XX_SP_FS_CTRL_REG0_BUFFER				0x00000004  #define A5XX_SP_FS_CTRL_REG0_THREADSIZE__MASK			0x00000008  #define A5XX_SP_FS_CTRL_REG0_THREADSIZE__SHIFT			3  static inline uint32_t A5XX_SP_FS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) @@ -4406,6 +4408,7 @@ static inline uint32_t A5XX_SP_FS_MRT_REG_COLOR_FORMAT(enum a5xx_color_fmt val)  #define REG_A5XX_UNKNOWN_E5DB					0x0000e5db  #define REG_A5XX_SP_CS_CTRL_REG0				0x0000e5f0 +#define A5XX_SP_CS_CTRL_REG0_BUFFER				0x00000004  #define A5XX_SP_CS_CTRL_REG0_THREADSIZE__MASK			0x00000008  #define A5XX_SP_CS_CTRL_REG0_THREADSIZE__SHIFT			3  static inline uint32_t A5XX_SP_CS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) @@ -4440,6 +4443,7 @@ static inline uint32_t A5XX_SP_CS_CTRL_REG0_BRANCHSTACK(uint32_t val)  #define REG_A5XX_SP_CS_OBJ_START_HI				0x0000e5f4  #define REG_A5XX_SP_HS_CTRL_REG0				0x0000e600 +#define A5XX_SP_HS_CTRL_REG0_BUFFER				0x00000004  #define A5XX_SP_HS_CTRL_REG0_THREADSIZE__MASK			0x00000008  #define A5XX_SP_HS_CTRL_REG0_THREADSIZE__SHIFT			3  static inline uint32_t A5XX_SP_HS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) @@ -4474,6 +4478,7 @@ static inline uint32_t A5XX_SP_HS_CTRL_REG0_BRANCHSTACK(uint32_t val)  #define REG_A5XX_SP_HS_OBJ_START_HI				0x0000e604  #define REG_A5XX_SP_DS_CTRL_REG0				0x0000e610 +#define A5XX_SP_DS_CTRL_REG0_BUFFER				0x00000004  #define A5XX_SP_DS_CTRL_REG0_THREADSIZE__MASK			0x00000008  #define A5XX_SP_DS_CTRL_REG0_THREADSIZE__SHIFT			3  static inline uint32_t A5XX_SP_DS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) @@ -4508,6 +4513,7 @@ static inline uint32_t A5XX_SP_DS_CTRL_REG0_BRANCHSTACK(uint32_t val)  #define REG_A5XX_SP_DS_OBJ_START_HI				0x0000e62d  #define REG_A5XX_SP_GS_CTRL_REG0				0x0000e640 +#define A5XX_SP_GS_CTRL_REG0_BUFFER				0x00000004  #define A5XX_SP_GS_CTRL_REG0_THREADSIZE__MASK			0x00000008  #define A5XX_SP_GS_CTRL_REG0_THREADSIZE__SHIFT			3  static inline uint32_t A5XX_SP_GS_CTRL_REG0_THREADSIZE(enum a3xx_threadsize val) @@ -4665,11 +4671,11 @@ static inline uint32_t A5XX_HLSQ_CONTROL_2_REG_SAMPLEMASK(uint32_t val)  {  	return ((val) << A5XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT) & A5XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK;  } -#define A5XX_HLSQ_CONTROL_2_REG_SIZE__MASK			0xff000000 -#define A5XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT			24 -static inline uint32_t A5XX_HLSQ_CONTROL_2_REG_SIZE(uint32_t val) +#define A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK			0xff000000 +#define A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT		24 +static inline uint32_t A5XX_HLSQ_CONTROL_2_REG_CENTERRHW(uint32_t val)  { -	return ((val) << A5XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT) & A5XX_HLSQ_CONTROL_2_REG_SIZE__MASK; +	return ((val) << A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT) & A5XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK;  }  #define REG_A5XX_HLSQ_CONTROL_3_REG				0x0000e787 diff --git a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c index a1e006ec5dce..1e8d2982d603 100644 --- a/drivers/gpu/drm/msm/adreno/a5xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a5xx_gpu.c @@ -567,7 +567,7 @@ static void a5xx_ucode_check_version(struct a5xx_gpu *a5xx_gpu,  	msm_gem_put_vaddr(obj);  } -static int a5xx_ucode_init(struct msm_gpu *gpu) +static int a5xx_ucode_load(struct msm_gpu *gpu)  {  	struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);  	struct a5xx_gpu *a5xx_gpu = to_a5xx_gpu(adreno_gpu); @@ -605,9 +605,24 @@ static int a5xx_ucode_init(struct msm_gpu *gpu)  		a5xx_ucode_check_version(a5xx_gpu, a5xx_gpu->pfp_bo);  	} -	gpu_write64(gpu, REG_A5XX_CP_ME_INSTR_BASE_LO, a5xx_gpu->pm4_iova); +	if (a5xx_gpu->has_whereami) { +		if (!a5xx_gpu->shadow_bo) { +			a5xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, +				sizeof(u32) * gpu->nr_rings, +				MSM_BO_WC | MSM_BO_MAP_PRIV, +				gpu->aspace, &a5xx_gpu->shadow_bo, +				&a5xx_gpu->shadow_iova); -	gpu_write64(gpu, REG_A5XX_CP_PFP_INSTR_BASE_LO, a5xx_gpu->pfp_iova); +			if (IS_ERR(a5xx_gpu->shadow)) +				return PTR_ERR(a5xx_gpu->shadow); + +			msm_gem_object_set_name(a5xx_gpu->shadow_bo, "shadow"); +		} +	} else if (gpu->nr_rings > 1) { +		/* Disable preemption if WHERE_AM_I isn't available */ +		a5xx_preempt_fini(gpu); +		gpu->nr_rings = 1; +	}  	return 0;  } @@ -900,9 +915,8 @@ static int a5xx_hw_init(struct msm_gpu *gpu)  	if (adreno_is_a530(adreno_gpu) || adreno_is_a540(adreno_gpu))  		a5xx_gpmu_ucode_init(gpu); -	ret = a5xx_ucode_init(gpu); -	if (ret) -		return ret; +	gpu_write64(gpu, REG_A5XX_CP_ME_INSTR_BASE_LO, a5xx_gpu->pm4_iova); +	gpu_write64(gpu, REG_A5XX_CP_PFP_INSTR_BASE_LO, a5xx_gpu->pfp_iova);  	/* Set the ringbuffer address */  	gpu_write64(gpu, REG_A5XX_CP_RB_BASE, gpu->rb[0]->iova); @@ -916,27 +930,10 @@ static int a5xx_hw_init(struct msm_gpu *gpu)  	gpu_write(gpu, REG_A5XX_CP_RB_CNTL,  		MSM_GPU_RB_CNTL_DEFAULT | AXXX_CP_RB_CNTL_NO_UPDATE); -	/* Create a privileged buffer for the RPTR shadow */ -	if (a5xx_gpu->has_whereami) { -		if (!a5xx_gpu->shadow_bo) { -			a5xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, -				sizeof(u32) * gpu->nr_rings, -				MSM_BO_WC | MSM_BO_MAP_PRIV, -				gpu->aspace, &a5xx_gpu->shadow_bo, -				&a5xx_gpu->shadow_iova); - -			if (IS_ERR(a5xx_gpu->shadow)) -				return PTR_ERR(a5xx_gpu->shadow); - -			msm_gem_object_set_name(a5xx_gpu->shadow_bo, "shadow"); -		} - +	/* Configure the RPTR shadow if needed: */ +	if (a5xx_gpu->shadow_bo) {  		gpu_write64(gpu, REG_A5XX_CP_RB_RPTR_ADDR,  			    shadowptr(a5xx_gpu, gpu->rb[0])); -	} else if (gpu->nr_rings > 1) { -		/* Disable preemption if WHERE_AM_I isn't available */ -		a5xx_preempt_fini(gpu); -		gpu->nr_rings = 1;  	}  	a5xx_preempt_hw_init(gpu); @@ -1099,14 +1096,19 @@ bool a5xx_idle(struct msm_gpu *gpu, struct msm_ringbuffer *ring)  static int a5xx_fault_handler(void *arg, unsigned long iova, int flags, void *data)  {  	struct msm_gpu *gpu = arg; -	pr_warn_ratelimited("*** gpu fault: iova=%08lx, flags=%d (%u,%u,%u,%u)\n", -			iova, flags, +	struct adreno_smmu_fault_info *info = data; +	char block[12] = "unknown"; +	u32 scratch[] = {  			gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(4)),  			gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(5)),  			gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(6)), -			gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(7))); +			gpu_read(gpu, REG_A5XX_CP_SCRATCH_REG(7)), +	}; -	return 0; +	if (info) +		snprintf(block, sizeof(block), "%x", info->fsynr1); + +	return adreno_fault_handler(gpu, iova, flags, info, block, scratch);  }  static void a5xx_cp_err_irq(struct msm_gpu *gpu) @@ -1682,6 +1684,7 @@ static const struct adreno_gpu_funcs funcs = {  		.get_param = adreno_get_param,  		.set_param = adreno_set_param,  		.hw_init = a5xx_hw_init, +		.ucode_load = a5xx_ucode_load,  		.pm_suspend = a5xx_pm_suspend,  		.pm_resume = a5xx_pm_resume,  		.recover = a5xx_recover, @@ -1743,6 +1746,7 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)  	struct a5xx_gpu *a5xx_gpu = NULL;  	struct adreno_gpu *adreno_gpu;  	struct msm_gpu *gpu; +	unsigned int nr_rings;  	int ret;  	if (!pdev) { @@ -1763,7 +1767,12 @@ struct msm_gpu *a5xx_gpu_init(struct drm_device *dev)  	check_speed_bin(&pdev->dev); -	ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, 4); +	nr_rings = 4; + +	if (adreno_is_a510(adreno_gpu)) +		nr_rings = 1; + +	ret = adreno_gpu_init(dev, pdev, adreno_gpu, &funcs, nr_rings);  	if (ret) {  		a5xx_destroy(&(a5xx_gpu->base.base));  		return ERR_PTR(ret); diff --git a/drivers/gpu/drm/msm/adreno/a6xx.xml.h b/drivers/gpu/drm/msm/adreno/a6xx.xml.h index a92788019376..4dc3be6ed45d 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx.xml.h +++ b/drivers/gpu/drm/msm/adreno/a6xx.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2022 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2023 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -911,6 +911,7 @@ enum a6xx_ztest_mode {  	A6XX_EARLY_Z = 0,  	A6XX_LATE_Z = 1,  	A6XX_EARLY_LRZ_LATE_Z = 2, +	A6XX_INVALID_ZTEST = 3,  };  enum a6xx_sequenced_thread_dist { @@ -946,6 +947,12 @@ enum a6xx_buffers_location {  	BUFFERS_IN_SYSMEM = 3,  }; +enum a6xx_lrz_dir_status { +	LRZ_DIR_LE = 1, +	LRZ_DIR_GE = 2, +	LRZ_DIR_INVALID = 3, +}; +  enum a6xx_fragcoord_sample_mode {  	FRAGCOORD_CENTER = 0,  	FRAGCOORD_SAMPLE = 3, @@ -978,6 +985,11 @@ enum a6xx_threadsize {  	THREAD128 = 1,  }; +enum a6xx_bindless_descriptor_size { +	BINDLESS_DESCRIPTOR_16B = 1, +	BINDLESS_DESCRIPTOR_64B = 3, +}; +  enum a6xx_isam_mode {  	ISAMMODE_GL = 2,  }; @@ -1030,6 +1042,8 @@ enum a6xx_tex_type {  #define A6XX_RBBM_INT_0_MASK_RBBM_GPU_IDLE			0x00000001  #define A6XX_RBBM_INT_0_MASK_CP_AHB_ERROR			0x00000002 +#define A6XX_RBBM_INT_0_MASK_CP_IPC_INTR_0			0x00000010 +#define A6XX_RBBM_INT_0_MASK_CP_IPC_INTR_1			0x00000020  #define A6XX_RBBM_INT_0_MASK_RBBM_ATB_ASYNCFIFO_OVERFLOW	0x00000040  #define A6XX_RBBM_INT_0_MASK_RBBM_GPC_ERROR			0x00000080  #define A6XX_RBBM_INT_0_MASK_CP_SW				0x00000100 @@ -1040,15 +1054,19 @@ enum a6xx_tex_type {  #define A6XX_RBBM_INT_0_MASK_CP_IB2				0x00002000  #define A6XX_RBBM_INT_0_MASK_CP_IB1				0x00004000  #define A6XX_RBBM_INT_0_MASK_CP_RB				0x00008000 +#define A6XX_RBBM_INT_0_MASK_PM4CPINTERRUPT			0x00008000 +#define A6XX_RBBM_INT_0_MASK_PM4CPINTERRUPTLPAC			0x00010000  #define A6XX_RBBM_INT_0_MASK_CP_RB_DONE_TS			0x00020000  #define A6XX_RBBM_INT_0_MASK_CP_WT_DONE_TS			0x00040000  #define A6XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS			0x00100000 +#define A6XX_RBBM_INT_0_MASK_CP_CACHE_FLUSH_TS_LPAC		0x00200000  #define A6XX_RBBM_INT_0_MASK_RBBM_ATB_BUS_OVERFLOW		0x00400000  #define A6XX_RBBM_INT_0_MASK_RBBM_HANG_DETECT			0x00800000  #define A6XX_RBBM_INT_0_MASK_UCHE_OOB_ACCESS			0x01000000  #define A6XX_RBBM_INT_0_MASK_UCHE_TRAP_INTR			0x02000000  #define A6XX_RBBM_INT_0_MASK_DEBBUS_INTR_0			0x04000000  #define A6XX_RBBM_INT_0_MASK_DEBBUS_INTR_1			0x08000000 +#define A6XX_RBBM_INT_0_MASK_TSBWRITEERROR			0x10000000  #define A6XX_RBBM_INT_0_MASK_ISDB_CPU_IRQ			0x40000000  #define A6XX_RBBM_INT_0_MASK_ISDB_UNDER_DEBUG			0x80000000  #define A6XX_CP_INT_CP_OPCODE_ERROR				0x00000001 @@ -1058,15 +1076,21 @@ enum a6xx_tex_type {  #define A6XX_CP_INT_CP_AHB_ERROR				0x00000020  #define A6XX_CP_INT_CP_VSD_PARITY_ERROR				0x00000040  #define A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR			0x00000080 +#define A6XX_CP_INT_CP_OPCODE_ERROR_LPAC			0x00000100 +#define A6XX_CP_INT_CP_UCODE_ERROR_LPAC				0x00000200 +#define A6XX_CP_INT_CP_HW_FAULT_ERROR_LPAC			0x00000400 +#define A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR_LPAC		0x00000800 +#define A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR_LPAC			0x00001000 +#define A6XX_CP_INT_CP_OPCODE_ERROR_BV				0x00002000 +#define A6XX_CP_INT_CP_UCODE_ERROR_BV				0x00004000 +#define A6XX_CP_INT_CP_HW_FAULT_ERROR_BV			0x00008000 +#define A6XX_CP_INT_CP_REGISTER_PROTECTION_ERROR_BV		0x00010000 +#define A6XX_CP_INT_CP_ILLEGAL_INSTR_ERROR_BV			0x00020000  #define REG_A6XX_CP_RB_BASE					0x00000800 -#define REG_A6XX_CP_RB_BASE_HI					0x00000801 -  #define REG_A6XX_CP_RB_CNTL					0x00000802 -#define REG_A6XX_CP_RB_RPTR_ADDR_LO				0x00000804 - -#define REG_A6XX_CP_RB_RPTR_ADDR_HI				0x00000805 +#define REG_A6XX_CP_RB_RPTR_ADDR				0x00000804  #define REG_A6XX_CP_RB_RPTR					0x00000806 @@ -1083,26 +1107,28 @@ enum a6xx_tex_type {  #define REG_A6XX_CP_PROTECT_STATUS				0x00000824 +#define REG_A6XX_CP_STATUS_1					0x00000825 +  #define REG_A6XX_CP_SQE_INSTR_BASE				0x00000830  #define REG_A6XX_CP_MISC_CNTL					0x00000840 -#define REG_A6XX_CP_CHICKEN_DBG					0x00000841 -  #define REG_A6XX_CP_APRIV_CNTL					0x00000844 +#define REG_A6XX_CP_PREEMPT_THRESHOLD				0x000008c0 +  #define REG_A6XX_CP_ROQ_THRESHOLDS_1				0x000008c1 -#define A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__MASK			0x000000ff -#define A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__SHIFT			0 -static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_RB_LO(uint32_t val) +#define A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__MASK		0x000000ff +#define A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__SHIFT		0 +static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_MRB_START(uint32_t val)  { -	return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_RB_LO__MASK; +	return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_MRB_START__MASK;  } -#define A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__MASK			0x0000ff00 -#define A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__SHIFT			8 -static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_RB_HI(uint32_t val) +#define A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__MASK		0x0000ff00 +#define A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__SHIFT		8 +static inline uint32_t A6XX_CP_ROQ_THRESHOLDS_1_VSD_START(uint32_t val)  { -	return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_RB_HI__MASK; +	return ((val >> 2) << A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__SHIFT) & A6XX_CP_ROQ_THRESHOLDS_1_VSD_START__MASK;  }  #define A6XX_CP_ROQ_THRESHOLDS_1_IB1_START__MASK		0x00ff0000  #define A6XX_CP_ROQ_THRESHOLDS_1_IB1_START__SHIFT		16 @@ -1164,27 +1190,21 @@ static inline uint32_t A6XX_CP_PROTECT_REG_MASK_LEN(uint32_t val)  #define REG_A6XX_CP_CONTEXT_SWITCH_CNTL				0x000008a0 -#define REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO_LO			0x000008a1 - -#define REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO_HI			0x000008a2 +#define REG_A6XX_CP_CONTEXT_SWITCH_SMMU_INFO			0x000008a1 -#define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_LO	0x000008a3 +#define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR	0x000008a3 -#define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_NON_SECURE_RESTORE_ADDR_HI	0x000008a4 +#define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR	0x000008a5 -#define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_LO	0x000008a5 +#define REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR	0x000008a7 -#define REG_A6XX_CP_CONTEXT_SWITCH_PRIV_SECURE_RESTORE_ADDR_HI	0x000008a6 - -#define REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_LO	0x000008a7 - -#define REG_A6XX_CP_CONTEXT_SWITCH_NON_PRIV_RESTORE_ADDR_HI	0x000008a8 +#define REG_A7XX_CP_CONTEXT_SWITCH_LEVEL_STATUS			0x000008ab  static inline uint32_t REG_A6XX_CP_PERFCTR_CP_SEL(uint32_t i0) { return 0x000008d0 + 0x1*i0; } -#define REG_A6XX_CP_CRASH_SCRIPT_BASE_LO			0x00000900 +static inline uint32_t REG_A7XX_CP_BV_PERFCTR_CP_SEL(uint32_t i0) { return 0x000008e0 + 0x1*i0; } -#define REG_A6XX_CP_CRASH_SCRIPT_BASE_HI			0x00000901 +#define REG_A6XX_CP_CRASH_SCRIPT_BASE				0x00000900  #define REG_A6XX_CP_CRASH_DUMP_CNTL				0x00000902 @@ -1212,63 +1232,165 @@ static inline uint32_t REG_A6XX_CP_PERFCTR_CP_SEL(uint32_t i0) { return 0x000008  #define REG_A6XX_CP_IB1_BASE					0x00000928 -#define REG_A6XX_CP_IB1_BASE_HI					0x00000929 -  #define REG_A6XX_CP_IB1_REM_SIZE				0x0000092a  #define REG_A6XX_CP_IB2_BASE					0x0000092b -#define REG_A6XX_CP_IB2_BASE_HI					0x0000092c -  #define REG_A6XX_CP_IB2_REM_SIZE				0x0000092d  #define REG_A6XX_CP_SDS_BASE					0x0000092e -#define REG_A6XX_CP_SDS_BASE_HI					0x0000092f -  #define REG_A6XX_CP_SDS_REM_SIZE				0x00000930  #define REG_A6XX_CP_MRB_BASE					0x00000931 -#define REG_A6XX_CP_MRB_BASE_HI					0x00000932 -  #define REG_A6XX_CP_MRB_REM_SIZE				0x00000933  #define REG_A6XX_CP_VSD_BASE					0x00000934 -#define REG_A6XX_CP_VSD_BASE_HI					0x00000935 +#define REG_A6XX_CP_ROQ_RB_STAT					0x00000939 +#define A6XX_CP_ROQ_RB_STAT_RPTR__MASK				0x000003ff +#define A6XX_CP_ROQ_RB_STAT_RPTR__SHIFT				0 +static inline uint32_t A6XX_CP_ROQ_RB_STAT_RPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_RB_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_RB_STAT_RPTR__MASK; +} +#define A6XX_CP_ROQ_RB_STAT_WPTR__MASK				0x03ff0000 +#define A6XX_CP_ROQ_RB_STAT_WPTR__SHIFT				16 +static inline uint32_t A6XX_CP_ROQ_RB_STAT_WPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_RB_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_RB_STAT_WPTR__MASK; +} + +#define REG_A6XX_CP_ROQ_IB1_STAT				0x0000093a +#define A6XX_CP_ROQ_IB1_STAT_RPTR__MASK				0x000003ff +#define A6XX_CP_ROQ_IB1_STAT_RPTR__SHIFT			0 +static inline uint32_t A6XX_CP_ROQ_IB1_STAT_RPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_IB1_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_IB1_STAT_RPTR__MASK; +} +#define A6XX_CP_ROQ_IB1_STAT_WPTR__MASK				0x03ff0000 +#define A6XX_CP_ROQ_IB1_STAT_WPTR__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_IB1_STAT_WPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_IB1_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_IB1_STAT_WPTR__MASK; +} + +#define REG_A6XX_CP_ROQ_IB2_STAT				0x0000093b +#define A6XX_CP_ROQ_IB2_STAT_RPTR__MASK				0x000003ff +#define A6XX_CP_ROQ_IB2_STAT_RPTR__SHIFT			0 +static inline uint32_t A6XX_CP_ROQ_IB2_STAT_RPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_IB2_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_IB2_STAT_RPTR__MASK; +} +#define A6XX_CP_ROQ_IB2_STAT_WPTR__MASK				0x03ff0000 +#define A6XX_CP_ROQ_IB2_STAT_WPTR__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_IB2_STAT_WPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_IB2_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_IB2_STAT_WPTR__MASK; +} + +#define REG_A6XX_CP_ROQ_SDS_STAT				0x0000093c +#define A6XX_CP_ROQ_SDS_STAT_RPTR__MASK				0x000003ff +#define A6XX_CP_ROQ_SDS_STAT_RPTR__SHIFT			0 +static inline uint32_t A6XX_CP_ROQ_SDS_STAT_RPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_SDS_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_SDS_STAT_RPTR__MASK; +} +#define A6XX_CP_ROQ_SDS_STAT_WPTR__MASK				0x03ff0000 +#define A6XX_CP_ROQ_SDS_STAT_WPTR__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_SDS_STAT_WPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_SDS_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_SDS_STAT_WPTR__MASK; +} + +#define REG_A6XX_CP_ROQ_MRB_STAT				0x0000093d +#define A6XX_CP_ROQ_MRB_STAT_RPTR__MASK				0x000003ff +#define A6XX_CP_ROQ_MRB_STAT_RPTR__SHIFT			0 +static inline uint32_t A6XX_CP_ROQ_MRB_STAT_RPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_MRB_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_MRB_STAT_RPTR__MASK; +} +#define A6XX_CP_ROQ_MRB_STAT_WPTR__MASK				0x03ff0000 +#define A6XX_CP_ROQ_MRB_STAT_WPTR__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_MRB_STAT_WPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_MRB_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_MRB_STAT_WPTR__MASK; +} + +#define REG_A6XX_CP_ROQ_VSD_STAT				0x0000093e +#define A6XX_CP_ROQ_VSD_STAT_RPTR__MASK				0x000003ff +#define A6XX_CP_ROQ_VSD_STAT_RPTR__SHIFT			0 +static inline uint32_t A6XX_CP_ROQ_VSD_STAT_RPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_VSD_STAT_RPTR__SHIFT) & A6XX_CP_ROQ_VSD_STAT_RPTR__MASK; +} +#define A6XX_CP_ROQ_VSD_STAT_WPTR__MASK				0x03ff0000 +#define A6XX_CP_ROQ_VSD_STAT_WPTR__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_VSD_STAT_WPTR(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_VSD_STAT_WPTR__SHIFT) & A6XX_CP_ROQ_VSD_STAT_WPTR__MASK; +} + +#define REG_A6XX_CP_IB1_DWORDS					0x00000943 + +#define REG_A6XX_CP_IB2_DWORDS					0x00000944 + +#define REG_A6XX_CP_SDS_DWORDS					0x00000945  #define REG_A6XX_CP_MRB_DWORDS					0x00000946  #define REG_A6XX_CP_VSD_DWORDS					0x00000947 -#define REG_A6XX_CP_CSQ_IB1_STAT				0x00000949 -#define A6XX_CP_CSQ_IB1_STAT_REM__MASK				0xffff0000 -#define A6XX_CP_CSQ_IB1_STAT_REM__SHIFT				16 -static inline uint32_t A6XX_CP_CSQ_IB1_STAT_REM(uint32_t val) +#define REG_A6XX_CP_ROQ_AVAIL_RB				0x00000948 +#define A6XX_CP_ROQ_AVAIL_RB_REM__MASK				0xffff0000 +#define A6XX_CP_ROQ_AVAIL_RB_REM__SHIFT				16 +static inline uint32_t A6XX_CP_ROQ_AVAIL_RB_REM(uint32_t val)  { -	return ((val) << A6XX_CP_CSQ_IB1_STAT_REM__SHIFT) & A6XX_CP_CSQ_IB1_STAT_REM__MASK; +	return ((val) << A6XX_CP_ROQ_AVAIL_RB_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_RB_REM__MASK;  } -#define REG_A6XX_CP_CSQ_IB2_STAT				0x0000094a -#define A6XX_CP_CSQ_IB2_STAT_REM__MASK				0xffff0000 -#define A6XX_CP_CSQ_IB2_STAT_REM__SHIFT				16 -static inline uint32_t A6XX_CP_CSQ_IB2_STAT_REM(uint32_t val) +#define REG_A6XX_CP_ROQ_AVAIL_IB1				0x00000949 +#define A6XX_CP_ROQ_AVAIL_IB1_REM__MASK				0xffff0000 +#define A6XX_CP_ROQ_AVAIL_IB1_REM__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_AVAIL_IB1_REM(uint32_t val)  { -	return ((val) << A6XX_CP_CSQ_IB2_STAT_REM__SHIFT) & A6XX_CP_CSQ_IB2_STAT_REM__MASK; +	return ((val) << A6XX_CP_ROQ_AVAIL_IB1_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_IB1_REM__MASK;  } -#define REG_A6XX_CP_MRQ_MRB_STAT				0x0000094c -#define A6XX_CP_MRQ_MRB_STAT_REM__MASK				0xffff0000 -#define A6XX_CP_MRQ_MRB_STAT_REM__SHIFT				16 -static inline uint32_t A6XX_CP_MRQ_MRB_STAT_REM(uint32_t val) +#define REG_A6XX_CP_ROQ_AVAIL_IB2				0x0000094a +#define A6XX_CP_ROQ_AVAIL_IB2_REM__MASK				0xffff0000 +#define A6XX_CP_ROQ_AVAIL_IB2_REM__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_AVAIL_IB2_REM(uint32_t val)  { -	return ((val) << A6XX_CP_MRQ_MRB_STAT_REM__SHIFT) & A6XX_CP_MRQ_MRB_STAT_REM__MASK; +	return ((val) << A6XX_CP_ROQ_AVAIL_IB2_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_IB2_REM__MASK;  } -#define REG_A6XX_CP_ALWAYS_ON_COUNTER_LO			0x00000980 +#define REG_A6XX_CP_ROQ_AVAIL_SDS				0x0000094b +#define A6XX_CP_ROQ_AVAIL_SDS_REM__MASK				0xffff0000 +#define A6XX_CP_ROQ_AVAIL_SDS_REM__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_AVAIL_SDS_REM(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_AVAIL_SDS_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_SDS_REM__MASK; +} -#define REG_A6XX_CP_ALWAYS_ON_COUNTER_HI			0x00000981 +#define REG_A6XX_CP_ROQ_AVAIL_MRB				0x0000094c +#define A6XX_CP_ROQ_AVAIL_MRB_REM__MASK				0xffff0000 +#define A6XX_CP_ROQ_AVAIL_MRB_REM__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_AVAIL_MRB_REM(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_AVAIL_MRB_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_MRB_REM__MASK; +} + +#define REG_A6XX_CP_ROQ_AVAIL_VSD				0x0000094d +#define A6XX_CP_ROQ_AVAIL_VSD_REM__MASK				0xffff0000 +#define A6XX_CP_ROQ_AVAIL_VSD_REM__SHIFT			16 +static inline uint32_t A6XX_CP_ROQ_AVAIL_VSD_REM(uint32_t val) +{ +	return ((val) << A6XX_CP_ROQ_AVAIL_VSD_REM__SHIFT) & A6XX_CP_ROQ_AVAIL_VSD_REM__MASK; +} + +#define REG_A6XX_CP_ALWAYS_ON_COUNTER				0x00000980  #define REG_A6XX_CP_AHB_CNTL					0x0000098d @@ -1276,12 +1398,70 @@ static inline uint32_t A6XX_CP_MRQ_MRB_STAT_REM(uint32_t val)  #define REG_A6XX_CP_APERTURE_CNTL_CD				0x00000a03 +#define REG_A7XX_CP_BV_PROTECT_STATUS				0x00000a61 + +#define REG_A7XX_CP_BV_HW_FAULT					0x00000a64 + +#define REG_A7XX_CP_BV_DRAW_STATE_ADDR				0x00000a81 + +#define REG_A7XX_CP_BV_DRAW_STATE_DATA				0x00000a82 + +#define REG_A7XX_CP_BV_ROQ_DBG_ADDR				0x00000a83 + +#define REG_A7XX_CP_BV_ROQ_DBG_DATA				0x00000a84 + +#define REG_A7XX_CP_BV_SQE_UCODE_DBG_ADDR			0x00000a85 + +#define REG_A7XX_CP_BV_SQE_UCODE_DBG_DATA			0x00000a86 + +#define REG_A7XX_CP_BV_SQE_STAT_ADDR				0x00000a87 + +#define REG_A7XX_CP_BV_SQE_STAT_DATA				0x00000a88 + +#define REG_A7XX_CP_BV_MEM_POOL_DBG_ADDR			0x00000a96 + +#define REG_A7XX_CP_BV_MEM_POOL_DBG_DATA			0x00000a97 + +#define REG_A7XX_CP_BV_RB_RPTR_ADDR				0x00000a98 + +#define REG_A7XX_CP_RESOURCE_TBL_DBG_ADDR			0x00000a9a + +#define REG_A7XX_CP_RESOURCE_TBL_DBG_DATA			0x00000a9b + +#define REG_A7XX_CP_BV_APRIV_CNTL				0x00000ad0 + +#define REG_A7XX_CP_BV_CHICKEN_DBG				0x00000ada + +#define REG_A7XX_CP_LPAC_DRAW_STATE_ADDR			0x00000b0a + +#define REG_A7XX_CP_LPAC_DRAW_STATE_DATA			0x00000b0b + +#define REG_A7XX_CP_LPAC_ROQ_DBG_ADDR				0x00000b0c + +#define REG_A7XX_CP_SQE_AC_UCODE_DBG_ADDR			0x00000b27 + +#define REG_A7XX_CP_SQE_AC_UCODE_DBG_DATA			0x00000b28 + +#define REG_A7XX_CP_SQE_AC_STAT_ADDR				0x00000b29 + +#define REG_A7XX_CP_SQE_AC_STAT_DATA				0x00000b2a + +#define REG_A7XX_CP_LPAC_APRIV_CNTL				0x00000b31 +  #define REG_A6XX_CP_LPAC_PROG_FIFO_SIZE				0x00000b34 +#define REG_A7XX_CP_LPAC_ROQ_DBG_DATA				0x00000b35 + +#define REG_A7XX_CP_LPAC_FIFO_DBG_DATA				0x00000b36 + +#define REG_A7XX_CP_LPAC_FIFO_DBG_ADDR				0x00000b40 +  #define REG_A6XX_CP_LPAC_SQE_INSTR_BASE				0x00000b82  #define REG_A6XX_VSC_ADDR_MODE_CNTL				0x00000c01 +#define REG_A6XX_RBBM_GPR0_CNTL					0x00000018 +  #define REG_A6XX_RBBM_INT_0_STATUS				0x00000201  #define REG_A6XX_RBBM_STATUS					0x00000210 @@ -1310,11 +1490,27 @@ static inline uint32_t A6XX_CP_MRQ_MRB_STAT_REM(uint32_t val)  #define A6XX_RBBM_STATUS_CP_AHB_BUSY_CP_MASTER			0x00000002  #define A6XX_RBBM_STATUS_CP_AHB_BUSY_CX_MASTER			0x00000001 +#define REG_A6XX_RBBM_STATUS1					0x00000211 + +#define REG_A6XX_RBBM_STATUS2					0x00000212 +  #define REG_A6XX_RBBM_STATUS3					0x00000213  #define A6XX_RBBM_STATUS3_SMMU_STALLED_ON_FAULT			0x01000000  #define REG_A6XX_RBBM_VBIF_GX_RESET_STATUS			0x00000215 +#define REG_A7XX_RBBM_CLOCK_MODE_CP				0x00000260 + +#define REG_A7XX_RBBM_CLOCK_MODE_BV_LRZ				0x00000284 + +#define REG_A7XX_RBBM_CLOCK_MODE_BV_GRAS			0x00000285 + +#define REG_A7XX_RBBM_CLOCK_MODE2_GRAS				0x00000286 + +#define REG_A7XX_RBBM_CLOCK_MODE_BV_VFD				0x00000287 + +#define REG_A7XX_RBBM_CLOCK_MODE_BV_GPC				0x00000288 +  static inline uint32_t REG_A6XX_RBBM_PERFCTR_CP(uint32_t i0) { return 0x00000400 + 0x2*i0; }  static inline uint32_t REG_A6XX_RBBM_PERFCTR_RBBM(uint32_t i0) { return 0x0000041c + 0x2*i0; } @@ -1347,6 +1543,62 @@ static inline uint32_t REG_A6XX_RBBM_PERFCTR_LRZ(uint32_t i0) { return 0x000004e  static inline uint32_t REG_A6XX_RBBM_PERFCTR_CMP(uint32_t i0) { return 0x000004f2 + 0x2*i0; } +static inline uint32_t REG_A7XX_RBBM_PERFCTR_CP(uint32_t i0) { return 0x00000300 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_RBBM(uint32_t i0) { return 0x0000031c + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_PC(uint32_t i0) { return 0x00000324 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_VFD(uint32_t i0) { return 0x00000334 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_HLSQ(uint32_t i0) { return 0x00000344 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_VPC(uint32_t i0) { return 0x00000350 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_CCU(uint32_t i0) { return 0x0000035c + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_TSE(uint32_t i0) { return 0x00000366 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_RAS(uint32_t i0) { return 0x0000036e + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_UCHE(uint32_t i0) { return 0x00000376 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_TP(uint32_t i0) { return 0x0000038e + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_SP(uint32_t i0) { return 0x000003a6 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_RB(uint32_t i0) { return 0x000003d6 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_VSC(uint32_t i0) { return 0x000003e6 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_LRZ(uint32_t i0) { return 0x000003ea + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_CMP(uint32_t i0) { return 0x000003f2 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_UFC(uint32_t i0) { return 0x000003fa + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR2_HLSQ(uint32_t i0) { return 0x00000410 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR2_CP(uint32_t i0) { return 0x0000041c + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR2_SP(uint32_t i0) { return 0x0000042a + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR2_TP(uint32_t i0) { return 0x00000442 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR2_UFC(uint32_t i0) { return 0x0000044e + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_PC(uint32_t i0) { return 0x00000460 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_VFD(uint32_t i0) { return 0x00000470 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_VPC(uint32_t i0) { return 0x00000480 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_TSE(uint32_t i0) { return 0x0000048c + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_RAS(uint32_t i0) { return 0x00000494 + 0x2*i0; } + +static inline uint32_t REG_A7XX_RBBM_PERFCTR_BV_LRZ(uint32_t i0) { return 0x0000049c + 0x2*i0; } +  #define REG_A6XX_RBBM_PERFCTR_CNTL				0x00000500  #define REG_A6XX_RBBM_PERFCTR_LOAD_CMD0				0x00000501 @@ -1371,6 +1623,10 @@ static inline uint32_t REG_A6XX_RBBM_PERFCTR_RBBM_SEL(uint32_t i0) { return 0x00  #define REG_A6XX_RBBM_ISDB_CNT					0x00000533 +#define REG_A7XX_RBBM_NC_MODE_CNTL				0x00000534 + +#define REG_A7XX_RBBM_SNAPSHOT_STATUS				0x00000535 +  #define REG_A6XX_RBBM_PRIMCTR_0_LO				0x00000540  #define REG_A6XX_RBBM_PRIMCTR_0_HI				0x00000541 @@ -1417,9 +1673,7 @@ static inline uint32_t REG_A6XX_RBBM_PERFCTR_RBBM_SEL(uint32_t i0) { return 0x00  #define REG_A6XX_RBBM_SECVID_TRUST_CNTL				0x0000f400 -#define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE_LO		0x0000f800 - -#define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE_HI		0x0000f801 +#define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE			0x0000f800  #define REG_A6XX_RBBM_SECVID_TSB_TRUSTED_SIZE			0x0000f802 @@ -1427,6 +1681,8 @@ static inline uint32_t REG_A6XX_RBBM_PERFCTR_RBBM_SEL(uint32_t i0) { return 0x00  #define REG_A6XX_RBBM_SECVID_TSB_ADDR_MODE_CNTL			0x0000f810 +#define REG_A7XX_RBBM_SECVID_TSB_STATUS				0x0000fc00 +  #define REG_A6XX_RBBM_VBIF_CLIENT_QOS_CNTL			0x00000010  #define REG_A6XX_RBBM_GBIF_CLIENT_QOS_CNTL			0x00000011 @@ -1438,12 +1694,18 @@ static inline uint32_t REG_A6XX_RBBM_PERFCTR_RBBM_SEL(uint32_t i0) { return 0x00  #define REG_A6XX_RBBM_WAIT_FOR_GPU_IDLE_CMD			0x0000001c  #define A6XX_RBBM_WAIT_FOR_GPU_IDLE_CMD_WAIT_GPU_IDLE		0x00000001 +#define REG_A7XX_RBBM_GBIF_HALT					0x00000016 + +#define REG_A7XX_RBBM_GBIF_HALT_ACK				0x00000017 +  #define REG_A6XX_RBBM_INTERFACE_HANG_INT_CNTL			0x0000001f  #define REG_A6XX_RBBM_INT_CLEAR_CMD				0x00000037  #define REG_A6XX_RBBM_INT_0_MASK				0x00000038 +#define REG_A7XX_RBBM_INT_2_MASK				0x0000003a +  #define REG_A6XX_RBBM_SP_HYST_CNT				0x00000042  #define REG_A6XX_RBBM_SW_RESET_CMD				0x00000043 @@ -1674,6 +1936,8 @@ static inline uint32_t REG_A6XX_RBBM_PERFCTR_RBBM_SEL(uint32_t i0) { return 0x00  #define REG_A6XX_RBBM_CLOCK_HYST_TEX_FCHE			0x00000122 +#define REG_A6XX_RBBM_LPAC_GBIF_CLIENT_QOS_CNTL			0x000005ff +  #define REG_A6XX_DBGC_CFG_DBGBUS_SEL_A				0x00000600  #define REG_A6XX_DBGC_CFG_DBGBUS_SEL_B				0x00000601 @@ -1852,25 +2116,15 @@ static inline uint32_t REG_A6XX_VSC_PERFCTR_VSC_SEL(uint32_t i0) { return 0x0000  #define REG_A6XX_UCHE_MODE_CNTL					0x00000e01 -#define REG_A6XX_UCHE_WRITE_RANGE_MAX_LO			0x00000e05 - -#define REG_A6XX_UCHE_WRITE_RANGE_MAX_HI			0x00000e06 - -#define REG_A6XX_UCHE_WRITE_THRU_BASE_LO			0x00000e07 +#define REG_A6XX_UCHE_WRITE_RANGE_MAX				0x00000e05 -#define REG_A6XX_UCHE_WRITE_THRU_BASE_HI			0x00000e08 +#define REG_A6XX_UCHE_WRITE_THRU_BASE				0x00000e07 -#define REG_A6XX_UCHE_TRAP_BASE_LO				0x00000e09 +#define REG_A6XX_UCHE_TRAP_BASE					0x00000e09 -#define REG_A6XX_UCHE_TRAP_BASE_HI				0x00000e0a +#define REG_A6XX_UCHE_GMEM_RANGE_MIN				0x00000e0b -#define REG_A6XX_UCHE_GMEM_RANGE_MIN_LO				0x00000e0b - -#define REG_A6XX_UCHE_GMEM_RANGE_MIN_HI				0x00000e0c - -#define REG_A6XX_UCHE_GMEM_RANGE_MAX_LO				0x00000e0d - -#define REG_A6XX_UCHE_GMEM_RANGE_MAX_HI				0x00000e0e +#define REG_A6XX_UCHE_GMEM_RANGE_MAX				0x00000e0d  #define REG_A6XX_UCHE_CACHE_WAYS				0x00000e17 @@ -1886,6 +2140,8 @@ static inline uint32_t A6XX_UCHE_CLIENT_PF_PERFSEL(uint32_t val)  static inline uint32_t REG_A6XX_UCHE_PERFCTR_UCHE_SEL(uint32_t i0) { return 0x00000e1c + 0x1*i0; } +#define REG_A6XX_UCHE_GBIF_GX_CONFIG				0x00000e3a +  #define REG_A6XX_UCHE_CMDQ_CONFIG				0x00000e3c  #define REG_A6XX_VBIF_VERSION					0x00003000 @@ -1983,6 +2239,8 @@ static inline uint32_t A6XX_VBIF_TEST_BUS2_CTRL1_DATA_SEL(uint32_t val)  #define REG_A6XX_GBIF_PERF_PWR_CNT_EN				0x00003cc0 +#define REG_A6XX_GBIF_PERF_PWR_CNT_CLR				0x00003cc1 +  #define REG_A6XX_GBIF_PERF_CNT_SEL				0x00003cc2  #define REG_A6XX_GBIF_PERF_PWR_CNT_SEL				0x00003cc3 @@ -2105,7 +2363,7 @@ static inline uint32_t REG_A6XX_VSC_DRAW_STRM_SIZE_REG(uint32_t i0) { return 0x0  #define A6XX_GRAS_CL_CNTL_CLIP_DISABLE				0x00000001  #define A6XX_GRAS_CL_CNTL_ZNEAR_CLIP_DISABLE			0x00000002  #define A6XX_GRAS_CL_CNTL_ZFAR_CLIP_DISABLE			0x00000004 -#define A6XX_GRAS_CL_CNTL_UNK5					0x00000020 +#define A6XX_GRAS_CL_CNTL_Z_CLAMP_ENABLE			0x00000020  #define A6XX_GRAS_CL_CNTL_ZERO_GB_SCALE_Z			0x00000040  #define A6XX_GRAS_CL_CNTL_VP_CLIP_CODE_IGNORE			0x00000080  #define A6XX_GRAS_CL_CNTL_VP_XFORM_DISABLE			0x00000100 @@ -2420,11 +2678,12 @@ static inline uint32_t A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION(enum a6xx  {  	return ((val) << A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION__SHIFT) & A6XX_GRAS_SC_CNTL_SEQUENCED_THREAD_DISTRIBUTION__MASK;  } -#define A6XX_GRAS_SC_CNTL_UNK9__MASK				0x00000e00 -#define A6XX_GRAS_SC_CNTL_UNK9__SHIFT				9 -static inline uint32_t A6XX_GRAS_SC_CNTL_UNK9(uint32_t val) +#define A6XX_GRAS_SC_CNTL_UNK9					0x00000200 +#define A6XX_GRAS_SC_CNTL_ROTATION__MASK			0x00000c00 +#define A6XX_GRAS_SC_CNTL_ROTATION__SHIFT			10 +static inline uint32_t A6XX_GRAS_SC_CNTL_ROTATION(uint32_t val)  { -	return ((val) << A6XX_GRAS_SC_CNTL_UNK9__SHIFT) & A6XX_GRAS_SC_CNTL_UNK9__MASK; +	return ((val) << A6XX_GRAS_SC_CNTL_ROTATION__SHIFT) & A6XX_GRAS_SC_CNTL_ROTATION__MASK;  }  #define A6XX_GRAS_SC_CNTL_EARLYVIZOUTEN				0x00001000 @@ -2697,12 +2956,14 @@ static inline uint32_t A6XX_GRAS_SC_WINDOW_SCISSOR_BR_Y(uint32_t val)  #define A6XX_GRAS_LRZ_CNTL_FC_ENABLE				0x00000008  #define A6XX_GRAS_LRZ_CNTL_Z_TEST_ENABLE			0x00000010  #define A6XX_GRAS_LRZ_CNTL_Z_BOUNDS_ENABLE			0x00000020 -#define A6XX_GRAS_LRZ_CNTL_UNK6__MASK				0x000003c0 -#define A6XX_GRAS_LRZ_CNTL_UNK6__SHIFT				6 -static inline uint32_t A6XX_GRAS_LRZ_CNTL_UNK6(uint32_t val) +#define A6XX_GRAS_LRZ_CNTL_DIR__MASK				0x000000c0 +#define A6XX_GRAS_LRZ_CNTL_DIR__SHIFT				6 +static inline uint32_t A6XX_GRAS_LRZ_CNTL_DIR(enum a6xx_lrz_dir_status val)  { -	return ((val) << A6XX_GRAS_LRZ_CNTL_UNK6__SHIFT) & A6XX_GRAS_LRZ_CNTL_UNK6__MASK; +	return ((val) << A6XX_GRAS_LRZ_CNTL_DIR__SHIFT) & A6XX_GRAS_LRZ_CNTL_DIR__MASK;  } +#define A6XX_GRAS_LRZ_CNTL_DIR_WRITE				0x00000100 +#define A6XX_GRAS_LRZ_CNTL_DISABLE_ON_WRONG_DIR			0x00000200  #define REG_A6XX_GRAS_LRZ_PS_INPUT_CNTL				0x00008101  #define A6XX_GRAS_LRZ_PS_INPUT_CNTL_SAMPLEID			0x00000001 @@ -2754,24 +3015,24 @@ static inline uint32_t A6XX_GRAS_LRZ_FAST_CLEAR_BUFFER_BASE(uint32_t val)  #define REG_A6XX_GRAS_SAMPLE_CNTL				0x00008109  #define A6XX_GRAS_SAMPLE_CNTL_PER_SAMP_MODE			0x00000001 -#define REG_A6XX_GRAS_UNKNOWN_810A				0x0000810a -#define A6XX_GRAS_UNKNOWN_810A_UNK0__MASK			0x000007ff -#define A6XX_GRAS_UNKNOWN_810A_UNK0__SHIFT			0 -static inline uint32_t A6XX_GRAS_UNKNOWN_810A_UNK0(uint32_t val) +#define REG_A6XX_GRAS_LRZ_DEPTH_VIEW				0x0000810a +#define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__MASK		0x000007ff +#define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__SHIFT		0 +static inline uint32_t A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER(uint32_t val)  { -	return ((val) << A6XX_GRAS_UNKNOWN_810A_UNK0__SHIFT) & A6XX_GRAS_UNKNOWN_810A_UNK0__MASK; +	return ((val) << A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__SHIFT) & A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_LAYER__MASK;  } -#define A6XX_GRAS_UNKNOWN_810A_UNK16__MASK			0x07ff0000 -#define A6XX_GRAS_UNKNOWN_810A_UNK16__SHIFT			16 -static inline uint32_t A6XX_GRAS_UNKNOWN_810A_UNK16(uint32_t val) +#define A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__MASK		0x07ff0000 +#define A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__SHIFT		16 +static inline uint32_t A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT(uint32_t val)  { -	return ((val) << A6XX_GRAS_UNKNOWN_810A_UNK16__SHIFT) & A6XX_GRAS_UNKNOWN_810A_UNK16__MASK; +	return ((val) << A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__SHIFT) & A6XX_GRAS_LRZ_DEPTH_VIEW_LAYER_COUNT__MASK;  } -#define A6XX_GRAS_UNKNOWN_810A_UNK28__MASK			0xf0000000 -#define A6XX_GRAS_UNKNOWN_810A_UNK28__SHIFT			28 -static inline uint32_t A6XX_GRAS_UNKNOWN_810A_UNK28(uint32_t val) +#define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__MASK		0xf0000000 +#define A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__SHIFT		28 +static inline uint32_t A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL(uint32_t val)  { -	return ((val) << A6XX_GRAS_UNKNOWN_810A_UNK28__SHIFT) & A6XX_GRAS_UNKNOWN_810A_UNK28__MASK; +	return ((val) << A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__SHIFT) & A6XX_GRAS_LRZ_DEPTH_VIEW_BASE_MIP_LEVEL__MASK;  }  #define REG_A6XX_GRAS_UNKNOWN_8110				0x00008110 @@ -2900,6 +3161,8 @@ static inline uint32_t A6XX_GRAS_2D_RESOLVE_CNTL_2_Y(uint32_t val)  #define REG_A6XX_GRAS_ADDR_MODE_CNTL				0x00008601 +#define REG_A7XX_GRAS_NC_MODE_CNTL				0x00008602 +  static inline uint32_t REG_A6XX_GRAS_PERFCTR_TSE_SEL(uint32_t i0) { return 0x00008610 + 0x1*i0; }  static inline uint32_t REG_A6XX_GRAS_PERFCTR_RAS_SEL(uint32_t i0) { return 0x00008614 + 0x1*i0; } @@ -3126,7 +3389,7 @@ static inline uint32_t A6XX_RB_RENDER_CONTROL0_COORD_MASK(uint32_t val)  #define REG_A6XX_RB_RENDER_CONTROL1				0x0000880a  #define A6XX_RB_RENDER_CONTROL1_SAMPLEMASK			0x00000001 -#define A6XX_RB_RENDER_CONTROL1_UNK1				0x00000002 +#define A6XX_RB_RENDER_CONTROL1_POSTDEPTHCOVERAGE		0x00000002  #define A6XX_RB_RENDER_CONTROL1_FACENESS			0x00000004  #define A6XX_RB_RENDER_CONTROL1_SAMPLEID			0x00000008  #define A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE__MASK	0x00000030 @@ -3135,7 +3398,7 @@ static inline uint32_t A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE(enum a6xx_fra  {  	return ((val) << A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE__SHIFT) & A6XX_RB_RENDER_CONTROL1_FRAGCOORDSAMPLEMODE__MASK;  } -#define A6XX_RB_RENDER_CONTROL1_SIZE				0x00000040 +#define A6XX_RB_RENDER_CONTROL1_CENTERRHW			0x00000040  #define A6XX_RB_RENDER_CONTROL1_LINELENGTHEN			0x00000080  #define A6XX_RB_RENDER_CONTROL1_FOVEATION			0x00000100 @@ -3691,7 +3954,7 @@ static inline uint32_t A6XX_RB_WINDOW_OFFSET_Y(uint32_t val)  }  #define REG_A6XX_RB_SAMPLE_COUNT_CONTROL			0x00008891 -#define A6XX_RB_SAMPLE_COUNT_CONTROL_UNK0			0x00000001 +#define A6XX_RB_SAMPLE_COUNT_CONTROL_DISABLE			0x00000001  #define A6XX_RB_SAMPLE_COUNT_CONTROL_COPY			0x00000002  #define REG_A6XX_RB_LRZ_CNTL					0x00008898 @@ -3783,12 +4046,12 @@ static inline uint32_t A6XX_RB_WINDOW_OFFSET2_Y(uint32_t val)  	return ((val) << A6XX_RB_WINDOW_OFFSET2_Y__SHIFT) & A6XX_RB_WINDOW_OFFSET2_Y__MASK;  } -#define REG_A6XX_RB_MSAA_CNTL					0x000088d5 -#define A6XX_RB_MSAA_CNTL_SAMPLES__MASK				0x00000018 -#define A6XX_RB_MSAA_CNTL_SAMPLES__SHIFT			3 -static inline uint32_t A6XX_RB_MSAA_CNTL_SAMPLES(enum a3xx_msaa_samples val) +#define REG_A6XX_RB_BLIT_GMEM_MSAA_CNTL				0x000088d5 +#define A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__MASK		0x00000018 +#define A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__SHIFT		3 +static inline uint32_t A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES(enum a3xx_msaa_samples val)  { -	return ((val) << A6XX_RB_MSAA_CNTL_SAMPLES__SHIFT) & A6XX_RB_MSAA_CNTL_SAMPLES__MASK; +	return ((val) << A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__SHIFT) & A6XX_RB_BLIT_GMEM_MSAA_CNTL_SAMPLES__MASK;  }  #define REG_A6XX_RB_BLIT_BASE_GMEM				0x000088d6 @@ -3892,17 +4155,17 @@ static inline uint32_t A6XX_RB_BLIT_INFO_CLEAR_MASK(uint32_t val)  {  	return ((val) << A6XX_RB_BLIT_INFO_CLEAR_MASK__SHIFT) & A6XX_RB_BLIT_INFO_CLEAR_MASK__MASK;  } -#define A6XX_RB_BLIT_INFO_UNK8__MASK				0x00000300 -#define A6XX_RB_BLIT_INFO_UNK8__SHIFT				8 -static inline uint32_t A6XX_RB_BLIT_INFO_UNK8(uint32_t val) +#define A6XX_RB_BLIT_INFO_LAST__MASK				0x00000300 +#define A6XX_RB_BLIT_INFO_LAST__SHIFT				8 +static inline uint32_t A6XX_RB_BLIT_INFO_LAST(uint32_t val)  { -	return ((val) << A6XX_RB_BLIT_INFO_UNK8__SHIFT) & A6XX_RB_BLIT_INFO_UNK8__MASK; +	return ((val) << A6XX_RB_BLIT_INFO_LAST__SHIFT) & A6XX_RB_BLIT_INFO_LAST__MASK;  } -#define A6XX_RB_BLIT_INFO_UNK12__MASK				0x0000f000 -#define A6XX_RB_BLIT_INFO_UNK12__SHIFT				12 -static inline uint32_t A6XX_RB_BLIT_INFO_UNK12(uint32_t val) +#define A6XX_RB_BLIT_INFO_BUFFER_ID__MASK			0x0000f000 +#define A6XX_RB_BLIT_INFO_BUFFER_ID__SHIFT			12 +static inline uint32_t A6XX_RB_BLIT_INFO_BUFFER_ID(uint32_t val)  { -	return ((val) << A6XX_RB_BLIT_INFO_UNK12__SHIFT) & A6XX_RB_BLIT_INFO_UNK12__MASK; +	return ((val) << A6XX_RB_BLIT_INFO_BUFFER_ID__SHIFT) & A6XX_RB_BLIT_INFO_BUFFER_ID__MASK;  }  #define REG_A6XX_RB_UNKNOWN_88F0				0x000088f0 @@ -4173,16 +4436,23 @@ static inline uint32_t A6XX_RB_2D_DST_FLAGS_PLANE_PITCH(uint32_t val)  #define REG_A6XX_RB_UNKNOWN_8E01				0x00008e01 -#define REG_A6XX_RB_UNKNOWN_8E04				0x00008e04 +#define REG_A6XX_RB_DBG_ECO_CNTL				0x00008e04  #define REG_A6XX_RB_ADDR_MODE_CNTL				0x00008e05  #define REG_A6XX_RB_CCU_CNTL					0x00008e07 -#define A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK			0xff800000 -#define A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT			23 -static inline uint32_t A6XX_RB_CCU_CNTL_COLOR_OFFSET(uint32_t val) +#define A6XX_RB_CCU_CNTL_CONCURRENT_RESOLVE			0x00000004 +#define A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__MASK			0x00000080 +#define A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__SHIFT			7 +static inline uint32_t A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI(uint32_t val)  { -	return ((val >> 12) << A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT) & A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK; +	return ((val) << A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__SHIFT) & A6XX_RB_CCU_CNTL_DEPTH_OFFSET_HI__MASK; +} +#define A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__MASK			0x00000200 +#define A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__SHIFT			9 +static inline uint32_t A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI(uint32_t val) +{ +	return ((val) << A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__SHIFT) & A6XX_RB_CCU_CNTL_COLOR_OFFSET_HI__MASK;  }  #define A6XX_RB_CCU_CNTL_DEPTH_OFFSET__MASK			0x001ff000  #define A6XX_RB_CCU_CNTL_DEPTH_OFFSET__SHIFT			12 @@ -4191,7 +4461,12 @@ static inline uint32_t A6XX_RB_CCU_CNTL_DEPTH_OFFSET(uint32_t val)  	return ((val >> 12) << A6XX_RB_CCU_CNTL_DEPTH_OFFSET__SHIFT) & A6XX_RB_CCU_CNTL_DEPTH_OFFSET__MASK;  }  #define A6XX_RB_CCU_CNTL_GMEM					0x00400000 -#define A6XX_RB_CCU_CNTL_UNK2					0x00000004 +#define A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK			0xff800000 +#define A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT			23 +static inline uint32_t A6XX_RB_CCU_CNTL_COLOR_OFFSET(uint32_t val) +{ +	return ((val >> 12) << A6XX_RB_CCU_CNTL_COLOR_OFFSET__SHIFT) & A6XX_RB_CCU_CNTL_COLOR_OFFSET__MASK; +}  #define REG_A6XX_RB_NC_MODE_CNTL				0x00008e08  #define A6XX_RB_NC_MODE_CNTL_MODE				0x00000001 @@ -4225,6 +4500,8 @@ static inline uint32_t REG_A6XX_RB_PERFCTR_CCU_SEL(uint32_t i0) { return 0x00008  static inline uint32_t REG_A6XX_RB_PERFCTR_CMP_SEL(uint32_t i0) { return 0x00008e2c + 0x1*i0; } +static inline uint32_t REG_A7XX_RB_PERFCTR_UFC_SEL(uint32_t i0) { return 0x00008e30 + 0x1*i0; } +  #define REG_A6XX_RB_RB_SUB_BLOCK_SEL_CNTL_HOST			0x00008e3b  #define REG_A6XX_RB_RB_SUB_BLOCK_SEL_CNTL_CD			0x00008e3d @@ -4440,7 +4717,13 @@ static inline uint32_t A6XX_VPC_SO_BUFFER_SIZE(uint32_t val)  	return ((val >> 2) << A6XX_VPC_SO_BUFFER_SIZE__SHIFT) & A6XX_VPC_SO_BUFFER_SIZE__MASK;  } -static inline uint32_t REG_A6XX_VPC_SO_NCOMP(uint32_t i0) { return 0x0000921d + 0x7*i0; } +static inline uint32_t REG_A6XX_VPC_SO_BUFFER_STRIDE(uint32_t i0) { return 0x0000921d + 0x7*i0; } +#define A6XX_VPC_SO_BUFFER_STRIDE__MASK				0x000003ff +#define A6XX_VPC_SO_BUFFER_STRIDE__SHIFT			0 +static inline uint32_t A6XX_VPC_SO_BUFFER_STRIDE(uint32_t val) +{ +	return ((val >> 2) << A6XX_VPC_SO_BUFFER_STRIDE__SHIFT) & A6XX_VPC_SO_BUFFER_STRIDE__MASK; +}  static inline uint32_t REG_A6XX_VPC_SO_BUFFER_OFFSET(uint32_t i0) { return 0x0000921e + 0x7*i0; }  #define A6XX_VPC_SO_BUFFER_OFFSET__MASK				0xfffffffc @@ -4597,7 +4880,7 @@ static inline uint32_t A6XX_VPC_SO_STREAM_CNTL_STREAM_ENABLE(uint32_t val)  #define REG_A6XX_VPC_SO_DISABLE					0x00009306  #define A6XX_VPC_SO_DISABLE_DISABLE				0x00000001 -#define REG_A6XX_VPC_UNKNOWN_9600				0x00009600 +#define REG_A6XX_VPC_DBG_ECO_CNTL				0x00009600  #define REG_A6XX_VPC_ADDR_MODE_CNTL				0x00009601 @@ -4607,6 +4890,8 @@ static inline uint32_t A6XX_VPC_SO_STREAM_CNTL_STREAM_ENABLE(uint32_t val)  static inline uint32_t REG_A6XX_VPC_PERFCTR_VPC_SEL(uint32_t i0) { return 0x00009604 + 0x1*i0; } +static inline uint32_t REG_A7XX_VPC_PERFCTR_VPC_SEL(uint32_t i0) { return 0x0000960b + 0x1*i0; } +  #define REG_A6XX_PC_TESS_NUM_VERTEX				0x00009800  #define REG_A6XX_PC_HS_INPUT_SIZE				0x00009801 @@ -4646,7 +4931,12 @@ static inline uint32_t A6XX_PC_TESS_CNTL_OUTPUT(enum a6xx_tess_output val)  #define REG_A6XX_PC_PRIMID_PASSTHRU				0x00009806  #define REG_A6XX_PC_SO_STREAM_CNTL				0x00009808 -#define A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE			0x00008000 +#define A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__MASK		0x00078000 +#define A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__SHIFT		15 +static inline uint32_t A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE(uint32_t val) +{ +	return ((val) << A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__SHIFT) & A6XX_PC_SO_STREAM_CNTL_STREAM_ENABLE__MASK; +}  #define REG_A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL		0x0000980a  #define A6XX_PC_DGEN_SU_CONSERVATIVE_RAS_CNTL_CONSERVATIVERASEN	0x00000001 @@ -4936,6 +5226,8 @@ static inline uint32_t A6XX_PC_BIN_DRAW_STRM(uint32_t val)  static inline uint32_t REG_A6XX_PC_PERFCTR_PC_SEL(uint32_t i0) { return 0x00009e34 + 0x1*i0; } +static inline uint32_t REG_A7XX_PC_PERFCTR_PC_SEL(uint32_t i0) { return 0x00009e42 + 0x1*i0; } +  #define REG_A6XX_PC_UNKNOWN_9E72				0x00009e72  #define REG_A6XX_VFD_CONTROL_0					0x0000a000 @@ -5138,9 +5430,11 @@ static inline uint32_t A6XX_VFD_DEST_CNTL_INSTR_REGID(uint32_t val)  static inline uint32_t REG_A6XX_VFD_PERFCTR_VFD_SEL(uint32_t i0) { return 0x0000a610 + 0x1*i0; } +static inline uint32_t REG_A7XX_VFD_PERFCTR_VFD_SEL(uint32_t i0) { return 0x0000a610 + 0x1*i0; } +  #define REG_A6XX_SP_VS_CTRL_REG0				0x0000a800  #define A6XX_SP_VS_CTRL_REG0_MERGEDREGS				0x00100000 -#define A6XX_SP_VS_CTRL_REG0_UNK21				0x00200000 +#define A6XX_SP_VS_CTRL_REG0_EARLYPREAMBLE			0x00200000  #define A6XX_SP_VS_CTRL_REG0_THREADMODE__MASK			0x00000001  #define A6XX_SP_VS_CTRL_REG0_THREADMODE__SHIFT			0  static inline uint32_t A6XX_SP_VS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) @@ -5318,7 +5612,7 @@ static inline uint32_t A6XX_SP_VS_PVT_MEM_HW_STACK_OFFSET_OFFSET(uint32_t val)  }  #define REG_A6XX_SP_HS_CTRL_REG0				0x0000a830 -#define A6XX_SP_HS_CTRL_REG0_UNK20				0x00100000 +#define A6XX_SP_HS_CTRL_REG0_EARLYPREAMBLE			0x00100000  #define A6XX_SP_HS_CTRL_REG0_THREADMODE__MASK			0x00000001  #define A6XX_SP_HS_CTRL_REG0_THREADMODE__SHIFT			0  static inline uint32_t A6XX_SP_HS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) @@ -5428,7 +5722,7 @@ static inline uint32_t A6XX_SP_HS_PVT_MEM_HW_STACK_OFFSET_OFFSET(uint32_t val)  }  #define REG_A6XX_SP_DS_CTRL_REG0				0x0000a840 -#define A6XX_SP_DS_CTRL_REG0_MERGEDREGS				0x00100000 +#define A6XX_SP_DS_CTRL_REG0_EARLYPREAMBLE			0x00100000  #define A6XX_SP_DS_CTRL_REG0_THREADMODE__MASK			0x00000001  #define A6XX_SP_DS_CTRL_REG0_THREADMODE__SHIFT			0  static inline uint32_t A6XX_SP_DS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) @@ -5606,7 +5900,7 @@ static inline uint32_t A6XX_SP_DS_PVT_MEM_HW_STACK_OFFSET_OFFSET(uint32_t val)  }  #define REG_A6XX_SP_GS_CTRL_REG0				0x0000a870 -#define A6XX_SP_GS_CTRL_REG0_UNK20				0x00100000 +#define A6XX_SP_GS_CTRL_REG0_EARLYPREAMBLE			0x00100000  #define A6XX_SP_GS_CTRL_REG0_THREADMODE__MASK			0x00000001  #define A6XX_SP_GS_CTRL_REG0_THREADMODE__SHIFT			0  static inline uint32_t A6XX_SP_GS_CTRL_REG0_THREADMODE(enum a3xx_threadmode val) @@ -5862,12 +6156,8 @@ static inline uint32_t A6XX_SP_FS_CTRL_REG0_THREADSIZE(enum a6xx_threadsize val)  #define A6XX_SP_FS_CTRL_REG0_UNK24				0x01000000  #define A6XX_SP_FS_CTRL_REG0_UNK25				0x02000000  #define A6XX_SP_FS_CTRL_REG0_PIXLODENABLE			0x04000000 -#define A6XX_SP_FS_CTRL_REG0_UNK27__MASK			0x18000000 -#define A6XX_SP_FS_CTRL_REG0_UNK27__SHIFT			27 -static inline uint32_t A6XX_SP_FS_CTRL_REG0_UNK27(uint32_t val) -{ -	return ((val) << A6XX_SP_FS_CTRL_REG0_UNK27__SHIFT) & A6XX_SP_FS_CTRL_REG0_UNK27__MASK; -} +#define A6XX_SP_FS_CTRL_REG0_UNK27				0x08000000 +#define A6XX_SP_FS_CTRL_REG0_EARLYPREAMBLE			0x10000000  #define A6XX_SP_FS_CTRL_REG0_MERGEDREGS				0x80000000  #define A6XX_SP_FS_CTRL_REG0_THREADMODE__MASK			0x00000001  #define A6XX_SP_FS_CTRL_REG0_THREADMODE__SHIFT			0 @@ -6069,18 +6359,14 @@ static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_COUNT(uint32_t val)  {  	return ((val) << A6XX_SP_FS_PREFETCH_CNTL_COUNT__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_COUNT__MASK;  } -#define A6XX_SP_FS_PREFETCH_CNTL_UNK3				0x00000008 -#define A6XX_SP_FS_PREFETCH_CNTL_UNK4__MASK			0x00000ff0 -#define A6XX_SP_FS_PREFETCH_CNTL_UNK4__SHIFT			4 -static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_UNK4(uint32_t val) +#define A6XX_SP_FS_PREFETCH_CNTL_IJ_WRITE_DISABLE		0x00000008 +#define A6XX_SP_FS_PREFETCH_CNTL_UNK4				0x00000010 +#define A6XX_SP_FS_PREFETCH_CNTL_WRITE_COLOR_TO_OUTPUT		0x00000020 +#define A6XX_SP_FS_PREFETCH_CNTL_UNK6__MASK			0x00007fc0 +#define A6XX_SP_FS_PREFETCH_CNTL_UNK6__SHIFT			6 +static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_UNK6(uint32_t val)  { -	return ((val) << A6XX_SP_FS_PREFETCH_CNTL_UNK4__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_UNK4__MASK; -} -#define A6XX_SP_FS_PREFETCH_CNTL_UNK12__MASK			0x00007000 -#define A6XX_SP_FS_PREFETCH_CNTL_UNK12__SHIFT			12 -static inline uint32_t A6XX_SP_FS_PREFETCH_CNTL_UNK12(uint32_t val) -{ -	return ((val) << A6XX_SP_FS_PREFETCH_CNTL_UNK12__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_UNK12__MASK; +	return ((val) << A6XX_SP_FS_PREFETCH_CNTL_UNK6__SHIFT) & A6XX_SP_FS_PREFETCH_CNTL_UNK6__MASK;  }  static inline uint32_t REG_A6XX_SP_FS_PREFETCH(uint32_t i0) { return 0x0000a99f + 0x1*i0; } @@ -6117,9 +6403,11 @@ static inline uint32_t A6XX_SP_FS_PREFETCH_CMD_WRMASK(uint32_t val)  	return ((val) << A6XX_SP_FS_PREFETCH_CMD_WRMASK__SHIFT) & A6XX_SP_FS_PREFETCH_CMD_WRMASK__MASK;  }  #define A6XX_SP_FS_PREFETCH_CMD_HALF				0x04000000 -#define A6XX_SP_FS_PREFETCH_CMD_CMD__MASK			0xf8000000 -#define A6XX_SP_FS_PREFETCH_CMD_CMD__SHIFT			27 -static inline uint32_t A6XX_SP_FS_PREFETCH_CMD_CMD(uint32_t val) +#define A6XX_SP_FS_PREFETCH_CMD_UNK27				0x08000000 +#define A6XX_SP_FS_PREFETCH_CMD_BINDLESS			0x10000000 +#define A6XX_SP_FS_PREFETCH_CMD_CMD__MASK			0xe0000000 +#define A6XX_SP_FS_PREFETCH_CMD_CMD__SHIFT			29 +static inline uint32_t A6XX_SP_FS_PREFETCH_CMD_CMD(enum a6xx_tex_prefetch_cmd val)  {  	return ((val) << A6XX_SP_FS_PREFETCH_CMD_CMD__SHIFT) & A6XX_SP_FS_PREFETCH_CMD_CMD__MASK;  } @@ -6161,7 +6449,7 @@ static inline uint32_t A6XX_SP_CS_CTRL_REG0_THREADSIZE(enum a6xx_threadsize val)  }  #define A6XX_SP_CS_CTRL_REG0_UNK21				0x00200000  #define A6XX_SP_CS_CTRL_REG0_UNK22				0x00400000 -#define A6XX_SP_CS_CTRL_REG0_SEPARATEPROLOG			0x00800000 +#define A6XX_SP_CS_CTRL_REG0_EARLYPREAMBLE			0x00800000  #define A6XX_SP_CS_CTRL_REG0_MERGEDREGS				0x80000000  #define A6XX_SP_CS_CTRL_REG0_THREADMODE__MASK			0x00000001  #define A6XX_SP_CS_CTRL_REG0_THREADMODE__SHIFT			0 @@ -6355,7 +6643,19 @@ static inline uint32_t A6XX_SP_CS_TEX_CONST(uint32_t val)  static inline uint32_t REG_A6XX_SP_CS_BINDLESS_BASE(uint32_t i0) { return 0x0000a9e8 + 0x2*i0; } -static inline uint32_t REG_A6XX_SP_CS_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000a9e8 + 0x2*i0; } +static inline uint32_t REG_A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000a9e8 + 0x2*i0; } +#define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK	0x00000003 +#define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT	0 +static inline uint32_t A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) +{ +	return ((val) << A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; +} +#define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK		0xfffffffc +#define A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT		2 +static inline uint32_t A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) +{ +	return ((val >> 2) << A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_SP_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; +}  #define REG_A6XX_SP_CS_IBO					0x0000a9f2  #define A6XX_SP_CS_IBO__MASK					0xffffffff @@ -6406,7 +6706,19 @@ static inline uint32_t A6XX_SP_FS_CONFIG_NIBO(uint32_t val)  static inline uint32_t REG_A6XX_SP_BINDLESS_BASE(uint32_t i0) { return 0x0000ab10 + 0x2*i0; } -static inline uint32_t REG_A6XX_SP_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000ab10 + 0x2*i0; } +static inline uint32_t REG_A6XX_SP_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000ab10 + 0x2*i0; } +#define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK	0x00000003 +#define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT	0 +static inline uint32_t A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) +{ +	return ((val) << A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_SP_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; +} +#define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK		0xfffffffc +#define A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT		2 +static inline uint32_t A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) +{ +	return ((val >> 2) << A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_SP_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; +}  #define REG_A6XX_SP_IBO						0x0000ab1a  #define A6XX_SP_IBO__MASK					0xffffffff @@ -6436,7 +6748,7 @@ static inline uint32_t A6XX_SP_2D_DST_FORMAT_MASK(uint32_t val)  	return ((val) << A6XX_SP_2D_DST_FORMAT_MASK__SHIFT) & A6XX_SP_2D_DST_FORMAT_MASK__MASK;  } -#define REG_A6XX_SP_UNKNOWN_AE00				0x0000ae00 +#define REG_A6XX_SP_DBG_ECO_CNTL				0x0000ae00  #define REG_A6XX_SP_ADDR_MODE_CNTL				0x0000ae01 @@ -6457,6 +6769,12 @@ static inline uint32_t A6XX_SP_2D_DST_FORMAT_MASK(uint32_t val)  static inline uint32_t REG_A6XX_SP_PERFCTR_SP_SEL(uint32_t i0) { return 0x0000ae10 + 0x1*i0; } +static inline uint32_t REG_A7XX_SP_PERFCTR_HLSQ_SEL(uint32_t i0) { return 0x0000ae60 + 0x1*i0; } + +#define REG_A7XX_SP_READ_SEL					0x0000ae6d + +static inline uint32_t REG_A7XX_SP_PERFCTR_SP_SEL(uint32_t i0) { return 0x0000ae80 + 0x1*i0; } +  #define REG_A6XX_SP_CONTEXT_SWITCH_GFX_PREEMPTION_SAFE_MODE	0x0000be22  #define REG_A6XX_SP_PS_TP_BORDER_COLOR_BASE_ADDR		0x0000b180 @@ -6887,6 +7205,8 @@ static inline uint32_t A6XX_HLSQ_FS_CNTL_0_UNK2(uint32_t val)  #define REG_A6XX_HLSQ_CONTROL_1_REG				0x0000b982 +#define REG_A7XX_HLSQ_CONTROL_1_REG				0x0000a9c7 +  #define REG_A6XX_HLSQ_CONTROL_2_REG				0x0000b983  #define A6XX_HLSQ_CONTROL_2_REG_FACEREGID__MASK			0x000000ff  #define A6XX_HLSQ_CONTROL_2_REG_FACEREGID__SHIFT		0 @@ -6906,11 +7226,37 @@ static inline uint32_t A6XX_HLSQ_CONTROL_2_REG_SAMPLEMASK(uint32_t val)  {  	return ((val) << A6XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT) & A6XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK;  } -#define A6XX_HLSQ_CONTROL_2_REG_SIZE__MASK			0xff000000 -#define A6XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT			24 -static inline uint32_t A6XX_HLSQ_CONTROL_2_REG_SIZE(uint32_t val) +#define A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK			0xff000000 +#define A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT		24 +static inline uint32_t A6XX_HLSQ_CONTROL_2_REG_CENTERRHW(uint32_t val) +{ +	return ((val) << A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT) & A6XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK; +} + +#define REG_A7XX_HLSQ_CONTROL_2_REG				0x0000a9c8 +#define A7XX_HLSQ_CONTROL_2_REG_FACEREGID__MASK			0x000000ff +#define A7XX_HLSQ_CONTROL_2_REG_FACEREGID__SHIFT		0 +static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_FACEREGID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_2_REG_FACEREGID__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_FACEREGID__MASK; +} +#define A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__MASK			0x0000ff00 +#define A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__SHIFT			8 +static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_SAMPLEID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_SAMPLEID__MASK; +} +#define A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK		0x00ff0000 +#define A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT		16 +static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_SAMPLEMASK__MASK; +} +#define A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK			0xff000000 +#define A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT		24 +static inline uint32_t A7XX_HLSQ_CONTROL_2_REG_CENTERRHW(uint32_t val)  { -	return ((val) << A6XX_HLSQ_CONTROL_2_REG_SIZE__SHIFT) & A6XX_HLSQ_CONTROL_2_REG_SIZE__MASK; +	return ((val) << A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__SHIFT) & A7XX_HLSQ_CONTROL_2_REG_CENTERRHW__MASK;  }  #define REG_A6XX_HLSQ_CONTROL_3_REG				0x0000b984 @@ -6939,6 +7285,32 @@ static inline uint32_t A6XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID(uint32_t val)  	return ((val) << A6XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__SHIFT) & A6XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__MASK;  } +#define REG_A7XX_HLSQ_CONTROL_3_REG				0x0000a9c9 +#define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__MASK		0x000000ff +#define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__SHIFT		0 +static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_PIXEL__MASK; +} +#define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__MASK		0x0000ff00 +#define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__SHIFT		8 +static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_PIXEL__MASK; +} +#define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__MASK		0x00ff0000 +#define A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__SHIFT	16 +static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_PERSP_CENTROID__MASK; +} +#define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__MASK	0xff000000 +#define A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__SHIFT	24 +static inline uint32_t A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__SHIFT) & A7XX_HLSQ_CONTROL_3_REG_IJ_LINEAR_CENTROID__MASK; +} +  #define REG_A6XX_HLSQ_CONTROL_4_REG				0x0000b985  #define A6XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__MASK		0x000000ff  #define A6XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__SHIFT		0 @@ -6965,6 +7337,32 @@ static inline uint32_t A6XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID(uint32_t val)  	return ((val) << A6XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__SHIFT) & A6XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__MASK;  } +#define REG_A7XX_HLSQ_CONTROL_4_REG				0x0000a9ca +#define A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__MASK		0x000000ff +#define A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__SHIFT		0 +static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_IJ_PERSP_SAMPLE__MASK; +} +#define A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__MASK		0x0000ff00 +#define A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__SHIFT		8 +static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_IJ_LINEAR_SAMPLE__MASK; +} +#define A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__MASK		0x00ff0000 +#define A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__SHIFT		16 +static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_XYCOORDREGID__MASK; +} +#define A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__MASK		0xff000000 +#define A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__SHIFT		24 +static inline uint32_t A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__SHIFT) & A7XX_HLSQ_CONTROL_4_REG_ZWCOORDREGID__MASK; +} +  #define REG_A6XX_HLSQ_CONTROL_5_REG				0x0000b986  #define A6XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__MASK		0x000000ff  #define A6XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__SHIFT		0 @@ -6979,6 +7377,20 @@ static inline uint32_t A6XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID(uint32_t va  	return ((val) << A6XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__SHIFT) & A6XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__MASK;  } +#define REG_A7XX_HLSQ_CONTROL_5_REG				0x0000a9cb +#define A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__MASK		0x000000ff +#define A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__SHIFT		0 +static inline uint32_t A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__SHIFT) & A7XX_HLSQ_CONTROL_5_REG_LINELENGTHREGID__MASK; +} +#define A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__MASK	0x0000ff00 +#define A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__SHIFT	8 +static inline uint32_t A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID(uint32_t val) +{ +	return ((val) << A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__SHIFT) & A7XX_HLSQ_CONTROL_5_REG_FOVEATIONQUALITYREGID__MASK; +} +  #define REG_A6XX_HLSQ_CS_CNTL					0x0000b987  #define A6XX_HLSQ_CS_CNTL_CONSTLEN__MASK			0x000000ff  #define A6XX_HLSQ_CS_CNTL_CONSTLEN__SHIFT			0 @@ -7124,7 +7536,19 @@ static inline uint32_t A6XX_HLSQ_LOAD_STATE_FRAG_EXT_SRC_ADDR(uint32_t val)  static inline uint32_t REG_A6XX_HLSQ_CS_BINDLESS_BASE(uint32_t i0) { return 0x0000b9c0 + 0x2*i0; } -static inline uint32_t REG_A6XX_HLSQ_CS_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000b9c0 + 0x2*i0; } +static inline uint32_t REG_A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000b9c0 + 0x2*i0; } +#define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK	0x00000003 +#define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT	0 +static inline uint32_t A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) +{ +	return ((val) << A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; +} +#define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK	0xfffffffc +#define A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT	2 +static inline uint32_t A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) +{ +	return ((val >> 2) << A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_HLSQ_CS_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; +}  #define REG_A6XX_HLSQ_CS_UNKNOWN_B9D0				0x0000b9d0  #define A6XX_HLSQ_CS_UNKNOWN_B9D0_SHARED_SIZE__MASK		0x0000001f @@ -7204,7 +7628,19 @@ static inline uint32_t A6XX_HLSQ_FS_CNTL_CONSTLEN(uint32_t val)  static inline uint32_t REG_A6XX_HLSQ_BINDLESS_BASE(uint32_t i0) { return 0x0000bb20 + 0x2*i0; } -static inline uint32_t REG_A6XX_HLSQ_BINDLESS_BASE_ADDR(uint32_t i0) { return 0x0000bb20 + 0x2*i0; } +static inline uint32_t REG_A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR(uint32_t i0) { return 0x0000bb20 + 0x2*i0; } +#define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK	0x00000003 +#define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT	0 +static inline uint32_t A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE(enum a6xx_bindless_descriptor_size val) +{ +	return ((val) << A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__SHIFT) & A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_DESC_SIZE__MASK; +} +#define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK		0xfffffffc +#define A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT		2 +static inline uint32_t A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR(uint32_t val) +{ +	return ((val >> 2) << A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__SHIFT) & A6XX_HLSQ_BINDLESS_BASE_DESCRIPTOR_ADDR__MASK; +}  #define REG_A6XX_HLSQ_2D_EVENT_CMD				0x0000bd80  #define A6XX_HLSQ_2D_EVENT_CMD_STATE_ID__MASK			0x0000ff00 @@ -7224,7 +7660,7 @@ static inline uint32_t A6XX_HLSQ_2D_EVENT_CMD_EVENT(enum vgt_event_type val)  #define REG_A6XX_HLSQ_UNKNOWN_BE01				0x0000be01 -#define REG_A6XX_HLSQ_UNKNOWN_BE04				0x0000be04 +#define REG_A6XX_HLSQ_DBG_ECO_CNTL				0x0000be04  #define REG_A6XX_HLSQ_ADDR_MODE_CNTL				0x0000be05 @@ -7234,6 +7670,8 @@ static inline uint32_t REG_A6XX_HLSQ_PERFCTR_HLSQ_SEL(uint32_t i0) { return 0x00  #define REG_A6XX_HLSQ_CONTEXT_SWITCH_GFX_PREEMPTION_SAFE_MODE	0x0000be22 +#define REG_A7XX_SP_AHB_READ_APERTURE				0x0000c000 +  #define REG_A6XX_CP_EVENT_START					0x0000d600  #define A6XX_CP_EVENT_START_STATE_ID__MASK			0x000000ff  #define A6XX_CP_EVENT_START_STATE_ID__SHIFT			0 @@ -7426,7 +7864,18 @@ static inline uint32_t A6XX_TEX_CONST_1_HEIGHT(uint32_t val)  }  #define REG_A6XX_TEX_CONST_2					0x00000002 -#define A6XX_TEX_CONST_2_BUFFER					0x00000010 +#define A6XX_TEX_CONST_2_STRUCTSIZETEXELS__MASK			0x0000fff0 +#define A6XX_TEX_CONST_2_STRUCTSIZETEXELS__SHIFT		4 +static inline uint32_t A6XX_TEX_CONST_2_STRUCTSIZETEXELS(uint32_t val) +{ +	return ((val) << A6XX_TEX_CONST_2_STRUCTSIZETEXELS__SHIFT) & A6XX_TEX_CONST_2_STRUCTSIZETEXELS__MASK; +} +#define A6XX_TEX_CONST_2_STARTOFFSETTEXELS__MASK		0x003f0000 +#define A6XX_TEX_CONST_2_STARTOFFSETTEXELS__SHIFT		16 +static inline uint32_t A6XX_TEX_CONST_2_STARTOFFSETTEXELS(uint32_t val) +{ +	return ((val) << A6XX_TEX_CONST_2_STARTOFFSETTEXELS__SHIFT) & A6XX_TEX_CONST_2_STARTOFFSETTEXELS__MASK; +}  #define A6XX_TEX_CONST_2_PITCHALIGN__MASK			0x0000000f  #define A6XX_TEX_CONST_2_PITCHALIGN__SHIFT			0  static inline uint32_t A6XX_TEX_CONST_2_PITCHALIGN(uint32_t val) @@ -7485,6 +7934,12 @@ static inline uint32_t A6XX_TEX_CONST_5_DEPTH(uint32_t val)  }  #define REG_A6XX_TEX_CONST_6					0x00000006 +#define A6XX_TEX_CONST_6_MIN_LOD_CLAMP__MASK			0x00000fff +#define A6XX_TEX_CONST_6_MIN_LOD_CLAMP__SHIFT			0 +static inline uint32_t A6XX_TEX_CONST_6_MIN_LOD_CLAMP(float val) +{ +	return ((((uint32_t)(val * 256.0))) << A6XX_TEX_CONST_6_MIN_LOD_CLAMP__SHIFT) & A6XX_TEX_CONST_6_MIN_LOD_CLAMP__MASK; +}  #define A6XX_TEX_CONST_6_PLANE_PITCH__MASK			0xffffff00  #define A6XX_TEX_CONST_6_PLANE_PITCH__SHIFT			8  static inline uint32_t A6XX_TEX_CONST_6_PLANE_PITCH(uint32_t val) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c index 7f5bc73b2040..8914992378f2 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.c @@ -621,6 +621,8 @@ setup_pdc:  	/* ensure no writes happen before the uCode is fully written */  	wmb(); +	a6xx_rpmh_stop(gmu); +  err:  	if (!IS_ERR_OR_NULL(pdcptr))  		iounmap(pdcptr); @@ -753,7 +755,6 @@ static int a6xx_gmu_fw_load(struct a6xx_gmu *gmu)  static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, unsigned int state)  { -	static bool rpmh_init;  	struct a6xx_gpu *a6xx_gpu = container_of(gmu, struct a6xx_gpu, gmu);  	struct adreno_gpu *adreno_gpu = &a6xx_gpu->base;  	int ret; @@ -776,15 +777,9 @@ static int a6xx_gmu_fw_start(struct a6xx_gmu *gmu, unsigned int state)  		/* Turn on register retention */  		gmu_write(gmu, REG_A6XX_GMU_GENERAL_7, 1); -		/* We only need to load the RPMh microcode once */ -		if (!rpmh_init) { -			a6xx_gmu_rpmh_init(gmu); -			rpmh_init = true; -		} else { -			ret = a6xx_rpmh_start(gmu); -			if (ret) -				return ret; -		} +		ret = a6xx_rpmh_start(gmu); +		if (ret) +			return ret;  		ret = a6xx_gmu_fw_load(gmu);  		if (ret) @@ -1482,6 +1477,12 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu)  	pm_runtime_force_suspend(gmu->dev); +	/* +	 * Since cxpd is a virt device, the devlink with gmu-dev will be removed +	 * automatically when we do detach +	 */ +	dev_pm_domain_detach(gmu->cxpd, false); +  	if (!IS_ERR_OR_NULL(gmu->gxpd)) {  		pm_runtime_disable(gmu->gxpd);  		dev_pm_domain_detach(gmu->gxpd, false); @@ -1504,6 +1505,17 @@ void a6xx_gmu_remove(struct a6xx_gpu *a6xx_gpu)  	gmu->initialized = false;  } +static int cxpd_notifier_cb(struct notifier_block *nb, +			unsigned long action, void *data) +{ +	struct a6xx_gmu *gmu = container_of(nb, struct a6xx_gmu, pd_nb); + +	if (action == GENPD_NOTIFY_OFF) +		complete_all(&gmu->pd_gate); + +	return 0; +} +  int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)  {  	struct adreno_gpu *adreno_gpu = &a6xx_gpu->base; @@ -1514,8 +1526,6 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)  	if (!pdev)  		return -ENODEV; -	mutex_init(&gmu->lock); -  	gmu->dev = &pdev->dev;  	of_dma_configure(gmu->dev, node, true); @@ -1608,8 +1618,10 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)  	if (adreno_is_a650_family(adreno_gpu)) {  		gmu->rscc = a6xx_gmu_get_mmio(pdev, "rscc"); -		if (IS_ERR(gmu->rscc)) +		if (IS_ERR(gmu->rscc)) { +			ret = -ENODEV;  			goto err_mmio; +		}  	} else {  		gmu->rscc = gmu->mmio + 0x23000;  	} @@ -1618,8 +1630,26 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)  	gmu->hfi_irq = a6xx_gmu_get_irq(gmu, pdev, "hfi", a6xx_hfi_irq);  	gmu->gmu_irq = a6xx_gmu_get_irq(gmu, pdev, "gmu", a6xx_gmu_irq); -	if (gmu->hfi_irq < 0 || gmu->gmu_irq < 0) +	if (gmu->hfi_irq < 0 || gmu->gmu_irq < 0) { +		ret = -ENODEV;  		goto err_mmio; +	} + +	gmu->cxpd = dev_pm_domain_attach_by_name(gmu->dev, "cx"); +	if (IS_ERR(gmu->cxpd)) { +		ret = PTR_ERR(gmu->cxpd); +		goto err_mmio; +	} + +	if (!device_link_add(gmu->dev, gmu->cxpd, +					DL_FLAG_PM_RUNTIME)) { +		ret = -ENODEV; +		goto detach_cxpd; +	} + +	init_completion(&gmu->pd_gate); +	complete_all(&gmu->pd_gate); +	gmu->pd_nb.notifier_call = cxpd_notifier_cb;  	/*  	 * Get a link to the GX power domain to reset the GPU in case of GMU @@ -1633,10 +1663,16 @@ int a6xx_gmu_init(struct a6xx_gpu *a6xx_gpu, struct device_node *node)  	/* Set up the HFI queues */  	a6xx_hfi_init(gmu); +	/* Initialize RPMh */ +	a6xx_gmu_rpmh_init(gmu); +  	gmu->initialized = true;  	return 0; +detach_cxpd: +	dev_pm_domain_detach(gmu->cxpd, false); +  err_mmio:  	iounmap(gmu->mmio);  	if (platform_get_resource_byname(pdev, IORESOURCE_MEM, "rscc")) @@ -1644,8 +1680,6 @@ err_mmio:  	free_irq(gmu->gmu_irq, gmu);  	free_irq(gmu->hfi_irq, gmu); -	ret = -ENODEV; -  err_memory:  	a6xx_gmu_memory_free(gmu);  err_put_device: diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h index e034935b3986..0bc3eb443fec 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.h @@ -4,8 +4,10 @@  #ifndef _A6XX_GMU_H_  #define _A6XX_GMU_H_ +#include <linux/completion.h>  #include <linux/iopoll.h>  #include <linux/interrupt.h> +#include <linux/notifier.h>  #include "msm_drv.h"  #include "a6xx_hfi.h" @@ -56,6 +58,7 @@ struct a6xx_gmu {  	int gmu_irq;  	struct device *gxpd; +	struct device *cxpd;  	int idle_level; @@ -89,6 +92,10 @@ struct a6xx_gmu {  	bool initialized;  	bool hung;  	bool legacy; /* a618 or a630 */ + +	/* For power domain callback */ +	struct notifier_block pd_nb; +	struct completion pd_gate;  };  static inline u32 gmu_read(struct a6xx_gmu *gmu, u32 offset) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gmu.xml.h b/drivers/gpu/drm/msm/adreno/a6xx_gmu.xml.h index 4a3230978c0e..9ab15d91aced 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gmu.xml.h +++ b/drivers/gpu/drm/msm/adreno/a6xx_gmu.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2023 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c index 6faea5049f76..52da3795b175 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu.c @@ -10,7 +10,7 @@  #include <linux/bitfield.h>  #include <linux/devfreq.h> -#include <linux/reset.h> +#include <linux/pm_domain.h>  #include <linux/soc/qcom/llcc-qcom.h>  #define GPU_PAS_ID 13 @@ -187,7 +187,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)  	 * GPU registers so we need to add 0x1a800 to the register value on A630  	 * to get the right value from PM4.  	 */ -	get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO, +	get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER,  		rbmemptr_stats(ring, index, alwayson_start));  	/* Invalidate CCU depth and color */ @@ -228,7 +228,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)  	get_stats_counter(ring, REG_A6XX_RBBM_PERFCTR_CP(0),  		rbmemptr_stats(ring, index, cpcycles_end)); -	get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO, +	get_stats_counter(ring, REG_A6XX_CP_ALWAYS_ON_COUNTER,  		rbmemptr_stats(ring, index, alwayson_end));  	/* Write the fence to the scratch register */ @@ -247,7 +247,7 @@ static void a6xx_submit(struct msm_gpu *gpu, struct msm_gem_submit *submit)  	OUT_RING(ring, submit->seqno);  	trace_msm_gpu_submit_flush(submit, -		gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO)); +		gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER));  	a6xx_flush(gpu, ring);  } @@ -917,7 +917,7 @@ out:  	return ret;  } -static int a6xx_ucode_init(struct msm_gpu *gpu) +static int a6xx_ucode_load(struct msm_gpu *gpu)  {  	struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);  	struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); @@ -946,7 +946,23 @@ static int a6xx_ucode_init(struct msm_gpu *gpu)  		}  	} -	gpu_write64(gpu, REG_A6XX_CP_SQE_INSTR_BASE, a6xx_gpu->sqe_iova); +	/* +	 * Expanded APRIV and targets that support WHERE_AM_I both need a +	 * privileged buffer to store the RPTR shadow +	 */ +	if ((adreno_gpu->base.hw_apriv || a6xx_gpu->has_whereami) && +	    !a6xx_gpu->shadow_bo) { +		a6xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, +						      sizeof(u32) * gpu->nr_rings, +						      MSM_BO_WC | MSM_BO_MAP_PRIV, +						      gpu->aspace, &a6xx_gpu->shadow_bo, +						      &a6xx_gpu->shadow_iova); + +		if (IS_ERR(a6xx_gpu->shadow)) +			return PTR_ERR(a6xx_gpu->shadow); + +		msm_gem_object_set_name(a6xx_gpu->shadow_bo, "shadow"); +	}  	return 0;  } @@ -997,7 +1013,7 @@ static int hw_init(struct msm_gpu *gpu)  	 * memory rendering at this point in time and we don't want to block off  	 * part of the virtual memory space.  	 */ -	gpu_write64(gpu, REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE_LO, 0x00000000); +	gpu_write64(gpu, REG_A6XX_RBBM_SECVID_TSB_TRUSTED_BASE, 0x00000000);  	gpu_write(gpu, REG_A6XX_RBBM_SECVID_TSB_TRUSTED_SIZE, 0x00000000);  	/* Turn on 64 bit addressing for all blocks */ @@ -1037,18 +1053,15 @@ static int hw_init(struct msm_gpu *gpu)  	gpu_write(gpu, REG_A6XX_RBBM_PERFCTR_GPU_BUSY_MASKED, 0xffffffff);  	/* Disable L2 bypass in the UCHE */ -	gpu_write(gpu, REG_A6XX_UCHE_WRITE_RANGE_MAX_LO, 0xffffffc0); -	gpu_write(gpu, REG_A6XX_UCHE_WRITE_RANGE_MAX_HI, 0x0001ffff); -	gpu_write(gpu, REG_A6XX_UCHE_TRAP_BASE_LO, 0xfffff000); -	gpu_write(gpu, REG_A6XX_UCHE_TRAP_BASE_HI, 0x0001ffff); -	gpu_write(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE_LO, 0xfffff000); -	gpu_write(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE_HI, 0x0001ffff); +	gpu_write64(gpu, REG_A6XX_UCHE_WRITE_RANGE_MAX, 0x0001ffffffffffc0llu); +	gpu_write64(gpu, REG_A6XX_UCHE_TRAP_BASE, 0x0001fffffffff000llu); +	gpu_write64(gpu, REG_A6XX_UCHE_WRITE_THRU_BASE, 0x0001fffffffff000llu);  	if (!adreno_is_a650_family(adreno_gpu)) {  		/* Set the GMEM VA range [0x100000:0x100000 + gpu->gmem - 1] */ -		gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN_LO, 0x00100000); +		gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MIN, 0x00100000); -		gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MAX_LO, +		gpu_write64(gpu, REG_A6XX_UCHE_GMEM_RANGE_MAX,  			0x00100000 + adreno_gpu->gmem - 1);  	} @@ -1135,9 +1148,7 @@ static int hw_init(struct msm_gpu *gpu)  	if (ret)  		goto out; -	ret = a6xx_ucode_init(gpu); -	if (ret) -		goto out; +	gpu_write64(gpu, REG_A6XX_CP_SQE_INSTR_BASE, a6xx_gpu->sqe_iova);  	/* Set the ringbuffer address */  	gpu_write64(gpu, REG_A6XX_CP_RB_BASE, gpu->rb[0]->iova); @@ -1152,26 +1163,9 @@ static int hw_init(struct msm_gpu *gpu)  		gpu_write(gpu, REG_A6XX_CP_RB_CNTL,  			MSM_GPU_RB_CNTL_DEFAULT | AXXX_CP_RB_CNTL_NO_UPDATE); -	/* -	 * Expanded APRIV and targets that support WHERE_AM_I both need a -	 * privileged buffer to store the RPTR shadow -	 */ - -	if (adreno_gpu->base.hw_apriv || a6xx_gpu->has_whereami) { -		if (!a6xx_gpu->shadow_bo) { -			a6xx_gpu->shadow = msm_gem_kernel_new(gpu->dev, -				sizeof(u32) * gpu->nr_rings, -				MSM_BO_WC | MSM_BO_MAP_PRIV, -				gpu->aspace, &a6xx_gpu->shadow_bo, -				&a6xx_gpu->shadow_iova); - -			if (IS_ERR(a6xx_gpu->shadow)) -				return PTR_ERR(a6xx_gpu->shadow); - -			msm_gem_object_set_name(a6xx_gpu->shadow_bo, "shadow"); -		} - -		gpu_write64(gpu, REG_A6XX_CP_RB_RPTR_ADDR_LO, +	/* Configure the RPTR shadow if needed: */ +	if (a6xx_gpu->shadow_bo) { +		gpu_write64(gpu, REG_A6XX_CP_RB_RPTR_ADDR,  			shadowptr(a6xx_gpu, gpu->rb[0]));  	} @@ -1259,6 +1253,7 @@ static void a6xx_recover(struct msm_gpu *gpu)  {  	struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);  	struct a6xx_gpu *a6xx_gpu = to_a6xx_gpu(adreno_gpu); +	struct a6xx_gmu *gmu = &a6xx_gpu->gmu;  	int i, active_submits;  	adreno_dump_info(gpu); @@ -1297,6 +1292,10 @@ static void a6xx_recover(struct msm_gpu *gpu)  	 */  	gpu->active_submits = 0; +	reinit_completion(&gmu->pd_gate); +	dev_pm_genpd_add_notifier(gmu->cxpd, &gmu->pd_nb); +	dev_pm_genpd_synced_poweroff(gmu->cxpd); +  	/* Drop the rpm refcount from active submits */  	if (active_submits)  		pm_runtime_put(&gpu->pdev->dev); @@ -1304,8 +1303,10 @@ static void a6xx_recover(struct msm_gpu *gpu)  	/* And the final one from recover worker */  	pm_runtime_put_sync(&gpu->pdev->dev); -	/* Call into gpucc driver to poll for cx gdsc collapse */ -	reset_control_reset(gpu->cx_collapse); +	if (!wait_for_completion_timeout(&gmu->pd_gate, msecs_to_jiffies(1000))) +		DRM_DEV_ERROR(&gpu->pdev->dev, "cx gdsc didn't collapse\n"); + +	dev_pm_genpd_remove_notifier(gmu->cxpd);  	pm_runtime_use_autosuspend(&gpu->pdev->dev); @@ -1361,73 +1362,23 @@ static const char *a6xx_fault_block(struct msm_gpu *gpu, u32 id)  	return a6xx_uche_fault_block(gpu, id);  } -#define ARM_SMMU_FSR_TF                 BIT(1) -#define ARM_SMMU_FSR_PF			BIT(3) -#define ARM_SMMU_FSR_EF			BIT(4) -  static int a6xx_fault_handler(void *arg, unsigned long iova, int flags, void *data)  {  	struct msm_gpu *gpu = arg;  	struct adreno_smmu_fault_info *info = data; -	const char *type = "UNKNOWN"; -	const char *block; -	bool do_devcoredump = info && !READ_ONCE(gpu->crashstate); - -	/* -	 * If we aren't going to be resuming later from fault_worker, then do -	 * it now. -	 */ -	if (!do_devcoredump) { -		gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu); -	} - -	/* -	 * Print a default message if we couldn't get the data from the -	 * adreno-smmu-priv -	 */ -	if (!info) { -		pr_warn_ratelimited("*** gpu fault: iova=%.16lx flags=%d (%u,%u,%u,%u)\n", -			iova, flags, -			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(4)), -			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(5)), -			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(6)), -			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(7))); - -		return 0; -	} +	const char *block = "unknown"; -	if (info->fsr & ARM_SMMU_FSR_TF) -		type = "TRANSLATION"; -	else if (info->fsr & ARM_SMMU_FSR_PF) -		type = "PERMISSION"; -	else if (info->fsr & ARM_SMMU_FSR_EF) -		type = "EXTERNAL"; - -	block = a6xx_fault_block(gpu, info->fsynr1 & 0xff); - -	pr_warn_ratelimited("*** gpu fault: ttbr0=%.16llx iova=%.16lx dir=%s type=%s source=%s (%u,%u,%u,%u)\n", -			info->ttbr0, iova, -			flags & IOMMU_FAULT_WRITE ? "WRITE" : "READ", -			type, block, +	u32 scratch[] = {  			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(4)),  			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(5)),  			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(6)), -			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(7))); - -	if (do_devcoredump) { -		/* Turn off the hangcheck timer to keep it from bothering us */ -		del_timer(&gpu->hangcheck_timer); - -		gpu->fault_info.ttbr0 = info->ttbr0; -		gpu->fault_info.iova  = iova; -		gpu->fault_info.flags = flags; -		gpu->fault_info.type  = type; -		gpu->fault_info.block = block; +			gpu_read(gpu, REG_A6XX_CP_SCRATCH_REG(7)), +	}; -		kthread_queue_work(gpu->worker, &gpu->fault_work); -	} +	if (info) +		block = a6xx_fault_block(gpu, info->fsynr1 & 0xff); -	return 0; +	return adreno_fault_handler(gpu, iova, flags, info, block, scratch);  }  static void a6xx_cp_hw_err_irq(struct msm_gpu *gpu) @@ -1712,7 +1663,7 @@ static int a6xx_get_timestamp(struct msm_gpu *gpu, uint64_t *value)  	/* Force the GPU power on so we can read this register */  	a6xx_gmu_set_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); -	*value = gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER_LO); +	*value = gpu_read64(gpu, REG_A6XX_CP_ALWAYS_ON_COUNTER);  	a6xx_gmu_clear_oob(&a6xx_gpu->gmu, GMU_OOB_PERFCOUNTER_SET); @@ -1848,8 +1799,8 @@ static bool a6xx_progress(struct msm_gpu *gpu, struct msm_ringbuffer *ring)  	 *     to prevent prefetching into an unrelated submit.  (And  	 *     either way, at some point the ROQ will be full.)  	 */ -	cp_state.ib1_rem += gpu_read(gpu, REG_A6XX_CP_CSQ_IB1_STAT) >> 16; -	cp_state.ib2_rem += gpu_read(gpu, REG_A6XX_CP_CSQ_IB2_STAT) >> 16; +	cp_state.ib1_rem += gpu_read(gpu, REG_A6XX_CP_ROQ_AVAIL_IB1) >> 16; +	cp_state.ib2_rem += gpu_read(gpu, REG_A6XX_CP_ROQ_AVAIL_IB2) >> 16;  	progress = !!memcmp(&cp_state, &ring->last_cp_state, sizeof(cp_state)); @@ -1886,6 +1837,31 @@ static u32 a619_get_speed_bin(u32 fuse)  	return UINT_MAX;  } +static u32 a640_get_speed_bin(u32 fuse) +{ +	if (fuse == 0) +		return 0; +	else if (fuse == 1) +		return 1; + +	return UINT_MAX; +} + +static u32 a650_get_speed_bin(u32 fuse) +{ +	if (fuse == 0) +		return 0; +	else if (fuse == 1) +		return 1; +	/* Yep, 2 and 3 are swapped! :/ */ +	else if (fuse == 2) +		return 3; +	else if (fuse == 3) +		return 2; + +	return UINT_MAX; +} +  static u32 adreno_7c3_get_speed_bin(u32 fuse)  {  	if (fuse == 0) @@ -1911,6 +1887,12 @@ static u32 fuse_to_supp_hw(struct device *dev, struct adreno_rev rev, u32 fuse)  	if (adreno_cmp_rev(ADRENO_REV(6, 3, 5, ANY_ID), rev))  		val = adreno_7c3_get_speed_bin(fuse); +	if (adreno_cmp_rev(ADRENO_REV(6, 4, 0, ANY_ID), rev)) +		val = a640_get_speed_bin(fuse); + +	if (adreno_cmp_rev(ADRENO_REV(6, 5, 0, ANY_ID), rev)) +		val = a650_get_speed_bin(fuse); +  	if (val == UINT_MAX) {  		DRM_DEV_ERROR(dev,  			"missing support for speed-bin: %u. Some OPPs may not be supported by hardware\n", @@ -1954,6 +1936,7 @@ static const struct adreno_gpu_funcs funcs = {  		.get_param = adreno_get_param,  		.set_param = adreno_set_param,  		.hw_init = a6xx_hw_init, +		.ucode_load = a6xx_ucode_load,  		.pm_suspend = a6xx_pm_suspend,  		.pm_resume = a6xx_pm_resume,  		.recover = a6xx_recover, @@ -1998,6 +1981,8 @@ struct msm_gpu *a6xx_gpu_init(struct drm_device *dev)  	adreno_gpu = &a6xx_gpu->base;  	gpu = &adreno_gpu->base; +	mutex_init(&a6xx_gpu->gmu.lock); +  	adreno_gpu->registers = NULL;  	/* diff --git a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c index b7e217d00a22..30ecdff363e7 100644 --- a/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c +++ b/drivers/gpu/drm/msm/adreno/a6xx_gpu_state.c @@ -147,7 +147,7 @@ static int a6xx_crashdumper_run(struct msm_gpu *gpu,  	/* Make sure all pending memory writes are posted */  	wmb(); -	gpu_write64(gpu, REG_A6XX_CP_CRASH_SCRIPT_BASE_LO, dumper->iova); +	gpu_write64(gpu, REG_A6XX_CP_CRASH_SCRIPT_BASE, dumper->iova);  	gpu_write(gpu, REG_A6XX_CP_CRASH_DUMP_CNTL, 1); diff --git a/drivers/gpu/drm/msm/adreno/adreno_common.xml.h b/drivers/gpu/drm/msm/adreno/adreno_common.xml.h index abb037ccc02b..51c320a2e5c0 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_common.xml.h +++ b/drivers/gpu/drm/msm/adreno/adreno_common.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2023 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -49,11 +49,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  enum chip { -	A2XX = 0, -	A3XX = 0, -	A4XX = 0, -	A5XX = 0, -	A6XX = 0, +	A2XX = 2, +	A3XX = 3, +	A4XX = 4, +	A5XX = 5, +	A6XX = 6, +	A7XX = 7,  };  enum adreno_pa_su_sc_draw { @@ -210,6 +211,17 @@ enum a5xx_line_mode {  	RECTANGULAR = 1,  }; +enum a6xx_tex_prefetch_cmd { +	TEX_PREFETCH_UNK0 = 0, +	TEX_PREFETCH_SAM = 1, +	TEX_PREFETCH_GATHER4R = 2, +	TEX_PREFETCH_GATHER4G = 3, +	TEX_PREFETCH_GATHER4B = 4, +	TEX_PREFETCH_GATHER4A = 5, +	TEX_PREFETCH_UNK6 = 6, +	TEX_PREFETCH_UNK7 = 7, +}; +  #define REG_AXXX_CP_RB_BASE					0x000001c0  #define REG_AXXX_CP_RB_CNTL					0x000001c1 diff --git a/drivers/gpu/drm/msm/adreno/adreno_device.c b/drivers/gpu/drm/msm/adreno/adreno_device.c index c5c4c93b3689..8cff86e9d35c 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_device.c +++ b/drivers/gpu/drm/msm/adreno/adreno_device.c @@ -432,31 +432,35 @@ struct msm_gpu *adreno_load_gpu(struct drm_device *dev)  	if (ret)  		return NULL; +	if (gpu->funcs->ucode_load) { +		ret = gpu->funcs->ucode_load(gpu); +		if (ret) +			return NULL; +	} +  	/*  	 * Now that we have firmware loaded, and are ready to begin  	 * booting the gpu, go ahead and enable runpm:  	 */  	pm_runtime_enable(&pdev->dev); -	/* Make sure pm runtime is active and reset any previous errors */ -	pm_runtime_set_active(&pdev->dev); -  	ret = pm_runtime_get_sync(&pdev->dev);  	if (ret < 0) { -		pm_runtime_put_sync(&pdev->dev); +		pm_runtime_put_noidle(&pdev->dev);  		DRM_DEV_ERROR(dev->dev, "Couldn't power up the GPU: %d\n", ret); -		return NULL; +		goto err_disable_rpm;  	}  	mutex_lock(&gpu->lock);  	ret = msm_gpu_hw_init(gpu);  	mutex_unlock(&gpu->lock); -	pm_runtime_put_autosuspend(&pdev->dev);  	if (ret) {  		DRM_DEV_ERROR(dev->dev, "gpu hw init failed: %d\n", ret); -		return NULL; +		goto err_put_rpm;  	} +	pm_runtime_put_autosuspend(&pdev->dev); +  #ifdef CONFIG_DEBUG_FS  	if (gpu->funcs->debugfs_init) {  		gpu->funcs->debugfs_init(gpu, dev->primary); @@ -465,6 +469,13 @@ struct msm_gpu *adreno_load_gpu(struct drm_device *dev)  #endif  	return gpu; + +err_put_rpm: +	pm_runtime_put_sync_suspend(&pdev->dev); +err_disable_rpm: +	pm_runtime_disable(&pdev->dev); + +	return NULL;  }  static int find_chipid(struct device *dev, struct adreno_rev *rev) @@ -548,6 +559,10 @@ static int adreno_bind(struct device *dev, struct device *master, void *data)  		return PTR_ERR(gpu);  	} +	ret = dev_pm_opp_of_find_icc_paths(dev, NULL); +	if (ret) +		return ret; +  	return 0;  } @@ -566,8 +581,8 @@ static void adreno_unbind(struct device *dev, struct device *master,  }  static const struct component_ops a3xx_ops = { -		.bind   = adreno_bind, -		.unbind = adreno_unbind, +	.bind   = adreno_bind, +	.unbind = adreno_unbind,  };  static void adreno_device_register_headless(void) diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.c b/drivers/gpu/drm/msm/adreno/adreno_gpu.c index ce6b76c45b6f..6934cee07d42 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.c +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.c @@ -208,7 +208,7 @@ adreno_iommu_create_address_space(struct msm_gpu *gpu,  	struct msm_gem_address_space *aspace;  	u64 start, size; -	mmu = msm_iommu_new(&pdev->dev, quirks); +	mmu = msm_iommu_gpu_new(&pdev->dev, gpu, quirks);  	if (IS_ERR_OR_NULL(mmu))  		return ERR_CAST(mmu); @@ -246,6 +246,66 @@ u64 adreno_private_address_space_size(struct msm_gpu *gpu)  	return SZ_4G;  } +#define ARM_SMMU_FSR_TF                 BIT(1) +#define ARM_SMMU_FSR_PF			BIT(3) +#define ARM_SMMU_FSR_EF			BIT(4) + +int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags, +			 struct adreno_smmu_fault_info *info, const char *block, +			 u32 scratch[4]) +{ +	const char *type = "UNKNOWN"; +	bool do_devcoredump = info && !READ_ONCE(gpu->crashstate); + +	/* +	 * If we aren't going to be resuming later from fault_worker, then do +	 * it now. +	 */ +	if (!do_devcoredump) { +		gpu->aspace->mmu->funcs->resume_translation(gpu->aspace->mmu); +	} + +	/* +	 * Print a default message if we couldn't get the data from the +	 * adreno-smmu-priv +	 */ +	if (!info) { +		pr_warn_ratelimited("*** gpu fault: iova=%.16lx flags=%d (%u,%u,%u,%u)\n", +			iova, flags, +			scratch[0], scratch[1], scratch[2], scratch[3]); + +		return 0; +	} + +	if (info->fsr & ARM_SMMU_FSR_TF) +		type = "TRANSLATION"; +	else if (info->fsr & ARM_SMMU_FSR_PF) +		type = "PERMISSION"; +	else if (info->fsr & ARM_SMMU_FSR_EF) +		type = "EXTERNAL"; + +	pr_warn_ratelimited("*** gpu fault: ttbr0=%.16llx iova=%.16lx dir=%s type=%s source=%s (%u,%u,%u,%u)\n", +			info->ttbr0, iova, +			flags & IOMMU_FAULT_WRITE ? "WRITE" : "READ", +			type, block, +			scratch[0], scratch[1], scratch[2], scratch[3]); + +	if (do_devcoredump) { +		/* Turn off the hangcheck timer to keep it from bothering us */ +		del_timer(&gpu->hangcheck_timer); + +		gpu->fault_info.ttbr0 = info->ttbr0; +		gpu->fault_info.iova  = iova; +		gpu->fault_info.flags = flags; +		gpu->fault_info.type  = type; +		gpu->fault_info.block = block; + +		kthread_queue_work(gpu->worker, &gpu->fault_work); +	} + +	return 0; +} +  int adreno_get_param(struct msm_gpu *gpu, struct msm_file_private *ctx,  		     uint32_t param, uint64_t *value, uint32_t *len)  { @@ -503,16 +563,9 @@ struct drm_gem_object *adreno_fw_create_bo(struct msm_gpu *gpu,  int adreno_hw_init(struct msm_gpu *gpu)  { -	struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu); -	int ret, i; -  	VERB("%s", gpu->name); -	ret = adreno_load_fw(adreno_gpu); -	if (ret) -		return ret; - -	for (i = 0; i < gpu->nr_rings; i++) { +	for (int i = 0; i < gpu->nr_rings; i++) {  		struct msm_ringbuffer *ring = gpu->rb[i];  		if (!ring) @@ -922,73 +975,46 @@ void adreno_wait_ring(struct msm_ringbuffer *ring, uint32_t ndwords)  			ring->id);  } -/* Get legacy powerlevels from qcom,gpu-pwrlevels and populate the opp table */ -static int adreno_get_legacy_pwrlevels(struct device *dev) -{ -	struct device_node *child, *node; -	int ret; - -	node = of_get_compatible_child(dev->of_node, "qcom,gpu-pwrlevels"); -	if (!node) { -		DRM_DEV_DEBUG(dev, "Could not find the GPU powerlevels\n"); -		return -ENXIO; -	} - -	for_each_child_of_node(node, child) { -		unsigned int val; - -		ret = of_property_read_u32(child, "qcom,gpu-freq", &val); -		if (ret) -			continue; - -		/* -		 * Skip the intentionally bogus clock value found at the bottom -		 * of most legacy frequency tables -		 */ -		if (val != 27000000) -			dev_pm_opp_add(dev, val, 0); -	} - -	of_node_put(node); - -	return 0; -} - -static void adreno_get_pwrlevels(struct device *dev, +static int adreno_get_pwrlevels(struct device *dev,  		struct msm_gpu *gpu)  { +	struct adreno_gpu *adreno_gpu = to_adreno_gpu(gpu);  	unsigned long freq = ULONG_MAX;  	struct dev_pm_opp *opp;  	int ret;  	gpu->fast_rate = 0; -	/* You down with OPP? */ -	if (!of_find_property(dev->of_node, "operating-points-v2", NULL)) -		ret = adreno_get_legacy_pwrlevels(dev); -	else { -		ret = devm_pm_opp_of_add_table(dev); -		if (ret) -			DRM_DEV_ERROR(dev, "Unable to set the OPP table\n"); -	} - -	if (!ret) { -		/* Find the fastest defined rate */ -		opp = dev_pm_opp_find_freq_floor(dev, &freq); -		if (!IS_ERR(opp)) { -			gpu->fast_rate = freq; -			dev_pm_opp_put(opp); +	/* devm_pm_opp_of_add_table may error out but will still create an OPP table */ +	ret = devm_pm_opp_of_add_table(dev); +	if (ret == -ENODEV) { +		/* Special cases for ancient hw with ancient DT bindings */ +		if (adreno_is_a2xx(adreno_gpu)) { +			dev_warn(dev, "Unable to find the OPP table. Falling back to 200 MHz.\n"); +			dev_pm_opp_add(dev, 200000000, 0); +		} else if (adreno_is_a320(adreno_gpu)) { +			dev_warn(dev, "Unable to find the OPP table. Falling back to 450 MHz.\n"); +			dev_pm_opp_add(dev, 450000000, 0); +		} else { +			DRM_DEV_ERROR(dev, "Unable to find the OPP table\n"); +			return -ENODEV;  		} +	} else if (ret) { +		DRM_DEV_ERROR(dev, "Unable to set the OPP table\n"); +		return ret;  	} -	if (!gpu->fast_rate) { -		dev_warn(dev, -			"Could not find a clock rate. Using a reasonable default\n"); -		/* Pick a suitably safe clock speed for any target */ -		gpu->fast_rate = 200000000; -	} +	/* Find the fastest defined rate */ +	opp = dev_pm_opp_find_freq_floor(dev, &freq); +	if (IS_ERR(opp)) +		return PTR_ERR(opp); + +	gpu->fast_rate = freq; +	dev_pm_opp_put(opp);  	DBG("fast_rate=%u, slow_rate=27000000", gpu->fast_rate); + +	return 0;  }  int adreno_gpu_ocmem_init(struct device *dev, struct adreno_gpu *adreno_gpu, @@ -1046,6 +1072,24 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,  	struct adreno_rev *rev = &config->rev;  	const char *gpu_name;  	u32 speedbin; +	int ret; + +	/* Only handle the core clock when GMU is not in use */ +	if (config->rev.core < 6) { +		/* +		 * This can only be done before devm_pm_opp_of_add_table(), or +		 * dev_pm_opp_set_config() will WARN_ON() +		 */ +		if (IS_ERR(devm_clk_get(dev, "core"))) { +			/* +			 * If "core" is absent, go for the legacy clock name. +			 * If we got this far in probing, it's a given one of +			 * them exists. +			 */ +			devm_pm_opp_set_clkname(dev, "core_clk"); +		} else +			devm_pm_opp_set_clkname(dev, "core"); +	}  	adreno_gpu->funcs = funcs;  	adreno_gpu->info = adreno_info(config->rev); @@ -1070,7 +1114,9 @@ int adreno_gpu_init(struct drm_device *drm, struct platform_device *pdev,  	adreno_gpu_config.nr_rings = nr_rings; -	adreno_get_pwrlevels(dev, gpu); +	ret = adreno_get_pwrlevels(dev, gpu); +	if (ret) +		return ret;  	pm_runtime_set_autosuspend_delay(dev,  		adreno_gpu->info->inactive_period); diff --git a/drivers/gpu/drm/msm/adreno/adreno_gpu.h b/drivers/gpu/drm/msm/adreno/adreno_gpu.h index b4f9b1343d63..f62612a5c70f 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_gpu.h +++ b/drivers/gpu/drm/msm/adreno/adreno_gpu.h @@ -341,6 +341,10 @@ adreno_iommu_create_address_space(struct msm_gpu *gpu,  				  struct platform_device *pdev,  				  unsigned long quirks); +int adreno_fault_handler(struct msm_gpu *gpu, unsigned long iova, int flags, +			 struct adreno_smmu_fault_info *info, const char *block, +			 u32 scratch[4]); +  int adreno_read_speedbin(struct device *dev, u32 *speedbin);  /* diff --git a/drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h b/drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h index 7aecf920f9b9..8a4a2d161a29 100644 --- a/drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h +++ b/drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h @@ -8,21 +8,21 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a2xx.xml                (  90810 bytes, from 2021-06-21 15:24:24) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  14609 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  69086 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2021-11-24 23:05:10) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113358 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149512 bytes, from 2022-01-31 23:06:21) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 184954 bytes, from 2022-03-03 16:41:33) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11331 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   6038 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2924 bytes, from 2021-07-22 15:21:56) - -Copyright (C) 2013-2022 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno.xml                     (    594 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml        (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a2xx.xml                (  91929 bytes, from 2023-02-28 23:52:27) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_common.xml       (  15434 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pm4.xml          (  74995 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a3xx.xml                (  84231 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a4xx.xml                ( 113474 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a5xx.xml                ( 149590 bytes, from 2023-02-14 19:37:12) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx.xml                ( 198949 bytes, from 2023-03-20 18:06:23) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/a6xx_gmu.xml            (  11404 bytes, from 2023-03-10 18:32:53) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/ocmem.xml               (   1773 bytes, from 2022-08-02 16:38:43) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_control_regs.xml (   9055 bytes, from 2023-03-10 18:32:52) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/adreno/adreno_pipe_regs.xml    (   2976 bytes, from 2023-03-10 18:32:52) + +Copyright (C) 2013-2023 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -76,6 +76,10 @@ enum vgt_event_type {  	VS_FETCH_DONE = 27,  	FACENESS_FLUSH = 28,  	WT_DONE_TS = 8, +	START_FRAGMENT_CTRS = 13, +	STOP_FRAGMENT_CTRS = 14, +	START_COMPUTE_CTRS = 15, +	STOP_COMPUTE_CTRS = 16,  	FLUSH_SO_0 = 17,  	FLUSH_SO_1 = 18,  	FLUSH_SO_2 = 19, @@ -86,7 +90,7 @@ enum vgt_event_type {  	PC_CCU_FLUSH_DEPTH_TS = 28,  	PC_CCU_FLUSH_COLOR_TS = 29,  	BLIT = 30, -	UNK_25 = 37, +	LRZ_CLEAR = 37,  	LRZ_FLUSH = 38,  	BLIT_OP_FILL_2D = 39,  	BLIT_OP_COPY_2D = 40, @@ -95,6 +99,20 @@ enum vgt_event_type {  	UNK_2C = 44,  	UNK_2D = 45,  	CACHE_INVALIDATE = 49, +	LABEL = 63, +	CCU_INVALIDATE_DEPTH = 24, +	CCU_INVALIDATE_COLOR = 25, +	CCU_RESOLVE_CLEAN = 26, +	CCU_FLUSH_DEPTH = 28, +	CCU_FLUSH_COLOR = 29, +	CCU_RESOLVE = 30, +	CCU_END_RESOLVE_GROUP = 31, +	CCU_CLEAN_DEPTH = 32, +	CCU_CLEAN_COLOR = 33, +	CACHE_RESET = 48, +	CACHE_CLEAN = 49, +	CACHE_FLUSH7 = 50, +	CACHE_INVALIDATE7 = 51,  };  enum pc_di_primtype { @@ -290,6 +308,9 @@ enum adreno_pm4_type3_packets {  	IN_INCR_UPDT_CONST = 86,  	IN_INCR_UPDT_INSTR = 87,  	PKT4 = 4, +	IN_IB_END = 10, +	IN_GMU_INTERRUPT = 11, +	IN_PREEMPT = 15,  	CP_SCRATCH_WRITE = 76,  	CP_REG_TO_MEM_OFFSET_MEM = 116,  	CP_REG_TO_MEM_OFFSET_REG = 114, @@ -297,10 +318,20 @@ enum adreno_pm4_type3_packets {  	CP_WAIT_TWO_REGS = 112,  	CP_MEMCPY = 117,  	CP_SET_BIN_DATA5_OFFSET = 46, +	CP_CONTEXT_SWITCH = 84,  	CP_SET_CTXSWITCH_IB = 85,  	CP_REG_WRITE = 109,  	CP_START_BIN = 80,  	CP_END_BIN = 81, +	CP_PREEMPT_DISABLE = 108, +	CP_WAIT_TIMESTAMP = 20, +	CP_THREAD_CONTROL = 23, +	CP_CONTEXT_REG_BUNCH2 = 93, +	CP_UNK15 = 21, +	CP_UNK16 = 22, +	CP_UNK18 = 24, +	CP_UNK1B = 27, +	CP_UNK49 = 73,  };  enum adreno_state_block { @@ -480,6 +511,13 @@ enum reg_tracker {  	TRACK_CNTL_REG = 1,  	TRACK_RENDER_CNTL = 2,  	UNK_EVENT_WRITE = 4, +	TRACK_LRZ = 8, +}; + +enum cp_thread { +	CP_SET_THREAD_BR = 1, +	CP_SET_THREAD_BV = 2, +	CP_SET_THREAD_BOTH = 3,  };  #define REG_CP_LOAD_STATE_0					0x00000000 @@ -1256,6 +1294,10 @@ static inline uint32_t CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI(uint32_t val)  	return ((val) << CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI__SHIFT) & CP_SET_BIN_DATA5_6_BIN_PRIM_STRM_HI__MASK;  } +#define REG_CP_SET_BIN_DATA5_7					0x00000007 + +#define REG_CP_SET_BIN_DATA5_9					0x00000009 +  #define REG_CP_SET_BIN_DATA5_OFFSET_0				0x00000000  #define CP_SET_BIN_DATA5_OFFSET_0_VSC_SIZE__MASK		0x003f0000  #define CP_SET_BIN_DATA5_OFFSET_0_VSC_SIZE__SHIFT		16 @@ -2202,7 +2244,18 @@ static inline uint32_t A6XX_CP_REG_TEST_0_BIT(uint32_t val)  {  	return ((val) << A6XX_CP_REG_TEST_0_BIT__SHIFT) & A6XX_CP_REG_TEST_0_BIT__MASK;  } -#define A6XX_CP_REG_TEST_0_WAIT_FOR_ME				0x02000000 +#define A6XX_CP_REG_TEST_0_SKIP_WAIT_FOR_ME			0x02000000 +#define A6XX_CP_REG_TEST_0_PRED_BIT__MASK			0x7c000000 +#define A6XX_CP_REG_TEST_0_PRED_BIT__SHIFT			26 +static inline uint32_t A6XX_CP_REG_TEST_0_PRED_BIT(uint32_t val) +{ +	return ((val) << A6XX_CP_REG_TEST_0_PRED_BIT__SHIFT) & A6XX_CP_REG_TEST_0_PRED_BIT__MASK; +} +#define A6XX_CP_REG_TEST_0_PRED_UPDATE				0x80000000 + +#define REG_A6XX_CP_REG_TEST_PRED_MASK				0x00000001 + +#define REG_A6XX_CP_REG_TEST_PRED_VAL				0x00000002  #define REG_CP_COND_REG_EXEC_0					0x00000000  #define CP_COND_REG_EXEC_0_REG0__MASK				0x0003ffff @@ -2211,6 +2264,12 @@ static inline uint32_t CP_COND_REG_EXEC_0_REG0(uint32_t val)  {  	return ((val) << CP_COND_REG_EXEC_0_REG0__SHIFT) & CP_COND_REG_EXEC_0_REG0__MASK;  } +#define CP_COND_REG_EXEC_0_PRED_BIT__MASK			0x007c0000 +#define CP_COND_REG_EXEC_0_PRED_BIT__SHIFT			18 +static inline uint32_t CP_COND_REG_EXEC_0_PRED_BIT(uint32_t val) +{ +	return ((val) << CP_COND_REG_EXEC_0_PRED_BIT__SHIFT) & CP_COND_REG_EXEC_0_PRED_BIT__MASK; +}  #define CP_COND_REG_EXEC_0_BINNING				0x02000000  #define CP_COND_REG_EXEC_0_GMEM					0x04000000  #define CP_COND_REG_EXEC_0_SYSMEM				0x08000000 @@ -2308,13 +2367,17 @@ static inline uint32_t CP_SET_CTXSWITCH_IB_2_TYPE(enum ctxswitch_ib val)  }  #define REG_CP_REG_WRITE_0					0x00000000 -#define CP_REG_WRITE_0_TRACKER__MASK				0x00000007 +#define CP_REG_WRITE_0_TRACKER__MASK				0x0000000f  #define CP_REG_WRITE_0_TRACKER__SHIFT				0  static inline uint32_t CP_REG_WRITE_0_TRACKER(enum reg_tracker val)  {  	return ((val) << CP_REG_WRITE_0_TRACKER__SHIFT) & CP_REG_WRITE_0_TRACKER__MASK;  } +#define REG_CP_REG_WRITE_1					0x00000001 + +#define REG_CP_REG_WRITE_2					0x00000002 +  #define REG_CP_SMMU_TABLE_UPDATE_0				0x00000000  #define CP_SMMU_TABLE_UPDATE_0_TTBR0_LO__MASK			0xffffffff  #define CP_SMMU_TABLE_UPDATE_0_TTBR0_LO__SHIFT			0 @@ -2361,5 +2424,21 @@ static inline uint32_t CP_SMMU_TABLE_UPDATE_3_CONTEXTBANK(uint32_t val)  #define REG_CP_START_BIN_BODY_DWORDS				0x00000004 +#define REG_CP_WAIT_TIMESTAMP_0					0x00000000 + +#define REG_CP_WAIT_TIMESTAMP_ADDR				0x00000001 + +#define REG_CP_WAIT_TIMESTAMP_TIMESTAMP				0x00000003 + +#define REG_CP_THREAD_CONTROL_0					0x00000000 +#define CP_THREAD_CONTROL_0_THREAD__MASK			0x00000003 +#define CP_THREAD_CONTROL_0_THREAD__SHIFT			0 +static inline uint32_t CP_THREAD_CONTROL_0_THREAD(enum cp_thread val) +{ +	return ((val) << CP_THREAD_CONTROL_0_THREAD__SHIFT) & CP_THREAD_CONTROL_0_THREAD__MASK; +} +#define CP_THREAD_CONTROL_0_CONCURRENT_BIN_DISABLE		0x08000000 +#define CP_THREAD_CONTROL_0_SYNC_THREADS			0x80000000 +  #endif /* ADRENO_PM4_XML */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h new file mode 100644 index 000000000000..bdcd554fc8a8 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_3_0_msm8998.h @@ -0,0 +1,210 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_3_0_MSM8998_H +#define _DPU_3_0_MSM8998_H + +static const struct dpu_caps msm8998_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0x7, +	.qseed_type = DPU_SSPP_SCALER_QSEED3, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +	.max_hdeci_exp = MAX_HORZ_DECIMATION, +	.max_vdeci_exp = MAX_VERT_DECIMATION, +}; + +static const struct dpu_ubwc_cfg msm8998_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_10, +	.highest_bank_bit = 0x2, +}; + +static const struct dpu_mdp_cfg msm8998_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x458, +	.features = 0, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 12 }, +	.clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { .reg_off = 0x3a8, .bit_off = 15 }, +	.clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { .reg_off = 0x3b0, .bit_off = 15 }, +	}, +}; + +static const struct dpu_ctl_cfg msm8998_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x94, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x1200, .len = 0x94, +	.features = 0, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x1400, .len = 0x94, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x1600, .len = 0x94, +	.features = 0, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x1800, .len = 0x94, +	.features = 0, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +}; + +static const struct dpu_sspp_cfg msm8998_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1ac, VIG_MSM8998_MASK, +		msm8998_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1ac, VIG_MSM8998_MASK, +		msm8998_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1ac, VIG_MSM8998_MASK, +		msm8998_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1ac, VIG_MSM8998_MASK, +		msm8998_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1ac, DMA_MSM8998_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1ac, DMA_MSM8998_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1ac, DMA_CURSOR_MSM8998_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1ac, DMA_CURSOR_MSM8998_MASK, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg msm8998_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_MSM8998_MASK, +		&msm8998_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_MSM8998_MASK, +		&msm8998_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_MSM8998_MASK, +		&msm8998_lm_sblk, PINGPONG_2, LM_5, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_MSM8998_MASK, +		&msm8998_lm_sblk, PINGPONG_MAX, 0, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_MSM8998_MASK, +		&msm8998_lm_sblk, PINGPONG_MAX, 0, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_MSM8998_MASK, +		&msm8998_lm_sblk, PINGPONG_3, LM_2, 0), +}; + +static const struct dpu_pingpong_cfg msm8998_pp[] = { +	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +}; + +static const struct dpu_dspp_cfg msm8998_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_MSM8998_MASK, +		 &msm8998_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_MSM8998_MASK, +		 &msm8998_dspp_sblk), +}; + +static const struct dpu_intf_cfg msm8998_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_HDMI, 0, 21, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_perf_cfg msm8998_perf_data = { +	.max_bw_low = 6700000, +	.max_bw_high = 6700000, +	.min_core_ib = 2400000, +	.min_llcc_ib = 800000, +	.min_dram_ib = 800000, +	.undersized_prefill_lines = 2, +	.xtra_prefill_lines = 2, +	.dest_scale_prefill_lines = 3, +	.macrotile_prefill_lines = 4, +	.yuv_nv12_prefill_lines = 8, +	.linear_prefill_lines = 1, +	.downscaling_prefill_lines = 1, +	.amortizable_threshold = 25, +	.min_prefill_lines = 25, +	.danger_lut_tbl = {0xf, 0xffff, 0x0}, +	.safe_lut_tbl = {0xfffc, 0xff00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(msm8998_qos_linear), +		.entries = msm8998_qos_linear +		}, +		{.nentry = ARRAY_SIZE(msm8998_qos_macrotile), +		.entries = msm8998_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(msm8998_qos_nrt), +		.entries = msm8998_qos_nrt +		}, +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 200, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_msm8998_cfg = { +	.caps = &msm8998_dpu_caps, +	.ubwc = &msm8998_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(msm8998_mdp), +	.mdp = msm8998_mdp, +	.ctl_count = ARRAY_SIZE(msm8998_ctl), +	.ctl = msm8998_ctl, +	.sspp_count = ARRAY_SIZE(msm8998_sspp), +	.sspp = msm8998_sspp, +	.mixer_count = ARRAY_SIZE(msm8998_lm), +	.mixer = msm8998_lm, +	.dspp_count = ARRAY_SIZE(msm8998_dspp), +	.dspp = msm8998_dspp, +	.pingpong_count = ARRAY_SIZE(msm8998_pp), +	.pingpong = msm8998_pp, +	.intf_count = ARRAY_SIZE(msm8998_intf), +	.intf = msm8998_intf, +	.vbif_count = ARRAY_SIZE(msm8998_vbif), +	.vbif = msm8998_vbif, +	.reg_dma_count = 0, +	.perf = &msm8998_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_INTR) | \ +		     BIT(MDP_INTF1_INTR) | \ +		     BIT(MDP_INTF2_INTR) | \ +		     BIT(MDP_INTF3_INTR) | \ +		     BIT(MDP_INTF4_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h new file mode 100644 index 000000000000..ceca741e93c9 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_4_0_sdm845.h @@ -0,0 +1,210 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_4_0_SDM845_H +#define _DPU_4_0_SDM845_H + +static const struct dpu_caps sdm845_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED3, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +	.max_hdeci_exp = MAX_HORZ_DECIMATION, +	.max_vdeci_exp = MAX_VERT_DECIMATION, +}; + +static const struct dpu_ubwc_cfg sdm845_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_20, +	.highest_bank_bit = 0x2, +}; + +static const struct dpu_mdp_cfg sdm845_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x45c, +	.features = BIT(DPU_MDP_AUDIO_SELECT), +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	}, +}; + +static const struct dpu_ctl_cfg sdm845_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0xe4, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x1200, .len = 0xe4, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x1400, .len = 0xe4, +	.features = 0, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x1600, .len = 0xe4, +	.features = 0, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x1800, .len = 0xe4, +	.features = 0, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +}; + +static const struct dpu_sspp_cfg sdm845_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1c8, VIG_SDM845_MASK_SDMA, +		sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1c8, VIG_SDM845_MASK_SDMA, +		sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1c8, VIG_SDM845_MASK_SDMA, +		sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1c8, VIG_SDM845_MASK_SDMA, +		sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1c8, DMA_SDM845_MASK_SDMA, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1c8, DMA_SDM845_MASK_SDMA, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1c8, DMA_CURSOR_SDM845_MASK_SDMA, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1c8, DMA_CURSOR_SDM845_MASK_SDMA, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sdm845_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, 0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, 0), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_5, 0), +	LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_MAX, 0, 0), +	LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_MAX, 0, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +}; + +static const struct dpu_pingpong_cfg sdm845_pp[] = { +	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +}; + +static const struct dpu_dsc_cfg sdm845_dsc[] = { +	DSC_BLK("dsc_0", DSC_0, 0x80000, 0), +	DSC_BLK("dsc_1", DSC_1, 0x80400, 0), +	DSC_BLK("dsc_2", DSC_2, 0x80800, 0), +	DSC_BLK("dsc_3", DSC_3, 0x80c00, 0), +}; + +static const struct dpu_intf_cfg sdm845_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x280, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x6b000, 0x280, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_perf_cfg sdm845_perf_data = { +	.max_bw_low = 6800000, +	.max_bw_high = 6800000, +	.min_core_ib = 2400000, +	.min_llcc_ib = 800000, +	.min_dram_ib = 800000, +	.undersized_prefill_lines = 2, +	.xtra_prefill_lines = 2, +	.dest_scale_prefill_lines = 3, +	.macrotile_prefill_lines = 4, +	.yuv_nv12_prefill_lines = 8, +	.linear_prefill_lines = 1, +	.downscaling_prefill_lines = 1, +	.amortizable_threshold = 25, +	.min_prefill_lines = 24, +	.danger_lut_tbl = {0xf, 0xffff, 0x0}, +	.safe_lut_tbl = {0xfff0, 0xf000, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sdm845_qos_linear), +		.entries = sdm845_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sdm845_qos_macrotile), +		.entries = sdm845_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sdm845_qos_nrt), +		.entries = sdm845_qos_nrt +		}, +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sdm845_cfg = { +	.caps = &sdm845_dpu_caps, +	.ubwc = &sdm845_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sdm845_mdp), +	.mdp = sdm845_mdp, +	.ctl_count = ARRAY_SIZE(sdm845_ctl), +	.ctl = sdm845_ctl, +	.sspp_count = ARRAY_SIZE(sdm845_sspp), +	.sspp = sdm845_sspp, +	.mixer_count = ARRAY_SIZE(sdm845_lm), +	.mixer = sdm845_lm, +	.pingpong_count = ARRAY_SIZE(sdm845_pp), +	.pingpong = sdm845_pp, +	.dsc_count = ARRAY_SIZE(sdm845_dsc), +	.dsc = sdm845_dsc, +	.intf_count = ARRAY_SIZE(sdm845_intf), +	.intf = sdm845_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sdm845_regdma, +	.perf = &sdm845_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_INTR) | \ +		     BIT(MDP_INTF1_INTR) | \ +		     BIT(MDP_INTF2_INTR) | \ +		     BIT(MDP_INTF3_INTR) | \ +		     BIT(MDP_AD4_0_INTR) | \ +		     BIT(MDP_AD4_1_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h new file mode 100644 index 000000000000..42b0e58624d0 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_0_sm8150.h @@ -0,0 +1,237 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_5_0_SM8150_H +#define _DPU_5_0_SM8150_H + +static const struct dpu_caps sm8150_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED3, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 4096, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +	.max_hdeci_exp = MAX_HORZ_DECIMATION, +	.max_vdeci_exp = MAX_VERT_DECIMATION, +}; + +static const struct dpu_ubwc_cfg sm8150_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_30, +	.highest_bank_bit = 0x2, +}; + +static const struct dpu_mdp_cfg sm8150_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x45c, +	.features = BIT(DPU_MDP_AUDIO_SELECT), +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	}, +}; + +/* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ +static const struct dpu_ctl_cfg sm8150_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x1200, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x1400, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x1600, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x1800, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a00, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sm8150_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f0, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f0, DMA_SDM845_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f0, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f0, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sm8150_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_dspp_cfg sm8150_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sm8150_pp[] = { +	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +	PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), +			-1), +	PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), +			-1), +}; + +static const struct dpu_merge_3d_cfg sm8150_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), +}; + +static const struct dpu_dsc_cfg sm8150_dsc[] = { +	DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)), +	DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)), +	DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)), +	DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)), +}; + +static const struct dpu_intf_cfg sm8150_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_perf_cfg sm8150_perf_data = { +	.max_bw_low = 12800000, +	.max_bw_high = 12800000, +	.min_core_ib = 2400000, +	.min_llcc_ib = 800000, +	.min_dram_ib = 800000, +	.min_prefill_lines = 24, +	.danger_lut_tbl = {0xf, 0xffff, 0x0}, +	.safe_lut_tbl = {0xfff8, 0xf000, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sm8150_qos_linear), +		.entries = sm8150_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm8150_cfg = { +	.caps = &sm8150_dpu_caps, +	.ubwc = &sm8150_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sm8150_mdp), +	.mdp = sm8150_mdp, +	.ctl_count = ARRAY_SIZE(sm8150_ctl), +	.ctl = sm8150_ctl, +	.sspp_count = ARRAY_SIZE(sm8150_sspp), +	.sspp = sm8150_sspp, +	.mixer_count = ARRAY_SIZE(sm8150_lm), +	.mixer = sm8150_lm, +	.dspp_count = ARRAY_SIZE(sm8150_dspp), +	.dspp = sm8150_dspp, +	.dsc_count = ARRAY_SIZE(sm8150_dsc), +	.dsc = sm8150_dsc, +	.pingpong_count = ARRAY_SIZE(sm8150_pp), +	.pingpong = sm8150_pp, +	.merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), +	.merge_3d = sm8150_merge_3d, +	.intf_count = ARRAY_SIZE(sm8150_intf), +	.intf = sm8150_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sm8150_regdma, +	.perf = &sm8150_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_INTR) | \ +		     BIT(MDP_INTF1_INTR) | \ +		     BIT(MDP_INTF2_INTR) | \ +		     BIT(MDP_INTF3_INTR) | \ +		     BIT(MDP_AD4_0_INTR) | \ +		     BIT(MDP_AD4_1_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h new file mode 100644 index 000000000000..e3bdfe7b30f1 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_5_1_sc8180x.h @@ -0,0 +1,217 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_5_1_SC8180X_H +#define _DPU_5_1_SC8180X_H + +static const struct dpu_caps sc8180x_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED3, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 4096, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +	.max_hdeci_exp = MAX_HORZ_DECIMATION, +	.max_vdeci_exp = MAX_VERT_DECIMATION, +}; + +static const struct dpu_ubwc_cfg sc8180x_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_30, +	.highest_bank_bit = 0x3, +}; + +static const struct dpu_mdp_cfg sc8180x_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x45c, +	.features = BIT(DPU_MDP_AUDIO_SELECT), +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	}, +}; + +static const struct dpu_ctl_cfg sc8180x_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x1200, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x1400, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x1600, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x1800, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a00, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sc8180x_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f0, VIG_SDM845_MASK, +		sdm845_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f0, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f0, DMA_SDM845_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f0, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f0, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sc8180x_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, 0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, 0), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_pingpong_cfg sc8180x_pp[] = { +	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +	PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), +			-1), +	PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), +			-1), +}; + +static const struct dpu_merge_3d_cfg sc8180x_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), +}; + +static const struct dpu_intf_cfg sc8180x_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2bc, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2bc, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	/* INTF_3 is for MST, wired to INTF_DP 0 and 1, use dummy index until this is supported */ +	INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +	INTF_BLK("intf_4", INTF_4, 0x6c000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21), +	INTF_BLK("intf_5", INTF_5, 0x6c800, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23), +}; + +static const struct dpu_perf_cfg sc8180x_perf_data = { +	.max_bw_low = 9600000, +	.max_bw_high = 9600000, +	.min_core_ib = 2400000, +	.min_llcc_ib = 800000, +	.min_dram_ib = 800000, +	.danger_lut_tbl = {0xf, 0xffff, 0x0}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sc8180x_cfg = { +	.caps = &sc8180x_dpu_caps, +	.ubwc = &sc8180x_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sc8180x_mdp), +	.mdp = sc8180x_mdp, +	.ctl_count = ARRAY_SIZE(sc8180x_ctl), +	.ctl = sc8180x_ctl, +	.sspp_count = ARRAY_SIZE(sc8180x_sspp), +	.sspp = sc8180x_sspp, +	.mixer_count = ARRAY_SIZE(sc8180x_lm), +	.mixer = sc8180x_lm, +	.pingpong_count = ARRAY_SIZE(sc8180x_pp), +	.pingpong = sc8180x_pp, +	.merge_3d_count = ARRAY_SIZE(sc8180x_merge_3d), +	.merge_3d = sc8180x_merge_3d, +	.intf_count = ARRAY_SIZE(sc8180x_intf), +	.intf = sc8180x_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sm8150_regdma, +	.perf = &sc8180x_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_INTR) | \ +		     BIT(MDP_INTF1_INTR) | \ +		     BIT(MDP_INTF2_INTR) | \ +		     BIT(MDP_INTF3_INTR) | \ +		     BIT(MDP_INTF4_INTR) | \ +		     BIT(MDP_INTF5_INTR) | \ +		     BIT(MDP_AD4_0_INTR) | \ +		     BIT(MDP_AD4_1_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h new file mode 100644 index 000000000000..ed130582873c --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_0_sm8250.h @@ -0,0 +1,244 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_6_0_SM8250_H +#define _DPU_6_0_SM8250_H + +static const struct dpu_caps sm8250_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 4096, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sm8250_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_40, +	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ +	.ubwc_swizzle = 0x6, +}; + +static const struct dpu_mdp_cfg sm8250_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = 0, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, +	.clk_ctrls[DPU_CLK_CTRL_WB2] = { .reg_off = 0x3b8, .bit_off = 24 }, +	}, +}; + +/* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ +static const struct dpu_ctl_cfg sm8250_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x1200, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x1400, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x1600, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x1800, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a00, .len = 0x1e0, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sm8250_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK_SDMA, +		sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f8, VIG_SC7180_MASK_SDMA, +		sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f8, VIG_SC7180_MASK_SDMA, +		sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f8, VIG_SC7180_MASK_SDMA, +		sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK_SDMA, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_SDM845_MASK_SDMA, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sm8250_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_dspp_cfg sm8250_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sm8250_pp[] = { +	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +	PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), +			-1), +	PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), +			-1), +}; + +static const struct dpu_merge_3d_cfg sm8250_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), +}; + +static const struct dpu_dsc_cfg sm8250_dsc[] = { +	DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)), +	DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)), +	DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)), +	DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)), +}; + +static const struct dpu_intf_cfg sm8250_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x6b000, 0x2c0, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x6b800, 0x280, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_wb_cfg sm8250_wb[] = { +	WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6, +			VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4), +}; + +static const struct dpu_perf_cfg sm8250_perf_data = { +	.max_bw_low = 13700000, +	.max_bw_high = 16600000, +	.min_core_ib = 4800000, +	.min_llcc_ib = 0, +	.min_dram_ib = 800000, +	.min_prefill_lines = 35, +	.danger_lut_tbl = {0xf, 0xffff, 0x0}, +	.safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm8250_cfg = { +	.caps = &sm8250_dpu_caps, +	.ubwc = &sm8250_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sm8250_mdp), +	.mdp = sm8250_mdp, +	.ctl_count = ARRAY_SIZE(sm8250_ctl), +	.ctl = sm8250_ctl, +	.sspp_count = ARRAY_SIZE(sm8250_sspp), +	.sspp = sm8250_sspp, +	.mixer_count = ARRAY_SIZE(sm8250_lm), +	.mixer = sm8250_lm, +	.dspp_count = ARRAY_SIZE(sm8250_dspp), +	.dspp = sm8250_dspp, +	.dsc_count = ARRAY_SIZE(sm8250_dsc), +	.dsc = sm8250_dsc, +	.pingpong_count = ARRAY_SIZE(sm8250_pp), +	.pingpong = sm8250_pp, +	.merge_3d_count = ARRAY_SIZE(sm8250_merge_3d), +	.merge_3d = sm8250_merge_3d, +	.intf_count = ARRAY_SIZE(sm8250_intf), +	.intf = sm8250_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.wb_count = ARRAY_SIZE(sm8250_wb), +	.wb = sm8250_wb, +	.reg_dma_count = 1, +	.dma_cfg = &sm8250_regdma, +	.perf = &sm8250_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_INTR) | \ +		     BIT(MDP_INTF1_INTR) | \ +		     BIT(MDP_INTF2_INTR) | \ +		     BIT(MDP_INTF3_INTR) | \ +		     BIT(MDP_INTF4_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h new file mode 100644 index 000000000000..a46b11730a4d --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_2_sc7180.h @@ -0,0 +1,156 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_6_2_SC7180_H +#define _DPU_6_2_SC7180_H + +static const struct dpu_caps sc7180_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0x9, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sc7180_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_20, +	.highest_bank_bit = 0x3, +}; + +static const struct dpu_mdp_cfg sc7180_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = 0, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_WB2] = { .reg_off = 0x3b8, .bit_off = 24 }, +	}, +}; + +static const struct dpu_ctl_cfg sc7180_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x1dc, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x1200, .len = 0x1dc, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x1400, .len = 0x1dc, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +}; + +static const struct dpu_sspp_cfg sc7180_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, +		sc7180_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +}; + +static const struct dpu_lm_cfg sc7180_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sc7180_lm_sblk, PINGPONG_1, LM_0, 0), +}; + +static const struct dpu_dspp_cfg sc7180_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sc7180_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sc7180_pp[] = { +	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, -1, -1), +	PP_BLK("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk, -1, -1), +}; + +static const struct dpu_intf_cfg sc7180_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x6a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +}; + +static const struct dpu_wb_cfg sc7180_wb[] = { +	WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6, +			VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4), +}; + +static const struct dpu_perf_cfg sc7180_perf_data = { +	.max_bw_low = 6800000, +	.max_bw_high = 6800000, +	.min_core_ib = 2400000, +	.min_llcc_ib = 800000, +	.min_dram_ib = 1600000, +	.min_prefill_lines = 24, +	.danger_lut_tbl = {0xff, 0xffff, 0x0}, +	.safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sc7180_cfg = { +	.caps = &sc7180_dpu_caps, +	.ubwc = &sc7180_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sc7180_mdp), +	.mdp = sc7180_mdp, +	.ctl_count = ARRAY_SIZE(sc7180_ctl), +	.ctl = sc7180_ctl, +	.sspp_count = ARRAY_SIZE(sc7180_sspp), +	.sspp = sc7180_sspp, +	.mixer_count = ARRAY_SIZE(sc7180_lm), +	.mixer = sc7180_lm, +	.dspp_count = ARRAY_SIZE(sc7180_dspp), +	.dspp = sc7180_dspp, +	.pingpong_count = ARRAY_SIZE(sc7180_pp), +	.pingpong = sc7180_pp, +	.intf_count = ARRAY_SIZE(sc7180_intf), +	.intf = sc7180_intf, +	.wb_count = ARRAY_SIZE(sc7180_wb), +	.wb = sc7180_wb, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sdm845_regdma, +	.perf = &sc7180_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_INTR) | \ +		     BIT(MDP_INTF1_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h new file mode 100644 index 000000000000..988d820f7ef2 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_3_sm6115.h @@ -0,0 +1,128 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_6_3_SM6115_H +#define _DPU_6_3_SM6115_H + +static const struct dpu_caps sm6115_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_LINE_WIDTH, +	.max_mixer_blendstages = 0x4, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.max_linewidth = 2160, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sm6115_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_10, +	.highest_bank_bit = 0x1, +	.ubwc_swizzle = 0x7, +}; + +static const struct dpu_mdp_cfg sm6115_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = 0, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	}, +}; + +static const struct dpu_ctl_cfg sm6115_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x1dc, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +}; + +static const struct dpu_sspp_cfg sm6115_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, +		sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +}; + +static const struct dpu_lm_cfg sm6115_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK, +		&qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0), +}; + +static const struct dpu_dspp_cfg sm6115_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sm6115_pp[] = { +	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, +		DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +		DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +}; + +static const struct dpu_intf_cfg sm6115_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0, 0), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +}; + +static const struct dpu_perf_cfg sm6115_perf_data = { +	.max_bw_low = 3100000, +	.max_bw_high = 4000000, +	.min_core_ib = 2400000, +	.min_llcc_ib = 800000, +	.min_dram_ib = 800000, +	.min_prefill_lines = 24, +	.danger_lut_tbl = {0xff, 0xffff, 0x0}, +	.safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm6115_cfg = { +	.caps = &sm6115_dpu_caps, +	.ubwc = &sm6115_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sm6115_mdp), +	.mdp = sm6115_mdp, +	.ctl_count = ARRAY_SIZE(sm6115_ctl), +	.ctl = sm6115_ctl, +	.sspp_count = ARRAY_SIZE(sm6115_sspp), +	.sspp = sm6115_sspp, +	.mixer_count = ARRAY_SIZE(sm6115_lm), +	.mixer = sm6115_lm, +	.dspp_count = ARRAY_SIZE(sm6115_dspp), +	.dspp = sm6115_dspp, +	.pingpong_count = ARRAY_SIZE(sm6115_pp), +	.pingpong = sm6115_pp, +	.intf_count = ARRAY_SIZE(sm6115_intf), +	.intf = sm6115_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.perf = &sm6115_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF1_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h new file mode 100644 index 000000000000..c9003dcc1a59 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_6_5_qcm2290.h @@ -0,0 +1,118 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_6_5_QCM2290_H +#define _DPU_6_5_QCM2290_H + +static const struct dpu_caps qcm2290_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_LINE_WIDTH, +	.max_mixer_blendstages = 0x4, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.max_linewidth = 2160, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg qcm2290_ubwc_cfg = { +	.highest_bank_bit = 0x2, +}; + +static const struct dpu_mdp_cfg qcm2290_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = 0, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	}, +}; + +static const struct dpu_ctl_cfg qcm2290_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x1000, .len = 0x1dc, +	.features = BIT(DPU_CTL_ACTIVE_CFG), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +}; + +static const struct dpu_sspp_cfg qcm2290_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_QCM2290_MASK, +		 qcm2290_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, +		 qcm2290_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +}; + +static const struct dpu_lm_cfg qcm2290_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK, +		&qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0), +}; + +static const struct dpu_dspp_cfg qcm2290_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg qcm2290_pp[] = { +	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, +		DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +		DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +}; + +static const struct dpu_intf_cfg qcm2290_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x00000, 0x280, INTF_NONE, 0, 0, 0, 0, 0, 0), +	INTF_BLK("intf_1", INTF_1, 0x6a800, 0x2c0, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +}; + +static const struct dpu_perf_cfg qcm2290_perf_data = { +	.max_bw_low = 2700000, +	.max_bw_high = 2700000, +	.min_core_ib = 1300000, +	.min_llcc_ib = 0, +	.min_dram_ib = 1600000, +	.min_prefill_lines = 24, +	.danger_lut_tbl = {0xff, 0x0, 0x0}, +	.safe_lut_tbl = {0xfff0, 0x0, 0x0}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(qcm2290_qos_linear), +		.entries = qcm2290_qos_linear +		}, +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_qcm2290_cfg = { +	.caps = &qcm2290_dpu_caps, +	.ubwc = &qcm2290_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(qcm2290_mdp), +	.mdp = qcm2290_mdp, +	.ctl_count = ARRAY_SIZE(qcm2290_ctl), +	.ctl = qcm2290_ctl, +	.sspp_count = ARRAY_SIZE(qcm2290_sspp), +	.sspp = qcm2290_sspp, +	.mixer_count = ARRAY_SIZE(qcm2290_lm), +	.mixer = qcm2290_lm, +	.dspp_count = ARRAY_SIZE(qcm2290_dspp), +	.dspp = qcm2290_dspp, +	.pingpong_count = ARRAY_SIZE(qcm2290_pp), +	.pingpong = qcm2290_pp, +	.intf_count = ARRAY_SIZE(qcm2290_intf), +	.intf = qcm2290_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.perf = &qcm2290_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF1_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h new file mode 100644 index 000000000000..4f6a965bcd90 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h @@ -0,0 +1,226 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_7_0_SM8350_H +#define _DPU_7_0_SM8350_H + +static const struct dpu_caps sm8350_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 4096, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sm8350_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_40, +	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ +}; + +static const struct dpu_mdp_cfg sm8350_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = 0, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, +	}, +}; + +/* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ +static const struct dpu_ctl_cfg sm8350_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x15000, .len = 0x1e8, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x16000, .len = 0x1e8, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x17000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x18000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x19000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sm8350_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7180_MASK, +		sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x1f8, VIG_SC7180_MASK, +		sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x1f8, VIG_SC7180_MASK, +		sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x1f8, VIG_SC7180_MASK, +		sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_SDM845_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x1f8, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sm8350_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_dspp_cfg sm8350_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sm8350_pp[] = { +	PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +	PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), +			-1), +	PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), +			-1), +}; + +static const struct dpu_merge_3d_cfg sm8350_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), +}; + +static const struct dpu_intf_cfg sm8350_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x36000, 0x2c4, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_perf_cfg sm8350_perf_data = { +	.max_bw_low = 11800000, +	.max_bw_high = 15500000, +	.min_core_ib = 2500000, +	.min_llcc_ib = 0, +	.min_dram_ib = 800000, +	.min_prefill_lines = 40, +	/* FIXME: lut tables */ +	.danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, +	.safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm8350_cfg = { +	.caps = &sm8350_dpu_caps, +	.ubwc = &sm8350_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sm8350_mdp), +	.mdp = sm8350_mdp, +	.ctl_count = ARRAY_SIZE(sm8350_ctl), +	.ctl = sm8350_ctl, +	.sspp_count = ARRAY_SIZE(sm8350_sspp), +	.sspp = sm8350_sspp, +	.mixer_count = ARRAY_SIZE(sm8350_lm), +	.mixer = sm8350_lm, +	.dspp_count = ARRAY_SIZE(sm8350_dspp), +	.dspp = sm8350_dspp, +	.pingpong_count = ARRAY_SIZE(sm8350_pp), +	.pingpong = sm8350_pp, +	.merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), +	.merge_3d = sm8350_merge_3d, +	.intf_count = ARRAY_SIZE(sm8350_intf), +	.intf = sm8350_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sm8350_regdma, +	.perf = &sm8350_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_7xxx_INTR) | \ +		     BIT(MDP_INTF1_7xxx_INTR) | \ +		     BIT(MDP_INTF2_7xxx_INTR) | \ +		     BIT(MDP_INTF3_7xxx_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h new file mode 100644 index 000000000000..6b2c7eae71d9 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_2_sc7280.h @@ -0,0 +1,158 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_7_2_SC7280_H +#define _DPU_7_2_SC7280_H + +static const struct dpu_caps sc7280_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0x7, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.max_linewidth = 2400, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sc7280_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_30, +	.highest_bank_bit = 0x1, +	.ubwc_swizzle = 0x6, +}; + +static const struct dpu_mdp_cfg sc7280_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x2014, +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2c4, .bit_off = 8 }, +	}, +}; + +static const struct dpu_ctl_cfg sc7280_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x15000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x16000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x17000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x18000, .len = 0x1e8, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +}; + +static const struct dpu_sspp_cfg sc7280_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x1f8, VIG_SC7280_MASK_SDMA, +		sc7280_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x1f8, DMA_SDM845_MASK_SDMA, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x1f8, DMA_CURSOR_SDM845_MASK_SDMA, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +}; + +static const struct dpu_lm_cfg sc7280_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sc7180_lm_sblk, PINGPONG_0, 0, DSPP_0), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sc7180_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sc7180_lm_sblk, PINGPONG_3, LM_2, 0), +}; + +static const struct dpu_dspp_cfg sc7280_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sc7180_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sc7280_pp[] = { +	PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1), +	PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1), +	PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1), +	PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1), +}; + +static const struct dpu_intf_cfg sc7280_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x35000, 0x2c4, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), +}; + +static const struct dpu_perf_cfg sc7280_perf_data = { +	.max_bw_low = 4700000, +	.max_bw_high = 8800000, +	.min_core_ib = 2500000, +	.min_llcc_ib = 0, +	.min_dram_ib = 1600000, +	.min_prefill_lines = 24, +	.danger_lut_tbl = {0xffff, 0xffff, 0x0}, +	.safe_lut_tbl = {0xff00, 0xff00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sc7280_cfg = { +	.caps = &sc7280_dpu_caps, +	.ubwc = &sc7280_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sc7280_mdp), +	.mdp = sc7280_mdp, +	.ctl_count = ARRAY_SIZE(sc7280_ctl), +	.ctl = sc7280_ctl, +	.sspp_count = ARRAY_SIZE(sc7280_sspp), +	.sspp = sc7280_sspp, +	.dspp_count = ARRAY_SIZE(sc7280_dspp), +	.dspp = sc7280_dspp, +	.mixer_count = ARRAY_SIZE(sc7280_lm), +	.mixer = sc7280_lm, +	.pingpong_count = ARRAY_SIZE(sc7280_pp), +	.pingpong = sc7280_pp, +	.intf_count = ARRAY_SIZE(sc7280_intf), +	.intf = sc7280_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.perf = &sc7280_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_7xxx_INTR) | \ +		     BIT(MDP_INTF1_7xxx_INTR) | \ +		     BIT(MDP_INTF5_7xxx_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h new file mode 100644 index 000000000000..706d0f13b598 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h @@ -0,0 +1,222 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_8_0_SC8280XP_H +#define _DPU_8_0_SC8280XP_H + +static const struct dpu_caps sc8280xp_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 11, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 5120, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sc8280xp_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_40, +	.highest_bank_bit = 2, +	.ubwc_swizzle = 6, +}; + +static const struct dpu_mdp_cfg sc8280xp_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = BIT(DPU_MDP_PERIPH_0_REMOVED), +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, +	}, +}; + +static const struct dpu_ctl_cfg sc8280xp_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x15000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x16000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x17000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x18000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x19000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sc8280xp_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x2ac, VIG_SC7180_MASK, +		 sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x2ac, VIG_SC7180_MASK, +		 sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x2ac, VIG_SC7180_MASK, +		 sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x2ac, VIG_SC7180_MASK, +		 sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x2ac, DMA_SDM845_MASK, +		 sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x2ac, DMA_SDM845_MASK, +		 sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x2ac, DMA_CURSOR_SDM845_MASK, +		 sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x2ac, DMA_CURSOR_SDM845_MASK, +		 sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sc8280xp_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_2, LM_3, DSPP_2), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_3, LM_2, DSPP_3), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_dspp_cfg sc8280xp_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; + +static const struct dpu_pingpong_cfg sc8280xp_pp[] = { +	PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1), +	PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1), +	PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1), +	PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1), +	PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1), +	PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1), +}; + +static const struct dpu_merge_3d_cfg sc8280xp_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), +}; + +/* TODO: INTF 3, 8 and 7 are used for MST, marked as INTF_NONE for now */ +static const struct dpu_intf_cfg sc8280xp_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +	INTF_BLK("intf_4", INTF_4, 0x38000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21), +	INTF_BLK("intf_5", INTF_5, 0x39000, 0x280, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), +	INTF_BLK("intf_6", INTF_6, 0x3a000, 0x280, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17), +	INTF_BLK("intf_7", INTF_7, 0x3b000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19), +	INTF_BLK("intf_8", INTF_8, 0x3c000, 0x280, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13), +}; + +static const struct dpu_perf_cfg sc8280xp_perf_data = { +	.max_bw_low = 13600000, +	.max_bw_high = 18200000, +	.min_core_ib = 2500000, +	.min_llcc_ib = 0, +	.min_dram_ib = 800000, +	.danger_lut_tbl = {0xf, 0xffff, 0x0}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc8180x_qos_linear), +		.entries = sc8180x_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc8180x_qos_macrotile), +		.entries = sc8180x_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sc8280xp_cfg = { +	.caps = &sc8280xp_dpu_caps, +	.ubwc = &sc8280xp_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sc8280xp_mdp), +	.mdp = sc8280xp_mdp, +	.ctl_count = ARRAY_SIZE(sc8280xp_ctl), +	.ctl = sc8280xp_ctl, +	.sspp_count = ARRAY_SIZE(sc8280xp_sspp), +	.sspp = sc8280xp_sspp, +	.mixer_count = ARRAY_SIZE(sc8280xp_lm), +	.mixer = sc8280xp_lm, +	.dspp_count = ARRAY_SIZE(sc8280xp_dspp), +	.dspp = sc8280xp_dspp, +	.pingpong_count = ARRAY_SIZE(sc8280xp_pp), +	.pingpong = sc8280xp_pp, +	.merge_3d_count = ARRAY_SIZE(sc8280xp_merge_3d), +	.merge_3d = sc8280xp_merge_3d, +	.intf_count = ARRAY_SIZE(sc8280xp_intf), +	.intf = sc8280xp_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sc8280xp_regdma, +	.perf = &sc8280xp_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_7xxx_INTR) | \ +		     BIT(MDP_INTF1_7xxx_INTR) | \ +		     BIT(MDP_INTF2_7xxx_INTR) | \ +		     BIT(MDP_INTF3_7xxx_INTR) | \ +		     BIT(MDP_INTF4_7xxx_INTR) | \ +		     BIT(MDP_INTF5_7xxx_INTR) | \ +		     BIT(MDP_INTF6_7xxx_INTR) | \ +		     BIT(MDP_INTF7_7xxx_INTR) | \ +		     BIT(MDP_INTF8_7xxx_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h new file mode 100644 index 000000000000..4ecb3df5cbc0 --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h @@ -0,0 +1,234 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_8_1_SM8450_H +#define _DPU_8_1_SM8450_H + +static const struct dpu_caps sm8450_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 5120, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sm8450_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_40, +	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ +	.ubwc_swizzle = 0x6, +}; + +static const struct dpu_mdp_cfg sm8450_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0x0, .len = 0x494, +	.features = BIT(DPU_MDP_PERIPH_0_REMOVED), +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, +	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, +	}, +}; + +/* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ +static const struct dpu_ctl_cfg sm8450_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x15000, .len = 0x204, +	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x16000, .len = 0x204, +	.features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x17000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x18000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x19000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a000, .len = 0x204, +	.features = CTL_SC7280_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sm8450_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x32c, VIG_SC7180_MASK, +		sm8250_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x32c, VIG_SC7180_MASK, +		sm8250_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x32c, VIG_SC7180_MASK, +		sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x32c, VIG_SC7180_MASK, +		sm8250_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x32c, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x32c, DMA_SDM845_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x32c, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x32c, DMA_CURSOR_SDM845_MASK, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +}; + +static const struct dpu_lm_cfg sm8450_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_dspp_cfg sm8450_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; +/* FIXME: interrupts */ +static const struct dpu_pingpong_cfg sm8450_pp[] = { +	PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), +	PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), +	PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), +	PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), +	PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), +			-1), +	PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), +			-1), +	PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sc7280_pp_sblk, +			-1, +			-1), +	PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sc7280_pp_sblk, +			-1, +			-1), +}; + +static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), +	MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x65f00), +}; + +static const struct dpu_intf_cfg sm8450_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_perf_cfg sm8450_perf_data = { +	.max_bw_low = 13600000, +	.max_bw_high = 18200000, +	.min_core_ib = 2500000, +	.min_llcc_ib = 0, +	.min_dram_ib = 800000, +	.min_prefill_lines = 35, +	/* FIXME: lut tables */ +	.danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, +	.safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm8450_cfg = { +	.caps = &sm8450_dpu_caps, +	.ubwc = &sm8450_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sm8450_mdp), +	.mdp = sm8450_mdp, +	.ctl_count = ARRAY_SIZE(sm8450_ctl), +	.ctl = sm8450_ctl, +	.sspp_count = ARRAY_SIZE(sm8450_sspp), +	.sspp = sm8450_sspp, +	.mixer_count = ARRAY_SIZE(sm8450_lm), +	.mixer = sm8450_lm, +	.dspp_count = ARRAY_SIZE(sm8450_dspp), +	.dspp = sm8450_dspp, +	.pingpong_count = ARRAY_SIZE(sm8450_pp), +	.pingpong = sm8450_pp, +	.merge_3d_count = ARRAY_SIZE(sm8450_merge_3d), +	.merge_3d = sm8450_merge_3d, +	.intf_count = ARRAY_SIZE(sm8450_intf), +	.intf = sm8450_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sm8450_regdma, +	.perf = &sm8450_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_7xxx_INTR) | \ +		     BIT(MDP_INTF1_7xxx_INTR) | \ +		     BIT(MDP_INTF2_7xxx_INTR) | \ +		     BIT(MDP_INTF3_7xxx_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h new file mode 100644 index 000000000000..d0ab351b6a8b --- /dev/null +++ b/drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h @@ -0,0 +1,239 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2022. Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2015-2018, 2020 The Linux Foundation. All rights reserved. + */ + +#ifndef _DPU_9_0_SM8550_H +#define _DPU_9_0_SM8550_H + +static const struct dpu_caps sm8550_dpu_caps = { +	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, +	.max_mixer_blendstages = 0xb, +	.qseed_type = DPU_SSPP_SCALER_QSEED4, +	.has_src_split = true, +	.has_dim_layer = true, +	.has_idle_pc = true, +	.has_3d_merge = true, +	.max_linewidth = 5120, +	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, +}; + +static const struct dpu_ubwc_cfg sm8550_ubwc_cfg = { +	.ubwc_version = DPU_HW_UBWC_VER_40, +	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ +}; + +static const struct dpu_mdp_cfg sm8550_mdp[] = { +	{ +	.name = "top_0", .id = MDP_TOP, +	.base = 0, .len = 0x494, +	.features = BIT(DPU_MDP_PERIPH_0_REMOVED), +	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x4330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x6330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x8330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0xa330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x24330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x26330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x28330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2a330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA4] = { .reg_off = 0x2c330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_DMA5] = { .reg_off = 0x2e330, .bit_off = 0 }, +	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, +	}, +}; + +/* FIXME: get rid of DPU_CTL_SPLIT_DISPLAY in favour of proper ACTIVE_CTL support */ +static const struct dpu_ctl_cfg sm8550_ctl[] = { +	{ +	.name = "ctl_0", .id = CTL_0, +	.base = 0x15000, .len = 0x290, +	.features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), +	}, +	{ +	.name = "ctl_1", .id = CTL_1, +	.base = 0x16000, .len = 0x290, +	.features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), +	}, +	{ +	.name = "ctl_2", .id = CTL_2, +	.base = 0x17000, .len = 0x290, +	.features = CTL_SM8550_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), +	}, +	{ +	.name = "ctl_3", .id = CTL_3, +	.base = 0x18000, .len = 0x290, +	.features = CTL_SM8550_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), +	}, +	{ +	.name = "ctl_4", .id = CTL_4, +	.base = 0x19000, .len = 0x290, +	.features = CTL_SM8550_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), +	}, +	{ +	.name = "ctl_5", .id = CTL_5, +	.base = 0x1a000, .len = 0x290, +	.features = CTL_SM8550_MASK, +	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), +	}, +}; + +static const struct dpu_sspp_cfg sm8550_sspp[] = { +	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, 0x344, VIG_SC7180_MASK, +		sm8550_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), +	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, 0x344, VIG_SC7180_MASK, +		sm8550_vig_sblk_1, 4, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), +	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, 0x344, VIG_SC7180_MASK, +		sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), +	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, 0x344, VIG_SC7180_MASK, +		sm8550_vig_sblk_3, 12, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), +	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, 0x344, DMA_SDM845_MASK, +		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), +	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, 0x344, DMA_SDM845_MASK, +		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), +	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, 0x344, DMA_SDM845_MASK, +		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), +	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, 0x344, DMA_SDM845_MASK, +		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), +	SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000, 0x344, DMA_CURSOR_SDM845_MASK, +		sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4), +	SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000, 0x344, DMA_CURSOR_SDM845_MASK, +		sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5), +}; + +static const struct dpu_lm_cfg sm8550_lm[] = { +	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), +	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), +	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), +	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), +	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), +	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, +		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), +}; + +static const struct dpu_dspp_cfg sm8550_dspp[] = { +	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, +		 &sm8150_dspp_sblk), +}; +static const struct dpu_pingpong_cfg sm8550_pp[] = { +	PP_BLK_DITHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), +			-1), +	PP_BLK_DITHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), +			-1), +	PP_BLK_DITHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), +			-1), +	PP_BLK_DITHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), +			-1), +	PP_BLK_DITHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), +			-1), +	PP_BLK_DITHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, +			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), +			-1), +	PP_BLK_DITHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk, +			-1, +			-1), +	PP_BLK_DITHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk, +			-1, +			-1), +}; + +static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = { +	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), +	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), +	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), +	MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x66700), +}; + +static const struct dpu_intf_cfg sm8550_intf[] = { +	INTF_BLK("intf_0", INTF_0, 0x34000, 0x280, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), +	/* TODO TE sub-blocks for intf1 & intf2 */ +	INTF_BLK("intf_1", INTF_1, 0x35000, 0x300, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), +	INTF_BLK("intf_2", INTF_2, 0x36000, 0x300, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), +	INTF_BLK("intf_3", INTF_3, 0x37000, 0x280, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), +}; + +static const struct dpu_perf_cfg sm8550_perf_data = { +	.max_bw_low = 13600000, +	.max_bw_high = 18200000, +	.min_core_ib = 2500000, +	.min_llcc_ib = 0, +	.min_dram_ib = 800000, +	.min_prefill_lines = 35, +	/* FIXME: lut tables */ +	.danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, +	.safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, +	.qos_lut_tbl = { +		{.nentry = ARRAY_SIZE(sc7180_qos_linear), +		.entries = sc7180_qos_linear +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), +		.entries = sc7180_qos_macrotile +		}, +		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), +		.entries = sc7180_qos_nrt +		}, +		/* TODO: macrotile-qseed is different from macrotile */ +	}, +	.cdp_cfg = { +		{.rd_enable = 1, .wr_enable = 1}, +		{.rd_enable = 1, .wr_enable = 0} +	}, +	.clk_inefficiency_factor = 105, +	.bw_inefficiency_factor = 120, +}; + +const struct dpu_mdss_cfg dpu_sm8550_cfg = { +	.caps = &sm8550_dpu_caps, +	.ubwc = &sm8550_ubwc_cfg, +	.mdp_count = ARRAY_SIZE(sm8550_mdp), +	.mdp = sm8550_mdp, +	.ctl_count = ARRAY_SIZE(sm8550_ctl), +	.ctl = sm8550_ctl, +	.sspp_count = ARRAY_SIZE(sm8550_sspp), +	.sspp = sm8550_sspp, +	.mixer_count = ARRAY_SIZE(sm8550_lm), +	.mixer = sm8550_lm, +	.dspp_count = ARRAY_SIZE(sm8550_dspp), +	.dspp = sm8550_dspp, +	.pingpong_count = ARRAY_SIZE(sm8550_pp), +	.pingpong = sm8550_pp, +	.merge_3d_count = ARRAY_SIZE(sm8550_merge_3d), +	.merge_3d = sm8550_merge_3d, +	.intf_count = ARRAY_SIZE(sm8550_intf), +	.intf = sm8550_intf, +	.vbif_count = ARRAY_SIZE(sdm845_vbif), +	.vbif = sdm845_vbif, +	.reg_dma_count = 1, +	.dma_cfg = &sm8450_regdma, +	.perf = &sm8550_perf_data, +	.mdss_irqs = BIT(MDP_SSPP_TOP0_INTR) | \ +		     BIT(MDP_SSPP_TOP0_INTR2) | \ +		     BIT(MDP_SSPP_TOP0_HIST_INTR) | \ +		     BIT(MDP_INTF0_7xxx_INTR) | \ +		     BIT(MDP_INTF1_7xxx_INTR) | \ +		     BIT(MDP_INTF2_7xxx_INTR) | \ +		     BIT(MDP_INTF3_7xxx_INTR), +}; + +#endif diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c index f29a339a3705..cc66ddffe672 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c @@ -21,6 +21,7 @@  #include <drm/drm_probe_helper.h>  #include <drm/drm_rect.h>  #include <drm/drm_vblank.h> +#include <drm/drm_self_refresh_helper.h>  #include "dpu_kms.h"  #include "dpu_hw_lm.h" @@ -400,6 +401,47 @@ static void _dpu_crtc_program_lm_output_roi(struct drm_crtc *crtc)  	}  } +static void _dpu_crtc_blend_setup_pipe(struct drm_crtc *crtc, +				       struct drm_plane *plane, +				       struct dpu_crtc_mixer *mixer, +				       u32 num_mixers, +				       enum dpu_stage stage, +				       struct dpu_format *format, +				       uint64_t modifier, +				       struct dpu_sw_pipe *pipe, +				       unsigned int stage_idx, +				       struct dpu_hw_stage_cfg *stage_cfg +				      ) +{ +	uint32_t lm_idx; +	enum dpu_sspp sspp_idx; +	struct drm_plane_state *state; + +	sspp_idx = pipe->sspp->idx; + +	state = plane->state; + +	trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane), +				   state, to_dpu_plane_state(state), stage_idx, +				   format->base.pixel_format, +				   modifier); + +	DRM_DEBUG_ATOMIC("crtc %d stage:%d - plane %d sspp %d fb %d multirect_idx %d\n", +			 crtc->base.id, +			 stage, +			 plane->base.id, +			 sspp_idx - SSPP_NONE, +			 state->fb ? state->fb->base.id : -1, +			 pipe->multirect_index); + +	stage_cfg->stage[stage][stage_idx] = sspp_idx; +	stage_cfg->multirect_index[stage][stage_idx] = pipe->multirect_index; + +	/* blend config update */ +	for (lm_idx = 0; lm_idx < num_mixers; lm_idx++) +		mixer[lm_idx].lm_ctl->ops.update_pending_flush_sspp(mixer[lm_idx].lm_ctl, sspp_idx); +} +  static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,  	struct dpu_crtc *dpu_crtc, struct dpu_crtc_mixer *mixer,  	struct dpu_hw_stage_cfg *stage_cfg) @@ -412,15 +454,12 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,  	struct dpu_format *format;  	struct dpu_hw_ctl *ctl = mixer->lm_ctl; -	uint32_t stage_idx, lm_idx; -	int zpos_cnt[DPU_STAGE_MAX + 1] = { 0 }; +	uint32_t lm_idx;  	bool bg_alpha_enable = false;  	DECLARE_BITMAP(fetch_active, SSPP_MAX);  	memset(fetch_active, 0, sizeof(fetch_active));  	drm_atomic_crtc_for_each_plane(plane, crtc) { -		enum dpu_sspp sspp_idx; -  		state = plane->state;  		if (!state)  			continue; @@ -431,40 +470,30 @@ static void _dpu_crtc_blend_setup_mixer(struct drm_crtc *crtc,  		pstate = to_dpu_plane_state(state);  		fb = state->fb; -		sspp_idx = dpu_plane_pipe(plane); -		set_bit(sspp_idx, fetch_active); - -		DRM_DEBUG_ATOMIC("crtc %d stage:%d - plane %d sspp %d fb %d\n", -				crtc->base.id, -				pstate->stage, -				plane->base.id, -				sspp_idx - SSPP_VIG0, -				state->fb ? state->fb->base.id : -1); -  		format = to_dpu_format(msm_framebuffer_format(pstate->base.fb));  		if (pstate->stage == DPU_STAGE_BASE && format->alpha_enable)  			bg_alpha_enable = true; -		stage_idx = zpos_cnt[pstate->stage]++; -		stage_cfg->stage[pstate->stage][stage_idx] = -					sspp_idx; -		stage_cfg->multirect_index[pstate->stage][stage_idx] = -					pstate->multirect_index; - -		trace_dpu_crtc_setup_mixer(DRMID(crtc), DRMID(plane), -					   state, pstate, stage_idx, -					   sspp_idx - SSPP_VIG0, -					   format->base.pixel_format, -					   fb ? fb->modifier : 0); +		set_bit(pstate->pipe.sspp->idx, fetch_active); +		_dpu_crtc_blend_setup_pipe(crtc, plane, +					   mixer, cstate->num_mixers, +					   pstate->stage, +					   format, fb ? fb->modifier : 0, +					   &pstate->pipe, 0, stage_cfg); + +		if (pstate->r_pipe.sspp) { +			set_bit(pstate->r_pipe.sspp->idx, fetch_active); +			_dpu_crtc_blend_setup_pipe(crtc, plane, +						   mixer, cstate->num_mixers, +						   pstate->stage, +						   format, fb ? fb->modifier : 0, +						   &pstate->r_pipe, 1, stage_cfg); +		}  		/* blend config update */  		for (lm_idx = 0; lm_idx < cstate->num_mixers; lm_idx++) { -			_dpu_crtc_setup_blend_cfg(mixer + lm_idx, -						pstate, format); - -			mixer[lm_idx].lm_ctl->ops.update_pending_flush_sspp(mixer[lm_idx].lm_ctl, -									    sspp_idx); +			_dpu_crtc_setup_blend_cfg(mixer + lm_idx, pstate, format);  			if (bg_alpha_enable && !format->alpha_enable)  				mixer[lm_idx].mixer_op_mode = 0; @@ -767,7 +796,7 @@ static void _dpu_crtc_setup_cp_blocks(struct drm_crtc *crtc)  		/* stage config flush mask */  		ctl->ops.update_pending_flush_dspp(ctl, -			mixer[i].hw_dspp->idx); +			mixer[i].hw_dspp->idx, DPU_DSPP_PCC);  	}  } @@ -1021,6 +1050,18 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,  	DRM_DEBUG_KMS("crtc%d\n", crtc->base.id); +	/* If disable is triggered while in self refresh mode, +	 * reset the encoder software state so that in enable +	 * it won't trigger a warn while assigning crtc. +	 */ +	if (old_crtc_state->self_refresh_active) { +		drm_for_each_encoder_mask(encoder, crtc->dev, +					old_crtc_state->encoder_mask) { +			dpu_encoder_assign_crtc(encoder, NULL); +		} +		return; +	} +  	/* Disable/save vblank irq handling */  	drm_crtc_vblank_off(crtc); @@ -1032,7 +1073,14 @@ static void dpu_crtc_disable(struct drm_crtc *crtc,  		 */  		if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_VIDEO)  			release_bandwidth = true; -		dpu_encoder_assign_crtc(encoder, NULL); + +		/* +		 * If disable is triggered during psr active(e.g: screen dim in PSR), +		 * we will need encoder->crtc connection to process the device sleep & +		 * preserve it during psr sequence. +		 */ +		if (!crtc->state->self_refresh_active) +			dpu_encoder_assign_crtc(encoder, NULL);  	}  	/* wait for frame_event_done completion */ @@ -1080,6 +1128,9 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,  	struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);  	struct drm_encoder *encoder;  	bool request_bandwidth = false; +	struct drm_crtc_state *old_crtc_state; + +	old_crtc_state = drm_atomic_get_old_crtc_state(state, crtc);  	pm_runtime_get_sync(crtc->dev->dev); @@ -1102,25 +1153,23 @@ static void dpu_crtc_enable(struct drm_crtc *crtc,  	trace_dpu_crtc_enable(DRMID(crtc), true, dpu_crtc);  	dpu_crtc->enabled = true; -	drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) -		dpu_encoder_assign_crtc(encoder, crtc); +	if (!old_crtc_state->self_refresh_active) { +		drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) +			dpu_encoder_assign_crtc(encoder, crtc); +	}  	/* Enable/restore vblank irq handling */  	drm_crtc_vblank_on(crtc);  } -struct plane_state { -	struct dpu_plane_state *dpu_pstate; -	const struct drm_plane_state *drm_pstate; -	int stage; -	u32 pipe_id; -}; -  static bool dpu_crtc_needs_dirtyfb(struct drm_crtc_state *cstate)  {  	struct drm_crtc *crtc = cstate->crtc;  	struct drm_encoder *encoder; +	if (cstate->self_refresh_active) +		return true; +  	drm_for_each_encoder_mask (encoder, crtc->dev, cstate->encoder_mask) {  		if (dpu_encoder_get_intf_mode(encoder) == INTF_MODE_CMD) {  			return true; @@ -1137,151 +1186,46 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,  									  crtc);  	struct dpu_crtc *dpu_crtc = to_dpu_crtc(crtc);  	struct dpu_crtc_state *cstate = to_dpu_crtc_state(crtc_state); -	struct plane_state *pstates;  	const struct drm_plane_state *pstate;  	struct drm_plane *plane; -	struct drm_display_mode *mode; -	int cnt = 0, rc = 0, mixer_width = 0, i, z_pos; +	int rc = 0; -	struct dpu_multirect_plane_states multirect_plane[DPU_STAGE_MAX * 2]; -	int multirect_count = 0; -	const struct drm_plane_state *pipe_staged[SSPP_MAX]; -	int left_zpos_cnt = 0, right_zpos_cnt = 0; -	struct drm_rect crtc_rect = { 0 };  	bool needs_dirtyfb = dpu_crtc_needs_dirtyfb(crtc_state); -	pstates = kzalloc(sizeof(*pstates) * DPU_STAGE_MAX * 4, GFP_KERNEL); -	if (!pstates) -		return -ENOMEM; - -	if (!crtc_state->enable || !crtc_state->active) { +	if (!crtc_state->enable || !drm_atomic_crtc_effectively_active(crtc_state)) {  		DRM_DEBUG_ATOMIC("crtc%d -> enable %d, active %d, skip atomic_check\n",  				crtc->base.id, crtc_state->enable,  				crtc_state->active);  		memset(&cstate->new_perf, 0, sizeof(cstate->new_perf)); -		goto end; +		return 0;  	} -	mode = &crtc_state->adjusted_mode;  	DRM_DEBUG_ATOMIC("%s: check\n", dpu_crtc->name);  	/* force a full mode set if active state changed */  	if (crtc_state->active_changed)  		crtc_state->mode_changed = true; -	memset(pipe_staged, 0, sizeof(pipe_staged)); - -	if (cstate->num_mixers) { -		mixer_width = mode->hdisplay / cstate->num_mixers; - +	if (cstate->num_mixers)  		_dpu_crtc_setup_lm_bounds(crtc, crtc_state); -	} - -	crtc_rect.x2 = mode->hdisplay; -	crtc_rect.y2 = mode->vdisplay; -	 /* get plane state for all drm planes associated with crtc state */ +	/* FIXME: move this to dpu_plane_atomic_check? */  	drm_atomic_crtc_state_for_each_plane_state(plane, pstate, crtc_state) {  		struct dpu_plane_state *dpu_pstate = to_dpu_plane_state(pstate); -		struct drm_rect dst, clip = crtc_rect;  		if (IS_ERR_OR_NULL(pstate)) {  			rc = PTR_ERR(pstate);  			DPU_ERROR("%s: failed to get plane%d state, %d\n",  					dpu_crtc->name, plane->base.id, rc); -			goto end; +			return rc;  		} -		if (cnt >= DPU_STAGE_MAX * 4) -			continue;  		if (!pstate->visible)  			continue; -		pstates[cnt].dpu_pstate = dpu_pstate; -		pstates[cnt].drm_pstate = pstate; -		pstates[cnt].stage = pstate->normalized_zpos; -		pstates[cnt].pipe_id = dpu_plane_pipe(plane); -  		dpu_pstate->needs_dirtyfb = needs_dirtyfb; - -		if (pipe_staged[pstates[cnt].pipe_id]) { -			multirect_plane[multirect_count].r0 = -				pipe_staged[pstates[cnt].pipe_id]; -			multirect_plane[multirect_count].r1 = pstate; -			multirect_count++; - -			pipe_staged[pstates[cnt].pipe_id] = NULL; -		} else { -			pipe_staged[pstates[cnt].pipe_id] = pstate; -		} - -		cnt++; - -		dst = drm_plane_state_dest(pstate); -		if (!drm_rect_intersect(&clip, &dst)) { -			DPU_ERROR("invalid vertical/horizontal destination\n"); -			DPU_ERROR("display: " DRM_RECT_FMT " plane: " -				  DRM_RECT_FMT "\n", DRM_RECT_ARG(&crtc_rect), -				  DRM_RECT_ARG(&dst)); -			rc = -E2BIG; -			goto end; -		} -	} - -	for (i = 1; i < SSPP_MAX; i++) { -		if (pipe_staged[i]) -			dpu_plane_clear_multirect(pipe_staged[i]); -	} - -	z_pos = -1; -	for (i = 0; i < cnt; i++) { -		/* reset counts at every new blend stage */ -		if (pstates[i].stage != z_pos) { -			left_zpos_cnt = 0; -			right_zpos_cnt = 0; -			z_pos = pstates[i].stage; -		} - -		/* verify z_pos setting before using it */ -		if (z_pos >= DPU_STAGE_MAX - DPU_STAGE_0) { -			DPU_ERROR("> %d plane stages assigned\n", -					DPU_STAGE_MAX - DPU_STAGE_0); -			rc = -EINVAL; -			goto end; -		} else if (pstates[i].drm_pstate->crtc_x < mixer_width) { -			if (left_zpos_cnt == 2) { -				DPU_ERROR("> 2 planes @ stage %d on left\n", -					z_pos); -				rc = -EINVAL; -				goto end; -			} -			left_zpos_cnt++; - -		} else { -			if (right_zpos_cnt == 2) { -				DPU_ERROR("> 2 planes @ stage %d on right\n", -					z_pos); -				rc = -EINVAL; -				goto end; -			} -			right_zpos_cnt++; -		} - -		pstates[i].dpu_pstate->stage = z_pos + DPU_STAGE_0; -		DRM_DEBUG_ATOMIC("%s: zpos %d\n", dpu_crtc->name, z_pos); -	} - -	for (i = 0; i < multirect_count; i++) { -		if (dpu_plane_validate_multirect_v2(&multirect_plane[i])) { -			DPU_ERROR( -			"multirect validation failed for planes (%d - %d)\n", -					multirect_plane[i].r0->plane->base.id, -					multirect_plane[i].r1->plane->base.id); -			rc = -EINVAL; -			goto end; -		}  	}  	atomic_inc(&_dpu_crtc_get_kms(crtc)->bandwidth_ref); @@ -1290,74 +1234,10 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,  	if (rc) {  		DPU_ERROR("crtc%d failed performance check %d\n",  				crtc->base.id, rc); -		goto end; +		return rc;  	} -	/* validate source split: -	 * use pstates sorted by stage to check planes on same stage -	 * we assume that all pipes are in source split so its valid to compare -	 * without taking into account left/right mixer placement -	 */ -	for (i = 1; i < cnt; i++) { -		struct plane_state *prv_pstate, *cur_pstate; -		struct drm_rect left_rect, right_rect; -		int32_t left_pid, right_pid; -		int32_t stage; - -		prv_pstate = &pstates[i - 1]; -		cur_pstate = &pstates[i]; -		if (prv_pstate->stage != cur_pstate->stage) -			continue; - -		stage = cur_pstate->stage; - -		left_pid = prv_pstate->dpu_pstate->base.plane->base.id; -		left_rect = drm_plane_state_dest(prv_pstate->drm_pstate); - -		right_pid = cur_pstate->dpu_pstate->base.plane->base.id; -		right_rect = drm_plane_state_dest(cur_pstate->drm_pstate); - -		if (right_rect.x1 < left_rect.x1) { -			swap(left_pid, right_pid); -			swap(left_rect, right_rect); -		} - -		/** -		 * - planes are enumerated in pipe-priority order such that -		 *   planes with lower drm_id must be left-most in a shared -		 *   blend-stage when using source split. -		 * - planes in source split must be contiguous in width -		 * - planes in source split must have same dest yoff and height -		 */ -		if (right_pid < left_pid) { -			DPU_ERROR( -				"invalid src split cfg. priority mismatch. stage: %d left: %d right: %d\n", -				stage, left_pid, right_pid); -			rc = -EINVAL; -			goto end; -		} else if (right_rect.x1 != drm_rect_width(&left_rect)) { -			DPU_ERROR("non-contiguous coordinates for src split. " -				  "stage: %d left: " DRM_RECT_FMT " right: " -				  DRM_RECT_FMT "\n", stage, -				  DRM_RECT_ARG(&left_rect), -				  DRM_RECT_ARG(&right_rect)); -			rc = -EINVAL; -			goto end; -		} else if (left_rect.y1 != right_rect.y1 || -			   drm_rect_height(&left_rect) != drm_rect_height(&right_rect)) { -			DPU_ERROR("source split at stage: %d. invalid " -				  "yoff/height: left: " DRM_RECT_FMT " right: " -				  DRM_RECT_FMT "\n", stage, -				  DRM_RECT_ARG(&left_rect), -				  DRM_RECT_ARG(&right_rect)); -			rc = -EINVAL; -			goto end; -		} -	} - -end: -	kfree(pstates); -	return rc; +	return 0;  }  int dpu_crtc_vblank(struct drm_crtc *crtc, bool en) @@ -1474,8 +1354,16 @@ static int _dpu_debugfs_status_show(struct seq_file *s, void *data)  		seq_printf(s, "\tdst x:%4d dst_y:%4d dst_w:%4d dst_h:%4d\n",  			state->crtc_x, state->crtc_y, state->crtc_w,  			state->crtc_h); -		seq_printf(s, "\tmultirect: mode: %d index: %d\n", -			pstate->multirect_mode, pstate->multirect_index); +		seq_printf(s, "\tsspp[0]:%s\n", +			   pstate->pipe.sspp->cap->name); +		seq_printf(s, "\tmultirect[0]: mode: %d index: %d\n", +			pstate->pipe.multirect_mode, pstate->pipe.multirect_index); +		if (pstate->r_pipe.sspp) { +			seq_printf(s, "\tsspp[1]:%s\n", +				   pstate->r_pipe.sspp->cap->name); +			seq_printf(s, "\tmultirect[1]: mode: %d index: %d\n", +				   pstate->r_pipe.multirect_mode, pstate->r_pipe.multirect_index); +		}  		seq_puts(s, "\n");  	} @@ -1577,7 +1465,7 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,  {  	struct drm_crtc *crtc = NULL;  	struct dpu_crtc *dpu_crtc = NULL; -	int i; +	int i, ret;  	dpu_crtc = kzalloc(sizeof(*dpu_crtc), GFP_KERNEL);  	if (!dpu_crtc) @@ -1614,6 +1502,13 @@ struct drm_crtc *dpu_crtc_init(struct drm_device *dev, struct drm_plane *plane,  	/* initialize event handling */  	spin_lock_init(&dpu_crtc->event_lock); +	ret = drm_self_refresh_helper_init(crtc); +	if (ret) { +		DPU_ERROR("Failed to initialize %s with self-refresh helpers %d\n", +			crtc->name, ret); +		return ERR_PTR(ret); +	} +  	DRM_DEBUG_KMS("%s: successfully initialized crtc\n", dpu_crtc->name);  	return crtc;  } diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c index 758261e8ac73..1dc5dbe58572 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c @@ -12,6 +12,7 @@  #include <linux/kthread.h>  #include <linux/seq_file.h> +#include <drm/drm_atomic.h>  #include <drm/drm_crtc.h>  #include <drm/drm_file.h>  #include <drm/drm_probe_helper.h> @@ -544,7 +545,8 @@ bool dpu_encoder_use_dsc_merge(struct drm_encoder *drm_enc)  static struct msm_display_topology dpu_encoder_get_topology(  			struct dpu_encoder_virt *dpu_enc,  			struct dpu_kms *dpu_kms, -			struct drm_display_mode *mode) +			struct drm_display_mode *mode, +			struct drm_crtc_state *crtc_state)  {  	struct msm_display_topology topology = {0};  	int i, intf_count = 0; @@ -562,8 +564,7 @@ static struct msm_display_topology dpu_encoder_get_topology(  	 * 1 LM, 1 INTF  	 * 2 LM, 1 INTF (stream merge to support high resolution interfaces)  	 * -	 * Adding color blocks only to primary interface if available in -	 * sufficient number +	 * Add dspps to the reservation requirements if ctm is requested  	 */  	if (intf_count == 2)  		topology.num_lm = 2; @@ -572,11 +573,8 @@ static struct msm_display_topology dpu_encoder_get_topology(  	else  		topology.num_lm = (mode->hdisplay > MAX_HDISPLAY_SPLIT) ? 2 : 1; -	if (dpu_enc->disp_info.intf_type == DRM_MODE_ENCODER_DSI) { -		if (dpu_kms->catalog->dspp && -			(dpu_kms->catalog->dspp_count >= topology.num_lm)) -			topology.num_dspp = topology.num_lm; -	} +	if (crtc_state->ctm) +		topology.num_dspp = topology.num_lm;  	topology.num_intf = intf_count; @@ -637,25 +635,22 @@ static int dpu_encoder_virt_atomic_check(  		if (ret) {  			DPU_ERROR_ENC(dpu_enc,  					"mode unsupported, phys idx %d\n", i); -			break; +			return ret;  		}  	} -	topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode); +	topology = dpu_encoder_get_topology(dpu_enc, dpu_kms, adj_mode, crtc_state); -	/* Reserve dynamic resources now. */ -	if (!ret) { -		/* -		 * Release and Allocate resources on every modeset -		 * Dont allocate when active is false. -		 */ -		if (drm_atomic_crtc_needs_modeset(crtc_state)) { -			dpu_rm_release(global_state, drm_enc); +	/* +	 * Release and Allocate resources on every modeset +	 * Dont allocate when active is false. +	 */ +	if (drm_atomic_crtc_needs_modeset(crtc_state)) { +		dpu_rm_release(global_state, drm_enc); -			if (!crtc_state->active_changed || crtc_state->active) -				ret = dpu_rm_reserve(&dpu_kms->rm, global_state, -						drm_enc, crtc_state, topology); -		} +		if (!crtc_state->active_changed || crtc_state->enable) +			ret = dpu_rm_reserve(&dpu_kms->rm, global_state, +					drm_enc, crtc_state, topology);  	}  	trace_dpu_enc_atomic_check_flags(DRMID(drm_enc), adj_mode->flags); @@ -1171,7 +1166,8 @@ out:  	mutex_unlock(&dpu_enc->enc_lock);  } -static void dpu_encoder_virt_enable(struct drm_encoder *drm_enc) +static void dpu_encoder_virt_atomic_enable(struct drm_encoder *drm_enc, +					struct drm_atomic_state *state)  {  	struct dpu_encoder_virt *dpu_enc = NULL;  	int ret = 0; @@ -1207,14 +1203,28 @@ out:  	mutex_unlock(&dpu_enc->enc_lock);  } -static void dpu_encoder_virt_disable(struct drm_encoder *drm_enc) +static void dpu_encoder_virt_atomic_disable(struct drm_encoder *drm_enc, +					struct drm_atomic_state *state)  {  	struct dpu_encoder_virt *dpu_enc = NULL; +	struct drm_crtc *crtc; +	struct drm_crtc_state *old_state = NULL;  	int i = 0;  	dpu_enc = to_dpu_encoder_virt(drm_enc);  	DPU_DEBUG_ENC(dpu_enc, "\n"); +	crtc = drm_atomic_get_old_crtc_for_encoder(state, drm_enc); +	if (crtc) +		old_state = drm_atomic_get_old_crtc_state(state, crtc); + +	/* +	 * The encoder is already disabled if self refresh mode was set earlier, +	 * in the old_state for the corresponding crtc. +	 */ +	if (old_state && old_state->self_refresh_active) +		return; +  	mutex_lock(&dpu_enc->enc_lock);  	dpu_enc->enabled = false; @@ -2078,25 +2088,6 @@ void dpu_encoder_helper_phys_cleanup(struct dpu_encoder_phys *phys_enc)  	ctl->ops.clear_pending_flush(ctl);  } -void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc) -{ -	struct dpu_encoder_virt *dpu_enc; -	struct dpu_encoder_phys *phys; -	int i; - -	if (!drm_enc) { -		DPU_ERROR("invalid encoder\n"); -		return; -	} -	dpu_enc = to_dpu_encoder_virt(drm_enc); - -	for (i = 0; i < dpu_enc->num_phys_encs; i++) { -		phys = dpu_enc->phys_encs[i]; -		if (phys->ops.prepare_commit) -			phys->ops.prepare_commit(phys); -	} -} -  #ifdef CONFIG_DEBUG_FS  static int _dpu_encoder_status_show(struct seq_file *s, void *data)  { @@ -2388,8 +2379,8 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)  static const struct drm_encoder_helper_funcs dpu_encoder_helper_funcs = {  	.atomic_mode_set = dpu_encoder_virt_atomic_mode_set, -	.disable = dpu_encoder_virt_disable, -	.enable = dpu_encoder_virt_enable, +	.atomic_disable = dpu_encoder_virt_atomic_disable, +	.atomic_enable = dpu_encoder_virt_atomic_enable,  	.atomic_check = dpu_encoder_virt_atomic_check,  }; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h index 9e7236ef34e6..2c9ef8d1b877 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.h @@ -147,13 +147,6 @@ int dpu_encoder_setup(struct drm_device *dev, struct drm_encoder *enc,  		struct msm_display_info *disp_info);  /** - * dpu_encoder_prepare_commit - prepare encoder at the very beginning of an - *	atomic commit, before any registers are written - * @drm_enc:    Pointer to previously created drm encoder structure - */ -void dpu_encoder_prepare_commit(struct drm_encoder *drm_enc); - -/**   * dpu_encoder_set_idle_timeout - set the idle timeout for video   *                    and command mode encoders.   * @drm_enc:    Pointer to previously created drm encoder structure diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c index c8f4a62a9536..74470d068622 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_cmd.c @@ -40,6 +40,8 @@  #define DPU_ENC_MAX_POLL_TIMEOUT_US	2000 +static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys *phys_enc); +  static bool dpu_encoder_phys_cmd_is_master(struct dpu_encoder_phys *phys_enc)  {  	return (phys_enc->split_role != ENC_ROLE_SLAVE); @@ -565,6 +567,8 @@ static void dpu_encoder_phys_cmd_prepare_for_kickoff(  			  phys_enc->hw_pp->idx - PINGPONG_0);  	} +	dpu_encoder_phys_cmd_enable_te(phys_enc); +  	DPU_DEBUG_CMDENC(cmd_enc, "pp:%d pending_cnt %d\n",  			phys_enc->hw_pp->idx - PINGPONG_0,  			atomic_read(&phys_enc->pending_kickoff_cnt)); @@ -586,8 +590,7 @@ static bool dpu_encoder_phys_cmd_is_ongoing_pptx(  	return false;  } -static void dpu_encoder_phys_cmd_prepare_commit( -		struct dpu_encoder_phys *phys_enc) +static void dpu_encoder_phys_cmd_enable_te(struct dpu_encoder_phys *phys_enc)  {  	struct dpu_encoder_phys_cmd *cmd_enc =  		to_dpu_encoder_phys_cmd(phys_enc); @@ -732,7 +735,6 @@ static void dpu_encoder_phys_cmd_trigger_start(  static void dpu_encoder_phys_cmd_init_ops(  		struct dpu_encoder_phys_ops *ops)  { -	ops->prepare_commit = dpu_encoder_phys_cmd_prepare_commit;  	ops->is_master = dpu_encoder_phys_cmd_is_master;  	ops->atomic_mode_set = dpu_encoder_phys_cmd_atomic_mode_set;  	ops->enable = dpu_encoder_phys_cmd_enable; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c index 48c48106b16a..3a374292f311 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c @@ -523,6 +523,7 @@ static void dpu_encoder_phys_vid_disable(struct dpu_encoder_phys *phys_enc)  {  	unsigned long lock_flags;  	int ret; +	struct intf_status intf_status = {0};  	if (!phys_enc->parent || !phys_enc->parent->dev) {  		DPU_ERROR("invalid encoder/device\n"); @@ -567,6 +568,27 @@ static void dpu_encoder_phys_vid_disable(struct dpu_encoder_phys *phys_enc)  		}  	} +	if (phys_enc->hw_intf && phys_enc->hw_intf->ops.get_status) +		phys_enc->hw_intf->ops.get_status(phys_enc->hw_intf, &intf_status); + +	/* +	 * Wait for a vsync if timing en status is on after timing engine +	 * is disabled. +	 */ +	if (intf_status.is_en && dpu_encoder_phys_vid_is_master(phys_enc)) { +		spin_lock_irqsave(phys_enc->enc_spinlock, lock_flags); +		dpu_encoder_phys_inc_pending(phys_enc); +		spin_unlock_irqrestore(phys_enc->enc_spinlock, lock_flags); +		ret = dpu_encoder_phys_vid_wait_for_vblank(phys_enc); +		if (ret) { +			atomic_set(&phys_enc->pending_kickoff_cnt, 0); +			DRM_ERROR("wait disable failed: id:%u intf:%d ret:%d\n", +				  DRMID(phys_enc->parent), +				  phys_enc->hw_intf->idx - INTF_0, ret); +		} +	} + +	dpu_encoder_helper_phys_cleanup(phys_enc);  	phys_enc->enable_state = DPU_ENC_DISABLED;  } diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c index d95540309d4d..e366ab134249 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_formats.c @@ -536,6 +536,16 @@ static const struct dpu_format dpu_format_map_ubwc[] = {  		true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED,  		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC), +	/* XRGB2101010 and ARGB2101010 purposely have the same color +	* ordering.  The hardware only supports ARGB2101010 UBWC +	* natively. +	*/ +	INTERLEAVED_RGB_FMT_TILED(ARGB2101010, +		COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT, +		C2_R_Cr, C0_G_Y, C1_B_Cb, C3_ALPHA, 4, +		true, 4, DPU_FORMAT_FLAG_DX | DPU_FORMAT_FLAG_COMPRESSED, +		DPU_FETCH_UBWC, 2, DPU_TILE_HEIGHT_UBWC), +  	PSEUDO_YUV_FMT_TILED(NV12,  		0, COLOR_8BIT, COLOR_8BIT, COLOR_8BIT,  		C1_B_Cb, C2_R_Cr, @@ -591,6 +601,7 @@ static int _dpu_format_get_media_color_ubwc(const struct dpu_format *fmt)  		{DRM_FORMAT_XBGR8888, COLOR_FMT_RGBA8888_UBWC},  		{DRM_FORMAT_XRGB8888, COLOR_FMT_RGBA8888_UBWC},  		{DRM_FORMAT_ABGR2101010, COLOR_FMT_RGBA1010102_UBWC}, +		{DRM_FORMAT_ARGB2101010, COLOR_FMT_RGBA1010102_UBWC},  		{DRM_FORMAT_XRGB2101010, COLOR_FMT_RGBA1010102_UBWC},  		{DRM_FORMAT_XBGR2101010, COLOR_FMT_RGBA1010102_UBWC},  		{DRM_FORMAT_BGR565, COLOR_FMT_RGB565_UBWC}, @@ -918,8 +929,7 @@ int dpu_format_populate_layout(  		struct drm_framebuffer *fb,  		struct dpu_hw_fmt_layout *layout)  { -	uint32_t plane_addr[DPU_MAX_PLANES]; -	int i, ret; +	int ret;  	if (!fb || !layout) {  		DRM_ERROR("invalid arguments\n"); @@ -940,9 +950,6 @@ int dpu_format_populate_layout(  	if (ret)  		return ret; -	for (i = 0; i < DPU_MAX_PLANES; ++i) -		plane_addr[i] = layout->plane_addr[i]; -  	/* Populate the addresses given the fb */  	if (DPU_FORMAT_IS_UBWC(layout->format) ||  			DPU_FORMAT_IS_TILE(layout->format)) @@ -950,10 +957,6 @@ int dpu_format_populate_layout(  	else  		ret = _dpu_format_populate_addrs_linear(aspace, fb, layout); -	/* check if anything changed */ -	if (!ret && !memcmp(plane_addr, layout->plane_addr, sizeof(plane_addr))) -		ret = -EAGAIN; -  	return ret;  } diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c index 497c9e1673ab..5d994bce696f 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.c @@ -27,9 +27,15 @@  #define VIG_SDM845_MASK \  	(VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED3)) +#define VIG_SDM845_MASK_SDMA \ +	(VIG_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) +  #define VIG_SC7180_MASK \  	(VIG_MASK | BIT(DPU_SSPP_QOS_8LVL) | BIT(DPU_SSPP_SCALER_QSEED4)) +#define VIG_SC7180_MASK_SDMA \ +	(VIG_SC7180_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) +  #define VIG_QCM2290_MASK (VIG_BASE_MASK | BIT(DPU_SSPP_QOS_8LVL))  #define DMA_MSM8998_MASK \ @@ -40,6 +46,9 @@  #define VIG_SC7280_MASK \  	(VIG_SC7180_MASK | BIT(DPU_SSPP_INLINE_ROTATION)) +#define VIG_SC7280_MASK_SDMA \ +	(VIG_SC7280_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) +  #define DMA_SDM845_MASK \  	(BIT(DPU_SSPP_SRC) | BIT(DPU_SSPP_QOS) | BIT(DPU_SSPP_QOS_8LVL) |\  	BIT(DPU_SSPP_TS_PREFILL) | BIT(DPU_SSPP_TS_PREFILL_REC1) |\ @@ -48,6 +57,12 @@  #define DMA_CURSOR_SDM845_MASK \  	(DMA_SDM845_MASK | BIT(DPU_SSPP_CURSOR)) +#define DMA_SDM845_MASK_SDMA \ +	(DMA_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) + +#define DMA_CURSOR_SDM845_MASK_SDMA \ +	(DMA_CURSOR_SDM845_MASK | BIT(DPU_SSPP_SMART_DMA_V2)) +  #define DMA_CURSOR_MSM8998_MASK \  	(DMA_MSM8998_MASK | BIT(DPU_SSPP_CURSOR)) @@ -66,7 +81,10 @@  	(PINGPONG_SDM845_MASK | BIT(DPU_PINGPONG_TE2))  #define CTL_SC7280_MASK \ -	(BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_FETCH_ACTIVE) | BIT(DPU_CTL_VM_CFG)) +	(BIT(DPU_CTL_ACTIVE_CFG) | \ +	 BIT(DPU_CTL_FETCH_ACTIVE) | \ +	 BIT(DPU_CTL_VM_CFG) | \ +	 BIT(DPU_CTL_DSPP_SUB_BLOCK_FLUSH))  #define CTL_SM8550_MASK \  	(CTL_SC7280_MASK | BIT(DPU_CTL_HAS_LAYER_EXT4)) @@ -79,83 +97,11 @@  #define INTF_SDM845_MASK (0) -#define INTF_SC7180_MASK BIT(DPU_INTF_INPUT_CTRL) | BIT(DPU_INTF_TE) +#define INTF_SC7180_MASK \ +	(BIT(DPU_INTF_INPUT_CTRL) | BIT(DPU_INTF_TE) | BIT(DPU_INTF_STATUS_SUPPORTED))  #define INTF_SC7280_MASK INTF_SC7180_MASK | BIT(DPU_DATA_HCTL_EN) -#define IRQ_SDM845_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			 BIT(MDP_SSPP_TOP0_INTR2) | \ -			 BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			 BIT(MDP_INTF0_INTR) | \ -			 BIT(MDP_INTF1_INTR) | \ -			 BIT(MDP_INTF2_INTR) | \ -			 BIT(MDP_INTF3_INTR) | \ -			 BIT(MDP_AD4_0_INTR) | \ -			 BIT(MDP_AD4_1_INTR)) - -#define IRQ_SC7180_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			 BIT(MDP_SSPP_TOP0_INTR2) | \ -			 BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			 BIT(MDP_INTF0_INTR) | \ -			 BIT(MDP_INTF1_INTR)) - -#define IRQ_SC7280_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			 BIT(MDP_SSPP_TOP0_INTR2) | \ -			 BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			 BIT(MDP_INTF0_7xxx_INTR) | \ -			 BIT(MDP_INTF1_7xxx_INTR) | \ -			 BIT(MDP_INTF5_7xxx_INTR)) - -#define IRQ_SM8250_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			 BIT(MDP_SSPP_TOP0_INTR2) | \ -			 BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			 BIT(MDP_INTF0_INTR) | \ -			 BIT(MDP_INTF1_INTR) | \ -			 BIT(MDP_INTF2_INTR) | \ -			 BIT(MDP_INTF3_INTR) | \ -			 BIT(MDP_INTF4_INTR)) - -#define IRQ_SM8350_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			 BIT(MDP_SSPP_TOP0_INTR2) | \ -			 BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			 BIT(MDP_INTF0_7xxx_INTR) | \ -			 BIT(MDP_INTF1_7xxx_INTR) | \ -			 BIT(MDP_INTF2_7xxx_INTR) | \ -			 BIT(MDP_INTF3_7xxx_INTR)) - -#define IRQ_SC8180X_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			  BIT(MDP_SSPP_TOP0_INTR2) | \ -			  BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			  BIT(MDP_INTF0_INTR) | \ -			  BIT(MDP_INTF1_INTR) | \ -			  BIT(MDP_INTF2_INTR) | \ -			  BIT(MDP_INTF3_INTR) | \ -			  BIT(MDP_INTF4_INTR) | \ -			  BIT(MDP_INTF5_INTR) | \ -			  BIT(MDP_AD4_0_INTR) | \ -			  BIT(MDP_AD4_1_INTR)) - -#define IRQ_SC8280XP_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			   BIT(MDP_SSPP_TOP0_INTR2) | \ -			   BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			   BIT(MDP_INTF0_7xxx_INTR) | \ -			   BIT(MDP_INTF1_7xxx_INTR) | \ -			   BIT(MDP_INTF2_7xxx_INTR) | \ -			   BIT(MDP_INTF3_7xxx_INTR) | \ -			   BIT(MDP_INTF4_7xxx_INTR) | \ -			   BIT(MDP_INTF5_7xxx_INTR) | \ -			   BIT(MDP_INTF6_7xxx_INTR) | \ -			   BIT(MDP_INTF7_7xxx_INTR) | \ -			   BIT(MDP_INTF8_7xxx_INTR)) - -#define IRQ_SM8450_MASK (BIT(MDP_SSPP_TOP0_INTR) | \ -			 BIT(MDP_SSPP_TOP0_INTR2) | \ -			 BIT(MDP_SSPP_TOP0_HIST_INTR) | \ -			 BIT(MDP_INTF0_7xxx_INTR) | \ -			 BIT(MDP_INTF1_7xxx_INTR) | \ -			 BIT(MDP_INTF2_7xxx_INTR) | \ -			 BIT(MDP_INTF3_7xxx_INTR)) -  #define WB_SM8250_MASK (BIT(DPU_WB_LINE_MODE) | \  			 BIT(DPU_WB_UBWC) | \  			 BIT(DPU_WB_YUV_CONFIG) | \ @@ -188,6 +134,7 @@ static const uint32_t plane_formats[] = {  	DRM_FORMAT_RGBX8888,  	DRM_FORMAT_BGRX8888,  	DRM_FORMAT_XBGR8888, +	DRM_FORMAT_ARGB2101010,  	DRM_FORMAT_XRGB2101010,  	DRM_FORMAT_RGB888,  	DRM_FORMAT_BGR888, @@ -217,6 +164,7 @@ static const uint32_t plane_formats_yuv[] = {  	DRM_FORMAT_RGBA8888,  	DRM_FORMAT_BGRX8888,  	DRM_FORMAT_BGRA8888, +	DRM_FORMAT_ARGB2101010,  	DRM_FORMAT_XRGB2101010,  	DRM_FORMAT_XRGB8888,  	DRM_FORMAT_XBGR8888, @@ -295,789 +243,6 @@ static const uint32_t wb2_formats[] = {  };  /************************************************************* - * DPU sub blocks config - *************************************************************/ -/* DPU top level caps */ -static const struct dpu_caps msm8998_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0x7, -	.qseed_type = DPU_SSPP_SCALER_QSEED3, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V1, -	.ubwc_version = DPU_HW_UBWC_VER_10, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -	.max_hdeci_exp = MAX_HORZ_DECIMATION, -	.max_vdeci_exp = MAX_VERT_DECIMATION, -}; - -static const struct dpu_caps qcm2290_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_LINE_WIDTH, -	.max_mixer_blendstages = 0x4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.max_linewidth = 2160, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sdm845_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED3, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, -	.ubwc_version = DPU_HW_UBWC_VER_20, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -	.max_hdeci_exp = MAX_HORZ_DECIMATION, -	.max_vdeci_exp = MAX_VERT_DECIMATION, -}; - -static const struct dpu_caps sc7180_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0x9, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, -	.ubwc_version = DPU_HW_UBWC_VER_20, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.max_linewidth = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sm6115_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_LINE_WIDTH, -	.max_mixer_blendstages = 0x4, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_10, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.max_linewidth = 2160, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sm8150_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED3, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_30, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 4096, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -	.max_hdeci_exp = MAX_HORZ_DECIMATION, -	.max_vdeci_exp = MAX_VERT_DECIMATION, -}; - -static const struct dpu_caps sc8180x_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED3, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_30, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 4096, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -	.max_hdeci_exp = MAX_HORZ_DECIMATION, -	.max_vdeci_exp = MAX_VERT_DECIMATION, -}; - -static const struct dpu_caps sc8280xp_dpu_caps = { -	.max_mixer_width = 2560, -	.max_mixer_blendstages = 11, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_40, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 5120, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sm8250_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_40, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 4096, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sm8350_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_40, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 4096, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sm8450_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_40, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 5120, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sm8550_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0xb, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, /* TODO: v2.5 */ -	.ubwc_version = DPU_HW_UBWC_VER_40, -	.has_src_split = true, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.has_3d_merge = true, -	.max_linewidth = 5120, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_caps sc7280_dpu_caps = { -	.max_mixer_width = DEFAULT_DPU_OUTPUT_LINE_WIDTH, -	.max_mixer_blendstages = 0x7, -	.qseed_type = DPU_SSPP_SCALER_QSEED4, -	.smart_dma_rev = DPU_SSPP_SMART_DMA_V2, -	.ubwc_version = DPU_HW_UBWC_VER_30, -	.has_dim_layer = true, -	.has_idle_pc = true, -	.max_linewidth = 2400, -	.pixel_ram_size = DEFAULT_PIXEL_RAM_SIZE, -}; - -static const struct dpu_mdp_cfg msm8998_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x458, -	.features = 0, -	.highest_bank_bit = 0x2, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x2B4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x2BC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0x2C4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x2C4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2C4, .bit_off = 12}, -	.clk_ctrls[DPU_CLK_CTRL_CURSOR0] = { -			.reg_off = 0x3A8, .bit_off = 15}, -	.clk_ctrls[DPU_CLK_CTRL_CURSOR1] = { -			.reg_off = 0x3B0, .bit_off = 15}, -	}, -}; - -static const struct dpu_mdp_cfg sdm845_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x45C, -	.features = BIT(DPU_MDP_AUDIO_SELECT), -	.highest_bank_bit = 0x2, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x2B4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x2BC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0x2C4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x2BC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2C4, .bit_off = 8}, -	}, -}; - -static const struct dpu_mdp_cfg sc7180_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = 0, -	.highest_bank_bit = 0x3, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -		.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -		.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -		.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -		.reg_off = 0x2C4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_WB2] = { -		.reg_off = 0x3B8, .bit_off = 24}, -	}, -}; - -static const struct dpu_mdp_cfg sc8180x_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x45C, -	.features = BIT(DPU_MDP_AUDIO_SELECT), -	.highest_bank_bit = 0x3, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x2B4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x2BC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0x2C4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x2BC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2C4, .bit_off = 8}, -	}, -}; - -static const struct dpu_mdp_cfg sm6115_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = 0, -	.highest_bank_bit = 0x1, -	.ubwc_swizzle = 0x7, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -		.reg_off = 0x2ac, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -		.reg_off = 0x2ac, .bit_off = 8}, -	}, -}; - -static const struct dpu_mdp_cfg sm8250_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = 0, -	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ -	.ubwc_swizzle = 0x6, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x2B4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x2BC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0x2C4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x2BC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2C4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { -			.reg_off = 0x2BC, .bit_off = 20}, -	.clk_ctrls[DPU_CLK_CTRL_WB2] = { -			.reg_off = 0x3B8, .bit_off = 24}, -	}, -}; - -static const struct dpu_mdp_cfg sm8350_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = 0, -	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x2ac, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x2b4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x2bc, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0x2c4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x2ac, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x2b4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x2bc, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2c4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { -			.reg_off = 0x2bc, .bit_off = 20}, -	}, -}; - -static const struct dpu_mdp_cfg sm8450_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = BIT(DPU_MDP_PERIPH_0_REMOVED), -	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ -	.ubwc_swizzle = 0x6, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x2B4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x2BC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0x2C4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x2BC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2C4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { -			.reg_off = 0x2BC, .bit_off = 20}, -	}, -}; - -static const struct dpu_mdp_cfg sc7280_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x2014, -	.highest_bank_bit = 0x1, -	.ubwc_swizzle = 0x6, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -		.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -		.reg_off = 0x2AC, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -		.reg_off = 0x2B4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -		.reg_off = 0x2C4, .bit_off = 8}, -	}, -}; - -static const struct dpu_mdp_cfg sc8280xp_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = BIT(DPU_MDP_PERIPH_0_REMOVED), -	.highest_bank_bit = 2, -	.ubwc_swizzle = 6, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { .reg_off = 0x2ac, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { .reg_off = 0x2b4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { .reg_off = 0x2bc, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { .reg_off = 0x2c4, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { .reg_off = 0x2ac, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8}, -	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20}, -	}, -}; - -static const struct dpu_mdp_cfg sm8550_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0, .len = 0x494, -	.features = BIT(DPU_MDP_PERIPH_0_REMOVED), -	.highest_bank_bit = 0x3, /* TODO: 2 for LP_DDR4 */ -	.ubwc_swizzle = 0x6, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -			.reg_off = 0x4330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG1] = { -			.reg_off = 0x6330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG2] = { -			.reg_off = 0x8330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_VIG3] = { -			.reg_off = 0xa330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -			.reg_off = 0x24330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA1] = { -			.reg_off = 0x26330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA2] = { -			.reg_off = 0x28330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA3] = { -			.reg_off = 0x2a330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA4] = { -			.reg_off = 0x2c330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA5] = { -			.reg_off = 0x2e330, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_REG_DMA] = { -			.reg_off = 0x2bc, .bit_off = 20}, -	}, -}; - -static const struct dpu_mdp_cfg qcm2290_mdp[] = { -	{ -	.name = "top_0", .id = MDP_TOP, -	.base = 0x0, .len = 0x494, -	.features = 0, -	.highest_bank_bit = 0x2, -	.clk_ctrls[DPU_CLK_CTRL_VIG0] = { -		.reg_off = 0x2AC, .bit_off = 0}, -	.clk_ctrls[DPU_CLK_CTRL_DMA0] = { -		.reg_off = 0x2AC, .bit_off = 8}, -	}, -}; - -/************************************************************* - * CTL sub blocks config - *************************************************************/ -static const struct dpu_ctl_cfg msm8998_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x1000, .len = 0x94, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x1200, .len = 0x94, -	.features = 0, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x1400, .len = 0x94, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x1600, .len = 0x94, -	.features = 0, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x1800, .len = 0x94, -	.features = 0, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -}; - -static const struct dpu_ctl_cfg sdm845_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x1000, .len = 0xE4, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x1200, .len = 0xE4, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x1400, .len = 0xE4, -	.features = 0, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x1600, .len = 0xE4, -	.features = 0, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x1800, .len = 0xE4, -	.features = 0, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -}; - -static const struct dpu_ctl_cfg sc7180_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x1000, .len = 0x1dc, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x1200, .len = 0x1dc, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x1400, .len = 0x1dc, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -}; - -static const struct dpu_ctl_cfg sc8280xp_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x15000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x16000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x17000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x18000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x19000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -	{ -	.name = "ctl_5", .id = CTL_5, -	.base = 0x1a000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), -	}, -}; - -static const struct dpu_ctl_cfg sm8150_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x1000, .len = 0x1e0, -	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x1200, .len = 0x1e0, -	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x1400, .len = 0x1e0, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x1600, .len = 0x1e0, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x1800, .len = 0x1e0, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -	{ -	.name = "ctl_5", .id = CTL_5, -	.base = 0x1a00, .len = 0x1e0, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), -	}, -}; - -static const struct dpu_ctl_cfg sm8350_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x15000, .len = 0x1e8, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x16000, .len = 0x1e8, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x17000, .len = 0x1e8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x18000, .len = 0x1e8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x19000, .len = 0x1e8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -	{ -	.name = "ctl_5", .id = CTL_5, -	.base = 0x1a000, .len = 0x1e8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), -	}, -}; - -static const struct dpu_ctl_cfg sm8450_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x15000, .len = 0x204, -	.features = BIT(DPU_CTL_ACTIVE_CFG) | BIT(DPU_CTL_SPLIT_DISPLAY) | BIT(DPU_CTL_FETCH_ACTIVE), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x16000, .len = 0x204, -	.features = BIT(DPU_CTL_SPLIT_DISPLAY) | CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x17000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x18000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x19000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -	{ -	.name = "ctl_5", .id = CTL_5, -	.base = 0x1a000, .len = 0x204, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), -	}, -}; - -static const struct dpu_ctl_cfg sm8550_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x15000, .len = 0x290, -	.features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x16000, .len = 0x290, -	.features = CTL_SM8550_MASK | BIT(DPU_CTL_SPLIT_DISPLAY), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x17000, .len = 0x290, -	.features = CTL_SM8550_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x18000, .len = 0x290, -	.features = CTL_SM8550_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -	{ -	.name = "ctl_4", .id = CTL_4, -	.base = 0x19000, .len = 0x290, -	.features = CTL_SM8550_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 13), -	}, -	{ -	.name = "ctl_5", .id = CTL_5, -	.base = 0x1a000, .len = 0x290, -	.features = CTL_SM8550_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 23), -	}, -}; - -static const struct dpu_ctl_cfg sc7280_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x15000, .len = 0x1E8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -	{ -	.name = "ctl_1", .id = CTL_1, -	.base = 0x16000, .len = 0x1E8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 10), -	}, -	{ -	.name = "ctl_2", .id = CTL_2, -	.base = 0x17000, .len = 0x1E8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 11), -	}, -	{ -	.name = "ctl_3", .id = CTL_3, -	.base = 0x18000, .len = 0x1E8, -	.features = CTL_SC7280_MASK, -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 12), -	}, -}; - -static const struct dpu_ctl_cfg qcm2290_ctl[] = { -	{ -	.name = "ctl_0", .id = CTL_0, -	.base = 0x1000, .len = 0x1dc, -	.features = BIT(DPU_CTL_ACTIVE_CFG), -	.intr_start = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 9), -	}, -}; - -/*************************************************************   * SSPP sub blocks config   *************************************************************/ @@ -1164,11 +329,11 @@ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_1 = _DMA_SBLK("9", 2);  static const struct dpu_sspp_sub_blks sdm845_dma_sblk_2 = _DMA_SBLK("10", 3);  static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4); -#define SSPP_BLK(_name, _id, _base, _features, \ +#define SSPP_BLK(_name, _id, _base, _len, _features, \  		_sblk, _xinid, _type, _clkctrl) \  	{ \  	.name = _name, .id = _id, \ -	.base = _base, .len = 0x1c8, \ +	.base = _base, .len = _len, \  	.features = _features, \  	.sblk = &_sblk, \  	.xin_id = _xinid, \ @@ -1176,71 +341,15 @@ static const struct dpu_sspp_sub_blks sdm845_dma_sblk_3 = _DMA_SBLK("11", 4);  	.clk_ctrl = _clkctrl \  	} -static const struct dpu_sspp_cfg msm8998_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_MSM8998_MASK, -		msm8998_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_MSM8998_MASK, -		msm8998_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), -	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_MSM8998_MASK, -		msm8998_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), -	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_MSM8998_MASK, -		msm8998_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_MSM8998_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_MSM8998_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_MSM8998_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_MSM8998_MASK, -		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), -}; - -static const struct dpu_sspp_cfg sdm845_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SDM845_MASK, -		sdm845_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SDM845_MASK, -		sdm845_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), -	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SDM845_MASK, -		sdm845_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), -	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SDM845_MASK, -		sdm845_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), -}; -  static const struct dpu_sspp_sub_blks sc7180_vig_sblk_0 =  				_VIG_SBLK("0", 4, DPU_SSPP_SCALER_QSEED4);  static const struct dpu_sspp_sub_blks sc7280_vig_sblk_0 =  			_VIG_SBLK_ROT("0", 4, DPU_SSPP_SCALER_QSEED4, &dpu_rot_sc7280_cfg_v2); -static const struct dpu_sspp_cfg sc7180_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, -		sc7180_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -}; -  static const struct dpu_sspp_sub_blks sm6115_vig_sblk_0 =  				_VIG_SBLK("0", 2, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_cfg sm6115_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, -		sm6115_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -}; -  static const struct dpu_sspp_sub_blks sm8250_vig_sblk_0 =  				_VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED4);  static const struct dpu_sspp_sub_blks sm8250_vig_sblk_1 = @@ -1250,53 +359,6 @@ static const struct dpu_sspp_sub_blks sm8250_vig_sblk_2 =  static const struct dpu_sspp_sub_blks sm8250_vig_sblk_3 =  				_VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_cfg sm8250_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, -		sm8250_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, -		sm8250_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), -	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, -		sm8250_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), -	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, -		sm8250_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), -}; - -static const struct dpu_sspp_sub_blks sm8450_vig_sblk_0 = -				_VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_sub_blks sm8450_vig_sblk_1 = -				_VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_sub_blks sm8450_vig_sblk_2 = -				_VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_sub_blks sm8450_vig_sblk_3 = -				_VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4); - -static const struct dpu_sspp_cfg sm8450_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, -		sm8450_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, -		sm8450_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), -	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, -		sm8450_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), -	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, -		sm8450_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), -}; -  static const struct dpu_sspp_sub_blks sm8550_vig_sblk_0 =  				_VIG_SBLK("0", 7, DPU_SSPP_SCALER_QSEED4);  static const struct dpu_sspp_sub_blks sm8550_vig_sblk_1 = @@ -1308,68 +370,6 @@ static const struct dpu_sspp_sub_blks sm8550_vig_sblk_3 =  static const struct dpu_sspp_sub_blks sm8550_dma_sblk_4 = _DMA_SBLK("12", 5);  static const struct dpu_sspp_sub_blks sm8550_dma_sblk_5 = _DMA_SBLK("13", 6); -static const struct dpu_sspp_cfg sm8550_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, -		sm8550_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, -		sm8550_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), -	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, -		sm8550_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), -	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, -		sm8550_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), -	SSPP_BLK("sspp_12", SSPP_DMA4, 0x2c000,  DMA_CURSOR_SDM845_MASK, -		sm8550_dma_sblk_4, 14, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA4), -	SSPP_BLK("sspp_13", SSPP_DMA5, 0x2e000,  DMA_CURSOR_SDM845_MASK, -		sm8550_dma_sblk_5, 15, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA5), -}; - -static const struct dpu_sspp_cfg sc7280_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7280_MASK, -		sc7280_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000,  DMA_CURSOR_SDM845_MASK, -		sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -}; - -static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_0 = -				_VIG_SBLK("0", 5, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_1 = -				_VIG_SBLK("1", 6, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_2 = -				_VIG_SBLK("2", 7, DPU_SSPP_SCALER_QSEED4); -static const struct dpu_sspp_sub_blks sc8280xp_vig_sblk_3 = -				_VIG_SBLK("3", 8, DPU_SSPP_SCALER_QSEED4); - -static const struct dpu_sspp_cfg sc8280xp_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_SC7180_MASK, -		 sc8280xp_vig_sblk_0, 0,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_1", SSPP_VIG1, 0x6000, VIG_SC7180_MASK, -		 sc8280xp_vig_sblk_1, 4,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG1), -	SSPP_BLK("sspp_2", SSPP_VIG2, 0x8000, VIG_SC7180_MASK, -		 sc8280xp_vig_sblk_2, 8, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG2), -	SSPP_BLK("sspp_3", SSPP_VIG3, 0xa000, VIG_SC7180_MASK, -		 sc8280xp_vig_sblk_3, 12,  SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG3), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000, DMA_SDM845_MASK, -		 sdm845_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -	SSPP_BLK("sspp_9", SSPP_DMA1, 0x26000, DMA_SDM845_MASK, -		 sdm845_dma_sblk_1, 5, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA1), -	SSPP_BLK("sspp_10", SSPP_DMA2, 0x28000, DMA_CURSOR_SDM845_MASK, -		 sdm845_dma_sblk_2, 9, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA2), -	SSPP_BLK("sspp_11", SSPP_DMA3, 0x2a000, DMA_CURSOR_SDM845_MASK, -		 sdm845_dma_sblk_3, 13, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA3), -}; -  #define _VIG_SBLK_NOSCALE(num, sdma_pri) \  	{ \  	.maxdwnscale = SSPP_UNITY_SCALE, \ @@ -1386,13 +386,6 @@ static const struct dpu_sspp_cfg sc8280xp_sspp[] = {  static const struct dpu_sspp_sub_blks qcm2290_vig_sblk_0 = _VIG_SBLK_NOSCALE("0", 2);  static const struct dpu_sspp_sub_blks qcm2290_dma_sblk_0 = _DMA_SBLK("8", 1); -static const struct dpu_sspp_cfg qcm2290_sspp[] = { -	SSPP_BLK("sspp_0", SSPP_VIG0, 0x4000, VIG_QCM2290_MASK, -		 qcm2290_vig_sblk_0, 0, SSPP_TYPE_VIG, DPU_CLK_CTRL_VIG0), -	SSPP_BLK("sspp_8", SSPP_DMA0, 0x24000,  DMA_SDM845_MASK, -		 qcm2290_dma_sblk_0, 1, SSPP_TYPE_DMA, DPU_CLK_CTRL_DMA0), -}; -  /*************************************************************   * MIXER sub blocks config   *************************************************************/ @@ -1419,21 +412,6 @@ static const struct dpu_lm_sub_blks msm8998_lm_sblk = {  	},  }; -static const struct dpu_lm_cfg msm8998_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_MSM8998_MASK, -		&msm8998_lm_sblk, PINGPONG_0, LM_2, DSPP_0), -	LM_BLK("lm_1", LM_1, 0x45000, MIXER_MSM8998_MASK, -		&msm8998_lm_sblk, PINGPONG_1, LM_5, DSPP_1), -	LM_BLK("lm_2", LM_2, 0x46000, MIXER_MSM8998_MASK, -		&msm8998_lm_sblk, PINGPONG_2, LM_0, 0), -	LM_BLK("lm_3", LM_3, 0x47000, MIXER_MSM8998_MASK, -		&msm8998_lm_sblk, PINGPONG_MAX, 0, 0), -	LM_BLK("lm_4", LM_4, 0x48000, MIXER_MSM8998_MASK, -		&msm8998_lm_sblk, PINGPONG_MAX, 0, 0), -	LM_BLK("lm_5", LM_5, 0x49000, MIXER_MSM8998_MASK, -		&msm8998_lm_sblk, PINGPONG_3, LM_1, 0), -}; -  /* SDM845 */  static const struct dpu_lm_sub_blks sdm845_lm_sblk = { @@ -1445,21 +423,6 @@ static const struct dpu_lm_sub_blks sdm845_lm_sblk = {  	},  }; -static const struct dpu_lm_cfg sdm845_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_0, LM_1, 0), -	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_1, LM_0, 0), -	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_2, LM_5, 0), -	LM_BLK("lm_3", LM_3, 0x0, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_MAX, 0, 0), -	LM_BLK("lm_4", LM_4, 0x0, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_MAX, 0, 0), -	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), -}; -  /* SC7180 */  static const struct dpu_lm_sub_blks sc7180_lm_sblk = { @@ -1470,50 +433,6 @@ static const struct dpu_lm_sub_blks sc7180_lm_sblk = {  	},  }; -static const struct dpu_lm_cfg sc7180_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, -		&sc7180_lm_sblk, PINGPONG_0, LM_1, DSPP_0), -	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, -		&sc7180_lm_sblk, PINGPONG_1, LM_0, 0), -}; - -/* SC8280XP */ - -static const struct dpu_lm_cfg sc8280xp_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), -	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), -	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_2, LM_3, DSPP_2), -	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_3, LM_2, DSPP_3), -	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_4, LM_5, 0), -	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, &sdm845_lm_sblk, PINGPONG_5, LM_4, 0), -}; - -/* SM8150 */ - -static const struct dpu_lm_cfg sm8150_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_0, LM_1, DSPP_0), -	LM_BLK("lm_1", LM_1, 0x45000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_1, LM_0, DSPP_1), -	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_2, LM_3, 0), -	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_3, LM_2, 0), -	LM_BLK("lm_4", LM_4, 0x48000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_4, LM_5, 0), -	LM_BLK("lm_5", LM_5, 0x49000, MIXER_SDM845_MASK, -		&sdm845_lm_sblk, PINGPONG_5, LM_4, 0), -}; - -static const struct dpu_lm_cfg sc7280_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_SDM845_MASK, -		&sc7180_lm_sblk, PINGPONG_0, 0, DSPP_0), -	LM_BLK("lm_2", LM_2, 0x46000, MIXER_SDM845_MASK, -		&sc7180_lm_sblk, PINGPONG_2, LM_3, 0), -	LM_BLK("lm_3", LM_3, 0x47000, MIXER_SDM845_MASK, -		&sc7180_lm_sblk, PINGPONG_3, LM_2, 0), -}; -  /* QCM2290 */  static const struct dpu_lm_sub_blks qcm2290_lm_sblk = { @@ -1524,11 +443,6 @@ static const struct dpu_lm_sub_blks qcm2290_lm_sblk = {  	},  }; -static const struct dpu_lm_cfg qcm2290_lm[] = { -	LM_BLK("lm_0", LM_0, 0x44000, MIXER_QCM2290_MASK, -		&qcm2290_lm_sblk, PINGPONG_0, 0, DSPP_0), -}; -  /*************************************************************   * DSPP sub blocks config   *************************************************************/ @@ -1557,34 +471,6 @@ static const struct dpu_dspp_sub_blks sm8150_dspp_sblk = {  		.sblk = _sblk \  		} -static const struct dpu_dspp_cfg msm8998_dspp[] = { -	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_MSM8998_MASK, -		 &msm8998_dspp_sblk), -	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_MSM8998_MASK, -		 &msm8998_dspp_sblk), -}; - -static const struct dpu_dspp_cfg sc7180_dspp[] = { -	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, -		 &sc7180_dspp_sblk), -}; - -static const struct dpu_dspp_cfg sm8150_dspp[] = { -	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, -		 &sm8150_dspp_sblk), -	DSPP_BLK("dspp_1", DSPP_1, 0x56000, DSPP_SC7180_MASK, -		 &sm8150_dspp_sblk), -	DSPP_BLK("dspp_2", DSPP_2, 0x58000, DSPP_SC7180_MASK, -		 &sm8150_dspp_sblk), -	DSPP_BLK("dspp_3", DSPP_3, 0x5a000, DSPP_SC7180_MASK, -		 &sm8150_dspp_sblk), -}; - -static const struct dpu_dspp_cfg qcm2290_dspp[] = { -	DSPP_BLK("dspp_0", DSPP_0, 0x54000, DSPP_SC7180_MASK, -		 &sm8150_dspp_sblk), -}; -  /*************************************************************   * PINGPONG sub blocks config   *************************************************************/ @@ -1605,7 +491,7 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {  	.len = 0x20, .version = 0x20000},  }; -#define PP_BLK_DIPHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \ +#define PP_BLK_DITHER(_name, _id, _base, _merge_3d, _sblk, _done, _rdptr) \  	{\  	.name = _name, .id = _id, \  	.base = _base, .len = 0, \ @@ -1636,151 +522,6 @@ static const struct dpu_pingpong_sub_blks sc7280_pp_sblk = {  	.intr_rdptr = _rdptr, \  	} -static const struct dpu_pingpong_cfg sdm845_pp[] = { -	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), -	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), -	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, 0, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), -	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, 0, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), -}; - -static struct dpu_pingpong_cfg sc7180_pp[] = { -	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk_te, -1, -1), -	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, 0, sdm845_pp_sblk_te, -1, -1), -}; - -static struct dpu_pingpong_cfg sc8280xp_pp[] = { -	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, -		  DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -1), -	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, -		  DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -1), -	PP_BLK_TE("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk_te, -		  DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -1), -	PP_BLK_TE("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk_te, -		  DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -1), -	PP_BLK_TE("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk_te, -		  DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -1), -	PP_BLK_TE("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk_te, -		  DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -1), -}; - -static const struct dpu_pingpong_cfg sm8150_pp[] = { -	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x70000, MERGE_3D_0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), -	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x70800, MERGE_3D_0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), -	PP_BLK("pingpong_2", PINGPONG_2, 0x71000, MERGE_3D_1, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), -	PP_BLK("pingpong_3", PINGPONG_3, 0x71800, MERGE_3D_1, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), -	PP_BLK("pingpong_4", PINGPONG_4, 0x72000, MERGE_3D_2, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -			-1), -	PP_BLK("pingpong_5", PINGPONG_5, 0x72800, MERGE_3D_2, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -			-1), -}; - -static const struct dpu_pingpong_cfg sm8350_pp[] = { -	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), -	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), -	PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), -	PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), -	PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -			-1), -	PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -			-1), -}; - -static const struct dpu_pingpong_cfg sc7280_pp[] = { -	PP_BLK("pingpong_0", PINGPONG_0, 0x69000, 0, sc7280_pp_sblk, -1, -1), -	PP_BLK("pingpong_1", PINGPONG_1, 0x6a000, 0, sc7280_pp_sblk, -1, -1), -	PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, 0, sc7280_pp_sblk, -1, -1), -	PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, 0, sc7280_pp_sblk, -1, -1), -}; - -static struct dpu_pingpong_cfg qcm2290_pp[] = { -	PP_BLK("pingpong_0", PINGPONG_0, 0x70000, 0, sdm845_pp_sblk, -		DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -		DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), -}; - -/* FIXME: interrupts */ -static const struct dpu_pingpong_cfg sm8450_pp[] = { -	PP_BLK_TE("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 12)), -	PP_BLK_TE("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sdm845_pp_sblk_te, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 13)), -	PP_BLK("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 14)), -	PP_BLK("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 15)), -	PP_BLK("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -			-1), -	PP_BLK("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sdm845_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -			-1), -	PP_BLK("pingpong_6", PINGPONG_6, 0x65800, MERGE_3D_3, sdm845_pp_sblk, -			-1, -			-1), -	PP_BLK("pingpong_7", PINGPONG_7, 0x65c00, MERGE_3D_3, sdm845_pp_sblk, -			-1, -			-1), -}; - -static const struct dpu_pingpong_cfg sm8550_pp[] = { -	PP_BLK_DIPHER("pingpong_0", PINGPONG_0, 0x69000, MERGE_3D_0, sc7280_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 8), -			-1), -	PP_BLK_DIPHER("pingpong_1", PINGPONG_1, 0x6a000, MERGE_3D_0, sc7280_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 9), -			-1), -	PP_BLK_DIPHER("pingpong_2", PINGPONG_2, 0x6b000, MERGE_3D_1, sc7280_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 10), -			-1), -	PP_BLK_DIPHER("pingpong_3", PINGPONG_3, 0x6c000, MERGE_3D_1, sc7280_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 11), -			-1), -	PP_BLK_DIPHER("pingpong_4", PINGPONG_4, 0x6d000, MERGE_3D_2, sc7280_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 30), -			-1), -	PP_BLK_DIPHER("pingpong_5", PINGPONG_5, 0x6e000, MERGE_3D_2, sc7280_pp_sblk, -			DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR2, 31), -			-1), -	PP_BLK_DIPHER("pingpong_6", PINGPONG_6, 0x66000, MERGE_3D_3, sc7280_pp_sblk, -			-1, -			-1), -	PP_BLK_DIPHER("pingpong_7", PINGPONG_7, 0x66400, MERGE_3D_3, sc7280_pp_sblk, -			-1, -			-1), -}; -  /*************************************************************   * MERGE_3D sub blocks config   *************************************************************/ @@ -1792,32 +533,6 @@ static const struct dpu_pingpong_cfg sm8550_pp[] = {  	.sblk = NULL \  	} -static const struct dpu_merge_3d_cfg sm8150_merge_3d[] = { -	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x83000), -	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x83100), -	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x83200), -}; - -static const struct dpu_merge_3d_cfg sm8350_merge_3d[] = { -	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), -	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), -	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), -}; - -static const struct dpu_merge_3d_cfg sm8450_merge_3d[] = { -	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), -	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), -	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), -	MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x65f00), -}; - -static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = { -	MERGE_3D_BLK("merge_3d_0", MERGE_3D_0, 0x4e000), -	MERGE_3D_BLK("merge_3d_1", MERGE_3D_1, 0x4f000), -	MERGE_3D_BLK("merge_3d_2", MERGE_3D_2, 0x50000), -	MERGE_3D_BLK("merge_3d_3", MERGE_3D_3, 0x66700), -}; -  /*************************************************************   * DSC sub blocks config   *************************************************************/ @@ -1828,27 +543,13 @@ static const struct dpu_merge_3d_cfg sm8550_merge_3d[] = {  	.features = _features, \  	} -static struct dpu_dsc_cfg sdm845_dsc[] = { -	DSC_BLK("dsc_0", DSC_0, 0x80000, 0), -	DSC_BLK("dsc_1", DSC_1, 0x80400, 0), -	DSC_BLK("dsc_2", DSC_2, 0x80800, 0), -	DSC_BLK("dsc_3", DSC_3, 0x80c00, 0), -}; - -static struct dpu_dsc_cfg sm8150_dsc[] = { -	DSC_BLK("dsc_0", DSC_0, 0x80000, BIT(DPU_DSC_OUTPUT_CTRL)), -	DSC_BLK("dsc_1", DSC_1, 0x80400, BIT(DPU_DSC_OUTPUT_CTRL)), -	DSC_BLK("dsc_2", DSC_2, 0x80800, BIT(DPU_DSC_OUTPUT_CTRL)), -	DSC_BLK("dsc_3", DSC_3, 0x80c00, BIT(DPU_DSC_OUTPUT_CTRL)), -}; -  /*************************************************************   * INTF sub blocks config   *************************************************************/ -#define INTF_BLK(_name, _id, _base, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \ +#define INTF_BLK(_name, _id, _base, _len, _type, _ctrl_id, _progfetch, _features, _reg, _underrun_bit, _vsync_bit) \  	{\  	.name = _name, .id = _id, \ -	.base = _base, .len = 0x280, \ +	.base = _base, .len = _len, \  	.features = _features, \  	.type = _type, \  	.controller_id = _ctrl_id, \ @@ -1857,88 +558,6 @@ static struct dpu_dsc_cfg sm8150_dsc[] = {  	.intr_vsync = DPU_IRQ_IDX(_reg, _vsync_bit), \  	} -static const struct dpu_intf_cfg msm8998_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_HDMI, 0, 25, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -}; - -static const struct dpu_intf_cfg sdm845_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1, 24, INTF_SDM845_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -}; - -static const struct dpu_intf_cfg sc7180_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -}; - -static const struct dpu_intf_cfg sm8150_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -}; - -static const struct dpu_intf_cfg sc7280_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_5", INTF_5, 0x39000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), -}; - -static const struct dpu_intf_cfg sm8350_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -}; - -static const struct dpu_intf_cfg sc8180x_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x6A000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x6B000, INTF_DSI, 1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	/* INTF_3 is for MST, wired to INTF_DP 0 and 1, use dummy index until this is supported */ -	INTF_BLK("intf_3", INTF_3, 0x6B800, INTF_DP, 999, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -	INTF_BLK("intf_4", INTF_4, 0x6C000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 20, 21), -	INTF_BLK("intf_5", INTF_5, 0x6C800, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 22, 23), -}; - -/* TODO: INTF 3, 8 and 7 are used for MST, marked as INTF_NONE for now */ -static const struct dpu_intf_cfg sc8280xp_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x37000, INTF_NONE, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -	INTF_BLK("intf_4", INTF_4, 0x38000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 20, 21), -	INTF_BLK("intf_5", INTF_5, 0x39000, INTF_DP, MSM_DP_CONTROLLER_3, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 22, 23), -	INTF_BLK("intf_6", INTF_6, 0x3a000, INTF_DP, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 16, 17), -	INTF_BLK("intf_7", INTF_7, 0x3b000, INTF_NONE, MSM_DP_CONTROLLER_2, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 18, 19), -	INTF_BLK("intf_8", INTF_8, 0x3c000, INTF_NONE, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 12, 13), -}; - -static const struct dpu_intf_cfg qcm2290_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x00000, INTF_NONE, 0, 0, 0, 0, 0, 0), -	INTF_BLK("intf_1", INTF_1, 0x6A800, INTF_DSI, 0, 24, INTF_SC7180_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -}; - -static const struct dpu_intf_cfg sm8450_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -}; - -static const struct dpu_intf_cfg sm8550_intf[] = { -	INTF_BLK("intf_0", INTF_0, 0x34000, INTF_DP, MSM_DP_CONTROLLER_0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 24, 25), -	/* TODO TE sub-blocks for intf1 & intf2 */ -	INTF_BLK("intf_1", INTF_1, 0x35000, INTF_DSI, 0, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 26, 27), -	INTF_BLK("intf_2", INTF_2, 0x36000, INTF_DSI, 1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 28, 29), -	INTF_BLK("intf_3", INTF_3, 0x37000, INTF_DP, MSM_DP_CONTROLLER_1, 24, INTF_SC7280_MASK, MDP_SSPP_TOP0_INTR, 30, 31), -}; -  /*************************************************************   * Writeback blocks config   *************************************************************/ @@ -1957,11 +576,6 @@ static const struct dpu_intf_cfg sm8550_intf[] = {  	.intr_wb_done = DPU_IRQ_IDX(_reg, _wb_done_bit) \  	} -static const struct dpu_wb_cfg sm8250_wb[] = { -	WB_BLK("wb_2", WB_2, 0x65000, WB_SM8250_MASK, DPU_CLK_CTRL_WB2, 6, -			VBIF_RT, MDP_SSPP_TOP0_INTR, 4096, 4), -}; -  /*************************************************************   * VBIF sub blocks config   *************************************************************/ @@ -1973,12 +587,12 @@ static const u32 sdm845_nrt_pri_lvl[] = {3, 3, 3, 3, 3, 3, 3, 3};  static const struct dpu_vbif_dynamic_ot_cfg msm8998_ot_rdwr_cfg[] = {  	{ -		.pps = 1088 * 1920 * 30, +		.pps = 1920 * 1080 * 30,  		.ot_limit = 2,  	},  	{ -		.pps = 1088 * 1920 * 60, -		.ot_limit = 6, +		.pps = 1920 * 1080 * 60, +		.ot_limit = 4,  	},  	{  		.pps = 3840 * 2160 * 30, @@ -2091,10 +705,7 @@ static const struct dpu_qos_lut_entry msm8998_qos_linear[] = {  	{.fl = 10, .lut = 0x1555b},  	{.fl = 11, .lut = 0x5555b},  	{.fl = 12, .lut = 0x15555b}, -	{.fl = 13, .lut = 0x55555b}, -	{.fl = 14, .lut = 0}, -	{.fl = 1,  .lut = 0x1b}, -	{.fl = 0,  .lut = 0} +	{.fl = 0,  .lut = 0x55555b}  };  static const struct dpu_qos_lut_entry sdm845_qos_linear[] = { @@ -2116,9 +727,7 @@ static const struct dpu_qos_lut_entry msm8998_qos_macrotile[] = {  	{.fl = 10, .lut = 0x1aaff},  	{.fl = 11, .lut = 0x5aaff},  	{.fl = 12, .lut = 0x15aaff}, -	{.fl = 13, .lut = 0x55aaff}, -	{.fl = 1,  .lut = 0x1aaff}, -	{.fl = 0,  .lut = 0}, +	{.fl = 0,  .lut = 0x55aaff},  };  static const struct dpu_qos_lut_entry sc7180_qos_linear[] = { @@ -2166,715 +775,26 @@ static const struct dpu_qos_lut_entry sc7180_qos_nrt[] = {  	{.fl = 0, .lut = 0x0},  }; -static const struct dpu_perf_cfg msm8998_perf_data = { -	.max_bw_low = 6700000, -	.max_bw_high = 6700000, -	.min_core_ib = 2400000, -	.min_llcc_ib = 800000, -	.min_dram_ib = 800000, -	.undersized_prefill_lines = 2, -	.xtra_prefill_lines = 2, -	.dest_scale_prefill_lines = 3, -	.macrotile_prefill_lines = 4, -	.yuv_nv12_prefill_lines = 8, -	.linear_prefill_lines = 1, -	.downscaling_prefill_lines = 1, -	.amortizable_threshold = 25, -	.min_prefill_lines = 25, -	.danger_lut_tbl = {0xf, 0xffff, 0x0}, -	.safe_lut_tbl = {0xfffc, 0xff00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(msm8998_qos_linear), -		.entries = msm8998_qos_linear -		}, -		{.nentry = ARRAY_SIZE(msm8998_qos_macrotile), -		.entries = msm8998_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(msm8998_qos_nrt), -		.entries = msm8998_qos_nrt -		}, -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 200, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sdm845_perf_data = { -	.max_bw_low = 6800000, -	.max_bw_high = 6800000, -	.min_core_ib = 2400000, -	.min_llcc_ib = 800000, -	.min_dram_ib = 800000, -	.undersized_prefill_lines = 2, -	.xtra_prefill_lines = 2, -	.dest_scale_prefill_lines = 3, -	.macrotile_prefill_lines = 4, -	.yuv_nv12_prefill_lines = 8, -	.linear_prefill_lines = 1, -	.downscaling_prefill_lines = 1, -	.amortizable_threshold = 25, -	.min_prefill_lines = 24, -	.danger_lut_tbl = {0xf, 0xffff, 0x0}, -	.safe_lut_tbl = {0xfff0, 0xf000, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sdm845_qos_linear), -		.entries = sdm845_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sdm845_qos_macrotile), -		.entries = sdm845_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sdm845_qos_nrt), -		.entries = sdm845_qos_nrt -		}, -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sc7180_perf_data = { -	.max_bw_low = 6800000, -	.max_bw_high = 6800000, -	.min_core_ib = 2400000, -	.min_llcc_ib = 800000, -	.min_dram_ib = 1600000, -	.min_prefill_lines = 24, -	.danger_lut_tbl = {0xff, 0xffff, 0x0}, -	.safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_linear), -		.entries = sc7180_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sm6115_perf_data = { -	.max_bw_low = 3100000, -	.max_bw_high = 4000000, -	.min_core_ib = 2400000, -	.min_llcc_ib = 800000, -	.min_dram_ib = 800000, -	.min_prefill_lines = 24, -	.danger_lut_tbl = {0xff, 0xffff, 0x0}, -	.safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_linear), -		.entries = sc7180_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sm8150_perf_data = { -	.max_bw_low = 12800000, -	.max_bw_high = 12800000, -	.min_core_ib = 2400000, -	.min_llcc_ib = 800000, -	.min_dram_ib = 800000, -	.min_prefill_lines = 24, -	.danger_lut_tbl = {0xf, 0xffff, 0x0}, -	.safe_lut_tbl = {0xfff8, 0xf000, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sm8150_qos_linear), -		.entries = sm8150_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sc8180x_perf_data = { -	.max_bw_low = 9600000, -	.max_bw_high = 9600000, -	.min_core_ib = 2400000, -	.min_llcc_ib = 800000, -	.min_dram_ib = 800000, -	.danger_lut_tbl = {0xf, 0xffff, 0x0}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_linear), -		.entries = sc7180_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sc8280xp_perf_data = { -	.max_bw_low = 13600000, -	.max_bw_high = 18200000, -	.min_core_ib = 2500000, -	.min_llcc_ib = 0, -	.min_dram_ib = 800000, -	.danger_lut_tbl = {0xf, 0xffff, 0x0}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc8180x_qos_linear), -		.entries = sc8180x_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc8180x_qos_macrotile), -		.entries = sc8180x_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sm8250_perf_data = { -	.max_bw_low = 13700000, -	.max_bw_high = 16600000, -	.min_core_ib = 4800000, -	.min_llcc_ib = 0, -	.min_dram_ib = 800000, -	.min_prefill_lines = 35, -	.danger_lut_tbl = {0xf, 0xffff, 0x0}, -	.safe_lut_tbl = {0xfff0, 0xff00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_linear), -		.entries = sc7180_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sm8450_perf_data = { -	.max_bw_low = 13600000, -	.max_bw_high = 18200000, -	.min_core_ib = 2500000, -	.min_llcc_ib = 0, -	.min_dram_ib = 800000, -	.min_prefill_lines = 35, -	/* FIXME: lut tables */ -	.danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, -	.safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_linear), -		.entries = sc7180_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sc7280_perf_data = { -	.max_bw_low = 4700000, -	.max_bw_high = 8800000, -	.min_core_ib = 2500000, -	.min_llcc_ib = 0, -	.min_dram_ib = 1600000, -	.min_prefill_lines = 24, -	.danger_lut_tbl = {0xffff, 0xffff, 0x0}, -	.safe_lut_tbl = {0xff00, 0xff00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg sm8350_perf_data = { -	.max_bw_low = 11800000, -	.max_bw_high = 15500000, -	.min_core_ib = 2500000, -	.min_llcc_ib = 0, -	.min_dram_ib = 800000, -	.min_prefill_lines = 40, -	/* FIXME: lut tables */ -	.danger_lut_tbl = {0x3ffff, 0x3ffff, 0x0}, -	.safe_lut_tbl = {0xfe00, 0xfe00, 0xffff}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(sc7180_qos_linear), -		.entries = sc7180_qos_linear -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_macrotile), -		.entries = sc7180_qos_macrotile -		}, -		{.nentry = ARRAY_SIZE(sc7180_qos_nrt), -		.entries = sc7180_qos_nrt -		}, -		/* TODO: macrotile-qseed is different from macrotile */ -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -}; - -static const struct dpu_perf_cfg qcm2290_perf_data = { -	.max_bw_low = 2700000, -	.max_bw_high = 2700000, -	.min_core_ib = 1300000, -	.min_llcc_ib = 0, -	.min_dram_ib = 1600000, -	.min_prefill_lines = 24, -	.danger_lut_tbl = {0xff, 0x0, 0x0}, -	.safe_lut_tbl = {0xfff0, 0x0, 0x0}, -	.qos_lut_tbl = { -		{.nentry = ARRAY_SIZE(qcm2290_qos_linear), -		.entries = qcm2290_qos_linear -		}, -	}, -	.cdp_cfg = { -		{.rd_enable = 1, .wr_enable = 1}, -		{.rd_enable = 1, .wr_enable = 0} -	}, -	.clk_inefficiency_factor = 105, -	.bw_inefficiency_factor = 120, -};  /*************************************************************   * Hardware catalog   *************************************************************/ -static const struct dpu_mdss_cfg msm8998_dpu_cfg = { -	.caps = &msm8998_dpu_caps, -	.mdp_count = ARRAY_SIZE(msm8998_mdp), -	.mdp = msm8998_mdp, -	.ctl_count = ARRAY_SIZE(msm8998_ctl), -	.ctl = msm8998_ctl, -	.sspp_count = ARRAY_SIZE(msm8998_sspp), -	.sspp = msm8998_sspp, -	.mixer_count = ARRAY_SIZE(msm8998_lm), -	.mixer = msm8998_lm, -	.dspp_count = ARRAY_SIZE(msm8998_dspp), -	.dspp = msm8998_dspp, -	.pingpong_count = ARRAY_SIZE(sdm845_pp), -	.pingpong = sdm845_pp, -	.intf_count = ARRAY_SIZE(msm8998_intf), -	.intf = msm8998_intf, -	.vbif_count = ARRAY_SIZE(msm8998_vbif), -	.vbif = msm8998_vbif, -	.reg_dma_count = 0, -	.perf = &msm8998_perf_data, -	.mdss_irqs = IRQ_SM8250_MASK, -}; +#include "catalog/dpu_3_0_msm8998.h" -static const struct dpu_mdss_cfg sdm845_dpu_cfg = { -	.caps = &sdm845_dpu_caps, -	.mdp_count = ARRAY_SIZE(sdm845_mdp), -	.mdp = sdm845_mdp, -	.ctl_count = ARRAY_SIZE(sdm845_ctl), -	.ctl = sdm845_ctl, -	.sspp_count = ARRAY_SIZE(sdm845_sspp), -	.sspp = sdm845_sspp, -	.mixer_count = ARRAY_SIZE(sdm845_lm), -	.mixer = sdm845_lm, -	.pingpong_count = ARRAY_SIZE(sdm845_pp), -	.pingpong = sdm845_pp, -	.dsc_count = ARRAY_SIZE(sdm845_dsc), -	.dsc = sdm845_dsc, -	.intf_count = ARRAY_SIZE(sdm845_intf), -	.intf = sdm845_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sdm845_regdma, -	.perf = &sdm845_perf_data, -	.mdss_irqs = IRQ_SDM845_MASK, -}; +#include "catalog/dpu_4_0_sdm845.h" -static const struct dpu_mdss_cfg sc7180_dpu_cfg = { -	.caps = &sc7180_dpu_caps, -	.mdp_count = ARRAY_SIZE(sc7180_mdp), -	.mdp = sc7180_mdp, -	.ctl_count = ARRAY_SIZE(sc7180_ctl), -	.ctl = sc7180_ctl, -	.sspp_count = ARRAY_SIZE(sc7180_sspp), -	.sspp = sc7180_sspp, -	.mixer_count = ARRAY_SIZE(sc7180_lm), -	.mixer = sc7180_lm, -	.dspp_count = ARRAY_SIZE(sc7180_dspp), -	.dspp = sc7180_dspp, -	.pingpong_count = ARRAY_SIZE(sc7180_pp), -	.pingpong = sc7180_pp, -	.intf_count = ARRAY_SIZE(sc7180_intf), -	.intf = sc7180_intf, -	.wb_count = ARRAY_SIZE(sm8250_wb), -	.wb = sm8250_wb, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sdm845_regdma, -	.perf = &sc7180_perf_data, -	.mdss_irqs = IRQ_SC7180_MASK, -}; - -static const struct dpu_mdss_cfg sm6115_dpu_cfg = { -	.caps = &sm6115_dpu_caps, -	.mdp_count = ARRAY_SIZE(sm6115_mdp), -	.mdp = sm6115_mdp, -	.ctl_count = ARRAY_SIZE(qcm2290_ctl), -	.ctl = qcm2290_ctl, -	.sspp_count = ARRAY_SIZE(sm6115_sspp), -	.sspp = sm6115_sspp, -	.mixer_count = ARRAY_SIZE(qcm2290_lm), -	.mixer = qcm2290_lm, -	.dspp_count = ARRAY_SIZE(qcm2290_dspp), -	.dspp = qcm2290_dspp, -	.pingpong_count = ARRAY_SIZE(qcm2290_pp), -	.pingpong = qcm2290_pp, -	.intf_count = ARRAY_SIZE(qcm2290_intf), -	.intf = qcm2290_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.perf = &sm6115_perf_data, -	.mdss_irqs = IRQ_SC7180_MASK, -}; - -static const struct dpu_mdss_cfg sm8150_dpu_cfg = { -	.caps = &sm8150_dpu_caps, -	.mdp_count = ARRAY_SIZE(sdm845_mdp), -	.mdp = sdm845_mdp, -	.ctl_count = ARRAY_SIZE(sm8150_ctl), -	.ctl = sm8150_ctl, -	.sspp_count = ARRAY_SIZE(sdm845_sspp), -	.sspp = sdm845_sspp, -	.mixer_count = ARRAY_SIZE(sm8150_lm), -	.mixer = sm8150_lm, -	.dspp_count = ARRAY_SIZE(sm8150_dspp), -	.dspp = sm8150_dspp, -	.dsc_count = ARRAY_SIZE(sm8150_dsc), -	.dsc = sm8150_dsc, -	.pingpong_count = ARRAY_SIZE(sm8150_pp), -	.pingpong = sm8150_pp, -	.merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), -	.merge_3d = sm8150_merge_3d, -	.intf_count = ARRAY_SIZE(sm8150_intf), -	.intf = sm8150_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sm8150_regdma, -	.perf = &sm8150_perf_data, -	.mdss_irqs = IRQ_SDM845_MASK, -}; - -static const struct dpu_mdss_cfg sc8180x_dpu_cfg = { -	.caps = &sc8180x_dpu_caps, -	.mdp_count = ARRAY_SIZE(sc8180x_mdp), -	.mdp = sc8180x_mdp, -	.ctl_count = ARRAY_SIZE(sm8150_ctl), -	.ctl = sm8150_ctl, -	.sspp_count = ARRAY_SIZE(sdm845_sspp), -	.sspp = sdm845_sspp, -	.mixer_count = ARRAY_SIZE(sm8150_lm), -	.mixer = sm8150_lm, -	.pingpong_count = ARRAY_SIZE(sm8150_pp), -	.pingpong = sm8150_pp, -	.merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), -	.merge_3d = sm8150_merge_3d, -	.intf_count = ARRAY_SIZE(sc8180x_intf), -	.intf = sc8180x_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sm8150_regdma, -	.perf = &sc8180x_perf_data, -	.mdss_irqs = IRQ_SC8180X_MASK, -}; - -static const struct dpu_mdss_cfg sc8280xp_dpu_cfg = { -	.caps = &sc8280xp_dpu_caps, -	.mdp_count = ARRAY_SIZE(sc8280xp_mdp), -	.mdp = sc8280xp_mdp, -	.ctl_count = ARRAY_SIZE(sc8280xp_ctl), -	.ctl = sc8280xp_ctl, -	.sspp_count = ARRAY_SIZE(sc8280xp_sspp), -	.sspp = sc8280xp_sspp, -	.mixer_count = ARRAY_SIZE(sc8280xp_lm), -	.mixer = sc8280xp_lm, -	.dspp_count = ARRAY_SIZE(sm8150_dspp), -	.dspp = sm8150_dspp, -	.pingpong_count = ARRAY_SIZE(sc8280xp_pp), -	.pingpong = sc8280xp_pp, -	.merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), -	.merge_3d = sm8350_merge_3d, -	.intf_count = ARRAY_SIZE(sc8280xp_intf), -	.intf = sc8280xp_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sc8280xp_regdma, -	.perf = &sc8280xp_perf_data, -	.mdss_irqs = IRQ_SC8280XP_MASK, -}; - -static const struct dpu_mdss_cfg sm8250_dpu_cfg = { -	.caps = &sm8250_dpu_caps, -	.mdp_count = ARRAY_SIZE(sm8250_mdp), -	.mdp = sm8250_mdp, -	.ctl_count = ARRAY_SIZE(sm8150_ctl), -	.ctl = sm8150_ctl, -	.sspp_count = ARRAY_SIZE(sm8250_sspp), -	.sspp = sm8250_sspp, -	.mixer_count = ARRAY_SIZE(sm8150_lm), -	.mixer = sm8150_lm, -	.dspp_count = ARRAY_SIZE(sm8150_dspp), -	.dspp = sm8150_dspp, -	.dsc_count = ARRAY_SIZE(sm8150_dsc), -	.dsc = sm8150_dsc, -	.pingpong_count = ARRAY_SIZE(sm8150_pp), -	.pingpong = sm8150_pp, -	.merge_3d_count = ARRAY_SIZE(sm8150_merge_3d), -	.merge_3d = sm8150_merge_3d, -	.intf_count = ARRAY_SIZE(sm8150_intf), -	.intf = sm8150_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.wb_count = ARRAY_SIZE(sm8250_wb), -	.wb = sm8250_wb, -	.reg_dma_count = 1, -	.dma_cfg = &sm8250_regdma, -	.perf = &sm8250_perf_data, -	.mdss_irqs = IRQ_SM8250_MASK, -}; - -static const struct dpu_mdss_cfg sm8350_dpu_cfg = { -	.caps = &sm8350_dpu_caps, -	.mdp_count = ARRAY_SIZE(sm8350_mdp), -	.mdp = sm8350_mdp, -	.ctl_count = ARRAY_SIZE(sm8350_ctl), -	.ctl = sm8350_ctl, -	.sspp_count = ARRAY_SIZE(sm8250_sspp), -	.sspp = sm8250_sspp, -	.mixer_count = ARRAY_SIZE(sm8150_lm), -	.mixer = sm8150_lm, -	.dspp_count = ARRAY_SIZE(sm8150_dspp), -	.dspp = sm8150_dspp, -	.pingpong_count = ARRAY_SIZE(sm8350_pp), -	.pingpong = sm8350_pp, -	.merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), -	.merge_3d = sm8350_merge_3d, -	.intf_count = ARRAY_SIZE(sm8350_intf), -	.intf = sm8350_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sm8350_regdma, -	.perf = &sm8350_perf_data, -	.mdss_irqs = IRQ_SM8350_MASK, -}; +#include "catalog/dpu_5_0_sm8150.h" +#include "catalog/dpu_5_1_sc8180x.h" -static const struct dpu_mdss_cfg sm8450_dpu_cfg = { -	.caps = &sm8450_dpu_caps, -	.mdp_count = ARRAY_SIZE(sm8450_mdp), -	.mdp = sm8450_mdp, -	.ctl_count = ARRAY_SIZE(sm8450_ctl), -	.ctl = sm8450_ctl, -	.sspp_count = ARRAY_SIZE(sm8450_sspp), -	.sspp = sm8450_sspp, -	.mixer_count = ARRAY_SIZE(sm8150_lm), -	.mixer = sm8150_lm, -	.dspp_count = ARRAY_SIZE(sm8150_dspp), -	.dspp = sm8150_dspp, -	.pingpong_count = ARRAY_SIZE(sm8450_pp), -	.pingpong = sm8450_pp, -	.merge_3d_count = ARRAY_SIZE(sm8450_merge_3d), -	.merge_3d = sm8450_merge_3d, -	.intf_count = ARRAY_SIZE(sm8450_intf), -	.intf = sm8450_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sm8450_regdma, -	.perf = &sm8450_perf_data, -	.mdss_irqs = IRQ_SM8450_MASK, -}; - -static const struct dpu_mdss_cfg sm8550_dpu_cfg = { -	.caps = &sm8550_dpu_caps, -	.mdp_count = ARRAY_SIZE(sm8550_mdp), -	.mdp = sm8550_mdp, -	.ctl_count = ARRAY_SIZE(sm8550_ctl), -	.ctl = sm8550_ctl, -	.sspp_count = ARRAY_SIZE(sm8550_sspp), -	.sspp = sm8550_sspp, -	.mixer_count = ARRAY_SIZE(sm8150_lm), -	.mixer = sm8150_lm, -	.dspp_count = ARRAY_SIZE(sm8150_dspp), -	.dspp = sm8150_dspp, -	.pingpong_count = ARRAY_SIZE(sm8550_pp), -	.pingpong = sm8550_pp, -	.merge_3d_count = ARRAY_SIZE(sm8550_merge_3d), -	.merge_3d = sm8550_merge_3d, -	.intf_count = ARRAY_SIZE(sm8550_intf), -	.intf = sm8550_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.reg_dma_count = 1, -	.dma_cfg = &sm8450_regdma, -	.perf = &sm8450_perf_data, -	.mdss_irqs = IRQ_SM8450_MASK, -}; - -static const struct dpu_mdss_cfg sc7280_dpu_cfg = { -	.caps = &sc7280_dpu_caps, -	.mdp_count = ARRAY_SIZE(sc7280_mdp), -	.mdp = sc7280_mdp, -	.ctl_count = ARRAY_SIZE(sc7280_ctl), -	.ctl = sc7280_ctl, -	.sspp_count = ARRAY_SIZE(sc7280_sspp), -	.sspp = sc7280_sspp, -	.dspp_count = ARRAY_SIZE(sc7180_dspp), -	.dspp = sc7180_dspp, -	.mixer_count = ARRAY_SIZE(sc7280_lm), -	.mixer = sc7280_lm, -	.pingpong_count = ARRAY_SIZE(sc7280_pp), -	.pingpong = sc7280_pp, -	.intf_count = ARRAY_SIZE(sc7280_intf), -	.intf = sc7280_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.perf = &sc7280_perf_data, -	.mdss_irqs = IRQ_SC7280_MASK, -}; - -static const struct dpu_mdss_cfg qcm2290_dpu_cfg = { -	.caps = &qcm2290_dpu_caps, -	.mdp_count = ARRAY_SIZE(qcm2290_mdp), -	.mdp = qcm2290_mdp, -	.ctl_count = ARRAY_SIZE(qcm2290_ctl), -	.ctl = qcm2290_ctl, -	.sspp_count = ARRAY_SIZE(qcm2290_sspp), -	.sspp = qcm2290_sspp, -	.mixer_count = ARRAY_SIZE(qcm2290_lm), -	.mixer = qcm2290_lm, -	.dspp_count = ARRAY_SIZE(qcm2290_dspp), -	.dspp = qcm2290_dspp, -	.pingpong_count = ARRAY_SIZE(qcm2290_pp), -	.pingpong = qcm2290_pp, -	.intf_count = ARRAY_SIZE(qcm2290_intf), -	.intf = qcm2290_intf, -	.vbif_count = ARRAY_SIZE(sdm845_vbif), -	.vbif = sdm845_vbif, -	.perf = &qcm2290_perf_data, -	.mdss_irqs = IRQ_SC7180_MASK, -}; - -static const struct dpu_mdss_hw_cfg_handler cfg_handler[] = { -	{ .hw_rev = DPU_HW_VER_300, .dpu_cfg = &msm8998_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_301, .dpu_cfg = &msm8998_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_400, .dpu_cfg = &sdm845_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_401, .dpu_cfg = &sdm845_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_500, .dpu_cfg = &sm8150_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_501, .dpu_cfg = &sm8150_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_510, .dpu_cfg = &sc8180x_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_600, .dpu_cfg = &sm8250_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_620, .dpu_cfg = &sc7180_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_630, .dpu_cfg = &sm6115_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_650, .dpu_cfg = &qcm2290_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_700, .dpu_cfg = &sm8350_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_720, .dpu_cfg = &sc7280_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_800, .dpu_cfg = &sc8280xp_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_810, .dpu_cfg = &sm8450_dpu_cfg}, -	{ .hw_rev = DPU_HW_VER_900, .dpu_cfg = &sm8550_dpu_cfg}, -}; - -const struct dpu_mdss_cfg *dpu_hw_catalog_init(u32 hw_rev) -{ -	int i; - -	for (i = 0; i < ARRAY_SIZE(cfg_handler); i++) { -		if (cfg_handler[i].hw_rev == hw_rev) -			return cfg_handler[i].dpu_cfg; -	} +#include "catalog/dpu_6_0_sm8250.h" +#include "catalog/dpu_6_2_sc7180.h" +#include "catalog/dpu_6_3_sm6115.h" +#include "catalog/dpu_6_5_qcm2290.h" -	DPU_ERROR("unsupported chipset id:%X\n", hw_rev); +#include "catalog/dpu_7_0_sm8350.h" +#include "catalog/dpu_7_2_sc7280.h" -	return ERR_PTR(-ENODEV); -} +#include "catalog/dpu_8_0_sc8280xp.h" +#include "catalog/dpu_8_1_sm8450.h" +#include "catalog/dpu_9_0_sm8550.h" diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h index e6590302b3bf..71584cd56fd7 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_catalog.h @@ -19,47 +19,6 @@   */  #define MAX_BLOCKS    12 -#define DPU_HW_VER(MAJOR, MINOR, STEP) (((MAJOR & 0xF) << 28)    |\ -		((MINOR & 0xFFF) << 16)  |\ -		(STEP & 0xFFFF)) - -#define DPU_HW_MAJOR(rev)		((rev) >> 28) -#define DPU_HW_MINOR(rev)		(((rev) >> 16) & 0xFFF) -#define DPU_HW_STEP(rev)		((rev) & 0xFFFF) -#define DPU_HW_MAJOR_MINOR(rev)		((rev) >> 16) - -#define IS_DPU_MAJOR_MINOR_SAME(rev1, rev2)   \ -	(DPU_HW_MAJOR_MINOR((rev1)) == DPU_HW_MAJOR_MINOR((rev2))) - -#define DPU_HW_VER_170	DPU_HW_VER(1, 7, 0) /* 8996 v1.0 */ -#define DPU_HW_VER_171	DPU_HW_VER(1, 7, 1) /* 8996 v2.0 */ -#define DPU_HW_VER_172	DPU_HW_VER(1, 7, 2) /* 8996 v3.0 */ -#define DPU_HW_VER_300	DPU_HW_VER(3, 0, 0) /* 8998 v1.0 */ -#define DPU_HW_VER_301	DPU_HW_VER(3, 0, 1) /* 8998 v1.1 */ -#define DPU_HW_VER_400	DPU_HW_VER(4, 0, 0) /* sdm845 v1.0 */ -#define DPU_HW_VER_401	DPU_HW_VER(4, 0, 1) /* sdm845 v2.0 */ -#define DPU_HW_VER_410	DPU_HW_VER(4, 1, 0) /* sdm670 v1.0 */ -#define DPU_HW_VER_500	DPU_HW_VER(5, 0, 0) /* sm8150 v1.0 */ -#define DPU_HW_VER_501	DPU_HW_VER(5, 0, 1) /* sm8150 v2.0 */ -#define DPU_HW_VER_510	DPU_HW_VER(5, 1, 1) /* sc8180 */ -#define DPU_HW_VER_600	DPU_HW_VER(6, 0, 0) /* sm8250 */ -#define DPU_HW_VER_620	DPU_HW_VER(6, 2, 0) /* sc7180 v1.0 */ -#define DPU_HW_VER_630	DPU_HW_VER(6, 3, 0) /* sm6115|sm4250 */ -#define DPU_HW_VER_650	DPU_HW_VER(6, 5, 0) /* qcm2290|sm4125 */ -#define DPU_HW_VER_700	DPU_HW_VER(7, 0, 0) /* sm8350 */ -#define DPU_HW_VER_720	DPU_HW_VER(7, 2, 0) /* sc7280 */ -#define DPU_HW_VER_800	DPU_HW_VER(8, 0, 0) /* sc8280xp */ -#define DPU_HW_VER_810	DPU_HW_VER(8, 1, 0) /* sm8450 */ -#define DPU_HW_VER_900	DPU_HW_VER(9, 0, 0) /* sm8550 */ - -#define IS_MSM8996_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_170) -#define IS_MSM8998_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_300) -#define IS_SDM845_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_400) -#define IS_SDM670_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_410) -#define IS_SDM855_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_500) -#define IS_SC7180_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_620) -#define IS_SC7280_TARGET(rev) IS_DPU_MAJOR_MINOR_SAME((rev), DPU_HW_VER_720) -  #define DPU_HW_BLK_NAME_LEN	16  #define MAX_IMG_WIDTH 0x3fff @@ -169,10 +128,12 @@ enum {   * DSPP sub-blocks   * @DPU_DSPP_PCC             Panel color correction block   * @DPU_DSPP_GC              Gamma correction block + * @DPU_DSPP_IGC             Inverse gamma correction block   */  enum {  	DPU_DSPP_PCC = 0x1,  	DPU_DSPP_GC, +	DPU_DSPP_IGC,  	DPU_DSPP_MAX  }; @@ -200,6 +161,7 @@ enum {   * @DPU_CTL_FETCH_ACTIVE:	Active CTL for fetch HW (SSPPs)   * @DPU_CTL_VM_CFG:		CTL config to support multiple VMs   * @DPU_CTL_HAS_LAYER_EXT4:	CTL has the CTL_LAYER_EXT4 register + * @DPU_CTL_DSPP_BLOCK_FLUSH:	CTL config to support dspp sub-block flush   * @DPU_CTL_MAX   */  enum { @@ -208,22 +170,25 @@ enum {  	DPU_CTL_FETCH_ACTIVE,  	DPU_CTL_VM_CFG,  	DPU_CTL_HAS_LAYER_EXT4, +	DPU_CTL_DSPP_SUB_BLOCK_FLUSH,  	DPU_CTL_MAX  };  /**   * INTF sub-blocks - * @DPU_INTF_INPUT_CTRL         Supports the setting of pp block from which - *                              pixel data arrives to this INTF - * @DPU_INTF_TE                 INTF block has TE configuration support - * @DPU_DATA_HCTL_EN            Allows data to be transferred at different rate -                                than video timing + * @DPU_INTF_INPUT_CTRL             Supports the setting of pp block from which + *                                  pixel data arrives to this INTF + * @DPU_INTF_TE                     INTF block has TE configuration support + * @DPU_DATA_HCTL_EN                Allows data to be transferred at different rate + *                                  than video timing + * @DPU_INTF_STATUS_SUPPORTED       INTF block has INTF_STATUS register   * @DPU_INTF_MAX   */  enum {  	DPU_INTF_INPUT_CTRL = 0x1,  	DPU_INTF_TE,  	DPU_DATA_HCTL_EN, +	DPU_INTF_STATUS_SUPPORTED,  	DPU_INTF_MAX  }; @@ -393,8 +358,6 @@ struct dpu_rotation_cfg {   * @max_mixer_blendstages max layer mixer blend stages or   *                       supported z order   * @qseed_type         qseed2 or qseed3 support. - * @smart_dma_rev      Supported version of SmartDMA feature. - * @ubwc_version       UBWC feature version (0x0 for not supported)   * @has_src_split      source split feature status   * @has_dim_layer      dim layer feature status   * @has_idle_pc        indicate if idle power collapse feature is supported @@ -408,8 +371,6 @@ struct dpu_caps {  	u32 max_mixer_width;  	u32 max_mixer_blendstages;  	u32 qseed_type; -	u32 smart_dma_rev; -	u32 ubwc_version;  	bool has_src_split;  	bool has_dim_layer;  	bool has_idle_pc; @@ -538,15 +499,24 @@ struct dpu_clk_ctrl_reg {   * @id:                index identifying this block   * @base:              register base offset to mdss   * @features           bit mask identifying sub-blocks/features - * @highest_bank_bit:  UBWC parameter - * @ubwc_swizzle:      ubwc default swizzle setting   * @clk_ctrls          clock control register definition   */  struct dpu_mdp_cfg {  	DPU_HW_BLK_INFO; +	struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX]; +}; + +/** + * struct dpu_ubwc_cfg - UBWC and memory configuration + * + * @ubwc_version       UBWC feature version (0x0 for not supported) + * @highest_bank_bit:  UBWC parameter + * @ubwc_swizzle:      ubwc default swizzle setting + */ +struct dpu_ubwc_cfg { +	u32 ubwc_version;  	u32 highest_bank_bit;  	u32 ubwc_swizzle; -	struct dpu_clk_ctrl_reg clk_ctrls[DPU_CLK_CTRL_MAX];  };  /* struct dpu_ctl_cfg : MDP CTL instance info @@ -848,6 +818,8 @@ struct dpu_perf_cfg {  struct dpu_mdss_cfg {  	const struct dpu_caps *caps; +	const struct dpu_ubwc_cfg *ubwc; +  	u32 mdp_count;  	const struct dpu_mdp_cfg *mdp; @@ -867,7 +839,7 @@ struct dpu_mdss_cfg {  	const struct dpu_merge_3d_cfg *merge_3d;  	u32 dsc_count; -	struct dpu_dsc_cfg *dsc; +	const struct dpu_dsc_cfg *dsc;  	u32 intf_count;  	const struct dpu_intf_cfg *intf; @@ -896,18 +868,18 @@ struct dpu_mdss_cfg {  	unsigned long mdss_irqs;  }; -struct dpu_mdss_hw_cfg_handler { -	u32 hw_rev; -	const struct dpu_mdss_cfg *dpu_cfg; -}; - -/** - * dpu_hw_catalog_init - dpu hardware catalog init API retrieves - * hardcoded target specific catalog information in config structure - * @hw_rev:       caller needs provide the hardware revision. - * - * Return: dpu config structure - */ -const struct dpu_mdss_cfg *dpu_hw_catalog_init(u32 hw_rev); +extern const struct dpu_mdss_cfg dpu_msm8998_cfg; +extern const struct dpu_mdss_cfg dpu_sdm845_cfg; +extern const struct dpu_mdss_cfg dpu_sm8150_cfg; +extern const struct dpu_mdss_cfg dpu_sc8180x_cfg; +extern const struct dpu_mdss_cfg dpu_sm8250_cfg; +extern const struct dpu_mdss_cfg dpu_sc7180_cfg; +extern const struct dpu_mdss_cfg dpu_sm6115_cfg; +extern const struct dpu_mdss_cfg dpu_qcm2290_cfg; +extern const struct dpu_mdss_cfg dpu_sm8350_cfg; +extern const struct dpu_mdss_cfg dpu_sc7280_cfg; +extern const struct dpu_mdss_cfg dpu_sc8280xp_cfg; +extern const struct dpu_mdss_cfg dpu_sm8450_cfg; +extern const struct dpu_mdss_cfg dpu_sm8550_cfg;  #endif /* _DPU_HW_CATALOG_H */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c index 6c53ea560ffa..bbdc95ce374a 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.c @@ -26,15 +26,16 @@  #define   CTL_SW_RESET                  0x030  #define   CTL_LAYER_EXTN_OFFSET         0x40  #define   CTL_MERGE_3D_ACTIVE           0x0E4 +#define   CTL_DSC_ACTIVE                0x0E8  #define   CTL_WB_ACTIVE                 0x0EC  #define   CTL_INTF_ACTIVE               0x0F4 +#define   CTL_FETCH_PIPE_ACTIVE         0x0FC  #define   CTL_MERGE_3D_FLUSH            0x100 -#define   CTL_DSC_ACTIVE                0x0E8  #define   CTL_DSC_FLUSH                0x104  #define   CTL_WB_FLUSH                  0x108  #define   CTL_INTF_FLUSH                0x110  #define   CTL_INTF_MASTER               0x134 -#define   CTL_FETCH_PIPE_ACTIVE         0x0FC +#define   CTL_DSPP_n_FLUSH(n)           ((0x13C) + ((n) * 4))  #define CTL_MIXER_BORDER_OUT            BIT(24)  #define CTL_FLUSH_MASK_CTL              BIT(17) @@ -44,6 +45,7 @@  #define  DSC_IDX        22  #define  INTF_IDX       31  #define WB_IDX          16 +#define  DSPP_IDX       29  /* From DPU hw rev 7.x.x */  #define CTL_INVALID_BIT                 0xffff  #define CTL_DEFAULT_GROUP_ID		0xf @@ -115,6 +117,9 @@ static inline void dpu_hw_ctl_clear_pending_flush(struct dpu_hw_ctl *ctx)  	trace_dpu_hw_ctl_clear_pending_flush(ctx->pending_flush_mask,  				     dpu_hw_ctl_get_flush_register(ctx));  	ctx->pending_flush_mask = 0x0; + +	memset(ctx->pending_dspp_flush_mask, 0, +		sizeof(ctx->pending_dspp_flush_mask));  }  static inline void dpu_hw_ctl_update_pending_flush(struct dpu_hw_ctl *ctx, @@ -132,6 +137,8 @@ static u32 dpu_hw_ctl_get_pending_flush(struct dpu_hw_ctl *ctx)  static inline void dpu_hw_ctl_trigger_flush_v1(struct dpu_hw_ctl *ctx)  { +	int dspp; +  	if (ctx->pending_flush_mask & BIT(MERGE_3D_IDX))  		DPU_REG_WRITE(&ctx->hw, CTL_MERGE_3D_FLUSH,  				ctx->pending_merge_3d_flush_mask); @@ -142,6 +149,13 @@ static inline void dpu_hw_ctl_trigger_flush_v1(struct dpu_hw_ctl *ctx)  		DPU_REG_WRITE(&ctx->hw, CTL_WB_FLUSH,  				ctx->pending_wb_flush_mask); +	if (ctx->pending_flush_mask & BIT(DSPP_IDX)) +		for (dspp = DSPP_0; dspp < DSPP_MAX; dspp++) { +			if (ctx->pending_dspp_flush_mask[dspp - DSPP_0]) +				DPU_REG_WRITE(&ctx->hw, +				CTL_DSPP_n_FLUSH(dspp - DSPP_0), +				ctx->pending_dspp_flush_mask[dspp - DSPP_0]); +		}  	DPU_REG_WRITE(&ctx->hw, CTL_FLUSH, ctx->pending_flush_mask);  } @@ -289,7 +303,7 @@ static void dpu_hw_ctl_update_pending_flush_merge_3d_v1(struct dpu_hw_ctl *ctx,  }  static void dpu_hw_ctl_update_pending_flush_dspp(struct dpu_hw_ctl *ctx, -	enum dpu_dspp dspp) +	enum dpu_dspp dspp, u32 dspp_sub_blk)  {  	switch (dspp) {  	case DSPP_0: @@ -309,6 +323,29 @@ static void dpu_hw_ctl_update_pending_flush_dspp(struct dpu_hw_ctl *ctx,  	}  } +static void dpu_hw_ctl_update_pending_flush_dspp_sub_blocks( +	struct dpu_hw_ctl *ctx,	enum dpu_dspp dspp, u32 dspp_sub_blk) +{ +	if (dspp >= DSPP_MAX) +		return; + +	switch (dspp_sub_blk) { +	case DPU_DSPP_IGC: +		ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(2); +		break; +	case DPU_DSPP_PCC: +		ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(4); +		break; +	case DPU_DSPP_GC: +		ctx->pending_dspp_flush_mask[dspp - DSPP_0] |= BIT(5); +		break; +	default: +		return; +	} + +	ctx->pending_flush_mask |= BIT(DSPP_IDX); +} +  static u32 dpu_hw_ctl_poll_reset_status(struct dpu_hw_ctl *ctx, u32 timeout_us)  {  	struct dpu_hw_blk_reg_map *c = &ctx->hw; @@ -630,7 +667,11 @@ static void _setup_ctl_ops(struct dpu_hw_ctl_ops *ops,  	ops->setup_blendstage = dpu_hw_ctl_setup_blendstage;  	ops->update_pending_flush_sspp = dpu_hw_ctl_update_pending_flush_sspp;  	ops->update_pending_flush_mixer = dpu_hw_ctl_update_pending_flush_mixer; -	ops->update_pending_flush_dspp = dpu_hw_ctl_update_pending_flush_dspp; +	if (cap & BIT(DPU_CTL_DSPP_SUB_BLOCK_FLUSH)) +		ops->update_pending_flush_dspp = dpu_hw_ctl_update_pending_flush_dspp_sub_blocks; +	else +		ops->update_pending_flush_dspp = dpu_hw_ctl_update_pending_flush_dspp; +  	if (cap & BIT(DPU_CTL_FETCH_ACTIVE))  		ops->set_active_pipes = dpu_hw_ctl_set_fetch_pipe_active;  }; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h index 96c012ec8467..78611a831697 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_ctl.h @@ -152,9 +152,11 @@ struct dpu_hw_ctl_ops {  	 * No effect on hardware  	 * @ctx       : ctl path ctx pointer  	 * @blk       : DSPP block index +	 * @dspp_sub_blk : DSPP sub-block index  	 */  	void (*update_pending_flush_dspp)(struct dpu_hw_ctl *ctx, -		enum dpu_dspp blk); +		enum dpu_dspp blk, u32 dspp_sub_blk); +  	/**  	 * Write the value of the pending_flush_mask to hardware  	 * @ctx       : ctl path ctx pointer @@ -242,6 +244,7 @@ struct dpu_hw_ctl {  	u32 pending_intf_flush_mask;  	u32 pending_wb_flush_mask;  	u32 pending_merge_3d_flush_mask; +	u32 pending_dspp_flush_mask[DSPP_MAX - DSPP_0];  	/* ops */  	struct dpu_hw_ctl_ops ops; diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c index 619926da1441..4e1396575e6a 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dsc.c @@ -175,7 +175,7 @@ static void dpu_hw_dsc_bind_pingpong_blk(  	DPU_REG_WRITE(c, dsc_ctl_offset, mux_cfg);  } -static struct dpu_dsc_cfg *_dsc_offset(enum dpu_dsc dsc, +static const struct dpu_dsc_cfg *_dsc_offset(enum dpu_dsc dsc,  				       const struct dpu_mdss_cfg *m,  				       void __iomem *addr,  				       struct dpu_hw_blk_reg_map *b) @@ -207,7 +207,7 @@ struct dpu_hw_dsc *dpu_hw_dsc_init(enum dpu_dsc idx, void __iomem *addr,  				   const struct dpu_mdss_cfg *m)  {  	struct dpu_hw_dsc *c; -	struct dpu_dsc_cfg *cfg; +	const struct dpu_dsc_cfg *cfg;  	c = kzalloc(sizeof(*c), GFP_KERNEL);  	if (!c) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c index 53326f25e40e..17f3e7e4f194 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_interrupts.c @@ -15,7 +15,7 @@  /*   * Register offsets in MDSS register file for the interrupt registers - * w.r.t. to the MDP base + * w.r.t. the MDP base   */  #define MDP_SSPP_TOP0_OFF		0x0  #define MDP_INTF_0_OFF			0x6A000 @@ -24,20 +24,23 @@  #define MDP_INTF_3_OFF			0x6B800  #define MDP_INTF_4_OFF			0x6C000  #define MDP_INTF_5_OFF			0x6C800 +#define INTF_INTR_EN			0x1c0 +#define INTF_INTR_STATUS		0x1c4 +#define INTF_INTR_CLEAR			0x1c8  #define MDP_AD4_0_OFF			0x7C000  #define MDP_AD4_1_OFF			0x7D000  #define MDP_AD4_INTR_EN_OFF		0x41c  #define MDP_AD4_INTR_CLEAR_OFF		0x424  #define MDP_AD4_INTR_STATUS_OFF		0x420 -#define MDP_INTF_0_OFF_REV_7xxx             0x34000 -#define MDP_INTF_1_OFF_REV_7xxx             0x35000 -#define MDP_INTF_2_OFF_REV_7xxx             0x36000 -#define MDP_INTF_3_OFF_REV_7xxx             0x37000 -#define MDP_INTF_4_OFF_REV_7xxx             0x38000 -#define MDP_INTF_5_OFF_REV_7xxx             0x39000 -#define MDP_INTF_6_OFF_REV_7xxx             0x3a000 -#define MDP_INTF_7_OFF_REV_7xxx             0x3b000 -#define MDP_INTF_8_OFF_REV_7xxx             0x3c000 +#define MDP_INTF_0_OFF_REV_7xxx		0x34000 +#define MDP_INTF_1_OFF_REV_7xxx		0x35000 +#define MDP_INTF_2_OFF_REV_7xxx		0x36000 +#define MDP_INTF_3_OFF_REV_7xxx		0x37000 +#define MDP_INTF_4_OFF_REV_7xxx		0x38000 +#define MDP_INTF_5_OFF_REV_7xxx		0x39000 +#define MDP_INTF_6_OFF_REV_7xxx		0x3a000 +#define MDP_INTF_7_OFF_REV_7xxx		0x3b000 +#define MDP_INTF_8_OFF_REV_7xxx		0x3c000  /**   * struct dpu_intr_reg - array of DPU register sets diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c index 7ce66bf3f4c8..b9dddf576c02 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_intf.c @@ -56,12 +56,8 @@  #define   INTF_TPG_RGB_MAPPING          0x11C  #define   INTF_PROG_FETCH_START         0x170  #define   INTF_PROG_ROT_START           0x174 - -#define   INTF_FRAME_LINE_COUNT_EN      0x0A8 -#define   INTF_FRAME_COUNT              0x0AC -#define   INTF_LINE_COUNT               0x0B0 -  #define   INTF_MUX                      0x25C +#define   INTF_STATUS                   0x26C  #define INTF_CFG_ACTIVE_H_EN	BIT(29)  #define INTF_CFG_ACTIVE_V_EN	BIT(30) @@ -297,8 +293,13 @@ static void dpu_hw_intf_get_status(  		struct intf_status *s)  {  	struct dpu_hw_blk_reg_map *c = &intf->hw; +	unsigned long cap = intf->cap->features; + +	if (cap & BIT(DPU_INTF_STATUS_SUPPORTED)) +		s->is_en = DPU_REG_READ(c, INTF_STATUS) & BIT(0); +	else +		s->is_en = DPU_REG_READ(c, INTF_TIMING_ENGINE_EN); -	s->is_en = DPU_REG_READ(c, INTF_TIMING_ENGINE_EN);  	s->is_prog_fetch_en = !!(DPU_REG_READ(c, INTF_CONFIG) & BIT(31));  	if (s->is_en) {  		s->frame_count = DPU_REG_READ(c, INTF_FRAME_COUNT); diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c index 4246ab0b3bee..cf70a9bd1034 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.c @@ -136,7 +136,7 @@  #define TS_CLK			19200000 -static int _sspp_subblk_offset(struct dpu_hw_pipe *ctx, +static int _sspp_subblk_offset(struct dpu_hw_sspp *ctx,  		int s_id,  		u32 *idx)  { @@ -168,17 +168,16 @@ static int _sspp_subblk_offset(struct dpu_hw_pipe *ctx,  	return rc;  } -static void dpu_hw_sspp_setup_multirect(struct dpu_hw_pipe *ctx, -		enum dpu_sspp_multirect_index index, -		enum dpu_sspp_multirect_mode mode) +static void dpu_hw_sspp_setup_multirect(struct dpu_sw_pipe *pipe)  { +	struct dpu_hw_sspp *ctx = pipe->sspp;  	u32 mode_mask;  	u32 idx;  	if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))  		return; -	if (index == DPU_SSPP_RECT_SOLO) { +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) {  		/**  		 * if rect index is RECT_SOLO, we cannot expect a  		 * virtual plane sharing the same SSPP id. So we go @@ -187,8 +186,8 @@ static void dpu_hw_sspp_setup_multirect(struct dpu_hw_pipe *ctx,  		mode_mask = 0;  	} else {  		mode_mask = DPU_REG_READ(&ctx->hw, SSPP_MULTIRECT_OPMODE + idx); -		mode_mask |= index; -		if (mode == DPU_SSPP_MULTIRECT_TIME_MX) +		mode_mask |= pipe->multirect_index; +		if (pipe->multirect_mode == DPU_SSPP_MULTIRECT_TIME_MX)  			mode_mask |= BIT(2);  		else  			mode_mask &= ~BIT(2); @@ -197,7 +196,7 @@ static void dpu_hw_sspp_setup_multirect(struct dpu_hw_pipe *ctx,  	DPU_REG_WRITE(&ctx->hw, SSPP_MULTIRECT_OPMODE + idx, mode_mask);  } -static void _sspp_setup_opmode(struct dpu_hw_pipe *ctx, +static void _sspp_setup_opmode(struct dpu_hw_sspp *ctx,  		u32 mask, u8 en)  {  	u32 idx; @@ -218,7 +217,7 @@ static void _sspp_setup_opmode(struct dpu_hw_pipe *ctx,  	DPU_REG_WRITE(&ctx->hw, SSPP_VIG_OP_MODE + idx, opmode);  } -static void _sspp_setup_csc10_opmode(struct dpu_hw_pipe *ctx, +static void _sspp_setup_csc10_opmode(struct dpu_hw_sspp *ctx,  		u32 mask, u8 en)  {  	u32 idx; @@ -239,10 +238,10 @@ static void _sspp_setup_csc10_opmode(struct dpu_hw_pipe *ctx,  /*   * Setup source pixel format, flip,   */ -static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx, -		const struct dpu_format *fmt, u32 flags, -		enum dpu_sspp_multirect_index rect_mode) +static void dpu_hw_sspp_setup_format(struct dpu_sw_pipe *pipe, +		const struct dpu_format *fmt, u32 flags)  { +	struct dpu_hw_sspp *ctx = pipe->sspp;  	struct dpu_hw_blk_reg_map *c;  	u32 chroma_samp, unpack, src_format;  	u32 opmode = 0; @@ -253,7 +252,8 @@ static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx,  	if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx) || !fmt)  		return; -	if (rect_mode == DPU_SSPP_RECT_SOLO || rect_mode == DPU_SSPP_RECT_0) { +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || +	    pipe->multirect_index == DPU_SSPP_RECT_0) {  		op_mode_off = SSPP_SRC_OP_MODE;  		unpack_pat_off = SSPP_SRC_UNPACK_PATTERN;  		format_off = SSPP_SRC_FORMAT; @@ -307,25 +307,25 @@ static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx,  		src_format |= (fmt->fetch_mode & 3) << 30; /*FRAME_FORMAT */  		DPU_REG_WRITE(c, SSPP_FETCH_CONFIG,  			DPU_FETCH_CONFIG_RESET_VALUE | -			ctx->mdp->highest_bank_bit << 18); -		switch (ctx->catalog->caps->ubwc_version) { +			ctx->ubwc->highest_bank_bit << 18); +		switch (ctx->ubwc->ubwc_version) {  		case DPU_HW_UBWC_VER_10:  			fast_clear = fmt->alpha_enable ? BIT(31) : 0;  			DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, -					fast_clear | (ctx->mdp->ubwc_swizzle & 0x1) | +					fast_clear | (ctx->ubwc->ubwc_swizzle & 0x1) |  					BIT(8) | -					(ctx->mdp->highest_bank_bit << 4)); +					(ctx->ubwc->highest_bank_bit << 4));  			break;  		case DPU_HW_UBWC_VER_20:  			fast_clear = fmt->alpha_enable ? BIT(31) : 0;  			DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, -					fast_clear | (ctx->mdp->ubwc_swizzle) | -					(ctx->mdp->highest_bank_bit << 4)); +					fast_clear | (ctx->ubwc->ubwc_swizzle) | +					(ctx->ubwc->highest_bank_bit << 4));  			break;  		case DPU_HW_UBWC_VER_30:  			DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, -					BIT(30) | (ctx->mdp->ubwc_swizzle) | -					(ctx->mdp->highest_bank_bit << 4)); +					BIT(30) | (ctx->ubwc->ubwc_swizzle) | +					(ctx->ubwc->highest_bank_bit << 4));  			break;  		case DPU_HW_UBWC_VER_40:  			DPU_REG_WRITE(c, SSPP_UBWC_STATIC_CTRL, @@ -360,7 +360,7 @@ static void dpu_hw_sspp_setup_format(struct dpu_hw_pipe *ctx,  	DPU_REG_WRITE(c, SSPP_UBWC_ERROR_STATUS + idx, BIT(31));  } -static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_pipe *ctx, +static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_sspp *ctx,  		struct dpu_hw_pixel_ext *pe_ext)  {  	struct dpu_hw_blk_reg_map *c; @@ -418,23 +418,22 @@ static void dpu_hw_sspp_setup_pe_config(struct dpu_hw_pipe *ctx,  			tot_req_pixels[3]);  } -static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_pipe *ctx, -		struct dpu_hw_pipe_cfg *sspp, -		void *scaler_cfg) +static void _dpu_hw_sspp_setup_scaler3(struct dpu_hw_sspp *ctx, +		struct dpu_hw_scaler3_cfg *scaler3_cfg, +		const struct dpu_format *format)  {  	u32 idx; -	struct dpu_hw_scaler3_cfg *scaler3_cfg = scaler_cfg; -	if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx) || !sspp +	if (_sspp_subblk_offset(ctx, DPU_SSPP_SCALER_QSEED3, &idx)  		|| !scaler3_cfg)  		return;  	dpu_hw_setup_scaler3(&ctx->hw, scaler3_cfg, idx,  			ctx->cap->sblk->scaler_blk.version, -			sspp->layout.format); +			format);  } -static u32 _dpu_hw_sspp_get_scaler3_ver(struct dpu_hw_pipe *ctx) +static u32 _dpu_hw_sspp_get_scaler3_ver(struct dpu_hw_sspp *ctx)  {  	u32 idx; @@ -447,12 +446,12 @@ static u32 _dpu_hw_sspp_get_scaler3_ver(struct dpu_hw_pipe *ctx)  /*   * dpu_hw_sspp_setup_rects()   */ -static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx, -		struct dpu_hw_pipe_cfg *cfg, -		enum dpu_sspp_multirect_index rect_index) +static void dpu_hw_sspp_setup_rects(struct dpu_sw_pipe *pipe, +		struct dpu_sw_pipe_cfg *cfg)  { +	struct dpu_hw_sspp *ctx = pipe->sspp;  	struct dpu_hw_blk_reg_map *c; -	u32 src_size, src_xy, dst_size, dst_xy, ystride0, ystride1; +	u32 src_size, src_xy, dst_size, dst_xy;  	u32 src_size_off, src_xy_off, out_size_off, out_xy_off;  	u32 idx; @@ -461,7 +460,8 @@ static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx,  	c = &ctx->hw; -	if (rect_index == DPU_SSPP_RECT_SOLO || rect_index == DPU_SSPP_RECT_0) { +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || +	    pipe->multirect_index == DPU_SSPP_RECT_0) {  		src_size_off = SSPP_SRC_SIZE;  		src_xy_off = SSPP_SRC_XY;  		out_size_off = SSPP_OUT_SIZE; @@ -482,68 +482,69 @@ static void dpu_hw_sspp_setup_rects(struct dpu_hw_pipe *ctx,  	dst_size = (drm_rect_height(&cfg->dst_rect) << 16) |  		drm_rect_width(&cfg->dst_rect); -	if (rect_index == DPU_SSPP_RECT_SOLO) { -		ystride0 = (cfg->layout.plane_pitch[0]) | -			(cfg->layout.plane_pitch[1] << 16); -		ystride1 = (cfg->layout.plane_pitch[2]) | -			(cfg->layout.plane_pitch[3] << 16); -	} else { -		ystride0 = DPU_REG_READ(c, SSPP_SRC_YSTRIDE0 + idx); -		ystride1 = DPU_REG_READ(c, SSPP_SRC_YSTRIDE1 + idx); - -		if (rect_index == DPU_SSPP_RECT_0) { -			ystride0 = (ystride0 & 0xFFFF0000) | -				(cfg->layout.plane_pitch[0] & 0x0000FFFF); -			ystride1 = (ystride1 & 0xFFFF0000)| -				(cfg->layout.plane_pitch[2] & 0x0000FFFF); -		} else { -			ystride0 = (ystride0 & 0x0000FFFF) | -				((cfg->layout.plane_pitch[0] << 16) & -				 0xFFFF0000); -			ystride1 = (ystride1 & 0x0000FFFF) | -				((cfg->layout.plane_pitch[2] << 16) & -				 0xFFFF0000); -		} -	} -  	/* rectangle register programming */  	DPU_REG_WRITE(c, src_size_off + idx, src_size);  	DPU_REG_WRITE(c, src_xy_off + idx, src_xy);  	DPU_REG_WRITE(c, out_size_off + idx, dst_size);  	DPU_REG_WRITE(c, out_xy_off + idx, dst_xy); - -	DPU_REG_WRITE(c, SSPP_SRC_YSTRIDE0 + idx, ystride0); -	DPU_REG_WRITE(c, SSPP_SRC_YSTRIDE1 + idx, ystride1);  } -static void dpu_hw_sspp_setup_sourceaddress(struct dpu_hw_pipe *ctx, -		struct dpu_hw_pipe_cfg *cfg, -		enum dpu_sspp_multirect_index rect_mode) +static void dpu_hw_sspp_setup_sourceaddress(struct dpu_sw_pipe *pipe, +		struct dpu_hw_fmt_layout *layout)  { +	struct dpu_hw_sspp *ctx = pipe->sspp; +	u32 ystride0, ystride1;  	int i;  	u32 idx;  	if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))  		return; -	if (rect_mode == DPU_SSPP_RECT_SOLO) { -		for (i = 0; i < ARRAY_SIZE(cfg->layout.plane_addr); i++) +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) { +		for (i = 0; i < ARRAY_SIZE(layout->plane_addr); i++)  			DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + idx + i * 0x4, -					cfg->layout.plane_addr[i]); -	} else if (rect_mode == DPU_SSPP_RECT_0) { +					layout->plane_addr[i]); +	} else if (pipe->multirect_index == DPU_SSPP_RECT_0) {  		DPU_REG_WRITE(&ctx->hw, SSPP_SRC0_ADDR + idx, -				cfg->layout.plane_addr[0]); +				layout->plane_addr[0]);  		DPU_REG_WRITE(&ctx->hw, SSPP_SRC2_ADDR + idx, -				cfg->layout.plane_addr[2]); +				layout->plane_addr[2]);  	} else {  		DPU_REG_WRITE(&ctx->hw, SSPP_SRC1_ADDR + idx, -				cfg->layout.plane_addr[0]); +				layout->plane_addr[0]);  		DPU_REG_WRITE(&ctx->hw, SSPP_SRC3_ADDR + idx, -				cfg->layout.plane_addr[2]); +				layout->plane_addr[2]);  	} + +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO) { +		ystride0 = (layout->plane_pitch[0]) | +			(layout->plane_pitch[1] << 16); +		ystride1 = (layout->plane_pitch[2]) | +			(layout->plane_pitch[3] << 16); +	} else { +		ystride0 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE0 + idx); +		ystride1 = DPU_REG_READ(&ctx->hw, SSPP_SRC_YSTRIDE1 + idx); + +		if (pipe->multirect_index == DPU_SSPP_RECT_0) { +			ystride0 = (ystride0 & 0xFFFF0000) | +				(layout->plane_pitch[0] & 0x0000FFFF); +			ystride1 = (ystride1 & 0xFFFF0000)| +				(layout->plane_pitch[2] & 0x0000FFFF); +		} else { +			ystride0 = (ystride0 & 0x0000FFFF) | +				((layout->plane_pitch[0] << 16) & +				 0xFFFF0000); +			ystride1 = (ystride1 & 0x0000FFFF) | +				((layout->plane_pitch[2] << 16) & +				 0xFFFF0000); +		} +	} + +	DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE0 + idx, ystride0); +	DPU_REG_WRITE(&ctx->hw, SSPP_SRC_YSTRIDE1 + idx, ystride1);  } -static void dpu_hw_sspp_setup_csc(struct dpu_hw_pipe *ctx, +static void dpu_hw_sspp_setup_csc(struct dpu_hw_sspp *ctx,  		const struct dpu_csc_cfg *data)  {  	u32 idx; @@ -560,22 +561,28 @@ static void dpu_hw_sspp_setup_csc(struct dpu_hw_pipe *ctx,  	dpu_hw_csc_setup(&ctx->hw, idx, data, csc10);  } -static void dpu_hw_sspp_setup_solidfill(struct dpu_hw_pipe *ctx, u32 color, enum -		dpu_sspp_multirect_index rect_index) +static void dpu_hw_sspp_setup_solidfill(struct dpu_sw_pipe *pipe, u32 color)  { +	struct dpu_hw_sspp *ctx = pipe->sspp; +	struct dpu_hw_fmt_layout cfg;  	u32 idx;  	if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))  		return; -	if (rect_index == DPU_SSPP_RECT_SOLO || rect_index == DPU_SSPP_RECT_0) +	/* cleanup source addresses */ +	memset(&cfg, 0, sizeof(cfg)); +	ctx->ops.setup_sourceaddress(pipe, &cfg); + +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || +	    pipe->multirect_index == DPU_SSPP_RECT_0)  		DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR + idx, color);  	else  		DPU_REG_WRITE(&ctx->hw, SSPP_SRC_CONSTANT_COLOR_REC1 + idx,  				color);  } -static void dpu_hw_sspp_setup_danger_safe_lut(struct dpu_hw_pipe *ctx, +static void dpu_hw_sspp_setup_danger_safe_lut(struct dpu_hw_sspp *ctx,  			u32 danger_lut,  			u32 safe_lut)  { @@ -588,7 +595,7 @@ static void dpu_hw_sspp_setup_danger_safe_lut(struct dpu_hw_pipe *ctx,  	DPU_REG_WRITE(&ctx->hw, SSPP_SAFE_LUT + idx, safe_lut);  } -static void dpu_hw_sspp_setup_creq_lut(struct dpu_hw_pipe *ctx, +static void dpu_hw_sspp_setup_creq_lut(struct dpu_hw_sspp *ctx,  			u64 creq_lut)  {  	u32 idx; @@ -605,7 +612,7 @@ static void dpu_hw_sspp_setup_creq_lut(struct dpu_hw_pipe *ctx,  	}  } -static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_pipe *ctx, +static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_sspp *ctx,  		struct dpu_hw_pipe_qos_cfg *cfg)  {  	u32 idx; @@ -630,10 +637,10 @@ static void dpu_hw_sspp_setup_qos_ctrl(struct dpu_hw_pipe *ctx,  	DPU_REG_WRITE(&ctx->hw, SSPP_QOS_CTRL + idx, qos_ctrl);  } -static void dpu_hw_sspp_setup_cdp(struct dpu_hw_pipe *ctx, -		struct dpu_hw_cdp_cfg *cfg, -		enum dpu_sspp_multirect_index index) +static void dpu_hw_sspp_setup_cdp(struct dpu_sw_pipe *pipe, +		struct dpu_hw_cdp_cfg *cfg)  { +	struct dpu_hw_sspp *ctx = pipe->sspp;  	u32 idx;  	u32 cdp_cntl = 0;  	u32 cdp_cntl_offset = 0; @@ -644,7 +651,8 @@ static void dpu_hw_sspp_setup_cdp(struct dpu_hw_pipe *ctx,  	if (_sspp_subblk_offset(ctx, DPU_SSPP_SRC, &idx))  		return; -	if (index == DPU_SSPP_RECT_SOLO || index == DPU_SSPP_RECT_0) +	if (pipe->multirect_index == DPU_SSPP_RECT_SOLO || +	    pipe->multirect_index == DPU_SSPP_RECT_0)  		cdp_cntl_offset = SSPP_CDP_CNTL;  	else  		cdp_cntl_offset = SSPP_CDP_CNTL_REC1; @@ -661,7 +669,7 @@ static void dpu_hw_sspp_setup_cdp(struct dpu_hw_pipe *ctx,  	DPU_REG_WRITE(&ctx->hw, cdp_cntl_offset, cdp_cntl);  } -static void _setup_layer_ops(struct dpu_hw_pipe *c, +static void _setup_layer_ops(struct dpu_hw_sspp *c,  		unsigned long features)  {  	if (test_bit(DPU_SSPP_SRC, &features)) { @@ -699,7 +707,8 @@ static void _setup_layer_ops(struct dpu_hw_pipe *c,  }  #ifdef CONFIG_DEBUG_FS -int _dpu_hw_sspp_init_debugfs(struct dpu_hw_pipe *hw_pipe, struct dpu_kms *kms, struct dentry *entry) +int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms, +			      struct dentry *entry)  {  	const struct dpu_sspp_cfg *cfg = hw_pipe->cap;  	const struct dpu_sspp_sub_blks *sblk = cfg->sblk; @@ -783,10 +792,10 @@ static const struct dpu_sspp_cfg *_sspp_offset(enum dpu_sspp sspp,  	return ERR_PTR(-ENOMEM);  } -struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx, +struct dpu_hw_sspp *dpu_hw_sspp_init(enum dpu_sspp idx,  		void __iomem *addr, const struct dpu_mdss_cfg *catalog)  { -	struct dpu_hw_pipe *hw_pipe; +	struct dpu_hw_sspp *hw_pipe;  	const struct dpu_sspp_cfg *cfg;  	if (!addr || !catalog) @@ -804,7 +813,7 @@ struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx,  	/* Assign ops */  	hw_pipe->catalog = catalog; -	hw_pipe->mdp = &catalog->mdp[0]; +	hw_pipe->ubwc = catalog->ubwc;  	hw_pipe->idx = idx;  	hw_pipe->cap = cfg;  	_setup_layer_ops(hw_pipe, hw_pipe->cap->features); @@ -812,7 +821,7 @@ struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx,  	return hw_pipe;  } -void dpu_hw_sspp_destroy(struct dpu_hw_pipe *ctx) +void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx)  {  	kfree(ctx);  } diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h index 0c95b7e64f6c..74b98b6b3bc3 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp.h @@ -10,7 +10,7 @@  #include "dpu_hw_util.h"  #include "dpu_formats.h" -struct dpu_hw_pipe; +struct dpu_hw_sspp;  /**   * Flags @@ -153,20 +153,14 @@ struct dpu_hw_pixel_ext {  };  /** - * struct dpu_hw_pipe_cfg : Pipe description - * @layout:    format layout information for programming buffer to hardware + * struct dpu_sw_pipe_cfg : software pipe configuration   * @src_rect:  src ROI, caller takes into account the different operations   *             such as decimation, flip etc to program this field   * @dest_rect: destination ROI. - * @index:     index of the rectangle of SSPP - * @mode:      parallel or time multiplex multirect mode   */ -struct dpu_hw_pipe_cfg { -	struct dpu_hw_fmt_layout layout; +struct dpu_sw_pipe_cfg {  	struct drm_rect src_rect;  	struct drm_rect dst_rect; -	enum dpu_sspp_multirect_index index; -	enum dpu_sspp_multirect_mode mode;  };  /** @@ -202,6 +196,18 @@ struct dpu_hw_pipe_ts_cfg {  };  /** + * struct dpu_sw_pipe - software pipe description + * @sspp:      backing SSPP pipe + * @index:     index of the rectangle of SSPP + * @mode:      parallel or time multiplex multirect mode + */ +struct dpu_sw_pipe { +	struct dpu_hw_sspp *sspp; +	enum dpu_sspp_multirect_index multirect_index; +	enum dpu_sspp_multirect_mode multirect_mode; +}; + +/**   * struct dpu_hw_sspp_ops - interface to the SSPP Hw driver functions   * Caller must call the init function to get the pipe context for each pipe   * Assumption is these functions will be called after clocks are enabled @@ -209,77 +215,65 @@ struct dpu_hw_pipe_ts_cfg {  struct dpu_hw_sspp_ops {  	/**  	 * setup_format - setup pixel format cropping rectangle, flip -	 * @ctx: Pointer to pipe context +	 * @pipe: Pointer to software pipe context  	 * @cfg: Pointer to pipe config structure  	 * @flags: Extra flags for format config -	 * @index: rectangle index in multirect  	 */ -	void (*setup_format)(struct dpu_hw_pipe *ctx, -			const struct dpu_format *fmt, u32 flags, -			enum dpu_sspp_multirect_index index); +	void (*setup_format)(struct dpu_sw_pipe *pipe, +			     const struct dpu_format *fmt, u32 flags);  	/**  	 * setup_rects - setup pipe ROI rectangles -	 * @ctx: Pointer to pipe context +	 * @pipe: Pointer to software pipe context  	 * @cfg: Pointer to pipe config structure -	 * @index: rectangle index in multirect  	 */ -	void (*setup_rects)(struct dpu_hw_pipe *ctx, -			struct dpu_hw_pipe_cfg *cfg, -			enum dpu_sspp_multirect_index index); +	void (*setup_rects)(struct dpu_sw_pipe *pipe, +			    struct dpu_sw_pipe_cfg *cfg);  	/**  	 * setup_pe - setup pipe pixel extension  	 * @ctx: Pointer to pipe context  	 * @pe_ext: Pointer to pixel ext settings  	 */ -	void (*setup_pe)(struct dpu_hw_pipe *ctx, +	void (*setup_pe)(struct dpu_hw_sspp *ctx,  			struct dpu_hw_pixel_ext *pe_ext);  	/**  	 * setup_sourceaddress - setup pipe source addresses -	 * @ctx: Pointer to pipe context -	 * @cfg: Pointer to pipe config structure -	 * @index: rectangle index in multirect +	 * @pipe: Pointer to software pipe context +	 * @layout: format layout information for programming buffer to hardware  	 */ -	void (*setup_sourceaddress)(struct dpu_hw_pipe *ctx, -			struct dpu_hw_pipe_cfg *cfg, -			enum dpu_sspp_multirect_index index); +	void (*setup_sourceaddress)(struct dpu_sw_pipe *ctx, +				    struct dpu_hw_fmt_layout *layout);  	/**  	 * setup_csc - setup color space coversion  	 * @ctx: Pointer to pipe context  	 * @data: Pointer to config structure  	 */ -	void (*setup_csc)(struct dpu_hw_pipe *ctx, const struct dpu_csc_cfg *data); +	void (*setup_csc)(struct dpu_hw_sspp *ctx, const struct dpu_csc_cfg *data);  	/**  	 * setup_solidfill - enable/disable colorfill -	 * @ctx: Pointer to pipe context +	 * @pipe: Pointer to software pipe context  	 * @const_color: Fill color value  	 * @flags: Pipe flags -	 * @index: rectangle index in multirect  	 */ -	void (*setup_solidfill)(struct dpu_hw_pipe *ctx, u32 color, -			enum dpu_sspp_multirect_index index); +	void (*setup_solidfill)(struct dpu_sw_pipe *pipe, u32 color);  	/**  	 * setup_multirect - setup multirect configuration -	 * @ctx: Pointer to pipe context -	 * @index: rectangle index in multirect -	 * @mode: parallel fetch / time multiplex multirect mode +	 * @pipe: Pointer to software pipe context  	 */ -	void (*setup_multirect)(struct dpu_hw_pipe *ctx, -			enum dpu_sspp_multirect_index index, -			enum dpu_sspp_multirect_mode mode); +	void (*setup_multirect)(struct dpu_sw_pipe *pipe);  	/**  	 * setup_sharpening - setup sharpening  	 * @ctx: Pointer to pipe context  	 * @cfg: Pointer to config structure  	 */ -	void (*setup_sharpening)(struct dpu_hw_pipe *ctx, +	void (*setup_sharpening)(struct dpu_hw_sspp *ctx,  			struct dpu_hw_sharp_cfg *cfg);  	/** @@ -289,7 +283,7 @@ struct dpu_hw_sspp_ops {  	 * @safe_lut: LUT for generate safe level based on fill level  	 *  	 */ -	void (*setup_danger_safe_lut)(struct dpu_hw_pipe *ctx, +	void (*setup_danger_safe_lut)(struct dpu_hw_sspp *ctx,  			u32 danger_lut,  			u32 safe_lut); @@ -299,7 +293,7 @@ struct dpu_hw_sspp_ops {  	 * @creq_lut: LUT for generate creq level based on fill level  	 *  	 */ -	void (*setup_creq_lut)(struct dpu_hw_pipe *ctx, +	void (*setup_creq_lut)(struct dpu_hw_sspp *ctx,  			u64 creq_lut);  	/** @@ -308,7 +302,7 @@ struct dpu_hw_sspp_ops {  	 * @cfg: Pointer to pipe QoS configuration  	 *  	 */ -	void (*setup_qos_ctrl)(struct dpu_hw_pipe *ctx, +	void (*setup_qos_ctrl)(struct dpu_hw_sspp *ctx,  			struct dpu_hw_pipe_qos_cfg *cfg);  	/** @@ -316,51 +310,48 @@ struct dpu_hw_sspp_ops {  	 * @ctx: Pointer to pipe context  	 * @cfg: Pointer to histogram configuration  	 */ -	void (*setup_histogram)(struct dpu_hw_pipe *ctx, +	void (*setup_histogram)(struct dpu_hw_sspp *ctx,  			void *cfg);  	/**  	 * setup_scaler - setup scaler -	 * @ctx: Pointer to pipe context -	 * @pipe_cfg: Pointer to pipe configuration -	 * @scaler_cfg: Pointer to scaler configuration +	 * @scaler3_cfg: Pointer to scaler configuration +	 * @format: pixel format parameters  	 */ -	void (*setup_scaler)(struct dpu_hw_pipe *ctx, -		struct dpu_hw_pipe_cfg *pipe_cfg, -		void *scaler_cfg); +	void (*setup_scaler)(struct dpu_hw_sspp *ctx, +		struct dpu_hw_scaler3_cfg *scaler3_cfg, +		const struct dpu_format *format);  	/**  	 * get_scaler_ver - get scaler h/w version  	 * @ctx: Pointer to pipe context  	 */ -	u32 (*get_scaler_ver)(struct dpu_hw_pipe *ctx); +	u32 (*get_scaler_ver)(struct dpu_hw_sspp *ctx);  	/**  	 * setup_cdp - setup client driven prefetch -	 * @ctx: Pointer to pipe context +	 * @pipe: Pointer to software pipe context  	 * @cfg: Pointer to cdp configuration -	 * @index: rectangle index in multirect  	 */ -	void (*setup_cdp)(struct dpu_hw_pipe *ctx, -			struct dpu_hw_cdp_cfg *cfg, -			enum dpu_sspp_multirect_index index); +	void (*setup_cdp)(struct dpu_sw_pipe *pipe, +			  struct dpu_hw_cdp_cfg *cfg);  };  /** - * struct dpu_hw_pipe - pipe description + * struct dpu_hw_sspp - pipe description   * @base: hardware block base structure   * @hw: block hardware details   * @catalog: back pointer to catalog - * @mdp: pointer to associated mdp portion of the catalog + * @ubwc: ubwc configuration data   * @idx: pipe index   * @cap: pointer to layer_cfg   * @ops: pointer to operations possible for this pipe   */ -struct dpu_hw_pipe { +struct dpu_hw_sspp {  	struct dpu_hw_blk base;  	struct dpu_hw_blk_reg_map hw;  	const struct dpu_mdss_cfg *catalog; -	const struct dpu_mdp_cfg *mdp; +	const struct dpu_ubwc_cfg *ubwc;  	/* Pipe */  	enum dpu_sspp idx; @@ -378,7 +369,7 @@ struct dpu_kms;   * @addr: Mapped register io address of MDP   * @catalog : Pointer to mdss catalog data   */ -struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx, +struct dpu_hw_sspp *dpu_hw_sspp_init(enum dpu_sspp idx,  		void __iomem *addr, const struct dpu_mdss_cfg *catalog);  /** @@ -386,10 +377,10 @@ struct dpu_hw_pipe *dpu_hw_sspp_init(enum dpu_sspp idx,   * should be called during Hw pipe cleanup.   * @ctx:  Pointer to SSPP driver context returned by dpu_hw_sspp_init   */ -void dpu_hw_sspp_destroy(struct dpu_hw_pipe *ctx); +void dpu_hw_sspp_destroy(struct dpu_hw_sspp *ctx); -void dpu_debugfs_sspp_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root); -int _dpu_hw_sspp_init_debugfs(struct dpu_hw_pipe *hw_pipe, struct dpu_kms *kms, struct dentry *entry); +int _dpu_hw_sspp_init_debugfs(struct dpu_hw_sspp *hw_pipe, struct dpu_kms *kms, +			      struct dentry *entry);  #endif /*_DPU_HW_SSPP_H */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c index 2d28afdf860e..a3e413d27717 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c @@ -61,6 +61,7 @@ static const struct dpu_wb_cfg *_wb_offset(enum dpu_wb wb,  	for (i = 0; i < m->wb_count; i++) {  		if (wb == m->wb[i].id) {  			b->blk_addr = addr + m->wb[i].base; +			b->log_mask = DPU_DBG_MASK_WB;  			return &m->wb[i];  		}  	} diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h index feb9a729844a..5acd5683d25a 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_hwio.h @@ -21,9 +21,6 @@  #define HIST_INTR_EN                    0x01c  #define HIST_INTR_STATUS                0x020  #define HIST_INTR_CLEAR                 0x024 -#define INTF_INTR_EN                    0x1C0 -#define INTF_INTR_STATUS                0x1C4 -#define INTF_INTR_CLEAR                 0x1C8  #define SPLIT_DISPLAY_EN                0x2F4  #define SPLIT_DISPLAY_UPPER_PIPE_CTRL   0x2F8  #define DSPP_IGC_COLOR0_RAM_LUTN        0x300 diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index a683bd9b5a04..0e7a68714e9e 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -250,6 +250,24 @@ void dpu_debugfs_create_regset32(const char *name, umode_t mode,  	debugfs_create_file(name, mode, parent, regset, &dpu_regset32_fops);  } +static void dpu_debugfs_sspp_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) +{ +	struct dentry *entry = debugfs_create_dir("sspp", debugfs_root); +	int i; + +	if (IS_ERR(entry)) +		return; + +	for (i = SSPP_NONE; i < SSPP_MAX; i++) { +		struct dpu_hw_sspp *hw = dpu_rm_get_sspp(&dpu_kms->rm, i); + +		if (!hw) +			continue; + +		_dpu_hw_sspp_init_debugfs(hw, dpu_kms, entry); +	} +} +  static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor)  {  	struct dpu_kms *dpu_kms = to_dpu_kms(kms); @@ -411,40 +429,6 @@ static void dpu_kms_disable_commit(struct msm_kms *kms)  	pm_runtime_put_sync(&dpu_kms->pdev->dev);  } -static ktime_t dpu_kms_vsync_time(struct msm_kms *kms, struct drm_crtc *crtc) -{ -	struct drm_encoder *encoder; - -	drm_for_each_encoder_mask(encoder, crtc->dev, crtc->state->encoder_mask) { -		ktime_t vsync_time; - -		if (dpu_encoder_vsync_time(encoder, &vsync_time) == 0) -			return vsync_time; -	} - -	return ktime_get(); -} - -static void dpu_kms_prepare_commit(struct msm_kms *kms, -		struct drm_atomic_state *state) -{ -	struct drm_crtc *crtc; -	struct drm_crtc_state *crtc_state; -	struct drm_encoder *encoder; -	int i; - -	if (!kms) -		return; - -	/* Call prepare_commit for all affected encoders */ -	for_each_new_crtc_in_state(state, crtc, crtc_state, i) { -		drm_for_each_encoder_mask(encoder, crtc->dev, -					  crtc_state->encoder_mask) { -			dpu_encoder_prepare_commit(encoder); -		} -	} -} -  static void dpu_kms_flush_commit(struct msm_kms *kms, unsigned crtc_mask)  {  	struct dpu_kms *dpu_kms = to_dpu_kms(kms); @@ -491,7 +475,7 @@ static void dpu_kms_wait_for_commit_done(struct msm_kms *kms,  		return;  	} -	if (!crtc->state->active) { +	if (!drm_atomic_crtc_effectively_active(crtc->state)) {  		DPU_DEBUG("[crtc:%d] not active\n", crtc->base.id);  		return;  	} @@ -953,8 +937,6 @@ static const struct msm_kms_funcs kms_funcs = {  	.irq             = dpu_core_irq,  	.enable_commit   = dpu_kms_enable_commit,  	.disable_commit  = dpu_kms_disable_commit, -	.vsync_time      = dpu_kms_vsync_time, -	.prepare_commit  = dpu_kms_prepare_commit,  	.flush_commit    = dpu_kms_flush_commit,  	.wait_flush      = dpu_kms_wait_flush,  	.complete_commit = dpu_kms_complete_commit, @@ -1013,6 +995,7 @@ static int dpu_kms_hw_init(struct msm_kms *kms)  	struct dpu_kms *dpu_kms;  	struct drm_device *dev;  	int i, rc = -EINVAL; +	u32 core_rev;  	if (!kms) {  		DPU_ERROR("invalid kms\n"); @@ -1062,17 +1045,14 @@ static int dpu_kms_hw_init(struct msm_kms *kms)  	if (rc < 0)  		goto error; -	dpu_kms->core_rev = readl_relaxed(dpu_kms->mmio + 0x0); +	core_rev = readl_relaxed(dpu_kms->mmio + 0x0); -	pr_info("dpu hardware revision:0x%x\n", dpu_kms->core_rev); +	pr_info("dpu hardware revision:0x%x\n", core_rev); -	dpu_kms->catalog = dpu_hw_catalog_init(dpu_kms->core_rev); -	if (IS_ERR_OR_NULL(dpu_kms->catalog)) { -		rc = PTR_ERR(dpu_kms->catalog); -		if (!dpu_kms->catalog) -			rc = -EINVAL; -		DPU_ERROR("catalog init failed: %d\n", rc); -		dpu_kms->catalog = NULL; +	dpu_kms->catalog = of_device_get_match_data(dev->dev); +	if (!dpu_kms->catalog) { +		DPU_ERROR("device config not known!\n"); +		rc = -EINVAL;  		goto power_error;  	} @@ -1298,19 +1278,19 @@ static const struct dev_pm_ops dpu_pm_ops = {  };  static const struct of_device_id dpu_dt_match[] = { -	{ .compatible = "qcom,msm8998-dpu", }, -	{ .compatible = "qcom,qcm2290-dpu", }, -	{ .compatible = "qcom,sdm845-dpu", }, -	{ .compatible = "qcom,sc7180-dpu", }, -	{ .compatible = "qcom,sc7280-dpu", }, -	{ .compatible = "qcom,sc8180x-dpu", }, -	{ .compatible = "qcom,sc8280xp-dpu", }, -	{ .compatible = "qcom,sm6115-dpu", }, -	{ .compatible = "qcom,sm8150-dpu", }, -	{ .compatible = "qcom,sm8250-dpu", }, -	{ .compatible = "qcom,sm8350-dpu", }, -	{ .compatible = "qcom,sm8450-dpu", }, -	{ .compatible = "qcom,sm8550-dpu", }, +	{ .compatible = "qcom,msm8998-dpu", .data = &dpu_msm8998_cfg, }, +	{ .compatible = "qcom,qcm2290-dpu", .data = &dpu_qcm2290_cfg, }, +	{ .compatible = "qcom,sdm845-dpu", .data = &dpu_sdm845_cfg, }, +	{ .compatible = "qcom,sc7180-dpu", .data = &dpu_sc7180_cfg, }, +	{ .compatible = "qcom,sc7280-dpu", .data = &dpu_sc7280_cfg, }, +	{ .compatible = "qcom,sc8180x-dpu", .data = &dpu_sc8180x_cfg, }, +	{ .compatible = "qcom,sc8280xp-dpu", .data = &dpu_sc8280xp_cfg, }, +	{ .compatible = "qcom,sm6115-dpu", .data = &dpu_sm6115_cfg, }, +	{ .compatible = "qcom,sm8150-dpu", .data = &dpu_sm8150_cfg, }, +	{ .compatible = "qcom,sm8250-dpu", .data = &dpu_sm8250_cfg, }, +	{ .compatible = "qcom,sm8350-dpu", .data = &dpu_sm8350_cfg, }, +	{ .compatible = "qcom,sm8450-dpu", .data = &dpu_sm8450_cfg, }, +	{ .compatible = "qcom,sm8550-dpu", .data = &dpu_sm8550_cfg, },  	{}  };  MODULE_DEVICE_TABLE(of, dpu_dt_match); diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h index ed80ed6784ee..aca39a4689f4 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h @@ -68,7 +68,6 @@  struct dpu_kms {  	struct msm_kms base;  	struct drm_device *dev; -	int core_rev;  	const struct dpu_mdss_cfg *catalog;  	/* io/register spaces: */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c index bfd5be89e8b8..14b5cfe30611 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c @@ -47,13 +47,6 @@  #define DPU_PLANE_COLOR_FILL_FLAG	BIT(31)  #define DPU_ZPOS_MAX 255 -/* multirect rect index */ -enum { -	R0, -	R1, -	R_MAX -}; -  /*   * Default Preload Values   */ @@ -69,6 +62,7 @@ static const uint32_t qcom_compressed_supported_formats[] = {  	DRM_FORMAT_ARGB8888,  	DRM_FORMAT_XBGR8888,  	DRM_FORMAT_XRGB8888, +	DRM_FORMAT_ARGB2101010,  	DRM_FORMAT_XRGB2101010,  	DRM_FORMAT_BGR565, @@ -104,7 +98,6 @@ struct dpu_plane {  	enum dpu_sspp pipe; -	struct dpu_hw_pipe *pipe_hw;  	uint32_t color_fill;  	bool is_error;  	bool is_rt_pipe; @@ -128,21 +121,19 @@ static struct dpu_kms *_dpu_plane_get_kms(struct drm_plane *plane)  /**   * _dpu_plane_calc_bw - calculate bandwidth required for a plane - * @plane: Pointer to drm plane. - * @fb:   Pointer to framebuffer associated with the given plane + * @catalog: Points to dpu catalog structure + * @fmt: Pointer to source buffer format + * @mode: Pointer to drm display mode   * @pipe_cfg: Pointer to pipe configuration   * Result: Updates calculated bandwidth in the plane state.   * BW Equation: src_w * src_h * bpp * fps * (v_total / v_dest)   * Prefill BW Equation: line src bytes * line_time   */ -static void _dpu_plane_calc_bw(struct drm_plane *plane, -	struct drm_framebuffer *fb, -	struct dpu_hw_pipe_cfg *pipe_cfg) +static u64 _dpu_plane_calc_bw(const struct dpu_mdss_cfg *catalog, +	const struct dpu_format *fmt, +	const struct drm_display_mode *mode, +	struct dpu_sw_pipe_cfg *pipe_cfg)  { -	struct dpu_plane_state *pstate; -	struct drm_display_mode *mode; -	const struct dpu_format *fmt = NULL; -	struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);  	int src_width, src_height, dst_height, fps;  	u64 plane_prefill_bw;  	u64 plane_bw; @@ -150,11 +141,6 @@ static void _dpu_plane_calc_bw(struct drm_plane *plane,  	u64 scale_factor;  	int vbp, vpw, vfp; -	pstate = to_dpu_plane_state(plane->state); -	mode = &plane->state->crtc->mode; - -	fmt = dpu_get_dpu_format_ext(fb->format->format, fb->modifier); -  	src_width = drm_rect_width(&pipe_cfg->src_rect);  	src_height = drm_rect_height(&pipe_cfg->src_rect);  	dst_height = drm_rect_height(&pipe_cfg->dst_rect); @@ -162,7 +148,7 @@ static void _dpu_plane_calc_bw(struct drm_plane *plane,  	vbp = mode->vtotal - mode->vsync_end;  	vpw = mode->vsync_end - mode->vsync_start;  	vfp = mode->vsync_start - mode->vdisplay; -	hw_latency_lines =  dpu_kms->catalog->perf->min_prefill_lines; +	hw_latency_lines =  catalog->perf->min_prefill_lines;  	scale_factor = src_height > dst_height ?  		mult_frac(src_height, 1, dst_height) : 1; @@ -182,61 +168,60 @@ static void _dpu_plane_calc_bw(struct drm_plane *plane,  		do_div(plane_prefill_bw, hw_latency_lines); -	pstate->plane_fetch_bw = max(plane_bw, plane_prefill_bw); +	return max(plane_bw, plane_prefill_bw);  }  /**   * _dpu_plane_calc_clk - calculate clock required for a plane - * @plane: Pointer to drm plane. + * @mode: Pointer to drm display mode   * @pipe_cfg: Pointer to pipe configuration   * Result: Updates calculated clock in the plane state.   * Clock equation: dst_w * v_total * fps * (src_h / dst_h)   */ -static void _dpu_plane_calc_clk(struct drm_plane *plane, struct dpu_hw_pipe_cfg *pipe_cfg) +static u64 _dpu_plane_calc_clk(const struct drm_display_mode *mode, +		struct dpu_sw_pipe_cfg *pipe_cfg)  { -	struct dpu_plane_state *pstate; -	struct drm_display_mode *mode;  	int dst_width, src_height, dst_height, fps; - -	pstate = to_dpu_plane_state(plane->state); -	mode = &plane->state->crtc->mode; +	u64 plane_clk;  	src_height = drm_rect_height(&pipe_cfg->src_rect);  	dst_width = drm_rect_width(&pipe_cfg->dst_rect);  	dst_height = drm_rect_height(&pipe_cfg->dst_rect);  	fps = drm_mode_vrefresh(mode); -	pstate->plane_clk = +	plane_clk =  		dst_width * mode->vtotal * fps;  	if (src_height > dst_height) { -		pstate->plane_clk *= src_height; -		do_div(pstate->plane_clk, dst_height); +		plane_clk *= src_height; +		do_div(plane_clk, dst_height);  	} + +	return plane_clk;  }  /**   * _dpu_plane_calc_fill_level - calculate fill level of the given source format   * @plane:		Pointer to drm plane + * @pipe:		Pointer to software pipe   * @fmt:		Pointer to source buffer format   * @src_width:		width of source buffer   * Return: fill level corresponding to the source buffer/format or 0 if error   */  static int _dpu_plane_calc_fill_level(struct drm_plane *plane, +		struct dpu_sw_pipe *pipe,  		const struct dpu_format *fmt, u32 src_width)  {  	struct dpu_plane *pdpu; -	struct dpu_plane_state *pstate;  	u32 fixed_buff_size;  	u32 total_fl; -	if (!fmt || !plane->state || !src_width || !fmt->bpp) { +	if (!fmt || !pipe || !src_width || !fmt->bpp) {  		DPU_ERROR("invalid arguments\n");  		return 0;  	}  	pdpu = to_dpu_plane(plane); -	pstate = to_dpu_plane_state(plane->state);  	fixed_buff_size = pdpu->catalog->caps->pixel_ram_size;  	/* FIXME: in multirect case account for the src_width of all the planes */ @@ -252,7 +237,7 @@ static int _dpu_plane_calc_fill_level(struct drm_plane *plane,  				((src_width + 32) * fmt->bpp);  		}  	} else { -		if (pstate->multirect_mode == DPU_SSPP_MULTIRECT_PARALLEL) { +		if (pipe->multirect_mode == DPU_SSPP_MULTIRECT_PARALLEL) {  			total_fl = (fixed_buff_size / 2) * 2 /  				((src_width + 32) * fmt->bpp);  		} else { @@ -262,7 +247,7 @@ static int _dpu_plane_calc_fill_level(struct drm_plane *plane,  	}  	DPU_DEBUG_PLANE(pdpu, "pnum:%d fmt: %4.4s w:%u fl:%u\n", -			pdpu->pipe - SSPP_VIG0, +			pipe->sspp->idx - SSPP_VIG0,  			(char *)&fmt->base.pixel_format,  			src_width, total_fl); @@ -272,24 +257,22 @@ static int _dpu_plane_calc_fill_level(struct drm_plane *plane,  /**   * _dpu_plane_set_qos_lut - set QoS LUT of the given plane   * @plane:		Pointer to drm plane - * @fb:			Pointer to framebuffer associated with the given plane + * @pipe:		Pointer to software pipe + * @fmt:		Pointer to source buffer format   * @pipe_cfg:		Pointer to pipe configuration   */  static void _dpu_plane_set_qos_lut(struct drm_plane *plane, -		struct drm_framebuffer *fb, struct dpu_hw_pipe_cfg *pipe_cfg) +		struct dpu_sw_pipe *pipe, +		const struct dpu_format *fmt, struct dpu_sw_pipe_cfg *pipe_cfg)  {  	struct dpu_plane *pdpu = to_dpu_plane(plane); -	const struct dpu_format *fmt = NULL;  	u64 qos_lut;  	u32 total_fl = 0, lut_usage;  	if (!pdpu->is_rt_pipe) {  		lut_usage = DPU_QOS_LUT_USAGE_NRT;  	} else { -		fmt = dpu_get_dpu_format_ext( -				fb->format->format, -				fb->modifier); -		total_fl = _dpu_plane_calc_fill_level(plane, fmt, +		total_fl = _dpu_plane_calc_fill_level(plane, pipe, fmt,  				drm_rect_width(&pipe_cfg->src_rect));  		if (fmt && DPU_FORMAT_IS_LINEAR(fmt)) @@ -301,7 +284,7 @@ static void _dpu_plane_set_qos_lut(struct drm_plane *plane,  	qos_lut = _dpu_hw_get_qos_lut(  			&pdpu->catalog->perf->qos_lut_tbl[lut_usage], total_fl); -	trace_dpu_perf_set_qos_luts(pdpu->pipe - SSPP_VIG0, +	trace_dpu_perf_set_qos_luts(pipe->sspp->idx - SSPP_VIG0,  			(fmt) ? fmt->base.pixel_format : 0,  			pdpu->is_rt_pipe, total_fl, qos_lut, lut_usage); @@ -310,19 +293,20 @@ static void _dpu_plane_set_qos_lut(struct drm_plane *plane,  			fmt ? (char *)&fmt->base.pixel_format : NULL,  			pdpu->is_rt_pipe, total_fl, qos_lut); -	pdpu->pipe_hw->ops.setup_creq_lut(pdpu->pipe_hw, qos_lut); +	pipe->sspp->ops.setup_creq_lut(pipe->sspp, qos_lut);  }  /**   * _dpu_plane_set_danger_lut - set danger/safe LUT of the given plane   * @plane:		Pointer to drm plane - * @fb:			Pointer to framebuffer associated with the given plane + * @pipe:		Pointer to software pipe + * @fmt:		Pointer to source buffer format   */  static void _dpu_plane_set_danger_lut(struct drm_plane *plane, -		struct drm_framebuffer *fb) +		struct dpu_sw_pipe *pipe, +		const struct dpu_format *fmt)  {  	struct dpu_plane *pdpu = to_dpu_plane(plane); -	const struct dpu_format *fmt = NULL;  	u32 danger_lut, safe_lut;  	if (!pdpu->is_rt_pipe) { @@ -331,10 +315,6 @@ static void _dpu_plane_set_danger_lut(struct drm_plane *plane,  		safe_lut = pdpu->catalog->perf->safe_lut_tbl  				[DPU_QOS_LUT_USAGE_NRT];  	} else { -		fmt = dpu_get_dpu_format_ext( -				fb->format->format, -				fb->modifier); -  		if (fmt && DPU_FORMAT_IS_LINEAR(fmt)) {  			danger_lut = pdpu->catalog->perf->danger_lut_tbl  					[DPU_QOS_LUT_USAGE_LINEAR]; @@ -361,17 +341,19 @@ static void _dpu_plane_set_danger_lut(struct drm_plane *plane,  		danger_lut,  		safe_lut); -	pdpu->pipe_hw->ops.setup_danger_safe_lut(pdpu->pipe_hw, +	pipe->sspp->ops.setup_danger_safe_lut(pipe->sspp,  			danger_lut, safe_lut);  }  /**   * _dpu_plane_set_qos_ctrl - set QoS control of the given plane   * @plane:		Pointer to drm plane + * @pipe:		Pointer to software pipe   * @enable:		true to enable QoS control   * @flags:		QoS control mode (enum dpu_plane_qos)   */  static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane, +	struct dpu_sw_pipe *pipe,  	bool enable, u32 flags)  {  	struct dpu_plane *pdpu = to_dpu_plane(plane); @@ -380,9 +362,9 @@ static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,  	memset(&pipe_qos_cfg, 0, sizeof(pipe_qos_cfg));  	if (flags & DPU_PLANE_QOS_VBLANK_CTRL) { -		pipe_qos_cfg.creq_vblank = pdpu->pipe_hw->cap->sblk->creq_vblank; +		pipe_qos_cfg.creq_vblank = pipe->sspp->cap->sblk->creq_vblank;  		pipe_qos_cfg.danger_vblank = -				pdpu->pipe_hw->cap->sblk->danger_vblank; +				pipe->sspp->cap->sblk->danger_vblank;  		pipe_qos_cfg.vblank_en = enable;  	} @@ -408,32 +390,35 @@ static void _dpu_plane_set_qos_ctrl(struct drm_plane *plane,  		pipe_qos_cfg.danger_vblank,  		pdpu->is_rt_pipe); -	pdpu->pipe_hw->ops.setup_qos_ctrl(pdpu->pipe_hw, +	pipe->sspp->ops.setup_qos_ctrl(pipe->sspp,  			&pipe_qos_cfg);  }  /**   * _dpu_plane_set_ot_limit - set OT limit for the given plane   * @plane:		Pointer to drm plane - * @crtc:		Pointer to drm crtc + * @pipe:		Pointer to software pipe   * @pipe_cfg:		Pointer to pipe configuration + * @frame_rate:		CRTC's frame rate   */  static void _dpu_plane_set_ot_limit(struct drm_plane *plane, -		struct drm_crtc *crtc, struct dpu_hw_pipe_cfg *pipe_cfg) +		struct dpu_sw_pipe *pipe, +		struct dpu_sw_pipe_cfg *pipe_cfg, +		int frame_rate)  {  	struct dpu_plane *pdpu = to_dpu_plane(plane);  	struct dpu_vbif_set_ot_params ot_params;  	struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);  	memset(&ot_params, 0, sizeof(ot_params)); -	ot_params.xin_id = pdpu->pipe_hw->cap->xin_id; -	ot_params.num = pdpu->pipe_hw->idx - SSPP_NONE; +	ot_params.xin_id = pipe->sspp->cap->xin_id; +	ot_params.num = pipe->sspp->idx - SSPP_NONE;  	ot_params.width = drm_rect_width(&pipe_cfg->src_rect);  	ot_params.height = drm_rect_height(&pipe_cfg->src_rect);  	ot_params.is_wfd = !pdpu->is_rt_pipe; -	ot_params.frame_rate = drm_mode_vrefresh(&crtc->mode); +	ot_params.frame_rate = frame_rate;  	ot_params.vbif_idx = VBIF_RT; -	ot_params.clk_ctrl = pdpu->pipe_hw->cap->clk_ctrl; +	ot_params.clk_ctrl = pipe->sspp->cap->clk_ctrl;  	ot_params.rd = true;  	dpu_vbif_set_ot_limit(dpu_kms, &ot_params); @@ -442,8 +427,10 @@ static void _dpu_plane_set_ot_limit(struct drm_plane *plane,  /**   * _dpu_plane_set_qos_remap - set vbif QoS for the given plane   * @plane:		Pointer to drm plane + * @pipe:		Pointer to software pipe   */ -static void _dpu_plane_set_qos_remap(struct drm_plane *plane) +static void _dpu_plane_set_qos_remap(struct drm_plane *plane, +		struct dpu_sw_pipe *pipe)  {  	struct dpu_plane *pdpu = to_dpu_plane(plane);  	struct dpu_vbif_set_qos_params qos_params; @@ -451,9 +438,9 @@ static void _dpu_plane_set_qos_remap(struct drm_plane *plane)  	memset(&qos_params, 0, sizeof(qos_params));  	qos_params.vbif_idx = VBIF_RT; -	qos_params.clk_ctrl = pdpu->pipe_hw->cap->clk_ctrl; -	qos_params.xin_id = pdpu->pipe_hw->cap->xin_id; -	qos_params.num = pdpu->pipe_hw->idx - SSPP_VIG0; +	qos_params.clk_ctrl = pipe->sspp->cap->clk_ctrl; +	qos_params.xin_id = pipe->sspp->cap->xin_id; +	qos_params.num = pipe->sspp->idx - SSPP_VIG0;  	qos_params.is_rt = pdpu->is_rt_pipe;  	DPU_DEBUG_PLANE(pdpu, "pipe:%d vbif:%d xin:%d rt:%d, clk_ctrl:%d\n", @@ -465,39 +452,15 @@ static void _dpu_plane_set_qos_remap(struct drm_plane *plane)  	dpu_vbif_set_qos_remap(dpu_kms, &qos_params);  } -static void _dpu_plane_set_scanout(struct drm_plane *plane, -		struct dpu_plane_state *pstate, -		struct dpu_hw_pipe_cfg *pipe_cfg, -		struct drm_framebuffer *fb) -{ -	struct dpu_plane *pdpu = to_dpu_plane(plane); -	struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base); -	struct msm_gem_address_space *aspace = kms->base.aspace; -	int ret; - -	ret = dpu_format_populate_layout(aspace, fb, &pipe_cfg->layout); -	if (ret == -EAGAIN) -		DPU_DEBUG_PLANE(pdpu, "not updating same src addrs\n"); -	else if (ret) -		DPU_ERROR_PLANE(pdpu, "failed to get format layout, %d\n", ret); -	else if (pdpu->pipe_hw->ops.setup_sourceaddress) { -		trace_dpu_plane_set_scanout(pdpu->pipe_hw->idx, -					    &pipe_cfg->layout, -					    pstate->multirect_index); -		pdpu->pipe_hw->ops.setup_sourceaddress(pdpu->pipe_hw, pipe_cfg, -						pstate->multirect_index); -	} -} - -static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu, -		struct dpu_plane_state *pstate, +static void _dpu_plane_setup_scaler3(struct dpu_hw_sspp *pipe_hw,  		uint32_t src_w, uint32_t src_h, uint32_t dst_w, uint32_t dst_h,  		struct dpu_hw_scaler3_cfg *scale_cfg,  		const struct dpu_format *fmt, -		uint32_t chroma_subsmpl_h, uint32_t chroma_subsmpl_v) +		uint32_t chroma_subsmpl_h, uint32_t chroma_subsmpl_v, +		unsigned int rotation)  {  	uint32_t i; -	bool inline_rotation = pstate->rotation & DRM_MODE_ROTATE_90; +	bool inline_rotation = rotation & DRM_MODE_ROTATE_90;  	/*  	 * For inline rotation cases, scaler config is post-rotation, @@ -536,7 +499,7 @@ static void _dpu_plane_setup_scaler3(struct dpu_plane *pdpu,  			scale_cfg->src_height[i] /= chroma_subsmpl_v;  		} -		if (pdpu->pipe_hw->cap->features & +		if (pipe_hw->cap->features &  			BIT(DPU_SSPP_SCALER_QSEED4)) {  			scale_cfg->preload_x[i] = DPU_QSEED4_DEFAULT_PRELOAD_H;  			scale_cfg->preload_y[i] = DPU_QSEED4_DEFAULT_PRELOAD_V; @@ -607,36 +570,28 @@ static const struct dpu_csc_cfg dpu_csc10_YUV2RGB_601L = {  	{ 0x00, 0x3ff, 0x00, 0x3ff, 0x00, 0x3ff,},  }; -static const struct dpu_csc_cfg *_dpu_plane_get_csc(struct dpu_plane *pdpu, const struct dpu_format *fmt) +static const struct dpu_csc_cfg *_dpu_plane_get_csc(struct dpu_sw_pipe *pipe, +						    const struct dpu_format *fmt)  {  	const struct dpu_csc_cfg *csc_ptr; -	if (!pdpu) { -		DPU_ERROR("invalid plane\n"); -		return NULL; -	} -  	if (!DPU_FORMAT_IS_YUV(fmt))  		return NULL; -	if (BIT(DPU_SSPP_CSC_10BIT) & pdpu->pipe_hw->cap->features) +	if (BIT(DPU_SSPP_CSC_10BIT) & pipe->sspp->cap->features)  		csc_ptr = &dpu_csc10_YUV2RGB_601L;  	else  		csc_ptr = &dpu_csc_YUV2RGB_601L; -	DPU_DEBUG_PLANE(pdpu, "using 0x%X 0x%X 0x%X...\n", -			csc_ptr->csc_mv[0], -			csc_ptr->csc_mv[1], -			csc_ptr->csc_mv[2]); -  	return csc_ptr;  } -static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu, -		struct dpu_plane_state *pstate, +static void _dpu_plane_setup_scaler(struct dpu_sw_pipe *pipe,  		const struct dpu_format *fmt, bool color_fill, -		struct dpu_hw_pipe_cfg *pipe_cfg) +		struct dpu_sw_pipe_cfg *pipe_cfg, +		unsigned int rotation)  { +	struct dpu_hw_sspp *pipe_hw = pipe->sspp;  	const struct drm_format_info *info = drm_format_info(fmt->base.pixel_format);  	struct dpu_hw_scaler3_cfg scaler3_cfg;  	struct dpu_hw_pixel_ext pixel_ext; @@ -650,20 +605,21 @@ static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,  	/* don't chroma subsample if decimating */  	/* update scaler. calculate default config for QSEED3 */ -	_dpu_plane_setup_scaler3(pdpu, pstate, +	_dpu_plane_setup_scaler3(pipe_hw,  			src_width,  			src_height,  			dst_width,  			dst_height,  			&scaler3_cfg, fmt, -			info->hsub, info->vsub); +			info->hsub, info->vsub, +			rotation);  	/* configure pixel extension based on scalar config */  	_dpu_plane_setup_pixel_ext(&scaler3_cfg, &pixel_ext,  			src_width, src_height, info->hsub, info->vsub); -	if (pdpu->pipe_hw->ops.setup_pe) -		pdpu->pipe_hw->ops.setup_pe(pdpu->pipe_hw, +	if (pipe_hw->ops.setup_pe) +		pipe_hw->ops.setup_pe(pipe_hw,  				&pixel_ext);  	/** @@ -671,11 +627,44 @@ static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,  	 * bypassed. Still we need to update alpha and bitwidth  	 * ONLY for RECT0  	 */ -	if (pdpu->pipe_hw->ops.setup_scaler && -			pstate->multirect_index != DPU_SSPP_RECT_1) -		pdpu->pipe_hw->ops.setup_scaler(pdpu->pipe_hw, -				pipe_cfg, -				&scaler3_cfg); +	if (pipe_hw->ops.setup_scaler && +			pipe->multirect_index != DPU_SSPP_RECT_1) +		pipe_hw->ops.setup_scaler(pipe_hw, +				&scaler3_cfg, +				fmt); +} + +static void _dpu_plane_color_fill_pipe(struct dpu_plane_state *pstate, +				       struct dpu_sw_pipe *pipe, +				       struct drm_rect *dst_rect, +				       u32 fill_color, +				       const struct dpu_format *fmt) +{ +	struct dpu_sw_pipe_cfg pipe_cfg; + +	/* update sspp */ +	if (!pipe->sspp->ops.setup_solidfill) +		return; + +	pipe->sspp->ops.setup_solidfill(pipe, fill_color); + +	/* override scaler/decimation if solid fill */ +	pipe_cfg.dst_rect = *dst_rect; + +	pipe_cfg.src_rect.x1 = 0; +	pipe_cfg.src_rect.y1 = 0; +	pipe_cfg.src_rect.x2 = +		drm_rect_width(&pipe_cfg.dst_rect); +	pipe_cfg.src_rect.y2 = +		drm_rect_height(&pipe_cfg.dst_rect); + +	if (pipe->sspp->ops.setup_format) +		pipe->sspp->ops.setup_format(pipe, fmt, DPU_SSPP_SOLID_FILL); + +	if (pipe->sspp->ops.setup_rects) +		pipe->sspp->ops.setup_rects(pipe, &pipe_cfg); + +	_dpu_plane_setup_scaler(pipe, fmt, true, &pipe_cfg, pstate->rotation);  }  /** @@ -683,15 +672,14 @@ static void _dpu_plane_setup_scaler(struct dpu_plane *pdpu,   * @pdpu:   Pointer to DPU plane object   * @color:  RGB fill color value, [23..16] Blue, [15..8] Green, [7..0] Red   * @alpha:  8-bit fill alpha value, 255 selects 100% alpha - * Returns: 0 on success   */ -static int _dpu_plane_color_fill(struct dpu_plane *pdpu, +static void _dpu_plane_color_fill(struct dpu_plane *pdpu,  		uint32_t color, uint32_t alpha)  {  	const struct dpu_format *fmt;  	const struct drm_plane *plane = &pdpu->base;  	struct dpu_plane_state *pstate = to_dpu_plane_state(plane->state); -	struct dpu_hw_pipe_cfg pipe_cfg; +	u32 fill_color = (color & 0xFFFFFF) | ((alpha & 0xFF) << 24);  	DPU_DEBUG_PLANE(pdpu, "\n"); @@ -700,156 +688,17 @@ static int _dpu_plane_color_fill(struct dpu_plane *pdpu,  	 * h/w only supports RGB variants  	 */  	fmt = dpu_get_dpu_format(DRM_FORMAT_ABGR8888); +	/* should not happen ever */ +	if (!fmt) +		return;  	/* update sspp */ -	if (fmt && pdpu->pipe_hw->ops.setup_solidfill) { -		pdpu->pipe_hw->ops.setup_solidfill(pdpu->pipe_hw, -				(color & 0xFFFFFF) | ((alpha & 0xFF) << 24), -				pstate->multirect_index); - -		/* override scaler/decimation if solid fill */ -		pipe_cfg.dst_rect = pstate->base.dst; - -		pipe_cfg.src_rect.x1 = 0; -		pipe_cfg.src_rect.y1 = 0; -		pipe_cfg.src_rect.x2 = -			drm_rect_width(&pipe_cfg.dst_rect); -		pipe_cfg.src_rect.y2 = -			drm_rect_height(&pipe_cfg.dst_rect); - -		if (pdpu->pipe_hw->ops.setup_format) -			pdpu->pipe_hw->ops.setup_format(pdpu->pipe_hw, -					fmt, DPU_SSPP_SOLID_FILL, -					pstate->multirect_index); - -		if (pdpu->pipe_hw->ops.setup_rects) -			pdpu->pipe_hw->ops.setup_rects(pdpu->pipe_hw, -					&pipe_cfg, -					pstate->multirect_index); - -		_dpu_plane_setup_scaler(pdpu, pstate, fmt, true, &pipe_cfg); -	} - -	return 0; -} - -void dpu_plane_clear_multirect(const struct drm_plane_state *drm_state) -{ -	struct dpu_plane_state *pstate = to_dpu_plane_state(drm_state); - -	pstate->multirect_index = DPU_SSPP_RECT_SOLO; -	pstate->multirect_mode = DPU_SSPP_MULTIRECT_NONE; -} - -int dpu_plane_validate_multirect_v2(struct dpu_multirect_plane_states *plane) -{ -	struct dpu_plane_state *pstate[R_MAX]; -	const struct drm_plane_state *drm_state[R_MAX]; -	struct drm_rect src[R_MAX], dst[R_MAX]; -	struct dpu_plane *dpu_plane[R_MAX]; -	const struct dpu_format *fmt[R_MAX]; -	int i, buffer_lines; -	unsigned int max_tile_height = 1; -	bool parallel_fetch_qualified = true; -	bool has_tiled_rect = false; - -	for (i = 0; i < R_MAX; i++) { -		const struct msm_format *msm_fmt; - -		drm_state[i] = i ? plane->r1 : plane->r0; -		msm_fmt = msm_framebuffer_format(drm_state[i]->fb); -		fmt[i] = to_dpu_format(msm_fmt); - -		if (DPU_FORMAT_IS_UBWC(fmt[i])) { -			has_tiled_rect = true; -			if (fmt[i]->tile_height > max_tile_height) -				max_tile_height = fmt[i]->tile_height; -		} -	} - -	for (i = 0; i < R_MAX; i++) { -		int width_threshold; - -		pstate[i] = to_dpu_plane_state(drm_state[i]); -		dpu_plane[i] = to_dpu_plane(drm_state[i]->plane); - -		if (pstate[i] == NULL) { -			DPU_ERROR("DPU plane state of plane id %d is NULL\n", -				drm_state[i]->plane->base.id); -			return -EINVAL; -		} - -		src[i].x1 = drm_state[i]->src_x >> 16; -		src[i].y1 = drm_state[i]->src_y >> 16; -		src[i].x2 = src[i].x1 + (drm_state[i]->src_w >> 16); -		src[i].y2 = src[i].y1 + (drm_state[i]->src_h >> 16); - -		dst[i] = drm_plane_state_dest(drm_state[i]); - -		if (drm_rect_calc_hscale(&src[i], &dst[i], 1, 1) != 1 || -		    drm_rect_calc_vscale(&src[i], &dst[i], 1, 1) != 1) { -			DPU_ERROR_PLANE(dpu_plane[i], -				"scaling is not supported in multirect mode\n"); -			return -EINVAL; -		} - -		if (DPU_FORMAT_IS_YUV(fmt[i])) { -			DPU_ERROR_PLANE(dpu_plane[i], -				"Unsupported format for multirect mode\n"); -			return -EINVAL; -		} - -		/** -		 * SSPP PD_MEM is split half - one for each RECT. -		 * Tiled formats need 5 lines of buffering while fetching -		 * whereas linear formats need only 2 lines. -		 * So we cannot support more than half of the supported SSPP -		 * width for tiled formats. -		 */ -		width_threshold = dpu_plane[i]->catalog->caps->max_linewidth; -		if (has_tiled_rect) -			width_threshold /= 2; - -		if (parallel_fetch_qualified && -		    drm_rect_width(&src[i]) > width_threshold) -			parallel_fetch_qualified = false; - -	} - -	/* Validate RECT's and set the mode */ - -	/* Prefer PARALLEL FETCH Mode over TIME_MX Mode */ -	if (parallel_fetch_qualified) { -		pstate[R0]->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; -		pstate[R1]->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; - -		goto done; -	} - -	/* TIME_MX Mode */ -	buffer_lines = 2 * max_tile_height; +	_dpu_plane_color_fill_pipe(pstate, &pstate->pipe, &pstate->pipe_cfg.dst_rect, +				   fill_color, fmt); -	if (dst[R1].y1 >= dst[R0].y2 + buffer_lines || -	    dst[R0].y1 >= dst[R1].y2 + buffer_lines) { -		pstate[R0]->multirect_mode = DPU_SSPP_MULTIRECT_TIME_MX; -		pstate[R1]->multirect_mode = DPU_SSPP_MULTIRECT_TIME_MX; -	} else { -		DPU_ERROR( -			"No multirect mode possible for the planes (%d - %d)\n", -			drm_state[R0]->plane->base.id, -			drm_state[R1]->plane->base.id); -		return -EINVAL; -	} - -done: -	pstate[R0]->multirect_index = DPU_SSPP_RECT_0; -	pstate[R1]->multirect_index = DPU_SSPP_RECT_1; - -	DPU_DEBUG_PLANE(dpu_plane[R0], "R0: %d - %d\n", -		pstate[R0]->multirect_mode, pstate[R0]->multirect_index); -	DPU_DEBUG_PLANE(dpu_plane[R1], "R1: %d - %d\n", -		pstate[R1]->multirect_mode, pstate[R1]->multirect_index); -	return 0; +	if (pstate->r_pipe.sspp) +		_dpu_plane_color_fill_pipe(pstate, &pstate->r_pipe, &pstate->r_pipe_cfg.dst_rect, +					   fill_color, fmt);  }  static int dpu_plane_prepare_fb(struct drm_plane *plane, @@ -914,25 +763,6 @@ static void dpu_plane_cleanup_fb(struct drm_plane *plane,  				old_pstate->needs_dirtyfb);  } -static bool dpu_plane_validate_src(struct drm_rect *src, -				   struct drm_rect *fb_rect, -				   uint32_t min_src_size) -{ -	/* Ensure fb size is supported */ -	if (drm_rect_width(fb_rect) > MAX_IMG_WIDTH || -	    drm_rect_height(fb_rect) > MAX_IMG_HEIGHT) -		return false; - -	/* Ensure src rect is above the minimum size */ -	if (drm_rect_width(src) < min_src_size || -	    drm_rect_height(src) < min_src_size) -		return false; - -	/* Ensure src is fully encapsulated in fb */ -	return drm_rect_intersect(fb_rect, src) && -		drm_rect_equals(fb_rect, src); -} -  static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu,  						const struct dpu_sspp_sub_blks *sblk,  						struct drm_rect src, const struct dpu_format *fmt) @@ -961,6 +791,53 @@ static int dpu_plane_check_inline_rotation(struct dpu_plane *pdpu,  	return 0;  } +static int dpu_plane_atomic_check_pipe(struct dpu_plane *pdpu, +		struct dpu_sw_pipe *pipe, +		struct dpu_sw_pipe_cfg *pipe_cfg, +		const struct dpu_format *fmt) +{ +	uint32_t min_src_size; + +	min_src_size = DPU_FORMAT_IS_YUV(fmt) ? 2 : 1; + +	if (DPU_FORMAT_IS_YUV(fmt) && +	    (!(pipe->sspp->cap->features & DPU_SSPP_SCALER) || +	     !(pipe->sspp->cap->features & DPU_SSPP_CSC_ANY))) { +		DPU_DEBUG_PLANE(pdpu, +				"plane doesn't have scaler/csc for yuv\n"); +		return -EINVAL; +	} + +	/* check src bounds */ +	if (drm_rect_width(&pipe_cfg->src_rect) < min_src_size || +	    drm_rect_height(&pipe_cfg->src_rect) < min_src_size) { +		DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n", +				DRM_RECT_ARG(&pipe_cfg->src_rect)); +		return -E2BIG; +	} + +	/* valid yuv image */ +	if (DPU_FORMAT_IS_YUV(fmt) && +	    (pipe_cfg->src_rect.x1 & 0x1 || +	     pipe_cfg->src_rect.y1 & 0x1 || +	     drm_rect_width(&pipe_cfg->src_rect) & 0x1 || +	     drm_rect_height(&pipe_cfg->src_rect) & 0x1)) { +		DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n", +				DRM_RECT_ARG(&pipe_cfg->src_rect)); +		return -EINVAL; +	} + +	/* min dst support */ +	if (drm_rect_width(&pipe_cfg->dst_rect) < 0x1 || +	    drm_rect_height(&pipe_cfg->dst_rect) < 0x1) { +		DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n", +				DRM_RECT_ARG(&pipe_cfg->dst_rect)); +		return -EINVAL; +	} + +	return 0; +} +  static int dpu_plane_atomic_check(struct drm_plane *plane,  				  struct drm_atomic_state *state)  { @@ -969,14 +846,18 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,  	int ret = 0, min_scale;  	struct dpu_plane *pdpu = to_dpu_plane(plane);  	struct dpu_plane_state *pstate = to_dpu_plane_state(new_plane_state); +	struct dpu_sw_pipe *pipe = &pstate->pipe; +	struct dpu_sw_pipe *r_pipe = &pstate->r_pipe;  	const struct drm_crtc_state *crtc_state = NULL;  	const struct dpu_format *fmt; -	struct drm_rect src, dst, fb_rect = { 0 }; -	uint32_t min_src_size, max_linewidth; +	struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg; +	struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg; +	struct drm_rect fb_rect = { 0 }; +	uint32_t max_linewidth;  	unsigned int rotation;  	uint32_t supported_rotations; -	const struct dpu_sspp_cfg *pipe_hw_caps = pdpu->pipe_hw->cap; -	const struct dpu_sspp_sub_blks *sblk = pdpu->pipe_hw->cap->sblk; +	const struct dpu_sspp_cfg *pipe_hw_caps = pstate->pipe.sspp->cap; +	const struct dpu_sspp_sub_blks *sblk = pstate->pipe.sspp->cap->sblk;  	if (new_plane_state->crtc)  		crtc_state = drm_atomic_get_new_crtc_state(state, @@ -994,55 +875,99 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,  	if (!new_plane_state->visible)  		return 0; -	src.x1 = new_plane_state->src_x >> 16; -	src.y1 = new_plane_state->src_y >> 16; -	src.x2 = src.x1 + (new_plane_state->src_w >> 16); -	src.y2 = src.y1 + (new_plane_state->src_h >> 16); +	pipe->multirect_index = DPU_SSPP_RECT_SOLO; +	pipe->multirect_mode = DPU_SSPP_MULTIRECT_NONE; +	r_pipe->multirect_index = DPU_SSPP_RECT_SOLO; +	r_pipe->multirect_mode = DPU_SSPP_MULTIRECT_NONE; +	r_pipe->sspp = NULL; + +	pstate->stage = DPU_STAGE_0 + pstate->base.normalized_zpos; +	if (pstate->stage >= pdpu->catalog->caps->max_mixer_blendstages) { +		DPU_ERROR("> %d plane stages assigned\n", +			  pdpu->catalog->caps->max_mixer_blendstages - DPU_STAGE_0); +		return -EINVAL; +	} + +	pipe_cfg->src_rect = new_plane_state->src; + +	/* state->src is 16.16, src_rect is not */ +	pipe_cfg->src_rect.x1 >>= 16; +	pipe_cfg->src_rect.x2 >>= 16; +	pipe_cfg->src_rect.y1 >>= 16; +	pipe_cfg->src_rect.y2 >>= 16; -	dst = drm_plane_state_dest(new_plane_state); +	pipe_cfg->dst_rect = new_plane_state->dst;  	fb_rect.x2 = new_plane_state->fb->width;  	fb_rect.y2 = new_plane_state->fb->height; -	max_linewidth = pdpu->catalog->caps->max_linewidth; +	/* Ensure fb size is supported */ +	if (drm_rect_width(&fb_rect) > MAX_IMG_WIDTH || +	    drm_rect_height(&fb_rect) > MAX_IMG_HEIGHT) { +		DPU_DEBUG_PLANE(pdpu, "invalid framebuffer " DRM_RECT_FMT "\n", +				DRM_RECT_ARG(&fb_rect)); +		return -E2BIG; +	}  	fmt = to_dpu_format(msm_framebuffer_format(new_plane_state->fb)); -	min_src_size = DPU_FORMAT_IS_YUV(fmt) ? 2 : 1; +	max_linewidth = pdpu->catalog->caps->max_linewidth; -	if (DPU_FORMAT_IS_YUV(fmt) && -		(!(pipe_hw_caps->features & DPU_SSPP_SCALER) || -		 !(pipe_hw_caps->features & DPU_SSPP_CSC_ANY))) { -		DPU_DEBUG_PLANE(pdpu, -				"plane doesn't have scaler/csc for yuv\n"); -		return -EINVAL; +	if (drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) { +		/* +		 * In parallel multirect case only the half of the usual width +		 * is supported for tiled formats. If we are here, we know that +		 * full width is more than max_linewidth, thus each rect is +		 * wider than allowed. +		 */ +		if (DPU_FORMAT_IS_UBWC(fmt)) { +			DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u, tiled format\n", +					DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); +			return -E2BIG; +		} -	/* check src bounds */ -	} else if (!dpu_plane_validate_src(&src, &fb_rect, min_src_size)) { -		DPU_DEBUG_PLANE(pdpu, "invalid source " DRM_RECT_FMT "\n", -				DRM_RECT_ARG(&src)); -		return -E2BIG; +		if (drm_rect_width(&pipe_cfg->src_rect) > 2 * max_linewidth) { +			DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n", +					DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); +			return -E2BIG; +		} -	/* valid yuv image */ -	} else if (DPU_FORMAT_IS_YUV(fmt) && -		   (src.x1 & 0x1 || src.y1 & 0x1 || -		    drm_rect_width(&src) & 0x1 || -		    drm_rect_height(&src) & 0x1)) { -		DPU_DEBUG_PLANE(pdpu, "invalid yuv source " DRM_RECT_FMT "\n", -				DRM_RECT_ARG(&src)); -		return -EINVAL; +		if (drm_rect_width(&pipe_cfg->src_rect) != drm_rect_width(&pipe_cfg->dst_rect) || +		    drm_rect_height(&pipe_cfg->src_rect) != drm_rect_height(&pipe_cfg->dst_rect) || +		    (!test_bit(DPU_SSPP_SMART_DMA_V1, &pipe->sspp->cap->features) && +		     !test_bit(DPU_SSPP_SMART_DMA_V2, &pipe->sspp->cap->features)) || +		    DPU_FORMAT_IS_YUV(fmt)) { +			DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u, can't use split source\n", +					DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth); +			return -E2BIG; +		} -	/* min dst support */ -	} else if (drm_rect_width(&dst) < 0x1 || drm_rect_height(&dst) < 0x1) { -		DPU_DEBUG_PLANE(pdpu, "invalid dest rect " DRM_RECT_FMT "\n", -				DRM_RECT_ARG(&dst)); -		return -EINVAL; +		/* +		 * Use multirect for wide plane. We do not support dynamic +		 * assignment of SSPPs, so we know the configuration. +		 */ +		pipe->multirect_index = DPU_SSPP_RECT_0; +		pipe->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; + +		r_pipe->sspp = pipe->sspp; +		r_pipe->multirect_index = DPU_SSPP_RECT_1; +		r_pipe->multirect_mode = DPU_SSPP_MULTIRECT_PARALLEL; + +		*r_pipe_cfg = *pipe_cfg; +		pipe_cfg->src_rect.x2 = (pipe_cfg->src_rect.x1 + pipe_cfg->src_rect.x2) >> 1; +		pipe_cfg->dst_rect.x2 = (pipe_cfg->dst_rect.x1 + pipe_cfg->dst_rect.x2) >> 1; +		r_pipe_cfg->src_rect.x1 = pipe_cfg->src_rect.x2; +		r_pipe_cfg->dst_rect.x1 = pipe_cfg->dst_rect.x2; +	} -	/* check decimated source width */ -	} else if (drm_rect_width(&src) > max_linewidth) { -		DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u\n", -				DRM_RECT_ARG(&src), max_linewidth); -		return -E2BIG; +	ret = dpu_plane_atomic_check_pipe(pdpu, pipe, pipe_cfg, fmt); +	if (ret) +		return ret; + +	if (r_pipe->sspp) { +		ret = dpu_plane_atomic_check_pipe(pdpu, r_pipe, r_pipe_cfg, fmt); +		if (ret) +			return ret;  	}  	supported_rotations = DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0; @@ -1055,7 +980,7 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,  	if ((pipe_hw_caps->features & BIT(DPU_SSPP_INLINE_ROTATION)) &&  		(rotation & DRM_MODE_ROTATE_90)) { -		ret = dpu_plane_check_inline_rotation(pdpu, sblk, src, fmt); +		ret = dpu_plane_check_inline_rotation(pdpu, sblk, pipe_cfg->src_rect, fmt);  		if (ret)  			return ret;  	} @@ -1066,6 +991,28 @@ static int dpu_plane_atomic_check(struct drm_plane *plane,  	return 0;  } +static void dpu_plane_flush_csc(struct dpu_plane *pdpu, struct dpu_sw_pipe *pipe) +{ +	const struct dpu_format *format = +		to_dpu_format(msm_framebuffer_format(pdpu->base.state->fb)); +	const struct dpu_csc_cfg *csc_ptr; + +	if (!pipe->sspp || !pipe->sspp->ops.setup_csc) +		return; + +	csc_ptr = _dpu_plane_get_csc(pipe, format); +	if (!csc_ptr) +		return; + +	DPU_DEBUG_PLANE(pdpu, "using 0x%X 0x%X 0x%X...\n", +			csc_ptr->csc_mv[0], +			csc_ptr->csc_mv[1], +			csc_ptr->csc_mv[2]); + +	pipe->sspp->ops.setup_csc(pipe->sspp, csc_ptr); + +} +  void dpu_plane_flush(struct drm_plane *plane)  {  	struct dpu_plane *pdpu; @@ -1089,12 +1036,9 @@ void dpu_plane_flush(struct drm_plane *plane)  	else if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG)  		/* force 100% alpha */  		_dpu_plane_color_fill(pdpu, pdpu->color_fill, 0xFF); -	else if (pdpu->pipe_hw && pdpu->pipe_hw->ops.setup_csc) { -		const struct dpu_format *fmt = to_dpu_format(msm_framebuffer_format(plane->state->fb)); -		const struct dpu_csc_cfg *csc_ptr = _dpu_plane_get_csc(pdpu, fmt); - -		if (csc_ptr) -			pdpu->pipe_hw->ops.setup_csc(pdpu->pipe_hw, csc_ptr); +	else { +		dpu_plane_flush_csc(pdpu, &pstate->pipe); +		dpu_plane_flush_csc(pdpu, &pstate->r_pipe);  	}  	/* flag h/w flush complete */ @@ -1118,45 +1062,24 @@ void dpu_plane_set_error(struct drm_plane *plane, bool error)  	pdpu->is_error = error;  } -static void dpu_plane_sspp_atomic_update(struct drm_plane *plane) +static void dpu_plane_sspp_update_pipe(struct drm_plane *plane, +				       struct dpu_sw_pipe *pipe, +				       struct dpu_sw_pipe_cfg *pipe_cfg, +				       const struct dpu_format *fmt, +				       int frame_rate, +				       struct dpu_hw_fmt_layout *layout)  {  	uint32_t src_flags;  	struct dpu_plane *pdpu = to_dpu_plane(plane);  	struct drm_plane_state *state = plane->state;  	struct dpu_plane_state *pstate = to_dpu_plane_state(state); -	struct drm_crtc *crtc = state->crtc; -	struct drm_framebuffer *fb = state->fb; -	bool is_rt_pipe; -	const struct dpu_format *fmt = -		to_dpu_format(msm_framebuffer_format(fb)); -	struct dpu_hw_pipe_cfg pipe_cfg; - -	memset(&pipe_cfg, 0, sizeof(struct dpu_hw_pipe_cfg)); -	_dpu_plane_set_scanout(plane, pstate, &pipe_cfg, fb); - -	pstate->pending = true; - -	is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT); -	pstate->needs_qos_remap |= (is_rt_pipe != pdpu->is_rt_pipe); -	pdpu->is_rt_pipe = is_rt_pipe; - -	_dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL); - -	DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT -			", %4.4s ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src), -			crtc->base.id, DRM_RECT_ARG(&state->dst), -			(char *)&fmt->base.pixel_format, DPU_FORMAT_IS_UBWC(fmt)); - -	pipe_cfg.src_rect = state->src; - -	/* state->src is 16.16, src_rect is not */ -	pipe_cfg.src_rect.x1 >>= 16; -	pipe_cfg.src_rect.x2 >>= 16; -	pipe_cfg.src_rect.y1 >>= 16; -	pipe_cfg.src_rect.y2 >>= 16; +	if (layout && pipe->sspp->ops.setup_sourceaddress) { +		trace_dpu_plane_set_scanout(pipe, layout); +		pipe->sspp->ops.setup_sourceaddress(pipe, layout); +	} -	pipe_cfg.dst_rect = state->dst; +	_dpu_plane_set_qos_ctrl(plane, pipe, false, DPU_PLANE_QOS_PANIC_CTRL);  	/* override for color fill */  	if (pdpu->color_fill & DPU_PLANE_COLOR_FILL_FLAG) { @@ -1164,21 +1087,18 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)  		return;  	} -	if (pdpu->pipe_hw->ops.setup_rects) { -		pdpu->pipe_hw->ops.setup_rects(pdpu->pipe_hw, -				&pipe_cfg, -				pstate->multirect_index); +	if (pipe->sspp->ops.setup_rects) { +		pipe->sspp->ops.setup_rects(pipe, +				pipe_cfg);  	} -	_dpu_plane_setup_scaler(pdpu, pstate, fmt, false, &pipe_cfg); +	_dpu_plane_setup_scaler(pipe, fmt, false, pipe_cfg, pstate->rotation); -	if (pdpu->pipe_hw->ops.setup_multirect) -		pdpu->pipe_hw->ops.setup_multirect( -				pdpu->pipe_hw, -				pstate->multirect_index, -				pstate->multirect_mode); +	if (pipe->sspp->ops.setup_multirect) +		pipe->sspp->ops.setup_multirect( +				pipe); -	if (pdpu->pipe_hw->ops.setup_format) { +	if (pipe->sspp->ops.setup_format) {  		unsigned int rotation = pstate->rotation;  		src_flags = 0x0; @@ -1193,10 +1113,9 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)  			src_flags |= DPU_SSPP_ROT_90;  		/* update format */ -		pdpu->pipe_hw->ops.setup_format(pdpu->pipe_hw, fmt, src_flags, -				pstate->multirect_index); +		pipe->sspp->ops.setup_format(pipe, fmt, src_flags); -		if (pdpu->pipe_hw->ops.setup_cdp) { +		if (pipe->sspp->ops.setup_cdp) {  			struct dpu_hw_cdp_cfg cdp_cfg;  			memset(&cdp_cfg, 0, sizeof(struct dpu_hw_cdp_cfg)); @@ -1210,35 +1129,100 @@ static void dpu_plane_sspp_atomic_update(struct drm_plane *plane)  					DPU_FORMAT_IS_TILE(fmt);  			cdp_cfg.preload_ahead = DPU_SSPP_CDP_PRELOAD_AHEAD_64; -			pdpu->pipe_hw->ops.setup_cdp(pdpu->pipe_hw, &cdp_cfg, pstate->multirect_index); +			pipe->sspp->ops.setup_cdp(pipe, &cdp_cfg);  		}  	} -	_dpu_plane_set_qos_lut(plane, fb, &pipe_cfg); -	_dpu_plane_set_danger_lut(plane, fb); +	_dpu_plane_set_qos_lut(plane, pipe, fmt, pipe_cfg); +	_dpu_plane_set_danger_lut(plane, pipe, fmt);  	if (plane->type != DRM_PLANE_TYPE_CURSOR) { -		_dpu_plane_set_qos_ctrl(plane, true, DPU_PLANE_QOS_PANIC_CTRL); -		_dpu_plane_set_ot_limit(plane, crtc, &pipe_cfg); +		_dpu_plane_set_qos_ctrl(plane, pipe, true, DPU_PLANE_QOS_PANIC_CTRL); +		_dpu_plane_set_ot_limit(plane, pipe, pipe_cfg, frame_rate);  	} -	if (pstate->needs_qos_remap) { -		pstate->needs_qos_remap = false; -		_dpu_plane_set_qos_remap(plane); +	if (pstate->needs_qos_remap) +		_dpu_plane_set_qos_remap(plane, pipe); +} + +static void dpu_plane_sspp_atomic_update(struct drm_plane *plane) +{ +	struct dpu_plane *pdpu = to_dpu_plane(plane); +	struct drm_plane_state *state = plane->state; +	struct dpu_plane_state *pstate = to_dpu_plane_state(state); +	struct dpu_sw_pipe *pipe = &pstate->pipe; +	struct dpu_sw_pipe *r_pipe = &pstate->r_pipe; +	struct drm_crtc *crtc = state->crtc; +	struct drm_framebuffer *fb = state->fb; +	bool is_rt_pipe; +	const struct dpu_format *fmt = +		to_dpu_format(msm_framebuffer_format(fb)); +	struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg; +	struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg; +	struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base); +	struct msm_gem_address_space *aspace = kms->base.aspace; +	struct dpu_hw_fmt_layout layout; +	bool layout_valid = false; +	int ret; + +	ret = dpu_format_populate_layout(aspace, fb, &layout); +	if (ret) +		DPU_ERROR_PLANE(pdpu, "failed to get format layout, %d\n", ret); +	else +		layout_valid = true; + +	pstate->pending = true; + +	is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT); +	pstate->needs_qos_remap |= (is_rt_pipe != pdpu->is_rt_pipe); +	pdpu->is_rt_pipe = is_rt_pipe; + +	DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT +			", %4.4s ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src), +			crtc->base.id, DRM_RECT_ARG(&state->dst), +			(char *)&fmt->base.pixel_format, DPU_FORMAT_IS_UBWC(fmt)); + +	dpu_plane_sspp_update_pipe(plane, pipe, pipe_cfg, fmt, +				   drm_mode_vrefresh(&crtc->mode), +				   layout_valid ? &layout : NULL); + +	if (r_pipe->sspp) { +		dpu_plane_sspp_update_pipe(plane, r_pipe, r_pipe_cfg, fmt, +					   drm_mode_vrefresh(&crtc->mode), +					   layout_valid ? &layout : NULL);  	} -	_dpu_plane_calc_bw(plane, fb, &pipe_cfg); +	if (pstate->needs_qos_remap) +		pstate->needs_qos_remap = false; + +	pstate->plane_fetch_bw = _dpu_plane_calc_bw(pdpu->catalog, fmt, +						    &crtc->mode, pipe_cfg); + +	pstate->plane_clk = _dpu_plane_calc_clk(&crtc->mode, pipe_cfg); -	_dpu_plane_calc_clk(plane, &pipe_cfg); +	if (r_pipe->sspp) { +		pstate->plane_fetch_bw += _dpu_plane_calc_bw(pdpu->catalog, fmt, &crtc->mode, r_pipe_cfg); + +		pstate->plane_clk = max(pstate->plane_clk, _dpu_plane_calc_clk(&crtc->mode, r_pipe_cfg)); +	}  }  static void _dpu_plane_atomic_disable(struct drm_plane *plane)  {  	struct drm_plane_state *state = plane->state;  	struct dpu_plane_state *pstate = to_dpu_plane_state(state); +	struct dpu_sw_pipe *r_pipe = &pstate->r_pipe;  	trace_dpu_plane_disable(DRMID(plane), false, -				pstate->multirect_mode); +				pstate->pipe.multirect_mode); + +	if (r_pipe->sspp) { +		r_pipe->multirect_index = DPU_SSPP_RECT_SOLO; +		r_pipe->multirect_mode = DPU_SSPP_MULTIRECT_NONE; + +		if (r_pipe->sspp->ops.setup_multirect) +			r_pipe->sspp->ops.setup_multirect(r_pipe); +	}  	pstate->pending = true;  } @@ -1264,19 +1248,22 @@ static void dpu_plane_atomic_update(struct drm_plane *plane,  static void dpu_plane_destroy(struct drm_plane *plane)  {  	struct dpu_plane *pdpu = plane ? to_dpu_plane(plane) : NULL; +	struct dpu_plane_state *pstate;  	DPU_DEBUG_PLANE(pdpu, "\n");  	if (pdpu) { -		_dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL); +		pstate = to_dpu_plane_state(plane->state); +		_dpu_plane_set_qos_ctrl(plane, &pstate->pipe, false, DPU_PLANE_QOS_PANIC_CTRL); + +		if (pstate->r_pipe.sspp) +			_dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, false, DPU_PLANE_QOS_PANIC_CTRL);  		mutex_destroy(&pdpu->lock);  		/* this will destroy the states as well */  		drm_plane_cleanup(plane); -		dpu_hw_sspp_destroy(pdpu->pipe_hw); -  		kfree(pdpu);  	}  } @@ -1352,18 +1339,36 @@ static void dpu_plane_atomic_print_state(struct drm_printer *p,  		const struct drm_plane_state *state)  {  	const struct dpu_plane_state *pstate = to_dpu_plane_state(state); -	const struct dpu_plane *pdpu = to_dpu_plane(state->plane); +	const struct dpu_sw_pipe *pipe = &pstate->pipe; +	const struct dpu_sw_pipe_cfg *pipe_cfg = &pstate->pipe_cfg; +	const struct dpu_sw_pipe *r_pipe = &pstate->r_pipe; +	const struct dpu_sw_pipe_cfg *r_pipe_cfg = &pstate->r_pipe_cfg;  	drm_printf(p, "\tstage=%d\n", pstate->stage); -	drm_printf(p, "\tsspp=%s\n", pdpu->pipe_hw->cap->name); -	drm_printf(p, "\tmultirect_mode=%s\n", dpu_get_multirect_mode(pstate->multirect_mode)); -	drm_printf(p, "\tmultirect_index=%s\n", dpu_get_multirect_index(pstate->multirect_index)); + +	drm_printf(p, "\tsspp[0]=%s\n", pipe->sspp->cap->name); +	drm_printf(p, "\tmultirect_mode[0]=%s\n", dpu_get_multirect_mode(pipe->multirect_mode)); +	drm_printf(p, "\tmultirect_index[0]=%s\n", +		   dpu_get_multirect_index(pipe->multirect_index)); +	drm_printf(p, "\tsrc[0]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&pipe_cfg->src_rect)); +	drm_printf(p, "\tdst[0]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&pipe_cfg->dst_rect)); + +	if (r_pipe->sspp) { +		drm_printf(p, "\tsspp[1]=%s\n", r_pipe->sspp->cap->name); +		drm_printf(p, "\tmultirect_mode[1]=%s\n", +			   dpu_get_multirect_mode(r_pipe->multirect_mode)); +		drm_printf(p, "\tmultirect_index[1]=%s\n", +			   dpu_get_multirect_index(r_pipe->multirect_index)); +		drm_printf(p, "\tsrc[1]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&r_pipe_cfg->src_rect)); +		drm_printf(p, "\tdst[1]=" DRM_RECT_FMT "\n", DRM_RECT_ARG(&r_pipe_cfg->dst_rect)); +	}  }  static void dpu_plane_reset(struct drm_plane *plane)  {  	struct dpu_plane *pdpu;  	struct dpu_plane_state *pstate; +	struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);  	if (!plane) {  		DPU_ERROR("invalid plane\n"); @@ -1385,6 +1390,16 @@ static void dpu_plane_reset(struct drm_plane *plane)  		return;  	} +	/* +	 * Set the SSPP here until we have proper virtualized DPU planes. +	 * This is the place where the state is allocated, so fill it fully. +	 */ +	pstate->pipe.sspp = dpu_rm_get_sspp(&dpu_kms->rm, pdpu->pipe); +	pstate->pipe.multirect_index = DPU_SSPP_RECT_SOLO; +	pstate->pipe.multirect_mode = DPU_SSPP_MULTIRECT_NONE; + +	pstate->r_pipe.sspp = NULL; +  	__drm_atomic_helper_plane_reset(plane, &pstate->base);  } @@ -1392,31 +1407,18 @@ static void dpu_plane_reset(struct drm_plane *plane)  void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)  {  	struct dpu_plane *pdpu = to_dpu_plane(plane); +	struct dpu_plane_state *pstate = to_dpu_plane_state(plane->state);  	struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);  	if (!pdpu->is_rt_pipe)  		return;  	pm_runtime_get_sync(&dpu_kms->pdev->dev); -	_dpu_plane_set_qos_ctrl(plane, enable, DPU_PLANE_QOS_PANIC_CTRL); +	_dpu_plane_set_qos_ctrl(plane, &pstate->pipe, enable, DPU_PLANE_QOS_PANIC_CTRL); +	if (pstate->r_pipe.sspp) +		_dpu_plane_set_qos_ctrl(plane, &pstate->r_pipe, enable, DPU_PLANE_QOS_PANIC_CTRL);  	pm_runtime_put_sync(&dpu_kms->pdev->dev);  } - -/* SSPP live inside dpu_plane private data only. Enumerate them here. */ -void dpu_debugfs_sspp_init(struct dpu_kms *dpu_kms, struct dentry *debugfs_root) -{ -	struct drm_plane *plane; -	struct dentry *entry = debugfs_create_dir("sspp", debugfs_root); - -	if (IS_ERR(entry)) -		return; - -	drm_for_each_plane(plane, dpu_kms->dev) { -		struct dpu_plane *pdpu = to_dpu_plane(plane); - -		_dpu_hw_sspp_init_debugfs(pdpu->pipe_hw, dpu_kms, entry); -	} -}  #endif  static bool dpu_plane_format_mod_supported(struct drm_plane *plane, @@ -1450,11 +1452,6 @@ static const struct drm_plane_helper_funcs dpu_plane_helper_funcs = {  		.atomic_update = dpu_plane_atomic_update,  }; -enum dpu_sspp dpu_plane_pipe(struct drm_plane *plane) -{ -	return plane ? to_dpu_plane(plane)->pipe : SSPP_NONE; -} -  /* initialize plane */  struct drm_plane *dpu_plane_init(struct drm_device *dev,  		uint32_t pipe, enum drm_plane_type type, @@ -1465,6 +1462,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,  	struct dpu_plane *pdpu;  	struct msm_drm_private *priv = dev->dev_private;  	struct dpu_kms *kms = to_dpu_kms(priv->kms); +	struct dpu_hw_sspp *pipe_hw;  	uint32_t num_formats;  	uint32_t supported_rotations;  	int ret = -EINVAL; @@ -1482,24 +1480,20 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,  	pdpu->pipe = pipe;  	/* initialize underlying h/w driver */ -	pdpu->pipe_hw = dpu_hw_sspp_init(pipe, kms->mmio, kms->catalog); -	if (IS_ERR(pdpu->pipe_hw)) { -		DPU_ERROR("[%u]SSPP init failed\n", pipe); -		ret = PTR_ERR(pdpu->pipe_hw); +	pipe_hw = dpu_rm_get_sspp(&kms->rm, pipe); +	if (!pipe_hw || !pipe_hw->cap || !pipe_hw->cap->sblk) { +		DPU_ERROR("[%u]SSPP is invalid\n", pipe);  		goto clean_plane; -	} else if (!pdpu->pipe_hw->cap || !pdpu->pipe_hw->cap->sblk) { -		DPU_ERROR("[%u]SSPP init returned invalid cfg\n", pipe); -		goto clean_sspp;  	} -	format_list = pdpu->pipe_hw->cap->sblk->format_list; -	num_formats = pdpu->pipe_hw->cap->sblk->num_formats; +	format_list = pipe_hw->cap->sblk->format_list; +	num_formats = pipe_hw->cap->sblk->num_formats;  	ret = drm_universal_plane_init(dev, plane, 0xff, &dpu_plane_funcs,  				format_list, num_formats,  				supported_format_modifiers, type, NULL);  	if (ret) -		goto clean_sspp; +		goto clean_plane;  	pdpu->catalog = kms->catalog; @@ -1515,7 +1509,7 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,  	supported_rotations = DRM_MODE_REFLECT_MASK | DRM_MODE_ROTATE_0 | DRM_MODE_ROTATE_180; -	if (pdpu->pipe_hw->cap->features & BIT(DPU_SSPP_INLINE_ROTATION)) +	if (pipe_hw->cap->features & BIT(DPU_SSPP_INLINE_ROTATION))  		supported_rotations |= DRM_MODE_ROTATE_MASK;  	drm_plane_create_rotation_property(plane, @@ -1532,9 +1526,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,  					pipe, plane->base.id);  	return plane; -clean_sspp: -	if (pdpu && pdpu->pipe_hw) -		dpu_hw_sspp_destroy(pdpu->pipe_hw);  clean_plane:  	kfree(pdpu);  	return ERR_PTR(ret); diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h index b7b1b05199c2..abd6b21a049b 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h @@ -18,6 +18,10 @@   * struct dpu_plane_state: Define dpu extension of drm plane state object   * @base:	base drm plane state object   * @aspace:	pointer to address space for input/output buffers + * @pipe:	software pipe description + * @r_pipe:	software pipe description of the second pipe + * @pipe_cfg:	software pipe configuration + * @r_pipe_cfg:	software pipe configuration for the second pipe   * @stage:	assigned by crtc blender   * @needs_qos_remap: qos remap settings need to be updated   * @multirect_index: index of the rectangle of SSPP @@ -31,10 +35,12 @@  struct dpu_plane_state {  	struct drm_plane_state base;  	struct msm_gem_address_space *aspace; +	struct dpu_sw_pipe pipe; +	struct dpu_sw_pipe r_pipe; +	struct dpu_sw_pipe_cfg pipe_cfg; +	struct dpu_sw_pipe_cfg r_pipe_cfg;  	enum dpu_stage stage;  	bool needs_qos_remap; -	uint32_t multirect_index; -	uint32_t multirect_mode;  	bool pending;  	u64 plane_fetch_bw; @@ -44,27 +50,10 @@ struct dpu_plane_state {  	unsigned int rotation;  }; -/** - * struct dpu_multirect_plane_states: Defines multirect pair of drm plane states - * @r0: drm plane configured on rect 0 - * @r1: drm plane configured on rect 1 - */ -struct dpu_multirect_plane_states { -	const struct drm_plane_state *r0; -	const struct drm_plane_state *r1; -}; -  #define to_dpu_plane_state(x) \  	container_of(x, struct dpu_plane_state, base)  /** - * dpu_plane_pipe - return sspp identifier for the given plane - * @plane:   Pointer to DRM plane object - * Returns: sspp identifier of the given plane - */ -enum dpu_sspp dpu_plane_pipe(struct drm_plane *plane); - -/**   * dpu_plane_flush - final plane operations before commit flush   * @plane: Pointer to drm plane structure   */ @@ -89,19 +78,6 @@ struct drm_plane *dpu_plane_init(struct drm_device *dev,  		unsigned long possible_crtcs);  /** - * dpu_plane_validate_multirecti_v2 - validate the multirect planes - *				      against hw limitations - * @plane: drm plate states of the multirect pair - */ -int dpu_plane_validate_multirect_v2(struct dpu_multirect_plane_states *plane); - -/** - * dpu_plane_clear_multirect - clear multirect bits for the given pipe - * @drm_state: Pointer to DRM plane state - */ -void dpu_plane_clear_multirect(const struct drm_plane_state *drm_state); - -/**   * dpu_plane_color_fill - enables color fill on plane   * @plane:  Pointer to DRM plane object   * @color:  RGB fill color value, [23..16] Blue, [15..8] Green, [7..0] Red diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c index 66c1b70d244f..f4dda88a73f7 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c @@ -8,6 +8,7 @@  #include "dpu_hw_lm.h"  #include "dpu_hw_ctl.h"  #include "dpu_hw_pingpong.h" +#include "dpu_hw_sspp.h"  #include "dpu_hw_intf.h"  #include "dpu_hw_wb.h"  #include "dpu_hw_dspp.h" @@ -91,6 +92,9 @@ int dpu_rm_destroy(struct dpu_rm *rm)  	for (i = 0; i < ARRAY_SIZE(rm->hw_wb); i++)  		dpu_hw_wb_destroy(rm->hw_wb[i]); +	for (i = 0; i < ARRAY_SIZE(rm->hw_sspp); i++) +		dpu_hw_sspp_destroy(rm->hw_sspp[i]); +  	return 0;  } @@ -255,6 +259,24 @@ int dpu_rm_init(struct dpu_rm *rm,  		rm->dsc_blks[dsc->id - DSC_0] = &hw->base;  	} +	for (i = 0; i < cat->sspp_count; i++) { +		struct dpu_hw_sspp *hw; +		const struct dpu_sspp_cfg *sspp = &cat->sspp[i]; + +		if (sspp->id < SSPP_NONE || sspp->id >= SSPP_MAX) { +			DPU_ERROR("skip intf %d with invalid id\n", sspp->id); +			continue; +		} + +		hw = dpu_hw_sspp_init(sspp->id, mmio, cat); +		if (IS_ERR(hw)) { +			rc = PTR_ERR(hw); +			DPU_ERROR("failed sspp object creation: err %d\n", rc); +			goto fail; +		} +		rm->hw_sspp[sspp->id - SSPP_NONE] = hw; +	} +  	return 0;  fail: diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h index 59de72b381f9..d62c2edb2460 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_rm.h @@ -21,6 +21,7 @@ struct dpu_global_state;   * @hw_intf: array of intf hardware resources   * @hw_wb: array of wb hardware resources   * @dspp_blks: array of dspp hardware resources + * @hw_sspp: array of sspp hardware resources   */  struct dpu_rm {  	struct dpu_hw_blk *pingpong_blks[PINGPONG_MAX - PINGPONG_0]; @@ -31,6 +32,7 @@ struct dpu_rm {  	struct dpu_hw_blk *dspp_blks[DSPP_MAX - DSPP_0];  	struct dpu_hw_blk *merge_3d_blks[MERGE_3D_MAX - MERGE_3D_0];  	struct dpu_hw_blk *dsc_blks[DSC_MAX - DSC_0]; +	struct dpu_hw_sspp *hw_sspp[SSPP_MAX - SSPP_NONE];  };  /** @@ -108,5 +110,15 @@ static inline struct dpu_hw_wb *dpu_rm_get_wb(struct dpu_rm *rm, enum dpu_wb wb_  	return rm->hw_wb[wb_idx - WB_0];  } +/** + * dpu_rm_get_sspp - Return a struct dpu_hw_sspp instance given it's index. + * @rm: DPU Resource Manager handle + * @sspp_idx: SSPP index + */ +static inline struct dpu_hw_sspp *dpu_rm_get_sspp(struct dpu_rm *rm, enum dpu_sspp sspp_idx) +{ +	return rm->hw_sspp[sspp_idx - SSPP_NONE]; +} +  #endif /* __DPU_RM_H__ */ diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h index 76169f406505..0ad148cc2fb8 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_trace.h @@ -633,9 +633,9 @@ TRACE_EVENT(dpu_enc_phys_vid_irq_ctrl,  TRACE_EVENT(dpu_crtc_setup_mixer,  	TP_PROTO(uint32_t crtc_id, uint32_t plane_id,  		 struct drm_plane_state *state, struct dpu_plane_state *pstate, -		 uint32_t stage_idx, enum dpu_sspp sspp, uint32_t pixel_format, +		 uint32_t stage_idx, uint32_t pixel_format,  		 uint64_t modifier), -	TP_ARGS(crtc_id, plane_id, state, pstate, stage_idx, sspp, +	TP_ARGS(crtc_id, plane_id, state, pstate, stage_idx,  		pixel_format, modifier),  	TP_STRUCT__entry(  		__field(	uint32_t,		crtc_id		) @@ -659,9 +659,9 @@ TRACE_EVENT(dpu_crtc_setup_mixer,  		__entry->dst_rect = drm_plane_state_dest(state);  		__entry->stage_idx = stage_idx;  		__entry->stage = pstate->stage; -		__entry->sspp = sspp; -		__entry->multirect_idx = pstate->multirect_index; -		__entry->multirect_mode = pstate->multirect_mode; +		__entry->sspp = pstate->pipe.sspp->idx; +		__entry->multirect_idx = pstate->pipe.multirect_index; +		__entry->multirect_mode = pstate->pipe.multirect_mode;  		__entry->pixel_format = pixel_format;  		__entry->modifier = modifier;  	), @@ -762,18 +762,17 @@ TRACE_EVENT(dpu_crtc_disable_frame_pending,  );  TRACE_EVENT(dpu_plane_set_scanout, -	TP_PROTO(enum dpu_sspp index, struct dpu_hw_fmt_layout *layout, -		 enum dpu_sspp_multirect_index multirect_index), -	TP_ARGS(index, layout, multirect_index), +	TP_PROTO(struct dpu_sw_pipe *pipe, struct dpu_hw_fmt_layout *layout), +	TP_ARGS(pipe, layout),  	TP_STRUCT__entry(  		__field(	enum dpu_sspp,			index	)  		__field_struct(	struct dpu_hw_fmt_layout,	layout	)  		__field(	enum dpu_sspp_multirect_index,	multirect_index)  	),  	TP_fast_assign( -		__entry->index = index; +		__entry->index = pipe->sspp->idx;  		__entry->layout = *layout; -		__entry->multirect_index = multirect_index; +		__entry->multirect_index = pipe->multirect_index;  	),  	TP_printk("index:%d layout:{%ux%u @ [%u/%u, %u/%u, %u/%u, %u/%u]} "  		  "multirect_index:%d", __entry->index, __entry->layout.width, diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4.xml.h b/drivers/gpu/drm/msm/disp/mdp4/mdp4.xml.h index a2b6422948ec..cc8fde450884 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4.xml.h +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c index 9a1a0769575d..6e37072ed302 100644 --- a/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c +++ b/drivers/gpu/drm/msm/disp/mdp4/mdp4_kms.c @@ -84,10 +84,6 @@ static void mdp4_disable_commit(struct msm_kms *kms)  	mdp4_disable(mdp4_kms);  } -static void mdp4_prepare_commit(struct msm_kms *kms, struct drm_atomic_state *state) -{ -} -  static void mdp4_flush_commit(struct msm_kms *kms, unsigned crtc_mask)  {  	/* TODO */ @@ -154,7 +150,6 @@ static const struct mdp_kms_funcs kms_funcs = {  		.disable_vblank  = mdp4_disable_vblank,  		.enable_commit   = mdp4_enable_commit,  		.disable_commit  = mdp4_disable_commit, -		.prepare_commit  = mdp4_prepare_commit,  		.flush_commit    = mdp4_flush_commit,  		.wait_flush      = mdp4_wait_flush,  		.complete_commit = mdp4_complete_commit, diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5.xml.h b/drivers/gpu/drm/msm/disp/mdp5/mdp5.xml.h index 86fc44b518cb..270e11c904bd 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5.xml.h +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c index 1f1555aa02d2..2eec2d78f32a 100644 --- a/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c +++ b/drivers/gpu/drm/msm/disp/mdp5/mdp5_cfg.c @@ -655,7 +655,7 @@ static const struct mdp5_cfg_hw msm8x96_config = {  	.max_clk = 412500000,  }; -const struct mdp5_cfg_hw msm8x76_config = { +static const struct mdp5_cfg_hw msm8x76_config = {  	.name = "msm8x76",  	.mdp = {  		.count = 1, diff --git a/drivers/gpu/drm/msm/disp/mdp_common.xml.h b/drivers/gpu/drm/msm/disp/mdp_common.xml.h index be759106b621..4dd8d7db2862 100644 --- a/drivers/gpu/drm/msm/disp/mdp_common.xml.h +++ b/drivers/gpu/drm/msm/disp/mdp_common.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c index b73031cd48e4..e75b97127c0d 100644 --- a/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c +++ b/drivers/gpu/drm/msm/disp/msm_disp_snapshot.c @@ -129,9 +129,6 @@ void msm_disp_snapshot_destroy(struct drm_device *drm_dev)  	}  	priv = drm_dev->dev_private; -	if (!priv->kms) -		return; -  	kms = priv->kms;  	if (kms->dump_worker) diff --git a/drivers/gpu/drm/msm/dp/dp_audio.c b/drivers/gpu/drm/msm/dp/dp_audio.c index 6666783e1468..1245c7aa49df 100644 --- a/drivers/gpu/drm/msm/dp/dp_audio.c +++ b/drivers/gpu/drm/msm/dp/dp_audio.c @@ -593,6 +593,18 @@ static struct hdmi_codec_pdata codec_data = {  	.i2s = 1,  }; +void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio) +{ +	struct dp_audio_private *audio_priv; + +	audio_priv = container_of(dp_audio, struct dp_audio_private, dp_audio); + +	if (audio_priv->audio_pdev) { +		platform_device_unregister(audio_priv->audio_pdev); +		audio_priv->audio_pdev = NULL; +	} +} +  int dp_register_audio_driver(struct device *dev,  		struct dp_audio *dp_audio)  { diff --git a/drivers/gpu/drm/msm/dp/dp_audio.h b/drivers/gpu/drm/msm/dp/dp_audio.h index 84e5f4a5d26b..4ab78880af82 100644 --- a/drivers/gpu/drm/msm/dp/dp_audio.h +++ b/drivers/gpu/drm/msm/dp/dp_audio.h @@ -53,6 +53,8 @@ struct dp_audio *dp_audio_get(struct platform_device *pdev,  int dp_register_audio_driver(struct device *dev,  		struct dp_audio *dp_audio); +void dp_unregister_audio_driver(struct device *dev, struct dp_audio *dp_audio); +  /**   * dp_audio_put()   * diff --git a/drivers/gpu/drm/msm/dp/dp_aux.c b/drivers/gpu/drm/msm/dp/dp_aux.c index cc3efed593aa..8e3b677f35e6 100644 --- a/drivers/gpu/drm/msm/dp/dp_aux.c +++ b/drivers/gpu/drm/msm/dp/dp_aux.c @@ -162,47 +162,6 @@ static ssize_t dp_aux_cmd_fifo_rx(struct dp_aux_private *aux,  	return i;  } -static void dp_aux_native_handler(struct dp_aux_private *aux, u32 isr) -{ -	if (isr & DP_INTR_AUX_I2C_DONE) -		aux->aux_error_num = DP_AUX_ERR_NONE; -	else if (isr & DP_INTR_WRONG_ADDR) -		aux->aux_error_num = DP_AUX_ERR_ADDR; -	else if (isr & DP_INTR_TIMEOUT) -		aux->aux_error_num = DP_AUX_ERR_TOUT; -	if (isr & DP_INTR_NACK_DEFER) -		aux->aux_error_num = DP_AUX_ERR_NACK; -	if (isr & DP_INTR_AUX_ERROR) { -		aux->aux_error_num = DP_AUX_ERR_PHY; -		dp_catalog_aux_clear_hw_interrupts(aux->catalog); -	} -} - -static void dp_aux_i2c_handler(struct dp_aux_private *aux, u32 isr) -{ -	if (isr & DP_INTR_AUX_I2C_DONE) { -		if (isr & (DP_INTR_I2C_NACK | DP_INTR_I2C_DEFER)) -			aux->aux_error_num = DP_AUX_ERR_NACK; -		else -			aux->aux_error_num = DP_AUX_ERR_NONE; -	} else { -		if (isr & DP_INTR_WRONG_ADDR) -			aux->aux_error_num = DP_AUX_ERR_ADDR; -		else if (isr & DP_INTR_TIMEOUT) -			aux->aux_error_num = DP_AUX_ERR_TOUT; -		if (isr & DP_INTR_NACK_DEFER) -			aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; -		if (isr & DP_INTR_I2C_NACK) -			aux->aux_error_num = DP_AUX_ERR_NACK; -		if (isr & DP_INTR_I2C_DEFER) -			aux->aux_error_num = DP_AUX_ERR_DEFER; -		if (isr & DP_INTR_AUX_ERROR) { -			aux->aux_error_num = DP_AUX_ERR_PHY; -			dp_catalog_aux_clear_hw_interrupts(aux->catalog); -		} -	} -} -  static void dp_aux_update_offset_and_segment(struct dp_aux_private *aux,  					     struct drm_dp_aux_msg *input_msg)  { @@ -409,14 +368,14 @@ exit:  	return ret;  } -void dp_aux_isr(struct drm_dp_aux *dp_aux) +irqreturn_t dp_aux_isr(struct drm_dp_aux *dp_aux)  {  	u32 isr;  	struct dp_aux_private *aux;  	if (!dp_aux) {  		DRM_ERROR("invalid input\n"); -		return; +		return IRQ_NONE;  	}  	aux = container_of(dp_aux, struct dp_aux_private, dp_aux); @@ -425,17 +384,48 @@ void dp_aux_isr(struct drm_dp_aux *dp_aux)  	/* no interrupts pending, return immediately */  	if (!isr) -		return; +		return IRQ_NONE; -	if (!aux->cmd_busy) -		return; +	if (!aux->cmd_busy) { +		DRM_ERROR("Unexpected DP AUX IRQ %#010x when not busy\n", isr); +		return IRQ_NONE; +	} -	if (aux->native) -		dp_aux_native_handler(aux, isr); -	else -		dp_aux_i2c_handler(aux, isr); +	/* +	 * The logic below assumes only one error bit is set (other than "done" +	 * which can apparently be set at the same time as some of the other +	 * bits). Warn if more than one get set so we know we need to improve +	 * the logic. +	 */ +	if (hweight32(isr & ~DP_INTR_AUX_XFER_DONE) > 1) +		DRM_WARN("Some DP AUX interrupts unhandled: %#010x\n", isr); + +	if (isr & DP_INTR_AUX_ERROR) { +		aux->aux_error_num = DP_AUX_ERR_PHY; +		dp_catalog_aux_clear_hw_interrupts(aux->catalog); +	} else if (isr & DP_INTR_NACK_DEFER) { +		aux->aux_error_num = DP_AUX_ERR_NACK_DEFER; +	} else if (isr & DP_INTR_WRONG_ADDR) { +		aux->aux_error_num = DP_AUX_ERR_ADDR; +	} else if (isr & DP_INTR_TIMEOUT) { +		aux->aux_error_num = DP_AUX_ERR_TOUT; +	} else if (!aux->native && (isr & DP_INTR_I2C_NACK)) { +		aux->aux_error_num = DP_AUX_ERR_NACK; +	} else if (!aux->native && (isr & DP_INTR_I2C_DEFER)) { +		if (isr & DP_INTR_AUX_XFER_DONE) +			aux->aux_error_num = DP_AUX_ERR_NACK; +		else +			aux->aux_error_num = DP_AUX_ERR_DEFER; +	} else if (isr & DP_INTR_AUX_XFER_DONE) { +		aux->aux_error_num = DP_AUX_ERR_NONE; +	} else { +		DRM_WARN("Unexpected interrupt: %#010x\n", isr); +		return IRQ_NONE; +	}  	complete(&aux->comp); + +	return IRQ_HANDLED;  }  void dp_aux_reconfig(struct drm_dp_aux *dp_aux) diff --git a/drivers/gpu/drm/msm/dp/dp_aux.h b/drivers/gpu/drm/msm/dp/dp_aux.h index e930974bcb5b..511305da4f66 100644 --- a/drivers/gpu/drm/msm/dp/dp_aux.h +++ b/drivers/gpu/drm/msm/dp/dp_aux.h @@ -11,7 +11,7 @@  int dp_aux_register(struct drm_dp_aux *dp_aux);  void dp_aux_unregister(struct drm_dp_aux *dp_aux); -void dp_aux_isr(struct drm_dp_aux *dp_aux); +irqreturn_t dp_aux_isr(struct drm_dp_aux *dp_aux);  void dp_aux_init(struct drm_dp_aux *dp_aux);  void dp_aux_deinit(struct drm_dp_aux *dp_aux);  void dp_aux_reconfig(struct drm_dp_aux *dp_aux); diff --git a/drivers/gpu/drm/msm/dp/dp_catalog.c b/drivers/gpu/drm/msm/dp/dp_catalog.c index 676279d0ca8d..5142aeb705a4 100644 --- a/drivers/gpu/drm/msm/dp/dp_catalog.c +++ b/drivers/gpu/drm/msm/dp/dp_catalog.c @@ -27,7 +27,7 @@  #define DP_INTF_CONFIG_DATABUS_WIDEN     BIT(4)  #define DP_INTERRUPT_STATUS1 \ -	(DP_INTR_AUX_I2C_DONE| \ +	(DP_INTR_AUX_XFER_DONE| \  	DP_INTR_WRONG_ADDR | DP_INTR_TIMEOUT | \  	DP_INTR_NACK_DEFER | DP_INTR_WRONG_DATA_CNT | \  	DP_INTR_I2C_NACK | DP_INTR_I2C_DEFER | \ @@ -47,6 +47,14 @@  #define DP_INTERRUPT_STATUS2_MASK \  	(DP_INTERRUPT_STATUS2 << DP_INTERRUPT_STATUS_MASK_SHIFT) +#define DP_INTERRUPT_STATUS4 \ +	(PSR_UPDATE_INT | PSR_CAPTURE_INT | PSR_EXIT_INT | \ +	PSR_UPDATE_ERROR_INT | PSR_WAKE_ERROR_INT) + +#define DP_INTERRUPT_MASK4 \ +	(PSR_UPDATE_MASK | PSR_CAPTURE_MASK | PSR_EXIT_MASK | \ +	PSR_UPDATE_ERROR_MASK | PSR_WAKE_ERROR_MASK) +  struct dp_catalog_private {  	struct device *dev;  	struct drm_device *drm_dev; @@ -359,6 +367,23 @@ void dp_catalog_ctrl_lane_mapping(struct dp_catalog *dp_catalog)  			ln_mapping);  } +void dp_catalog_ctrl_psr_mainlink_enable(struct dp_catalog *dp_catalog, +						bool enable) +{ +	u32 val; +	struct dp_catalog_private *catalog = container_of(dp_catalog, +				struct dp_catalog_private, dp_catalog); + +	val = dp_read_link(catalog, REG_DP_MAINLINK_CTRL); + +	if (enable) +		val |= DP_MAINLINK_CTRL_ENABLE; +	else +		val &= ~DP_MAINLINK_CTRL_ENABLE; + +	dp_write_link(catalog, REG_DP_MAINLINK_CTRL, val); +} +  void dp_catalog_ctrl_mainlink_ctrl(struct dp_catalog *dp_catalog,  						bool enable)  { @@ -595,7 +620,7 @@ void dp_catalog_hpd_config_intr(struct dp_catalog *dp_catalog,  				config & DP_DP_HPD_INT_MASK);  } -void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog) +void dp_catalog_ctrl_hpd_enable(struct dp_catalog *dp_catalog)  {  	struct dp_catalog_private *catalog = container_of(dp_catalog,  				struct dp_catalog_private, dp_catalog); @@ -610,6 +635,60 @@ void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog)  	dp_write_aux(catalog, REG_DP_DP_HPD_CTRL, DP_DP_HPD_CTRL_HPD_EN);  } +void dp_catalog_ctrl_hpd_disable(struct dp_catalog *dp_catalog) +{ +	struct dp_catalog_private *catalog = container_of(dp_catalog, +				struct dp_catalog_private, dp_catalog); + +	u32 reftimer = dp_read_aux(catalog, REG_DP_DP_HPD_REFTIMER); + +	reftimer &= ~DP_DP_HPD_REFTIMER_ENABLE; +	dp_write_aux(catalog, REG_DP_DP_HPD_REFTIMER, reftimer); + +	dp_write_aux(catalog, REG_DP_DP_HPD_CTRL, 0); +} + +static void dp_catalog_enable_sdp(struct dp_catalog_private *catalog) +{ +	/* trigger sdp */ +	dp_write_link(catalog, MMSS_DP_SDP_CFG3, UPDATE_SDP); +	dp_write_link(catalog, MMSS_DP_SDP_CFG3, 0x0); +} + +void dp_catalog_ctrl_config_psr(struct dp_catalog *dp_catalog) +{ +	struct dp_catalog_private *catalog = container_of(dp_catalog, +				struct dp_catalog_private, dp_catalog); +	u32 config; + +	/* enable PSR1 function */ +	config = dp_read_link(catalog, REG_PSR_CONFIG); +	config |= PSR1_SUPPORTED; +	dp_write_link(catalog, REG_PSR_CONFIG, config); + +	dp_write_ahb(catalog, REG_DP_INTR_MASK4, DP_INTERRUPT_MASK4); +	dp_catalog_enable_sdp(catalog); +} + +void dp_catalog_ctrl_set_psr(struct dp_catalog *dp_catalog, bool enter) +{ +	struct dp_catalog_private *catalog = container_of(dp_catalog, +			struct dp_catalog_private, dp_catalog); +	u32 cmd; + +	cmd = dp_read_link(catalog, REG_PSR_CMD); + +	cmd &= ~(PSR_ENTER | PSR_EXIT); + +	if (enter) +		cmd |= PSR_ENTER; +	else +		cmd |= PSR_EXIT; + +	dp_catalog_enable_sdp(catalog); +	dp_write_link(catalog, REG_PSR_CMD, cmd); +} +  u32 dp_catalog_link_is_connected(struct dp_catalog *dp_catalog)  {  	struct dp_catalog_private *catalog = container_of(dp_catalog, @@ -645,6 +724,20 @@ u32 dp_catalog_hpd_get_intr_status(struct dp_catalog *dp_catalog)  	return isr & (mask | ~DP_DP_HPD_INT_MASK);  } +u32 dp_catalog_ctrl_read_psr_interrupt_status(struct dp_catalog *dp_catalog) +{ +	struct dp_catalog_private *catalog = container_of(dp_catalog, +				struct dp_catalog_private, dp_catalog); +	u32 intr, intr_ack; + +	intr = dp_read_ahb(catalog, REG_DP_INTR_STATUS4); +	intr_ack = (intr & DP_INTERRUPT_STATUS4) +			<< DP_INTERRUPT_STATUS_ACK_SHIFT; +	dp_write_ahb(catalog, REG_DP_INTR_STATUS4, intr_ack); + +	return intr; +} +  int dp_catalog_ctrl_get_interrupt(struct dp_catalog *dp_catalog)  {  	struct dp_catalog_private *catalog = container_of(dp_catalog, diff --git a/drivers/gpu/drm/msm/dp/dp_catalog.h b/drivers/gpu/drm/msm/dp/dp_catalog.h index 1f717f45c115..38786e855b51 100644 --- a/drivers/gpu/drm/msm/dp/dp_catalog.h +++ b/drivers/gpu/drm/msm/dp/dp_catalog.h @@ -13,7 +13,7 @@  /* interrupts */  #define DP_INTR_HPD		BIT(0) -#define DP_INTR_AUX_I2C_DONE	BIT(3) +#define DP_INTR_AUX_XFER_DONE	BIT(3)  #define DP_INTR_WRONG_ADDR	BIT(6)  #define DP_INTR_TIMEOUT		BIT(9)  #define DP_INTR_NACK_DEFER	BIT(12) @@ -93,6 +93,7 @@ void dp_catalog_ctrl_state_ctrl(struct dp_catalog *dp_catalog, u32 state);  void dp_catalog_ctrl_config_ctrl(struct dp_catalog *dp_catalog, u32 config);  void dp_catalog_ctrl_lane_mapping(struct dp_catalog *dp_catalog);  void dp_catalog_ctrl_mainlink_ctrl(struct dp_catalog *dp_catalog, bool enable); +void dp_catalog_ctrl_psr_mainlink_enable(struct dp_catalog *dp_catalog, bool enable);  void dp_catalog_ctrl_config_misc(struct dp_catalog *dp_catalog, u32 cc, u32 tb);  void dp_catalog_ctrl_config_msa(struct dp_catalog *dp_catalog, u32 rate,  				u32 stream_rate_khz, bool fixed_nvid); @@ -103,13 +104,17 @@ bool dp_catalog_ctrl_mainlink_ready(struct dp_catalog *dp_catalog);  void dp_catalog_ctrl_enable_irq(struct dp_catalog *dp_catalog, bool enable);  void dp_catalog_hpd_config_intr(struct dp_catalog *dp_catalog,  			u32 intr_mask, bool en); -void dp_catalog_ctrl_hpd_config(struct dp_catalog *dp_catalog); +void dp_catalog_ctrl_hpd_enable(struct dp_catalog *dp_catalog); +void dp_catalog_ctrl_hpd_disable(struct dp_catalog *dp_catalog); +void dp_catalog_ctrl_config_psr(struct dp_catalog *dp_catalog); +void dp_catalog_ctrl_set_psr(struct dp_catalog *dp_catalog, bool enter);  u32 dp_catalog_link_is_connected(struct dp_catalog *dp_catalog);  u32 dp_catalog_hpd_get_intr_status(struct dp_catalog *dp_catalog);  void dp_catalog_ctrl_phy_reset(struct dp_catalog *dp_catalog);  int dp_catalog_ctrl_update_vx_px(struct dp_catalog *dp_catalog, u8 v_level,  				u8 p_level);  int dp_catalog_ctrl_get_interrupt(struct dp_catalog *dp_catalog); +u32 dp_catalog_ctrl_read_psr_interrupt_status(struct dp_catalog *dp_catalog);  void dp_catalog_ctrl_update_transfer_unit(struct dp_catalog *dp_catalog,  				u32 dp_tu, u32 valid_boundary,  				u32 valid_boundary2); diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.c b/drivers/gpu/drm/msm/dp/dp_ctrl.c index dd26ca651a05..a7a5c7e0ab92 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.c +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.c @@ -22,6 +22,7 @@  #define DP_KHZ_TO_HZ 1000  #define IDLE_PATTERN_COMPLETION_TIMEOUT_JIFFIES	(30 * HZ / 1000) /* 30 ms */ +#define PSR_OPERATION_COMPLETION_TIMEOUT_JIFFIES       (300 * HZ / 1000) /* 300 ms */  #define WAIT_FOR_VIDEO_READY_TIMEOUT_JIFFIES (HZ / 2)  #define DP_CTRL_INTR_READY_FOR_VIDEO     BIT(0) @@ -80,6 +81,7 @@ struct dp_ctrl_private {  	struct dp_catalog *catalog;  	struct completion idle_comp; +	struct completion psr_op_comp;  	struct completion video_comp;  }; @@ -153,6 +155,9 @@ static void dp_ctrl_config_ctrl(struct dp_ctrl_private *ctrl)  	config |= DP_CONFIGURATION_CTRL_STATIC_DYNAMIC_CN;  	config |= DP_CONFIGURATION_CTRL_SYNC_ASYNC_CLK; +	if (ctrl->panel->psr_cap.version) +		config |= DP_CONFIGURATION_CTRL_SEND_VSC; +  	dp_catalog_ctrl_config_ctrl(ctrl->catalog, config);  } @@ -1375,6 +1380,64 @@ void dp_ctrl_reset_irq_ctrl(struct dp_ctrl *dp_ctrl, bool enable)  	dp_catalog_ctrl_enable_irq(ctrl->catalog, enable);  } +void dp_ctrl_config_psr(struct dp_ctrl *dp_ctrl) +{ +	u8 cfg; +	struct dp_ctrl_private *ctrl = container_of(dp_ctrl, +			struct dp_ctrl_private, dp_ctrl); + +	if (!ctrl->panel->psr_cap.version) +		return; + +	dp_catalog_ctrl_config_psr(ctrl->catalog); + +	cfg = DP_PSR_ENABLE; +	drm_dp_dpcd_write(ctrl->aux, DP_PSR_EN_CFG, &cfg, 1); +} + +void dp_ctrl_set_psr(struct dp_ctrl *dp_ctrl, bool enter) +{ +	struct dp_ctrl_private *ctrl = container_of(dp_ctrl, +			struct dp_ctrl_private, dp_ctrl); + +	if (!ctrl->panel->psr_cap.version) +		return; + +	/* +	 * When entering PSR, +	 * 1. Send PSR enter SDP and wait for the PSR_UPDATE_INT +	 * 2. Turn off video +	 * 3. Disable the mainlink +	 * +	 * When exiting PSR, +	 * 1. Enable the mainlink +	 * 2. Send the PSR exit SDP +	 */ +	if (enter) { +		reinit_completion(&ctrl->psr_op_comp); +		dp_catalog_ctrl_set_psr(ctrl->catalog, true); + +		if (!wait_for_completion_timeout(&ctrl->psr_op_comp, +			PSR_OPERATION_COMPLETION_TIMEOUT_JIFFIES)) { +			DRM_ERROR("PSR_ENTRY timedout\n"); +			dp_catalog_ctrl_set_psr(ctrl->catalog, false); +			return; +		} + +		dp_ctrl_push_idle(dp_ctrl); +		dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); + +		dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, false); +	} else { +		dp_catalog_ctrl_psr_mainlink_enable(ctrl->catalog, true); + +		dp_catalog_ctrl_set_psr(ctrl->catalog, false); +		dp_catalog_ctrl_state_ctrl(ctrl->catalog, DP_STATE_CTRL_SEND_VIDEO); +		dp_ctrl_wait4video_ready(ctrl); +		dp_catalog_ctrl_state_ctrl(ctrl->catalog, 0); +	} +} +  void dp_ctrl_phy_init(struct dp_ctrl *dp_ctrl)  {  	struct dp_ctrl_private *ctrl; @@ -1979,27 +2042,49 @@ int dp_ctrl_off(struct dp_ctrl *dp_ctrl)  	return ret;  } -void dp_ctrl_isr(struct dp_ctrl *dp_ctrl) +irqreturn_t dp_ctrl_isr(struct dp_ctrl *dp_ctrl)  {  	struct dp_ctrl_private *ctrl;  	u32 isr; +	irqreturn_t ret = IRQ_NONE;  	if (!dp_ctrl) -		return; +		return IRQ_NONE;  	ctrl = container_of(dp_ctrl, struct dp_ctrl_private, dp_ctrl); +	if (ctrl->panel->psr_cap.version) { +		isr = dp_catalog_ctrl_read_psr_interrupt_status(ctrl->catalog); + +		if (isr) +			complete(&ctrl->psr_op_comp); + +		if (isr & PSR_EXIT_INT) +			drm_dbg_dp(ctrl->drm_dev, "PSR exit done\n"); + +		if (isr & PSR_UPDATE_INT) +			drm_dbg_dp(ctrl->drm_dev, "PSR frame update done\n"); + +		if (isr & PSR_CAPTURE_INT) +			drm_dbg_dp(ctrl->drm_dev, "PSR frame capture done\n"); +	} +  	isr = dp_catalog_ctrl_get_interrupt(ctrl->catalog); +  	if (isr & DP_CTRL_INTR_READY_FOR_VIDEO) {  		drm_dbg_dp(ctrl->drm_dev, "dp_video_ready\n");  		complete(&ctrl->video_comp); +		ret = IRQ_HANDLED;  	}  	if (isr & DP_CTRL_INTR_IDLE_PATTERN_SENT) {  		drm_dbg_dp(ctrl->drm_dev, "idle_patterns_sent\n");  		complete(&ctrl->idle_comp); +		ret = IRQ_HANDLED;  	} + +	return ret;  }  struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link, @@ -2035,6 +2120,7 @@ struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link,  		dev_err(dev, "failed to add DP OPP table\n");  	init_completion(&ctrl->idle_comp); +	init_completion(&ctrl->psr_op_comp);  	init_completion(&ctrl->video_comp);  	/* in parameters */ diff --git a/drivers/gpu/drm/msm/dp/dp_ctrl.h b/drivers/gpu/drm/msm/dp/dp_ctrl.h index 9f29734af81c..f712780149fd 100644 --- a/drivers/gpu/drm/msm/dp/dp_ctrl.h +++ b/drivers/gpu/drm/msm/dp/dp_ctrl.h @@ -25,7 +25,7 @@ int dp_ctrl_off_link_stream(struct dp_ctrl *dp_ctrl);  int dp_ctrl_off_link(struct dp_ctrl *dp_ctrl);  int dp_ctrl_off(struct dp_ctrl *dp_ctrl);  void dp_ctrl_push_idle(struct dp_ctrl *dp_ctrl); -void dp_ctrl_isr(struct dp_ctrl *dp_ctrl); +irqreturn_t dp_ctrl_isr(struct dp_ctrl *dp_ctrl);  void dp_ctrl_handle_sink_request(struct dp_ctrl *dp_ctrl);  struct dp_ctrl *dp_ctrl_get(struct device *dev, struct dp_link *link,  			struct dp_panel *panel,	struct drm_dp_aux *aux, @@ -37,4 +37,7 @@ void dp_ctrl_phy_init(struct dp_ctrl *dp_ctrl);  void dp_ctrl_phy_exit(struct dp_ctrl *dp_ctrl);  void dp_ctrl_irq_phy_exit(struct dp_ctrl *dp_ctrl); +void dp_ctrl_set_psr(struct dp_ctrl *dp_ctrl, bool enable); +void dp_ctrl_config_psr(struct dp_ctrl *dp_ctrl); +  #endif /* _DP_CTRL_H_ */ diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index bde1a7ce442f..03b0eda6df54 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -28,6 +28,10 @@  #include "dp_audio.h"  #include "dp_debug.h" +static bool psr_enabled = false; +module_param(psr_enabled, bool, 0); +MODULE_PARM_DESC(psr_enabled, "enable PSR for eDP and DP displays"); +  #define HPD_STRING_SIZE 30  enum { @@ -326,6 +330,7 @@ static void dp_display_unbind(struct device *dev, struct device *master,  	kthread_stop(dp->ev_tsk);  	dp_power_client_deinit(dp->power); +	dp_unregister_audio_driver(dev, dp->audio);  	dp_aux_unregister(dp->aux);  	dp->drm_dev = NULL;  	dp->aux->drm_dev = NULL; @@ -406,6 +411,8 @@ static int dp_display_process_hpd_high(struct dp_display_private *dp)  	edid = dp->panel->edid; +	dp->dp_display.psr_supported = dp->panel->psr_cap.version && psr_enabled; +  	dp->audio_supported = drm_detect_monitor_audio(edid);  	dp_panel_handle_sink_request(dp->panel); @@ -613,12 +620,6 @@ static int dp_hpd_plug_handle(struct dp_display_private *dp, u32 data)  		dp->hpd_state = ST_MAINLINK_READY;  	} -	/* enable HDP irq_hpd/replug interrupt */ -	if (dp->dp_display.internal_hpd) -		dp_catalog_hpd_config_intr(dp->catalog, -					   DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK, -					   true); -  	drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",  			dp->dp_display.connector_type, state);  	mutex_unlock(&dp->event_mutex); @@ -656,12 +657,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)  	drm_dbg_dp(dp->drm_dev, "Before, type=%d hpd_state=%d\n",  			dp->dp_display.connector_type, state); -	/* disable irq_hpd/replug interrupts */ -	if (dp->dp_display.internal_hpd) -		dp_catalog_hpd_config_intr(dp->catalog, -					   DP_DP_IRQ_HPD_INT_MASK | DP_DP_HPD_REPLUG_INT_MASK, -					   false); -  	/* unplugged, no more irq_hpd handle */  	dp_del_event(dp, EV_IRQ_HPD_INT); @@ -685,10 +680,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)  		return 0;  	} -	/* disable HPD plug interrupts */ -	if (dp->dp_display.internal_hpd) -		dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, false); -  	/*  	 * We don't need separate work for disconnect as  	 * connect/attention interrupts are disabled @@ -704,10 +695,6 @@ static int dp_hpd_unplug_handle(struct dp_display_private *dp, u32 data)  	/* signal the disconnect event early to ensure proper teardown */  	dp_display_handle_plugged_change(&dp->dp_display, false); -	/* enable HDP plug interrupt to prepare for next plugin */ -	if (dp->dp_display.internal_hpd) -		dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_PLUG_INT_MASK, true); -  	drm_dbg_dp(dp->drm_dev, "After, type=%d hpd_state=%d\n",  			dp->dp_display.connector_type, state); @@ -910,6 +897,10 @@ static int dp_display_post_enable(struct msm_dp *dp_display)  	/* signal the connect event late to synchronize video and display */  	dp_display_handle_plugged_change(dp_display, true); + +	if (dp_display->psr_supported) +		dp_ctrl_config_psr(dp->ctrl); +  	return 0;  } @@ -990,14 +981,6 @@ enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,  		return -EINVAL;  	} -	/* -	 * The eDP controller currently does not have a reliable way of -	 * enabling panel power to read sink capabilities. So, we rely -	 * on the panel driver to populate only supported modes for now. -	 */ -	if (dp->is_edp) -		return MODE_OK; -  	if (mode->clock > DP_MAX_PIXEL_CLK_KHZ)  		return MODE_CLOCK_HIGH; @@ -1084,24 +1067,17 @@ void msm_dp_snapshot(struct msm_disp_state *disp_state, struct msm_dp *dp)  	mutex_unlock(&dp_display->event_mutex);  } -static void dp_display_config_hpd(struct dp_display_private *dp) +void dp_display_set_psr(struct msm_dp *dp_display, bool enter)  { +	struct dp_display_private *dp; -	dp_display_host_init(dp); -	dp_catalog_ctrl_hpd_config(dp->catalog); - -	/* Enable plug and unplug interrupts only if requested */ -	if (dp->dp_display.internal_hpd) -		dp_catalog_hpd_config_intr(dp->catalog, -				DP_DP_HPD_PLUG_INT_MASK | -				DP_DP_HPD_UNPLUG_INT_MASK, -				true); - -	/* Enable interrupt first time -	 * we are leaving dp clocks on during disconnect -	 * and never disable interrupt -	 */ -	enable_irq(dp->irq); +	if (!dp_display) { +		DRM_ERROR("invalid params\n"); +		return; +	} + +	dp = container_of(dp_display, struct dp_display_private, dp_display); +	dp_ctrl_set_psr(dp->ctrl, enter);  }  static int hpd_event_thread(void *data) @@ -1165,7 +1141,7 @@ static int hpd_event_thread(void *data)  		switch (todo->event_id) {  		case EV_HPD_INIT_SETUP: -			dp_display_config_hpd(dp_priv); +			dp_display_host_init(dp_priv);  			break;  		case EV_HPD_PLUG_INT:  			dp_hpd_plug_handle(dp_priv, todo->data); @@ -1204,7 +1180,7 @@ static int dp_hpd_event_thread_start(struct dp_display_private *dp_priv)  static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)  {  	struct dp_display_private *dp = dev_id; -	irqreturn_t ret = IRQ_HANDLED; +	irqreturn_t ret = IRQ_NONE;  	u32 hpd_isr_status;  	if (!dp) { @@ -1232,13 +1208,15 @@ static irqreturn_t dp_display_irq_handler(int irq, void *dev_id)  		if (hpd_isr_status & DP_DP_HPD_UNPLUG_INT_MASK)  			dp_add_event(dp, EV_HPD_UNPLUG_INT, 0, 0); + +		ret = IRQ_HANDLED;  	}  	/* DP controller isr */ -	dp_ctrl_isr(dp->ctrl); +	ret |= dp_ctrl_isr(dp->ctrl);  	/* DP aux isr */ -	dp_aux_isr(dp->aux); +	ret |= dp_aux_isr(dp->aux);  	return ret;  } @@ -1269,7 +1247,6 @@ int dp_display_request_irq(struct msm_dp *dp_display)  				dp->irq, rc);  		return rc;  	} -	disable_irq(dp->irq);  	return 0;  } @@ -1381,13 +1358,8 @@ static int dp_pm_resume(struct device *dev)  	/* turn on dp ctrl/phy */  	dp_display_host_init(dp); -	dp_catalog_ctrl_hpd_config(dp->catalog); - -	if (dp->dp_display.internal_hpd) -		dp_catalog_hpd_config_intr(dp->catalog, -				DP_DP_HPD_PLUG_INT_MASK | -				DP_DP_HPD_UNPLUG_INT_MASK, -				true); +	if (dp_display->is_edp) +		dp_catalog_ctrl_hpd_enable(dp->catalog);  	if (dp_catalog_link_is_connected(dp->catalog)) {  		/* @@ -1555,9 +1527,8 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)  	if (aux_bus && dp->is_edp) {  		dp_display_host_init(dp_priv); -		dp_catalog_ctrl_hpd_config(dp_priv->catalog); +		dp_catalog_ctrl_hpd_enable(dp_priv->catalog);  		dp_display_host_phy_init(dp_priv); -		enable_irq(dp_priv->irq);  		/*  		 * The code below assumes that the panel will finish probing @@ -1599,7 +1570,6 @@ static int dp_display_get_next_bridge(struct msm_dp *dp)  error:  	if (dp->is_edp) { -		disable_irq(dp_priv->irq);  		dp_display_host_phy_exit(dp_priv);  		dp_display_host_deinit(dp_priv);  	} @@ -1652,7 +1622,8 @@ int msm_dp_modeset_init(struct msm_dp *dp_display, struct drm_device *dev,  	return 0;  } -void dp_bridge_enable(struct drm_bridge *drm_bridge) +void dp_bridge_atomic_enable(struct drm_bridge *drm_bridge, +			     struct drm_bridge_state *old_bridge_state)  {  	struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge);  	struct msm_dp *dp = dp_bridge->dp_display; @@ -1707,7 +1678,8 @@ void dp_bridge_enable(struct drm_bridge *drm_bridge)  	mutex_unlock(&dp_display->event_mutex);  } -void dp_bridge_disable(struct drm_bridge *drm_bridge) +void dp_bridge_atomic_disable(struct drm_bridge *drm_bridge, +			      struct drm_bridge_state *old_bridge_state)  {  	struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge);  	struct msm_dp *dp = dp_bridge->dp_display; @@ -1718,7 +1690,8 @@ void dp_bridge_disable(struct drm_bridge *drm_bridge)  	dp_ctrl_push_idle(dp_display->ctrl);  } -void dp_bridge_post_disable(struct drm_bridge *drm_bridge) +void dp_bridge_atomic_post_disable(struct drm_bridge *drm_bridge, +				   struct drm_bridge_state *old_bridge_state)  {  	struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge);  	struct msm_dp *dp = dp_bridge->dp_display; @@ -1785,16 +1758,31 @@ void dp_bridge_hpd_enable(struct drm_bridge *bridge)  {  	struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);  	struct msm_dp *dp_display = dp_bridge->dp_display; +	struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display); + +	mutex_lock(&dp->event_mutex); +	dp_catalog_ctrl_hpd_enable(dp->catalog); + +	/* enable HDP interrupts */ +	dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, true);  	dp_display->internal_hpd = true; +	mutex_unlock(&dp->event_mutex);  }  void dp_bridge_hpd_disable(struct drm_bridge *bridge)  {  	struct msm_dp_bridge *dp_bridge = to_dp_bridge(bridge);  	struct msm_dp *dp_display = dp_bridge->dp_display; +	struct dp_display_private *dp = container_of(dp_display, struct dp_display_private, dp_display); + +	mutex_lock(&dp->event_mutex); +	/* disable HDP interrupts */ +	dp_catalog_hpd_config_intr(dp->catalog, DP_DP_HPD_INT_MASK, false); +	dp_catalog_ctrl_hpd_disable(dp->catalog);  	dp_display->internal_hpd = false; +	mutex_unlock(&dp->event_mutex);  }  void dp_bridge_hpd_notify(struct drm_bridge *bridge, diff --git a/drivers/gpu/drm/msm/dp/dp_display.h b/drivers/gpu/drm/msm/dp/dp_display.h index 371337d0fae2..1e9415ab15d8 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.h +++ b/drivers/gpu/drm/msm/dp/dp_display.h @@ -29,6 +29,7 @@ struct msm_dp {  	u32 max_dp_lanes;  	struct dp_audio *dp_audio; +	bool psr_supported;  };  int dp_display_set_plugged_cb(struct msm_dp *dp_display, @@ -39,5 +40,6 @@ bool dp_display_check_video_test(struct msm_dp *dp_display);  int dp_display_get_test_bpp(struct msm_dp *dp_display);  void dp_display_signal_audio_start(struct msm_dp *dp_display);  void dp_display_signal_audio_complete(struct msm_dp *dp_display); +void dp_display_set_psr(struct msm_dp *dp, bool enter);  #endif /* _DP_DISPLAY_H_ */ diff --git a/drivers/gpu/drm/msm/dp/dp_drm.c b/drivers/gpu/drm/msm/dp/dp_drm.c index 275370f21115..785d76639497 100644 --- a/drivers/gpu/drm/msm/dp/dp_drm.c +++ b/drivers/gpu/drm/msm/dp/dp_drm.c @@ -94,9 +94,9 @@ static const struct drm_bridge_funcs dp_bridge_ops = {  	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,  	.atomic_destroy_state   = drm_atomic_helper_bridge_destroy_state,  	.atomic_reset           = drm_atomic_helper_bridge_reset, -	.enable       = dp_bridge_enable, -	.disable      = dp_bridge_disable, -	.post_disable = dp_bridge_post_disable, +	.atomic_enable          = dp_bridge_atomic_enable, +	.atomic_disable         = dp_bridge_atomic_disable, +	.atomic_post_disable    = dp_bridge_atomic_post_disable,  	.mode_set     = dp_bridge_mode_set,  	.mode_valid   = dp_bridge_mode_valid,  	.get_modes    = dp_bridge_get_modes, @@ -107,6 +107,171 @@ static const struct drm_bridge_funcs dp_bridge_ops = {  	.hpd_notify   = dp_bridge_hpd_notify,  }; +static int edp_bridge_atomic_check(struct drm_bridge *drm_bridge, +				   struct drm_bridge_state *bridge_state, +				   struct drm_crtc_state *crtc_state, +				   struct drm_connector_state *conn_state) +{ +	struct msm_dp *dp = to_dp_bridge(drm_bridge)->dp_display; + +	if (WARN_ON(!conn_state)) +		return -ENODEV; + +	conn_state->self_refresh_aware = dp->psr_supported; + +	if (!conn_state->crtc || !crtc_state) +		return 0; + +	if (crtc_state->self_refresh_active && !dp->psr_supported) +		return -EINVAL; + +	return 0; +} + +static void edp_bridge_atomic_enable(struct drm_bridge *drm_bridge, +				     struct drm_bridge_state *old_bridge_state) +{ +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_crtc *crtc; +	struct drm_crtc_state *old_crtc_state; +	struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); +	struct msm_dp *dp = dp_bridge->dp_display; + +	/* +	 * Check the old state of the crtc to determine if the panel +	 * was put into psr state previously by the edp_bridge_atomic_disable. +	 * If the panel is in psr, just exit psr state and skip the full +	 * bridge enable sequence. +	 */ +	crtc = drm_atomic_get_new_crtc_for_encoder(atomic_state, +						   drm_bridge->encoder); +	if (!crtc) +		return; + +	old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); + +	if (old_crtc_state && old_crtc_state->self_refresh_active) { +		dp_display_set_psr(dp, false); +		return; +	} + +	dp_bridge_atomic_enable(drm_bridge, old_bridge_state); +} + +static void edp_bridge_atomic_disable(struct drm_bridge *drm_bridge, +				      struct drm_bridge_state *old_bridge_state) +{ +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_crtc *crtc; +	struct drm_crtc_state *new_crtc_state = NULL, *old_crtc_state = NULL; +	struct msm_dp_bridge *dp_bridge = to_dp_bridge(drm_bridge); +	struct msm_dp *dp = dp_bridge->dp_display; + +	crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, +						   drm_bridge->encoder); +	if (!crtc) +		goto out; + +	new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); +	if (!new_crtc_state) +		goto out; + +	old_crtc_state = drm_atomic_get_old_crtc_state(atomic_state, crtc); +	if (!old_crtc_state) +		goto out; + +	/* +	 * Set self refresh mode if current crtc state is active. +	 * +	 * If old crtc state is active, then this is a display disable +	 * call while the sink is in psr state. So, exit psr here. +	 * The eDP controller will be disabled in the +	 * edp_bridge_atomic_post_disable function. +	 * +	 * We observed sink is stuck in self refresh if psr exit is skipped +	 * when display disable occurs while the sink is in psr state. +	 */ +	if (new_crtc_state->self_refresh_active) { +		dp_display_set_psr(dp, true); +		return; +	} else if (old_crtc_state->self_refresh_active) { +		dp_display_set_psr(dp, false); +		return; +	} + +out: +	dp_bridge_atomic_disable(drm_bridge, old_bridge_state); +} + +static void edp_bridge_atomic_post_disable(struct drm_bridge *drm_bridge, +				struct drm_bridge_state *old_bridge_state) +{ +	struct drm_atomic_state *atomic_state = old_bridge_state->base.state; +	struct drm_crtc *crtc; +	struct drm_crtc_state *new_crtc_state = NULL; + +	crtc = drm_atomic_get_old_crtc_for_encoder(atomic_state, +						   drm_bridge->encoder); +	if (!crtc) +		return; + +	new_crtc_state = drm_atomic_get_new_crtc_state(atomic_state, crtc); +	if (!new_crtc_state) +		return; + +	/* +	 * Self refresh mode is already set in edp_bridge_atomic_disable. +	 */ +	if (new_crtc_state->self_refresh_active) +		return; + +	dp_bridge_atomic_post_disable(drm_bridge, old_bridge_state); +} + +/** + * edp_bridge_mode_valid - callback to determine if specified mode is valid + * @bridge: Pointer to drm bridge structure + * @info: display info + * @mode: Pointer to drm mode structure + * Returns: Validity status for specified mode + */ +static enum drm_mode_status edp_bridge_mode_valid(struct drm_bridge *bridge, +					  const struct drm_display_info *info, +					  const struct drm_display_mode *mode) +{ +	struct msm_dp *dp; +	int mode_pclk_khz = mode->clock; + +	dp = to_dp_bridge(bridge)->dp_display; + +	if (!dp || !mode_pclk_khz || !dp->connector) { +		DRM_ERROR("invalid params\n"); +		return -EINVAL; +	} + +	if (mode->clock > DP_MAX_PIXEL_CLK_KHZ) +		return MODE_CLOCK_HIGH; + +	/* +	 * The eDP controller currently does not have a reliable way of +	 * enabling panel power to read sink capabilities. So, we rely +	 * on the panel driver to populate only supported modes for now. +	 */ +	return MODE_OK; +} + +static const struct drm_bridge_funcs edp_bridge_ops = { +	.atomic_enable = edp_bridge_atomic_enable, +	.atomic_disable = edp_bridge_atomic_disable, +	.atomic_post_disable = edp_bridge_atomic_post_disable, +	.mode_set = dp_bridge_mode_set, +	.mode_valid = edp_bridge_mode_valid, +	.atomic_reset = drm_atomic_helper_bridge_reset, +	.atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, +	.atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, +	.atomic_check = edp_bridge_atomic_check, +}; +  struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,  			struct drm_encoder *encoder)  { @@ -121,7 +286,7 @@ struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *  	dp_bridge->dp_display = dp_display;  	bridge = &dp_bridge->bridge; -	bridge->funcs = &dp_bridge_ops; +	bridge->funcs = dp_display->is_edp ? &edp_bridge_ops : &dp_bridge_ops;  	bridge->type = dp_display->connector_type;  	/* diff --git a/drivers/gpu/drm/msm/dp/dp_drm.h b/drivers/gpu/drm/msm/dp/dp_drm.h index 250f7c66201f..afe79b85e183 100644 --- a/drivers/gpu/drm/msm/dp/dp_drm.h +++ b/drivers/gpu/drm/msm/dp/dp_drm.h @@ -23,9 +23,12 @@ struct drm_connector *dp_drm_connector_init(struct msm_dp *dp_display, struct dr  struct drm_bridge *dp_bridge_init(struct msm_dp *dp_display, struct drm_device *dev,  			struct drm_encoder *encoder); -void dp_bridge_enable(struct drm_bridge *drm_bridge); -void dp_bridge_disable(struct drm_bridge *drm_bridge); -void dp_bridge_post_disable(struct drm_bridge *drm_bridge); +void dp_bridge_atomic_enable(struct drm_bridge *drm_bridge, +			     struct drm_bridge_state *old_bridge_state); +void dp_bridge_atomic_disable(struct drm_bridge *drm_bridge, +			      struct drm_bridge_state *old_bridge_state); +void dp_bridge_atomic_post_disable(struct drm_bridge *drm_bridge, +				   struct drm_bridge_state *old_bridge_state);  enum drm_mode_status dp_bridge_mode_valid(struct drm_bridge *bridge,  					  const struct drm_display_info *info,  					  const struct drm_display_mode *mode); diff --git a/drivers/gpu/drm/msm/dp/dp_link.c b/drivers/gpu/drm/msm/dp/dp_link.c index f1f1d646539d..42427129acea 100644 --- a/drivers/gpu/drm/msm/dp/dp_link.c +++ b/drivers/gpu/drm/msm/dp/dp_link.c @@ -937,6 +937,38 @@ static int dp_link_process_phy_test_pattern_request(  	return 0;  } +static bool dp_link_read_psr_error_status(struct dp_link_private *link) +{ +	u8 status; + +	drm_dp_dpcd_read(link->aux, DP_PSR_ERROR_STATUS, &status, 1); + +	if (status & DP_PSR_LINK_CRC_ERROR) +		DRM_ERROR("PSR LINK CRC ERROR\n"); +	else if (status & DP_PSR_RFB_STORAGE_ERROR) +		DRM_ERROR("PSR RFB STORAGE ERROR\n"); +	else if (status & DP_PSR_VSC_SDP_UNCORRECTABLE_ERROR) +		DRM_ERROR("PSR VSC SDP UNCORRECTABLE ERROR\n"); +	else +		return false; + +	return true; +} + +static bool dp_link_psr_capability_changed(struct dp_link_private *link) +{ +	u8 status; + +	drm_dp_dpcd_read(link->aux, DP_PSR_ESI, &status, 1); + +	if (status & DP_PSR_CAPS_CHANGE) { +		drm_dbg_dp(link->drm_dev, "PSR Capability Change\n"); +		return true; +	} + +	return false; +} +  static u8 get_link_status(const u8 link_status[DP_LINK_STATUS_SIZE], int r)  {  	return link_status[r - DP_LANE0_1_STATUS]; @@ -1055,6 +1087,10 @@ int dp_link_process_request(struct dp_link *dp_link)  		dp_link->sink_request |= DP_TEST_LINK_TRAINING;  	} else if (!dp_link_process_phy_test_pattern_request(link)) {  		dp_link->sink_request |= DP_TEST_LINK_PHY_TEST_PATTERN; +	} else if (dp_link_read_psr_error_status(link)) { +		DRM_ERROR("PSR IRQ_HPD received\n"); +	} else if (dp_link_psr_capability_changed(link)) { +		drm_dbg_dp(link->drm_dev, "PSR Capability changed");  	} else {  		ret = dp_link_process_link_status_update(link);  		if (!ret) { diff --git a/drivers/gpu/drm/msm/dp/dp_panel.c b/drivers/gpu/drm/msm/dp/dp_panel.c index 1800d8963f8a..42d52510ffd4 100644 --- a/drivers/gpu/drm/msm/dp/dp_panel.c +++ b/drivers/gpu/drm/msm/dp/dp_panel.c @@ -20,6 +20,27 @@ struct dp_panel_private {  	bool aux_cfg_update_done;  }; +static void dp_panel_read_psr_cap(struct dp_panel_private *panel) +{ +	ssize_t rlen; +	struct dp_panel *dp_panel; + +	dp_panel = &panel->dp_panel; + +	/* edp sink */ +	if (dp_panel->dpcd[DP_EDP_CONFIGURATION_CAP]) { +		rlen = drm_dp_dpcd_read(panel->aux, DP_PSR_SUPPORT, +				&dp_panel->psr_cap, sizeof(dp_panel->psr_cap)); +		if (rlen == sizeof(dp_panel->psr_cap)) { +			drm_dbg_dp(panel->drm_dev, +				"psr version: 0x%x, psr_cap: 0x%x\n", +				dp_panel->psr_cap.version, +				dp_panel->psr_cap.capabilities); +		} else +			DRM_ERROR("failed to read psr info, rlen=%zd\n", rlen); +	} +} +  static int dp_panel_read_dpcd(struct dp_panel *dp_panel)  {  	int rc = 0; @@ -107,6 +128,7 @@ static int dp_panel_read_dpcd(struct dp_panel *dp_panel)  		}  	} +	dp_panel_read_psr_cap(panel);  end:  	return rc;  } diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h index f04d0210b5cd..45208b45eb53 100644 --- a/drivers/gpu/drm/msm/dp/dp_panel.h +++ b/drivers/gpu/drm/msm/dp/dp_panel.h @@ -34,6 +34,11 @@ struct dp_panel_in {  	struct dp_catalog *catalog;  }; +struct dp_panel_psr { +	u8 version; +	u8 capabilities; +}; +  struct dp_panel {  	/* dpcd raw data */  	u8 dpcd[DP_RECEIVER_CAP_SIZE + 1]; @@ -46,6 +51,7 @@ struct dp_panel {  	struct edid *edid;  	struct drm_connector *connector;  	struct dp_display_mode dp_mode; +	struct dp_panel_psr psr_cap;  	bool video_test;  	u32 vic; diff --git a/drivers/gpu/drm/msm/dp/dp_reg.h b/drivers/gpu/drm/msm/dp/dp_reg.h index 268602803d9a..ea85a691e72b 100644 --- a/drivers/gpu/drm/msm/dp/dp_reg.h +++ b/drivers/gpu/drm/msm/dp/dp_reg.h @@ -22,6 +22,20 @@  #define REG_DP_INTR_STATUS2			(0x00000024)  #define REG_DP_INTR_STATUS3			(0x00000028) +#define REG_DP_INTR_STATUS4			(0x0000002C) +#define PSR_UPDATE_INT				(0x00000001) +#define PSR_CAPTURE_INT				(0x00000004) +#define PSR_EXIT_INT				(0x00000010) +#define PSR_UPDATE_ERROR_INT			(0x00000040) +#define PSR_WAKE_ERROR_INT			(0x00000100) + +#define REG_DP_INTR_MASK4			(0x00000030) +#define PSR_UPDATE_MASK				(0x00000001) +#define PSR_CAPTURE_MASK			(0x00000002) +#define PSR_EXIT_MASK				(0x00000004) +#define PSR_UPDATE_ERROR_MASK			(0x00000008) +#define PSR_WAKE_ERROR_MASK			(0x00000010) +  #define REG_DP_DP_HPD_CTRL			(0x00000000)  #define DP_DP_HPD_CTRL_HPD_EN			(0x00000001) @@ -164,6 +178,16 @@  #define MMSS_DP_AUDIO_TIMING_RBR_48		(0x00000094)  #define MMSS_DP_AUDIO_TIMING_HBR_48		(0x00000098) +#define REG_PSR_CONFIG				(0x00000100) +#define DISABLE_PSR				(0x00000000) +#define PSR1_SUPPORTED				(0x00000001) +#define PSR2_WITHOUT_FRAMESYNC			(0x00000002) +#define PSR2_WITH_FRAMESYNC			(0x00000003) + +#define REG_PSR_CMD				(0x00000110) +#define PSR_ENTER				(0x00000001) +#define PSR_EXIT				(0x00000002) +  #define MMSS_DP_PSR_CRC_RG			(0x00000154)  #define MMSS_DP_PSR_CRC_B			(0x00000158) @@ -184,6 +208,9 @@  #define MMSS_DP_AUDIO_STREAM_0			(0x00000240)  #define MMSS_DP_AUDIO_STREAM_1			(0x00000244) +#define MMSS_DP_SDP_CFG3			(0x0000024c) +#define UPDATE_SDP				(0x00000001) +  #define MMSS_DP_EXTENSION_0			(0x00000250)  #define MMSS_DP_EXTENSION_1			(0x00000254)  #define MMSS_DP_EXTENSION_2			(0x00000258) diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c index 31fdee2052be..baab79ab6e74 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.c +++ b/drivers/gpu/drm/msm/dsi/dsi.c @@ -4,7 +4,6 @@   */  #include "dsi.h" -#include "dsi_cfg.h"  bool msm_dsi_is_cmd_mode(struct msm_dsi *msm_dsi)  { @@ -173,8 +172,10 @@ static int dsi_dev_remove(struct platform_device *pdev)  }  static const struct of_device_id dt_match[] = { -	{ .compatible = "qcom,mdss-dsi-ctrl", .data = NULL /* autodetect cfg */ }, -	{ .compatible = "qcom,dsi-ctrl-6g-qcm2290", .data = &qcm2290_dsi_cfg_handler }, +	{ .compatible = "qcom,mdss-dsi-ctrl" }, + +	/* Deprecated, don't use */ +	{ .compatible = "qcom,dsi-ctrl-6g-qcm2290" },  	{}  }; diff --git a/drivers/gpu/drm/msm/dsi/dsi.xml.h b/drivers/gpu/drm/msm/dsi/dsi.xml.h index d1b2a17b0a66..a4a154601114 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -785,4 +785,5 @@ static inline uint32_t DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH(ui  	return ((val) << DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH__SHIFT) & DSI_COMMAND_COMPRESSION_MODE_CTRL2_STREAM0_SLICE_WIDTH__MASK;  } +  #endif /* DSI_XML */ diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.c b/drivers/gpu/drm/msm/dsi/dsi_cfg.c index 6d21f0b33411..29ccd755cc2e 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_cfg.c +++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.c @@ -21,8 +21,9 @@ static const struct msm_dsi_config apq8064_dsi_cfg = {  	.num_regulators = ARRAY_SIZE(apq8064_dsi_regulators),  	.bus_clk_names = dsi_v2_bus_clk_names,  	.num_bus_clks = ARRAY_SIZE(dsi_v2_bus_clk_names), -	.io_start = { 0x4700000, 0x5800000 }, -	.num_dsi = 2, +	.io_start = { +		{ 0x4700000, 0x5800000 }, +	},  };  static const char * const dsi_6g_bus_clk_names[] = { @@ -41,46 +42,40 @@ static const struct msm_dsi_config msm8974_apq8084_dsi_cfg = {  	.num_regulators = ARRAY_SIZE(msm8974_apq8084_regulators),  	.bus_clk_names = dsi_6g_bus_clk_names,  	.num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names), -	.io_start = { 0xfd922800, 0xfd922b00 }, -	.num_dsi = 2, +	.io_start = { +		{ 0xfd922800, 0xfd922b00 }, +	},  }; -static const char * const dsi_8916_bus_clk_names[] = { +static const char * const dsi_v1_3_1_clk_names[] = {  	"mdp_core", "iface", "bus",  }; -static const struct regulator_bulk_data msm8916_dsi_regulators[] = { +static const struct regulator_bulk_data dsi_v1_3_1_regulators[] = {  	{ .supply = "vdda", .init_load_uA = 100000 },	/* 1.2 V */  	{ .supply = "vddio", .init_load_uA = 100000 },	/* 1.8 V */  };  static const struct msm_dsi_config msm8916_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT, -	.regulator_data = msm8916_dsi_regulators, -	.num_regulators = ARRAY_SIZE(msm8916_dsi_regulators), -	.bus_clk_names = dsi_8916_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_8916_bus_clk_names), -	.io_start = { 0x1a98000 }, -	.num_dsi = 1, -}; - -static const char * const dsi_8976_bus_clk_names[] = { -	"mdp_core", "iface", "bus", -}; - -static const struct regulator_bulk_data msm8976_dsi_regulators[] = { -	{ .supply = "vdda", .init_load_uA = 100000 },	/* 1.2 V */ -	{ .supply = "vddio", .init_load_uA = 100000 },	/* 1.8 V */ +	.regulator_data = dsi_v1_3_1_regulators, +	.num_regulators = ARRAY_SIZE(dsi_v1_3_1_regulators), +	.bus_clk_names = dsi_v1_3_1_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_v1_3_1_clk_names), +	.io_start = { +		{ 0x1a98000 }, +	},  };  static const struct msm_dsi_config msm8976_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT, -	.regulator_data = msm8976_dsi_regulators, -	.num_regulators = ARRAY_SIZE(msm8976_dsi_regulators), -	.bus_clk_names = dsi_8976_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_8976_bus_clk_names), -	.io_start = { 0x1a94000, 0x1a96000 }, -	.num_dsi = 2, +	.regulator_data = dsi_v1_3_1_regulators, +	.num_regulators = ARRAY_SIZE(dsi_v1_3_1_regulators), +	.bus_clk_names = dsi_v1_3_1_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_v1_3_1_clk_names), +	.io_start = { +		{ 0x1a94000, 0x1a96000 }, +	},  };  static const struct regulator_bulk_data msm8994_dsi_regulators[] = { @@ -98,12 +93,9 @@ static const struct msm_dsi_config msm8994_dsi_cfg = {  	.num_regulators = ARRAY_SIZE(msm8994_dsi_regulators),  	.bus_clk_names = dsi_6g_bus_clk_names,  	.num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names), -	.io_start = { 0xfd998000, 0xfd9a0000 }, -	.num_dsi = 2, -}; - -static const char * const dsi_8996_bus_clk_names[] = { -	"mdp_core", "iface", "bus", "core_mmss", +	.io_start = { +		{ 0xfd998000, 0xfd9a0000 }, +	},  };  static const struct regulator_bulk_data msm8996_dsi_regulators[] = { @@ -116,10 +108,11 @@ static const struct msm_dsi_config msm8996_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT,  	.regulator_data = msm8996_dsi_regulators,  	.num_regulators = ARRAY_SIZE(msm8996_dsi_regulators), -	.bus_clk_names = dsi_8996_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_8996_bus_clk_names), -	.io_start = { 0x994000, 0x996000 }, -	.num_dsi = 2, +	.bus_clk_names = dsi_6g_bus_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_6g_bus_clk_names), +	.io_start = { +		{ 0x994000, 0x996000 }, +	},  };  static const char * const dsi_msm8998_bus_clk_names[] = { @@ -137,8 +130,9 @@ static const struct msm_dsi_config msm8998_dsi_cfg = {  	.num_regulators = ARRAY_SIZE(msm8998_dsi_regulators),  	.bus_clk_names = dsi_msm8998_bus_clk_names,  	.num_bus_clks = ARRAY_SIZE(dsi_msm8998_bus_clk_names), -	.io_start = { 0xc994000, 0xc996000 }, -	.num_dsi = 2, +	.io_start = { +		{ 0xc994000, 0xc996000 }, +	},  };  static const char * const dsi_sdm660_bus_clk_names[] = { @@ -155,30 +149,29 @@ static const struct msm_dsi_config sdm660_dsi_cfg = {  	.num_regulators = ARRAY_SIZE(sdm660_dsi_regulators),  	.bus_clk_names = dsi_sdm660_bus_clk_names,  	.num_bus_clks = ARRAY_SIZE(dsi_sdm660_bus_clk_names), -	.io_start = { 0xc994000, 0xc996000 }, -	.num_dsi = 2, +	.io_start = { +		{ 0xc994000, 0xc996000 }, +	},  }; -static const char * const dsi_sdm845_bus_clk_names[] = { +static const char * const dsi_v2_4_clk_names[] = {  	"iface", "bus",  }; -static const char * const dsi_sc7180_bus_clk_names[] = { -	"iface", "bus", -}; - -static const struct regulator_bulk_data sdm845_dsi_regulators[] = { +static const struct regulator_bulk_data dsi_v2_4_regulators[] = {  	{ .supply = "vdda", .init_load_uA = 21800 },	/* 1.2 V */  };  static const struct msm_dsi_config sdm845_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT, -	.regulator_data = sdm845_dsi_regulators, -	.num_regulators = ARRAY_SIZE(sdm845_dsi_regulators), -	.bus_clk_names = dsi_sdm845_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_sdm845_bus_clk_names), -	.io_start = { 0xae94000, 0xae96000 }, -	.num_dsi = 2, +	.regulator_data = dsi_v2_4_regulators, +	.num_regulators = ARRAY_SIZE(dsi_v2_4_regulators), +	.bus_clk_names = dsi_v2_4_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_v2_4_clk_names), +	.io_start = { +		{ 0xae94000, 0xae96000 }, /* SDM845 / SDM670 */ +		{ 0x5e94000 }, /* QCM2290 / SM6115 / SM6125 / SM6375 */ +	},  };  static const struct regulator_bulk_data sm8550_dsi_regulators[] = { @@ -189,28 +182,11 @@ static const struct msm_dsi_config sm8550_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT,  	.regulator_data = sm8550_dsi_regulators,  	.num_regulators = ARRAY_SIZE(sm8550_dsi_regulators), -	.bus_clk_names = dsi_sdm845_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_sdm845_bus_clk_names), -	.io_start = { 0xae94000, 0xae96000 }, -	.num_dsi = 2, -}; - -static const struct regulator_bulk_data sc7180_dsi_regulators[] = { -	{ .supply = "vdda", .init_load_uA = 21800 },	/* 1.2 V */ -}; - -static const struct msm_dsi_config sc7180_dsi_cfg = { -	.io_offset = DSI_6G_REG_SHIFT, -	.regulator_data = sc7180_dsi_regulators, -	.num_regulators = ARRAY_SIZE(sc7180_dsi_regulators), -	.bus_clk_names = dsi_sc7180_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_sc7180_bus_clk_names), -	.io_start = { 0xae94000 }, -	.num_dsi = 1, -}; - -static const char * const dsi_sc7280_bus_clk_names[] = { -	"iface", "bus", +	.bus_clk_names = dsi_v2_4_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_v2_4_clk_names), +	.io_start = { +		{ 0xae94000, 0xae96000 }, +	},  };  static const struct regulator_bulk_data sc7280_dsi_regulators[] = { @@ -221,28 +197,11 @@ static const struct msm_dsi_config sc7280_dsi_cfg = {  	.io_offset = DSI_6G_REG_SHIFT,  	.regulator_data = sc7280_dsi_regulators,  	.num_regulators = ARRAY_SIZE(sc7280_dsi_regulators), -	.bus_clk_names = dsi_sc7280_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_sc7280_bus_clk_names), -	.io_start = { 0xae94000, 0xae96000 }, -	.num_dsi = 2, -}; - -static const char * const dsi_qcm2290_bus_clk_names[] = { -	"iface", "bus", -}; - -static const struct regulator_bulk_data qcm2290_dsi_cfg_regulators[] = { -	{ .supply = "vdda", .init_load_uA = 21800 },	/* 1.2 V */ -}; - -static const struct msm_dsi_config qcm2290_dsi_cfg = { -	.io_offset = DSI_6G_REG_SHIFT, -	.regulator_data = qcm2290_dsi_cfg_regulators, -	.num_regulators = ARRAY_SIZE(qcm2290_dsi_cfg_regulators), -	.bus_clk_names = dsi_qcm2290_bus_clk_names, -	.num_bus_clks = ARRAY_SIZE(dsi_qcm2290_bus_clk_names), -	.io_start = { 0x5e94000 }, -	.num_dsi = 1, +	.bus_clk_names = dsi_v2_4_clk_names, +	.num_bus_clks = ARRAY_SIZE(dsi_v2_4_clk_names), +	.io_start = { +		{ 0xae94000, 0xae96000 }, +	},  };  static const struct msm_dsi_host_cfg_ops msm_dsi_v2_host_ops = { @@ -311,7 +270,7 @@ static const struct msm_dsi_cfg_handler dsi_cfg_handlers[] = {  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_4_0,  		&sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_4_1, -		&sc7180_dsi_cfg, &msm_dsi_6g_v2_host_ops}, +		&sdm845_dsi_cfg, &msm_dsi_6g_v2_host_ops},  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_5_0,  		&sc7280_dsi_cfg, &msm_dsi_6g_v2_host_ops},  	{MSM_DSI_VER_MAJOR_6G, MSM_DSI_6G_VER_MINOR_V2_6_0, @@ -335,9 +294,3 @@ const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor)  	return cfg_hnd;  } - -/*  Non autodetect configs */ -const struct msm_dsi_cfg_handler qcm2290_dsi_cfg_handler = { -	.cfg = &qcm2290_dsi_cfg, -	.ops = &msm_dsi_6g_v2_host_ops, -}; diff --git a/drivers/gpu/drm/msm/dsi/dsi_cfg.h b/drivers/gpu/drm/msm/dsi/dsi_cfg.h index 44be4a88aa83..91bdaf50bb1a 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_cfg.h +++ b/drivers/gpu/drm/msm/dsi/dsi_cfg.h @@ -32,14 +32,16 @@  #define DSI_6G_REG_SHIFT	4 +/* Maximum number of configurations matched against the same hw revision */ +#define VARIANTS_MAX			2 +  struct msm_dsi_config {  	u32 io_offset;  	const struct regulator_bulk_data *regulator_data;  	int num_regulators;  	const char * const *bus_clk_names;  	const int num_bus_clks; -	const resource_size_t io_start[DSI_MAX]; -	const int num_dsi; +	const resource_size_t io_start[VARIANTS_MAX][DSI_MAX];  };  struct msm_dsi_host_cfg_ops { @@ -63,8 +65,5 @@ struct msm_dsi_cfg_handler {  const struct msm_dsi_cfg_handler *msm_dsi_cfg_get(u32 major, u32 minor); -/* Non autodetect configs */ -extern const struct msm_dsi_cfg_handler qcm2290_dsi_cfg_handler; -  #endif /* __MSM_DSI_CFG_H__ */ diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c index 18fa30e1e858..961689a255c4 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_host.c +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c @@ -214,10 +214,6 @@ static const struct msm_dsi_cfg_handler *dsi_get_config(  	int ret;  	u32 major = 0, minor = 0; -	cfg_hnd = device_get_match_data(dev); -	if (cfg_hnd) -		return cfg_hnd; -  	ahb_clk = msm_clk_get(msm_host->pdev, "iface");  	if (IS_ERR(ahb_clk)) {  		pr_err("%s: cannot get interface clock\n", __func__); @@ -1862,16 +1858,16 @@ static int dsi_host_get_id(struct msm_dsi_host *msm_host)  	struct platform_device *pdev = msm_host->pdev;  	const struct msm_dsi_config *cfg = msm_host->cfg_hnd->cfg;  	struct resource *res; -	int i; +	int i, j;  	res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dsi_ctrl");  	if (!res)  		return -EINVAL; -	for (i = 0; i < cfg->num_dsi; i++) { -		if (cfg->io_start[i] == res->start) -			return i; -	} +	for (i = 0; i < VARIANTS_MAX; i++) +		for (j = 0; j < DSI_MAX; j++) +			if (cfg->io_start[i][j] == res->start) +				return j;  	return -EINVAL;  } diff --git a/drivers/gpu/drm/msm/dsi/dsi_phy_10nm.xml.h b/drivers/gpu/drm/msm/dsi/dsi_phy_10nm.xml.h index 8b1be69ccf89..a2ae8777e59e 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_phy_10nm.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi_phy_10nm.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/dsi/dsi_phy_14nm.xml.h b/drivers/gpu/drm/msm/dsi/dsi_phy_14nm.xml.h index 515f1fa605bf..24e2fdc0cde1 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_phy_14nm.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi_phy_14nm.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/dsi/dsi_phy_20nm.xml.h b/drivers/gpu/drm/msm/dsi/dsi_phy_20nm.xml.h index 81e4622eb358..6352541f37e9 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_phy_20nm.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi_phy_20nm.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/dsi/dsi_phy_28nm.xml.h b/drivers/gpu/drm/msm/dsi/dsi_phy_28nm.xml.h index 8c7db35c12c8..178bd4fd7893 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_phy_28nm.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi_phy_28nm.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/dsi/dsi_phy_28nm_8960.xml.h b/drivers/gpu/drm/msm/dsi/dsi_phy_28nm_8960.xml.h index 44eeca31a811..5f900bb53519 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_phy_28nm_8960.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi_phy_28nm_8960.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/dsi/dsi_phy_7nm.xml.h b/drivers/gpu/drm/msm/dsi/dsi_phy_7nm.xml.h index 5bc061797003..584cbd0205ef 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_phy_7nm.xml.h +++ b/drivers/gpu/drm/msm/dsi/dsi_phy_7nm.xml.h @@ -8,24 +8,24 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42)  Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark) diff --git a/drivers/gpu/drm/msm/dsi/mmss_cc.xml.h b/drivers/gpu/drm/msm/dsi/mmss_cc.xml.h index 03bc322d0487..7062f7164216 100644 --- a/drivers/gpu/drm/msm/dsi/mmss_cc.xml.h +++ b/drivers/gpu/drm/msm/dsi/mmss_cc.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/dsi/sfpb.xml.h b/drivers/gpu/drm/msm/dsi/sfpb.xml.h index 2ae711cbec36..344a1a1620cd 100644 --- a/drivers/gpu/drm/msm/dsi/sfpb.xml.h +++ b/drivers/gpu/drm/msm/dsi/sfpb.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) -Copyright (C) 2013-2021 by the following authors: +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.xml.h b/drivers/gpu/drm/msm/hdmi/hdmi.xml.h index c9eb26df67c0..973b460486a5 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.xml.h +++ b/drivers/gpu/drm/msm/hdmi/hdmi.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) @@ -776,10 +776,28 @@ static inline uint32_t HDMI_8x60_PHY_REG1_OUTVOL_SWING_CTRL(uint32_t val)  #define REG_HDMI_8x74_ANA_CFG1					0x00000004 +#define REG_HDMI_8x74_ANA_CFG2					0x00000008 + +#define REG_HDMI_8x74_ANA_CFG3					0x0000000c +  #define REG_HDMI_8x74_PD_CTRL0					0x00000010  #define REG_HDMI_8x74_PD_CTRL1					0x00000014 +#define REG_HDMI_8x74_GLB_CFG					0x00000018 + +#define REG_HDMI_8x74_DCC_CFG0					0x0000001c + +#define REG_HDMI_8x74_DCC_CFG1					0x00000020 + +#define REG_HDMI_8x74_TXCAL_CFG0				0x00000024 + +#define REG_HDMI_8x74_TXCAL_CFG1				0x00000028 + +#define REG_HDMI_8x74_TXCAL_CFG2				0x0000002c + +#define REG_HDMI_8x74_TXCAL_CFG3				0x00000030 +  #define REG_HDMI_8x74_BIST_CFG0					0x00000034  #define REG_HDMI_8x74_BIST_PATN0				0x0000003c @@ -790,6 +808,8 @@ static inline uint32_t HDMI_8x60_PHY_REG1_OUTVOL_SWING_CTRL(uint32_t val)  #define REG_HDMI_8x74_BIST_PATN3				0x00000048 +#define REG_HDMI_8x74_STATUS					0x0000005c +  #define REG_HDMI_28nm_PHY_PLL_REFCLK_CFG			0x00000000  #define REG_HDMI_28nm_PHY_PLL_POSTDIV1_CFG			0x00000004 @@ -877,6 +897,8 @@ static inline uint32_t HDMI_8x60_PHY_REG1_OUTVOL_SWING_CTRL(uint32_t val)  #define REG_HDMI_28nm_PHY_PLL_DEBUG_BUS_SEL			0x000000a0 +#define REG_HDMI_28nm_PHY_PLL_STATUS				0x000000c0 +  #define REG_HDMI_8996_PHY_CFG					0x00000000  #define REG_HDMI_8996_PHY_PD_CTL				0x00000004 diff --git a/drivers/gpu/drm/msm/hdmi/qfprom.xml.h b/drivers/gpu/drm/msm/hdmi/qfprom.xml.h index 3edc698c4df5..498801526695 100644 --- a/drivers/gpu/drm/msm/hdmi/qfprom.xml.h +++ b/drivers/gpu/drm/msm/hdmi/qfprom.xml.h @@ -8,26 +8,26 @@ http://github.com/freedreno/envytools/  git clone https://github.com/freedreno/envytools.git  The rules-ng-ng source files this header was generated from are: -- /home/robclark/tmp/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2020-12-31 19:26:32) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi.xml               (  17560 bytes, from 2021-09-16 22:37:02) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2021-07-22 15:21:56) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-03 01:18:13) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  41874 bytes, from 2021-01-30 18:25:22) -- /home/robclark/tmp/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2021-01-30 18:25:22) - -Copyright (C) 2013-2021 by the following authors: +- /home/robclark/src/mesa/mesa/src/freedreno/registers/msm.xml                   (    944 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/freedreno_copyright.xml   (   1572 bytes, from 2022-07-23 20:21:46) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp4.xml              (  20912 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp_common.xml        (   2849 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/mdp/mdp5.xml              (  37461 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi.xml               (  18746 bytes, from 2022-04-28 17:29:36) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_v2.xml        (   3236 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm_8960.xml (   4935 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_28nm.xml      (   7004 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_20nm.xml      (   3712 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_14nm.xml      (   5381 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_10nm.xml      (   4499 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/dsi_phy_7nm.xml       (  11007 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/sfpb.xml              (    602 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/dsi/mmss_cc.xml           (   1686 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/qfprom.xml           (    600 bytes, from 2022-03-08 17:40:42) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/hdmi/hdmi.xml             (  42350 bytes, from 2022-09-20 17:45:56) +- /home/robclark/src/mesa/mesa/src/freedreno/registers/edp/edp.xml               (  10416 bytes, from 2022-03-08 17:40:42) + +Copyright (C) 2013-2022 by the following authors:  - Rob Clark <[email protected]> (robclark)  - Ilia Mirkin <[email protected]> (imirkin) diff --git a/drivers/gpu/drm/msm/msm_atomic.c b/drivers/gpu/drm/msm/msm_atomic.c index 1686fbb611fd..9c45d641b521 100644 --- a/drivers/gpu/drm/msm/msm_atomic.c +++ b/drivers/gpu/drm/msm/msm_atomic.c @@ -155,6 +155,8 @@ static bool can_do_async(struct drm_atomic_state *state,  	for_each_new_crtc_in_state(state, crtc, crtc_state, i) {  		if (drm_atomic_crtc_needs_modeset(crtc_state))  			return false; +		if (!crtc_state->active) +			return false;  		if (++num_crtcs > 1)  			return false;  		*async_crtc = crtc; @@ -179,6 +181,24 @@ static unsigned get_crtc_mask(struct drm_atomic_state *state)  	return mask;  } +int msm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state) +{ +	struct drm_crtc_state *old_crtc_state, *new_crtc_state; +	struct drm_crtc *crtc; +	int i; + +	for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, +				      new_crtc_state, i) { +		if ((old_crtc_state->ctm && !new_crtc_state->ctm) || +		    (!old_crtc_state->ctm && new_crtc_state->ctm)) { +			new_crtc_state->mode_changed = true; +			state->allow_modeset = true; +		} +	} + +	return drm_atomic_helper_check(dev, state); +} +  void msm_atomic_commit_tail(struct drm_atomic_state *state)  {  	struct drm_device *dev = state->dev; @@ -186,8 +206,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  	struct msm_kms *kms = priv->kms;  	struct drm_crtc *async_crtc = NULL;  	unsigned crtc_mask = get_crtc_mask(state); -	bool async = kms->funcs->vsync_time && -			can_do_async(state, &async_crtc); +	bool async = can_do_async(state, &async_crtc);  	trace_msm_atomic_commit_tail_start(async, crtc_mask); @@ -206,7 +225,8 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  	 * Now that there is no in-progress flush, prepare the  	 * current update:  	 */ -	kms->funcs->prepare_commit(kms, state); +	if (kms->funcs->prepare_commit) +		kms->funcs->prepare_commit(kms, state);  	/*  	 * Push atomic updates down to hardware: @@ -231,7 +251,9 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  			kms->pending_crtc_mask |= crtc_mask; -			vsync_time = kms->funcs->vsync_time(kms, async_crtc); +			if (drm_crtc_next_vblank_start(async_crtc, &vsync_time)) +				goto fallback; +  			wakeup_time = ktime_sub(vsync_time, ms_to_ktime(1));  			msm_hrtimer_queue_work(&timer->work, wakeup_time, @@ -253,6 +275,7 @@ void msm_atomic_commit_tail(struct drm_atomic_state *state)  		return;  	} +fallback:  	/*  	 * If there is any async flush pending on updated crtcs, fold  	 * them into the current flush. diff --git a/drivers/gpu/drm/msm/msm_debugfs.c b/drivers/gpu/drm/msm/msm_debugfs.c index d6ecff0ab618..9c0e633a3a61 100644 --- a/drivers/gpu/drm/msm/msm_debugfs.c +++ b/drivers/gpu/drm/msm/msm_debugfs.c @@ -10,6 +10,7 @@  #include <linux/fault-inject.h>  #include <drm/drm_debugfs.h> +#include <drm/drm_fb_helper.h>  #include <drm/drm_file.h>  #include <drm/drm_framebuffer.h> @@ -241,12 +242,11 @@ static int msm_fb_show(struct seq_file *m, void *arg)  {  	struct drm_info_node *node = (struct drm_info_node *) m->private;  	struct drm_device *dev = node->minor->dev; -	struct msm_drm_private *priv = dev->dev_private;  	struct drm_framebuffer *fb, *fbdev_fb = NULL; -	if (priv->fbdev) { +	if (dev->fb_helper && dev->fb_helper->fb) {  		seq_printf(m, "fbcon "); -		fbdev_fb = priv->fbdev->fb; +		fbdev_fb = dev->fb_helper->fb;  		msm_framebuffer_describe(fbdev_fb, m);  	} diff --git a/drivers/gpu/drm/msm/msm_drv.c b/drivers/gpu/drm/msm/msm_drv.c index aca48c868c14..463ca4164f5f 100644 --- a/drivers/gpu/drm/msm/msm_drv.c +++ b/drivers/gpu/drm/msm/msm_drv.c @@ -8,10 +8,12 @@  #include <linux/dma-mapping.h>  #include <linux/fault-inject.h>  #include <linux/kthread.h> +#include <linux/of_address.h>  #include <linux/sched/mm.h>  #include <linux/uaccess.h>  #include <uapi/linux/sched/types.h> +#include <drm/drm_aperture.h>  #include <drm/drm_bridge.h>  #include <drm/drm_drv.h>  #include <drm/drm_file.h> @@ -46,15 +48,17 @@   * - 1.8.0 - Add MSM_BO_CACHED_COHERENT for supported GPUs (a6xx)   * - 1.9.0 - Add MSM_SUBMIT_FENCE_SN_IN   * - 1.10.0 - Add MSM_SUBMIT_BO_NO_IMPLICIT + * - 1.11.0 - Add wait boost (MSM_WAIT_FENCE_BOOST, MSM_PREP_BOOST)   */  #define MSM_VERSION_MAJOR	1  #define MSM_VERSION_MINOR	10  #define MSM_VERSION_PATCHLEVEL	0 +static void msm_deinit_vram(struct drm_device *ddev); +  static const struct drm_mode_config_funcs mode_config_funcs = {  	.fb_create = msm_framebuffer_create, -	.output_poll_changed = drm_fb_helper_output_poll_changed, -	.atomic_check = drm_atomic_helper_check, +	.atomic_check = msm_atomic_check,  	.atomic_commit = drm_atomic_helper_commit,  }; @@ -62,12 +66,6 @@ static const struct drm_mode_config_helper_funcs mode_config_helper_funcs = {  	.atomic_commit_tail = msm_atomic_commit_tail,  }; -#ifdef CONFIG_DRM_FBDEV_EMULATION -static bool fbdev = true; -MODULE_PARM_DESC(fbdev, "Enable fbdev compat layer"); -module_param(fbdev, bool, 0600); -#endif -  static char *vram = "16m";  MODULE_PARM_DESC(vram, "Configure VRAM size (for devices without IOMMU/GPUMMU)");  module_param(vram, charp, 0); @@ -150,9 +148,6 @@ static void msm_irq_uninstall(struct drm_device *dev)  	struct msm_drm_private *priv = dev->dev_private;  	struct msm_kms *kms = priv->kms; -	if (!priv->kms) -		return; -  	kms->funcs->irq_uninstall(kms);  	if (kms->irq_requested)  		free_irq(kms->irq, dev); @@ -240,12 +235,8 @@ static int msm_drm_uninit(struct device *dev)  	msm_perf_debugfs_cleanup(priv);  	msm_rd_debugfs_cleanup(priv); -#ifdef CONFIG_DRM_FBDEV_EMULATION -	if (fbdev && priv->fbdev) -		msm_fbdev_free(ddev); -#endif - -	msm_disp_snapshot_destroy(ddev); +	if (kms) +		msm_disp_snapshot_destroy(ddev);  	drm_mode_config_cleanup(ddev); @@ -253,30 +244,27 @@ static int msm_drm_uninit(struct device *dev)  		drm_bridge_remove(priv->bridges[i]);  	priv->num_bridges = 0; -	pm_runtime_get_sync(dev); -	msm_irq_uninstall(ddev); -	pm_runtime_put_sync(dev); +	if (kms) { +		pm_runtime_get_sync(dev); +		msm_irq_uninstall(ddev); +		pm_runtime_put_sync(dev); +	}  	if (kms && kms->funcs)  		kms->funcs->destroy(kms); -	if (priv->vram.paddr) { -		unsigned long attrs = DMA_ATTR_NO_KERNEL_MAPPING; -		drm_mm_takedown(&priv->vram.mm); -		dma_free_attrs(dev, priv->vram.size, NULL, -			       priv->vram.paddr, attrs); -	} +	msm_deinit_vram(ddev);  	component_unbind_all(dev, ddev);  	ddev->dev_private = NULL; +	drm_dev_put(ddev); +  	destroy_workqueue(priv->wq);  	return 0;  } -#include <linux/of_address.h> -  struct msm_gem_address_space *msm_kms_init_aspace(struct drm_device *dev)  {  	struct msm_gem_address_space *aspace; @@ -401,6 +389,19 @@ static int msm_init_vram(struct drm_device *dev)  	return ret;  } +static void msm_deinit_vram(struct drm_device *ddev) +{ +	struct msm_drm_private *priv = ddev->dev_private; +	unsigned long attrs = DMA_ATTR_NO_KERNEL_MAPPING; + +	if (!priv->vram.paddr) +		return; + +	drm_mm_takedown(&priv->vram.mm); +	dma_free_attrs(ddev->dev, priv->vram.size, NULL, priv->vram.paddr, +			attrs); +} +  static int msm_drm_init(struct device *dev, const struct drm_driver *drv)  {  	struct msm_drm_private *priv = dev_get_drvdata(dev); @@ -420,8 +421,10 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)  	priv->dev = ddev;  	priv->wq = alloc_ordered_workqueue("msm", 0); -	if (!priv->wq) -		return -ENOMEM; +	if (!priv->wq) { +		ret = -ENOMEM; +		goto err_put_dev; +	}  	INIT_LIST_HEAD(&priv->objects);  	mutex_init(&priv->obj_lock); @@ -444,14 +447,19 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)  	ret = msm_init_vram(ddev);  	if (ret) -		goto err_drm_dev_put; +		goto err_cleanup_mode_config; + +	dma_set_max_seg_size(dev, UINT_MAX);  	/* Bind all our sub-components: */  	ret = component_bind_all(dev, ddev);  	if (ret) -		goto err_drm_dev_put; +		goto err_deinit_vram; -	dma_set_max_seg_size(dev, UINT_MAX); +	/* the fw fb could be anywhere in memory */ +	ret = drm_aperture_remove_framebuffers(false, drv); +	if (ret) +		goto err_msm_uninit;  	msm_gem_shrinker_init(ddev); @@ -529,23 +537,30 @@ static int msm_drm_init(struct device *dev, const struct drm_driver *drv)  	}  	drm_mode_config_reset(ddev); -#ifdef CONFIG_DRM_FBDEV_EMULATION -	if (kms && fbdev) -		priv->fbdev = msm_fbdev_init(ddev); -#endif -  	ret = msm_debugfs_late_init(ddev);  	if (ret)  		goto err_msm_uninit;  	drm_kms_helper_poll_init(ddev); +	if (kms) +		msm_fbdev_setup(ddev); +  	return 0;  err_msm_uninit:  	msm_drm_uninit(dev); -err_drm_dev_put: + +	return ret; + +err_deinit_vram: +	msm_deinit_vram(ddev); +err_cleanup_mode_config: +	drm_mode_config_cleanup(ddev); +	destroy_workqueue(priv->wq); +err_put_dev:  	drm_dev_put(ddev); +  	return ret;  } @@ -899,7 +914,7 @@ static int msm_ioctl_gem_info(struct drm_device *dev, void *data,  }  static int wait_fence(struct msm_gpu_submitqueue *queue, uint32_t fence_id, -		      ktime_t timeout) +		      ktime_t timeout, uint32_t flags)  {  	struct dma_fence *fence;  	int ret; @@ -918,17 +933,18 @@ static int wait_fence(struct msm_gpu_submitqueue *queue, uint32_t fence_id,  	 * retired, so if the fence is not found it means there is nothing  	 * to wait for  	 */ -	ret = mutex_lock_interruptible(&queue->idr_lock); -	if (ret) -		return ret; +	spin_lock(&queue->idr_lock);  	fence = idr_find(&queue->fence_idr, fence_id);  	if (fence)  		fence = dma_fence_get_rcu(fence); -	mutex_unlock(&queue->idr_lock); +	spin_unlock(&queue->idr_lock);  	if (!fence)  		return 0; +	if (flags & MSM_WAIT_FENCE_BOOST) +		dma_fence_set_deadline(fence, ktime_get()); +  	ret = dma_fence_wait_timeout(fence, true, timeout_to_jiffies(&timeout));  	if (ret == 0) {  		ret = -ETIMEDOUT; @@ -949,8 +965,8 @@ static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,  	struct msm_gpu_submitqueue *queue;  	int ret; -	if (args->pad) { -		DRM_ERROR("invalid pad: %08x\n", args->pad); +	if (args->flags & ~MSM_WAIT_FENCE_FLAGS) { +		DRM_ERROR("invalid flags: %08x\n", args->flags);  		return -EINVAL;  	} @@ -961,7 +977,7 @@ static int msm_ioctl_wait_fence(struct drm_device *dev, void *data,  	if (!queue)  		return -ENOENT; -	ret = wait_fence(queue, args->fence, to_ktime(args->timeout)); +	ret = wait_fence(queue, args->fence, to_ktime(args->timeout), args->flags);  	msm_submitqueue_put(queue); @@ -1068,7 +1084,6 @@ static const struct drm_driver msm_driver = {  				DRIVER_SYNCOBJ,  	.open               = msm_open,  	.postclose           = msm_postclose, -	.lastclose          = drm_fb_helper_lastclose,  	.dumb_create        = msm_gem_dumb_create,  	.dumb_map_offset    = msm_gem_dumb_map_offset,  	.prime_handle_to_fd = drm_gem_prime_handle_to_fd, diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index 9f0c184b02a0..e13a8cbd61c9 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h @@ -29,7 +29,6 @@  #include <drm/drm_atomic.h>  #include <drm/drm_atomic_helper.h>  #include <drm/drm_probe_helper.h> -#include <drm/drm_fb_helper.h>  #include <drm/display/drm_dsc.h>  #include <drm/msm_drm.h>  #include <drm/drm_gem.h> @@ -129,8 +128,6 @@ struct msm_drm_private {  	bool is_a2xx;  	bool has_cached_coherent; -	struct drm_fb_helper *fbdev; -  	struct msm_rd_state *rd;       /* debugfs to dump all submits */  	struct msm_rd_state *hangrd;   /* debugfs to dump hanging submits */  	struct msm_perf_state *perf; @@ -261,6 +258,7 @@ int msm_atomic_init_pending_timer(struct msm_pending_timer *timer,  		struct msm_kms *kms, int crtc_idx);  void msm_atomic_destroy_pending_timer(struct msm_pending_timer *timer);  void msm_atomic_commit_tail(struct drm_atomic_state *state); +int msm_atomic_check(struct drm_device *dev, struct drm_atomic_state *state);  struct drm_atomic_state *msm_atomic_state_alloc(struct drm_device *dev);  void msm_atomic_state_clear(struct drm_atomic_state *state);  void msm_atomic_state_free(struct drm_atomic_state *state); @@ -306,8 +304,13 @@ struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,  struct drm_framebuffer * msm_alloc_stolen_fb(struct drm_device *dev,  		int w, int h, int p, uint32_t format); -struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev); -void msm_fbdev_free(struct drm_device *dev); +#ifdef CONFIG_DRM_FBDEV_EMULATION +void msm_fbdev_setup(struct drm_device *dev); +#else +static inline void msm_fbdev_setup(struct drm_device *dev) +{ +} +#endif  struct hdmi;  #ifdef CONFIG_DRM_MSM_HDMI @@ -548,7 +551,7 @@ static inline unsigned long timeout_to_jiffies(const ktime_t *timeout)  		remaining_jiffies = ktime_divns(rem, NSEC_PER_SEC / HZ);  	} -	return clamp(remaining_jiffies, 0LL, (s64)INT_MAX); +	return clamp(remaining_jiffies, 1LL, (s64)INT_MAX);  }  /* Driver helpers */ diff --git a/drivers/gpu/drm/msm/msm_fbdev.c b/drivers/gpu/drm/msm/msm_fbdev.c index d26aa52217ce..2ebc86381e1c 100644 --- a/drivers/gpu/drm/msm/msm_fbdev.c +++ b/drivers/gpu/drm/msm/msm_fbdev.c @@ -4,8 +4,8 @@   * Author: Rob Clark <[email protected]>   */ -#include <drm/drm_aperture.h> -#include <drm/drm_crtc.h> +#include <drm/drm_drv.h> +#include <drm/drm_crtc_helper.h>  #include <drm/drm_fb_helper.h>  #include <drm/drm_fourcc.h>  #include <drm/drm_framebuffer.h> @@ -15,18 +15,40 @@  #include "msm_gem.h"  #include "msm_kms.h" -static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma); +static bool fbdev = true; +MODULE_PARM_DESC(fbdev, "Enable fbdev compat layer"); +module_param(fbdev, bool, 0600);  /*   * fbdev funcs, to implement legacy fbdev interface on top of drm driver   */ -#define to_msm_fbdev(x) container_of(x, struct msm_fbdev, base) +static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma) +{ +	struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; +	struct drm_gem_object *bo = msm_framebuffer_bo(helper->fb, 0); -struct msm_fbdev { -	struct drm_fb_helper base; -	struct drm_framebuffer *fb; -}; +	return drm_gem_prime_mmap(bo, vma); +} + +static void msm_fbdev_fb_destroy(struct fb_info *info) +{ +	struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; +	struct drm_framebuffer *fb = helper->fb; +	struct drm_gem_object *bo = msm_framebuffer_bo(fb, 0); + +	DBG(); + +	drm_fb_helper_fini(helper); + +	/* this will free the backing object */ +	msm_gem_put_vaddr(bo); +	drm_framebuffer_remove(fb); + +	drm_client_release(&helper->client); +	drm_fb_helper_unprepare(helper); +	kfree(helper); +}  static const struct fb_ops msm_fb_ops = {  	.owner = THIS_MODULE, @@ -41,21 +63,12 @@ static const struct fb_ops msm_fb_ops = {  	.fb_copyarea = drm_fb_helper_sys_copyarea,  	.fb_imageblit = drm_fb_helper_sys_imageblit,  	.fb_mmap = msm_fbdev_mmap, +	.fb_destroy = msm_fbdev_fb_destroy,  }; -static int msm_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma) -{ -	struct drm_fb_helper *helper = (struct drm_fb_helper *)info->par; -	struct msm_fbdev *fbdev = to_msm_fbdev(helper); -	struct drm_gem_object *bo = msm_framebuffer_bo(fbdev->fb, 0); - -	return drm_gem_prime_mmap(bo, vma); -} -  static int msm_fbdev_create(struct drm_fb_helper *helper,  		struct drm_fb_helper_surface_size *sizes)  { -	struct msm_fbdev *fbdev = to_msm_fbdev(helper);  	struct drm_device *dev = helper->dev;  	struct msm_drm_private *priv = dev->dev_private;  	struct drm_framebuffer *fb = NULL; @@ -102,7 +115,6 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,  	DBG("fbi=%p, dev=%p", fbi, dev); -	fbdev->fb = fb;  	helper->fb = fb;  	fbi->fbops = &msm_fb_ops; @@ -119,7 +131,7 @@ static int msm_fbdev_create(struct drm_fb_helper *helper,  	fbi->fix.smem_len = bo->size;  	DBG("par=%p, %dx%d", fbi->par, fbi->var.xres, fbi->var.yres); -	DBG("allocated %dx%d fb", fbdev->fb->width, fbdev->fb->height); +	DBG("allocated %dx%d fb", fb->width, fb->height);  	return 0; @@ -132,73 +144,98 @@ static const struct drm_fb_helper_funcs msm_fb_helper_funcs = {  	.fb_probe = msm_fbdev_create,  }; -/* initialize fbdev helper */ -struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev) +/* + * struct drm_client + */ + +static void msm_fbdev_client_unregister(struct drm_client_dev *client)  { -	struct msm_drm_private *priv = dev->dev_private; -	struct msm_fbdev *fbdev; -	struct drm_fb_helper *helper; -	int ret; +	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); + +	if (fb_helper->info) { +		drm_fb_helper_unregister_info(fb_helper); +	} else { +		drm_client_release(&fb_helper->client); +		drm_fb_helper_unprepare(fb_helper); +		kfree(fb_helper); +	} +} -	fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL); -	if (!fbdev) -		return NULL; +static int msm_fbdev_client_restore(struct drm_client_dev *client) +{ +	drm_fb_helper_lastclose(client->dev); -	helper = &fbdev->base; +	return 0; +} -	drm_fb_helper_prepare(dev, helper, 32, &msm_fb_helper_funcs); +static int msm_fbdev_client_hotplug(struct drm_client_dev *client) +{ +	struct drm_fb_helper *fb_helper = drm_fb_helper_from_client(client); +	struct drm_device *dev = client->dev; +	int ret; -	ret = drm_fb_helper_init(dev, helper); -	if (ret) { -		DRM_DEV_ERROR(dev->dev, "could not init fbdev: ret=%d\n", ret); -		goto fail; -	} +	if (dev->fb_helper) +		return drm_fb_helper_hotplug_event(dev->fb_helper); -	/* the fw fb could be anywhere in memory */ -	ret = drm_aperture_remove_framebuffers(false, dev->driver); +	ret = drm_fb_helper_init(dev, fb_helper);  	if (ret) -		goto fini; +		goto err_drm_err; -	ret = drm_fb_helper_initial_config(helper); -	if (ret) -		goto fini; +	if (!drm_drv_uses_atomic_modeset(dev)) +		drm_helper_disable_unused_functions(dev); -	priv->fbdev = helper; +	ret = drm_fb_helper_initial_config(fb_helper); +	if (ret) +		goto err_drm_fb_helper_fini; -	return helper; +	return 0; -fini: -	drm_fb_helper_fini(helper); -fail: -	drm_fb_helper_unprepare(helper); -	kfree(fbdev); -	return NULL; +err_drm_fb_helper_fini: +	drm_fb_helper_fini(fb_helper); +err_drm_err: +	drm_err(dev, "Failed to setup fbdev emulation (ret=%d)\n", ret); +	return ret;  } -void msm_fbdev_free(struct drm_device *dev) -{ -	struct msm_drm_private *priv = dev->dev_private; -	struct drm_fb_helper *helper = priv->fbdev; -	struct msm_fbdev *fbdev; +static const struct drm_client_funcs msm_fbdev_client_funcs = { +	.owner		= THIS_MODULE, +	.unregister	= msm_fbdev_client_unregister, +	.restore	= msm_fbdev_client_restore, +	.hotplug	= msm_fbdev_client_hotplug, +}; -	DBG(); +/* initialize fbdev helper */ +void msm_fbdev_setup(struct drm_device *dev) +{ +	struct drm_fb_helper *helper; +	int ret; -	drm_fb_helper_unregister_info(helper); +	if (!fbdev) +		return; -	drm_fb_helper_fini(helper); +	drm_WARN(dev, !dev->registered, "Device has not been registered.\n"); +	drm_WARN(dev, dev->fb_helper, "fb_helper is already set!\n"); -	fbdev = to_msm_fbdev(priv->fbdev); +	helper = kzalloc(sizeof(*helper), GFP_KERNEL); +	if (!helper) +		return; +	drm_fb_helper_prepare(dev, helper, 32, &msm_fb_helper_funcs); -	/* this will free the backing object */ -	if (fbdev->fb) { -		struct drm_gem_object *bo = -			msm_framebuffer_bo(fbdev->fb, 0); -		msm_gem_put_vaddr(bo); -		drm_framebuffer_remove(fbdev->fb); +	ret = drm_client_init(dev, &helper->client, "fbdev", &msm_fbdev_client_funcs); +	if (ret) { +		drm_err(dev, "Failed to register client: %d\n", ret); +		goto err_drm_fb_helper_unprepare;  	} -	drm_fb_helper_unprepare(helper); -	kfree(fbdev); +	ret = msm_fbdev_client_hotplug(&helper->client); +	if (ret) +		drm_dbg_kms(dev, "client hotplug ret=%d\n", ret); + +	drm_client_register(&helper->client); -	priv->fbdev = NULL; +	return; + +err_drm_fb_helper_unprepare: +	drm_fb_helper_unprepare(helper); +	kfree(helper);  } diff --git a/drivers/gpu/drm/msm/msm_fence.c b/drivers/gpu/drm/msm/msm_fence.c index 56641408ea74..96599ec3eb78 100644 --- a/drivers/gpu/drm/msm/msm_fence.c +++ b/drivers/gpu/drm/msm/msm_fence.c @@ -8,6 +8,35 @@  #include "msm_drv.h"  #include "msm_fence.h" +#include "msm_gpu.h" + +static struct msm_gpu *fctx2gpu(struct msm_fence_context *fctx) +{ +	struct msm_drm_private *priv = fctx->dev->dev_private; +	return priv->gpu; +} + +static enum hrtimer_restart deadline_timer(struct hrtimer *t) +{ +	struct msm_fence_context *fctx = container_of(t, +			struct msm_fence_context, deadline_timer); + +	kthread_queue_work(fctx2gpu(fctx)->worker, &fctx->deadline_work); + +	return HRTIMER_NORESTART; +} + +static void deadline_work(struct kthread_work *work) +{ +	struct msm_fence_context *fctx = container_of(work, +			struct msm_fence_context, deadline_work); + +	/* If deadline fence has already passed, nothing to do: */ +	if (msm_fence_completed(fctx, fctx->next_deadline_fence)) +		return; + +	msm_devfreq_boost(fctx2gpu(fctx), 2); +}  struct msm_fence_context * @@ -36,6 +65,13 @@ msm_fence_context_alloc(struct drm_device *dev, volatile uint32_t *fenceptr,  	fctx->completed_fence = fctx->last_fence;  	*fctx->fenceptr = fctx->last_fence; +	hrtimer_init(&fctx->deadline_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS); +	fctx->deadline_timer.function = deadline_timer; + +	kthread_init_work(&fctx->deadline_work, deadline_work); + +	fctx->next_deadline = ktime_get(); +  	return fctx;  } @@ -62,6 +98,8 @@ void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence)  	spin_lock_irqsave(&fctx->spinlock, flags);  	if (fence_after(fence, fctx->completed_fence))  		fctx->completed_fence = fence; +	if (msm_fence_completed(fctx, fctx->next_deadline_fence)) +		hrtimer_cancel(&fctx->deadline_timer);  	spin_unlock_irqrestore(&fctx->spinlock, flags);  } @@ -92,14 +130,50 @@ static bool msm_fence_signaled(struct dma_fence *fence)  	return msm_fence_completed(f->fctx, f->base.seqno);  } +static void msm_fence_set_deadline(struct dma_fence *fence, ktime_t deadline) +{ +	struct msm_fence *f = to_msm_fence(fence); +	struct msm_fence_context *fctx = f->fctx; +	unsigned long flags; +	ktime_t now; + +	spin_lock_irqsave(&fctx->spinlock, flags); +	now = ktime_get(); + +	if (ktime_after(now, fctx->next_deadline) || +			ktime_before(deadline, fctx->next_deadline)) { +		fctx->next_deadline = deadline; +		fctx->next_deadline_fence = +			max(fctx->next_deadline_fence, (uint32_t)fence->seqno); + +		/* +		 * Set timer to trigger boost 3ms before deadline, or +		 * if we are already less than 3ms before the deadline +		 * schedule boost work immediately. +		 */ +		deadline = ktime_sub(deadline, ms_to_ktime(3)); + +		if (ktime_after(now, deadline)) { +			kthread_queue_work(fctx2gpu(fctx)->worker, +					&fctx->deadline_work); +		} else { +			hrtimer_start(&fctx->deadline_timer, deadline, +					HRTIMER_MODE_ABS); +		} +	} + +	spin_unlock_irqrestore(&fctx->spinlock, flags); +} +  static const struct dma_fence_ops msm_fence_ops = {  	.get_driver_name = msm_fence_get_driver_name,  	.get_timeline_name = msm_fence_get_timeline_name,  	.signaled = msm_fence_signaled, +	.set_deadline = msm_fence_set_deadline,  };  struct dma_fence * -msm_fence_alloc(struct msm_fence_context *fctx) +msm_fence_alloc(void)  {  	struct msm_fence *f; @@ -107,10 +181,16 @@ msm_fence_alloc(struct msm_fence_context *fctx)  	if (!f)  		return ERR_PTR(-ENOMEM); +	return &f->base; +} + +void +msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx) +{ +	struct msm_fence *f = to_msm_fence(fence); +  	f->fctx = fctx;  	dma_fence_init(&f->base, &msm_fence_ops, &fctx->spinlock,  		       fctx->context, ++fctx->last_fence); - -	return &f->base;  } diff --git a/drivers/gpu/drm/msm/msm_fence.h b/drivers/gpu/drm/msm/msm_fence.h index 7f1798c54cd1..148196375a0b 100644 --- a/drivers/gpu/drm/msm/msm_fence.h +++ b/drivers/gpu/drm/msm/msm_fence.h @@ -52,6 +52,26 @@ struct msm_fence_context {  	volatile uint32_t *fenceptr;  	spinlock_t spinlock; + +	/* +	 * TODO this doesn't really deal with multiple deadlines, like +	 * if userspace got multiple frames ahead.. OTOH atomic updates +	 * don't queue, so maybe that is ok +	 */ + +	/** next_deadline: Time of next deadline */ +	ktime_t next_deadline; + +	/** +	 * next_deadline_fence: +	 * +	 * Fence value for next pending deadline.  The deadline timer is +	 * canceled when this fence is signaled. +	 */ +	uint32_t next_deadline_fence; + +	struct hrtimer deadline_timer; +	struct kthread_work deadline_work;  };  struct msm_fence_context * msm_fence_context_alloc(struct drm_device *dev, @@ -61,7 +81,8 @@ void msm_fence_context_free(struct msm_fence_context *fctx);  bool msm_fence_completed(struct msm_fence_context *fctx, uint32_t fence);  void msm_update_fence(struct msm_fence_context *fctx, uint32_t fence); -struct dma_fence * msm_fence_alloc(struct msm_fence_context *fctx); +struct dma_fence * msm_fence_alloc(void); +void msm_fence_init(struct dma_fence *fence, struct msm_fence_context *fctx);  static inline bool  fence_before(uint32_t a, uint32_t b) diff --git a/drivers/gpu/drm/msm/msm_gem.c b/drivers/gpu/drm/msm/msm_gem.c index c2fb98a94bc3..cd39b9d8abdb 100644 --- a/drivers/gpu/drm/msm/msm_gem.c +++ b/drivers/gpu/drm/msm/msm_gem.c @@ -19,8 +19,6 @@  #include "msm_gpu.h"  #include "msm_mmu.h" -static void update_lru(struct drm_gem_object *obj); -  static dma_addr_t physaddr(struct drm_gem_object *obj)  {  	struct msm_gem_object *msm_obj = to_msm_bo(obj); @@ -63,6 +61,49 @@ static void sync_for_cpu(struct msm_gem_object *msm_obj)  	dma_unmap_sgtable(dev, msm_obj->sgt, DMA_BIDIRECTIONAL, 0);  } +static void update_lru_active(struct drm_gem_object *obj) +{ +	struct msm_drm_private *priv = obj->dev->dev_private; +	struct msm_gem_object *msm_obj = to_msm_bo(obj); + +	GEM_WARN_ON(!msm_obj->pages); + +	if (msm_obj->pin_count) { +		drm_gem_lru_move_tail_locked(&priv->lru.pinned, obj); +	} else if (msm_obj->madv == MSM_MADV_WILLNEED) { +		drm_gem_lru_move_tail_locked(&priv->lru.willneed, obj); +	} else { +		GEM_WARN_ON(msm_obj->madv != MSM_MADV_DONTNEED); + +		drm_gem_lru_move_tail_locked(&priv->lru.dontneed, obj); +	} +} + +static void update_lru_locked(struct drm_gem_object *obj) +{ +	struct msm_drm_private *priv = obj->dev->dev_private; +	struct msm_gem_object *msm_obj = to_msm_bo(obj); + +	msm_gem_assert_locked(&msm_obj->base); + +	if (!msm_obj->pages) { +		GEM_WARN_ON(msm_obj->pin_count); + +		drm_gem_lru_move_tail_locked(&priv->lru.unbacked, obj); +	} else { +		update_lru_active(obj); +	} +} + +static void update_lru(struct drm_gem_object *obj) +{ +	struct msm_drm_private *priv = obj->dev->dev_private; + +	mutex_lock(&priv->lru.lock); +	update_lru_locked(obj); +	mutex_unlock(&priv->lru.lock); +} +  /* allocate pages from VRAM carveout, used when no IOMMU: */  static struct page **get_pages_vram(struct drm_gem_object *obj, int npages)  { @@ -178,22 +219,29 @@ static void put_pages(struct drm_gem_object *obj)  	}  } -static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj) +static struct page **msm_gem_pin_pages_locked(struct drm_gem_object *obj, +					      unsigned madv)  { +	struct msm_drm_private *priv = obj->dev->dev_private;  	struct msm_gem_object *msm_obj = to_msm_bo(obj);  	struct page **p;  	msm_gem_assert_locked(obj); -	if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) { +	if (GEM_WARN_ON(msm_obj->madv > madv)) { +		DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n", +			msm_obj->madv, madv);  		return ERR_PTR(-EBUSY);  	}  	p = get_pages(obj); -	if (!IS_ERR(p)) { -		to_msm_bo(obj)->pin_count++; -		update_lru(obj); -	} +	if (IS_ERR(p)) +		return p; + +	mutex_lock(&priv->lru.lock); +	msm_obj->pin_count++; +	update_lru_locked(obj); +	mutex_unlock(&priv->lru.lock);  	return p;  } @@ -203,7 +251,7 @@ struct page **msm_gem_pin_pages(struct drm_gem_object *obj)  	struct page **p;  	msm_gem_lock(obj); -	p = msm_gem_pin_pages_locked(obj); +	p = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);  	msm_gem_unlock(obj);  	return p; @@ -309,12 +357,10 @@ static struct msm_gem_vma *add_vma(struct drm_gem_object *obj,  	msm_gem_assert_locked(obj); -	vma = kzalloc(sizeof(*vma), GFP_KERNEL); +	vma = msm_gem_vma_new(aspace);  	if (!vma)  		return ERR_PTR(-ENOMEM); -	vma->aspace = aspace; -  	list_add_tail(&vma->list, &msm_obj->vmas);  	return vma; @@ -361,9 +407,9 @@ put_iova_spaces(struct drm_gem_object *obj, bool close)  	list_for_each_entry(vma, &msm_obj->vmas, list) {  		if (vma->aspace) { -			msm_gem_purge_vma(vma->aspace, vma); +			msm_gem_vma_purge(vma);  			if (close) -				msm_gem_close_vma(vma->aspace, vma); +				msm_gem_vma_close(vma);  		}  	}  } @@ -399,7 +445,7 @@ static struct msm_gem_vma *get_vma_locked(struct drm_gem_object *obj,  		if (IS_ERR(vma))  			return vma; -		ret = msm_gem_init_vma(aspace, vma, obj->size, +		ret = msm_gem_vma_init(vma, obj->size,  			range_start, range_end);  		if (ret) {  			del_vma(vma); @@ -430,14 +476,11 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)  	msm_gem_assert_locked(obj); -	if (GEM_WARN_ON(msm_obj->madv != MSM_MADV_WILLNEED)) -		return -EBUSY; - -	pages = msm_gem_pin_pages_locked(obj); +	pages = msm_gem_pin_pages_locked(obj, MSM_MADV_WILLNEED);  	if (IS_ERR(pages))  		return PTR_ERR(pages); -	ret = msm_gem_map_vma(vma->aspace, vma, prot, msm_obj->sgt, obj->size); +	ret = msm_gem_vma_map(vma, prot, msm_obj->sgt, obj->size);  	if (ret)  		msm_gem_unpin_locked(obj); @@ -446,14 +489,34 @@ int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma)  void msm_gem_unpin_locked(struct drm_gem_object *obj)  { +	struct msm_drm_private *priv = obj->dev->dev_private;  	struct msm_gem_object *msm_obj = to_msm_bo(obj);  	msm_gem_assert_locked(obj); +	mutex_lock(&priv->lru.lock);  	msm_obj->pin_count--;  	GEM_WARN_ON(msm_obj->pin_count < 0); +	update_lru_locked(obj); +	mutex_unlock(&priv->lru.lock); +} -	update_lru(obj); +/* Special unpin path for use in fence-signaling path, avoiding the need + * to hold the obj lock by only depending on things that a protected by + * the LRU lock.  In particular we know that that we already have backing + * and and that the object's dma_resv has the fence for the current + * submit/job which will prevent us racing against page eviction. + */ +void msm_gem_unpin_active(struct drm_gem_object *obj) +{ +	struct msm_drm_private *priv = obj->dev->dev_private; +	struct msm_gem_object *msm_obj = to_msm_bo(obj); + +	mutex_lock(&priv->lru.lock); +	msm_obj->pin_count--; +	GEM_WARN_ON(msm_obj->pin_count < 0); +	update_lru_active(obj); +	mutex_unlock(&priv->lru.lock);  }  struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj, @@ -539,8 +602,8 @@ static int clear_iova(struct drm_gem_object *obj,  	if (msm_gem_vma_inuse(vma))  		return -EBUSY; -	msm_gem_purge_vma(vma->aspace, vma); -	msm_gem_close_vma(vma->aspace, vma); +	msm_gem_vma_purge(vma); +	msm_gem_vma_close(vma);  	del_vma(vma);  	return 0; @@ -589,7 +652,7 @@ void msm_gem_unpin_iova(struct drm_gem_object *obj,  	msm_gem_lock(obj);  	vma = lookup_vma(obj, aspace);  	if (!GEM_WARN_ON(!vma)) { -		msm_gem_unpin_vma(vma); +		msm_gem_vma_unpin(vma);  		msm_gem_unpin_locked(obj);  	}  	msm_gem_unlock(obj); @@ -628,6 +691,7 @@ fail:  static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)  {  	struct msm_gem_object *msm_obj = to_msm_bo(obj); +	struct page **pages;  	int ret = 0;  	msm_gem_assert_locked(obj); @@ -635,11 +699,9 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)  	if (obj->import_attach)  		return ERR_PTR(-ENODEV); -	if (GEM_WARN_ON(msm_obj->madv > madv)) { -		DRM_DEV_ERROR(obj->dev->dev, "Invalid madv state: %u vs %u\n", -			msm_obj->madv, madv); -		return ERR_PTR(-EBUSY); -	} +	pages = msm_gem_pin_pages_locked(obj, madv); +	if (IS_ERR(pages)) +		return ERR_CAST(pages);  	/* increment vmap_count *before* vmap() call, so shrinker can  	 * check vmap_count (is_vunmapable()) outside of msm_obj lock. @@ -650,25 +712,19 @@ static void *get_vaddr(struct drm_gem_object *obj, unsigned madv)  	msm_obj->vmap_count++;  	if (!msm_obj->vaddr) { -		struct page **pages = get_pages(obj); -		if (IS_ERR(pages)) { -			ret = PTR_ERR(pages); -			goto fail; -		}  		msm_obj->vaddr = vmap(pages, obj->size >> PAGE_SHIFT,  				VM_MAP, msm_gem_pgprot(msm_obj, PAGE_KERNEL));  		if (msm_obj->vaddr == NULL) {  			ret = -ENOMEM;  			goto fail;  		} - -		update_lru(obj);  	}  	return msm_obj->vaddr;  fail:  	msm_obj->vmap_count--; +	msm_gem_unpin_locked(obj);  	return ERR_PTR(ret);  } @@ -707,6 +763,7 @@ void msm_gem_put_vaddr_locked(struct drm_gem_object *obj)  	GEM_WARN_ON(msm_obj->vmap_count < 1);  	msm_obj->vmap_count--; +	msm_gem_unpin_locked(obj);  }  void msm_gem_put_vaddr(struct drm_gem_object *obj) @@ -721,10 +778,13 @@ void msm_gem_put_vaddr(struct drm_gem_object *obj)   */  int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)  { +	struct msm_drm_private *priv = obj->dev->dev_private;  	struct msm_gem_object *msm_obj = to_msm_bo(obj);  	msm_gem_lock(obj); +	mutex_lock(&priv->lru.lock); +  	if (msm_obj->madv != __MSM_MADV_PURGED)  		msm_obj->madv = madv; @@ -733,7 +793,9 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)  	/* If the obj is inactive, we might need to move it  	 * between inactive lists  	 */ -	update_lru(obj); +	update_lru_locked(obj); + +	mutex_unlock(&priv->lru.lock);  	msm_gem_unlock(obj); @@ -743,6 +805,7 @@ int msm_gem_madvise(struct drm_gem_object *obj, unsigned madv)  void msm_gem_purge(struct drm_gem_object *obj)  {  	struct drm_device *dev = obj->dev; +	struct msm_drm_private *priv = obj->dev->dev_private;  	struct msm_gem_object *msm_obj = to_msm_bo(obj);  	msm_gem_assert_locked(obj); @@ -759,7 +822,10 @@ void msm_gem_purge(struct drm_gem_object *obj)  	put_iova_vmas(obj); +	mutex_lock(&priv->lru.lock); +	/* A one-way transition: */  	msm_obj->madv = __MSM_MADV_PURGED; +	mutex_unlock(&priv->lru.lock);  	drm_gem_free_mmap_offset(obj); @@ -806,29 +872,6 @@ void msm_gem_vunmap(struct drm_gem_object *obj)  	msm_obj->vaddr = NULL;  } -static void update_lru(struct drm_gem_object *obj) -{ -	struct msm_drm_private *priv = obj->dev->dev_private; -	struct msm_gem_object *msm_obj = to_msm_bo(obj); - -	msm_gem_assert_locked(&msm_obj->base); - -	if (!msm_obj->pages) { -		GEM_WARN_ON(msm_obj->pin_count); -		GEM_WARN_ON(msm_obj->vmap_count); - -		drm_gem_lru_move_tail(&priv->lru.unbacked, obj); -	} else if (msm_obj->pin_count || msm_obj->vmap_count) { -		drm_gem_lru_move_tail(&priv->lru.pinned, obj); -	} else if (msm_obj->madv == MSM_MADV_WILLNEED) { -		drm_gem_lru_move_tail(&priv->lru.willneed, obj); -	} else { -		GEM_WARN_ON(msm_obj->madv != MSM_MADV_DONTNEED); - -		drm_gem_lru_move_tail(&priv->lru.dontneed, obj); -	} -} -  bool msm_gem_active(struct drm_gem_object *obj)  {  	msm_gem_assert_locked(obj); @@ -846,6 +889,11 @@ int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ktime_t *timeout)  		op & MSM_PREP_NOSYNC ? 0 : timeout_to_jiffies(timeout);  	long ret; +	if (op & MSM_PREP_BOOST) { +		dma_resv_set_deadline(obj->resv, dma_resv_usage_rw(write), +				      ktime_get()); +	} +  	ret = dma_resv_wait_timeout(obj->resv, dma_resv_usage_rw(write),  				    true,  remain);  	if (ret == 0) diff --git a/drivers/gpu/drm/msm/msm_gem.h b/drivers/gpu/drm/msm/msm_gem.h index c4844cf3a585..2bd6846c83a9 100644 --- a/drivers/gpu/drm/msm/msm_gem.h +++ b/drivers/gpu/drm/msm/msm_gem.h @@ -59,6 +59,7 @@ struct msm_fence_context;  struct msm_gem_vma {  	struct drm_mm_node node; +	spinlock_t lock;  	uint64_t iova;  	struct msm_gem_address_space *aspace;  	struct list_head list;    /* node in msm_gem_object::vmas */ @@ -69,19 +70,15 @@ struct msm_gem_vma {  	struct msm_fence_context *fctx[MSM_GPU_MAX_RINGS];  }; -int msm_gem_init_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma, int size, +struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_address_space *aspace); +int msm_gem_vma_init(struct msm_gem_vma *vma, int size,  		u64 range_start, u64 range_end);  bool msm_gem_vma_inuse(struct msm_gem_vma *vma); -void msm_gem_purge_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma); -void msm_gem_unpin_vma(struct msm_gem_vma *vma); -void msm_gem_unpin_vma_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx); -int msm_gem_map_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma, int prot, -		struct sg_table *sgt, int size); -void msm_gem_close_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma); +void msm_gem_vma_purge(struct msm_gem_vma *vma); +void msm_gem_vma_unpin(struct msm_gem_vma *vma); +void msm_gem_vma_unpin_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx); +int msm_gem_vma_map(struct msm_gem_vma *vma, int prot, struct sg_table *sgt, int size); +void msm_gem_vma_close(struct msm_gem_vma *vma);  struct msm_gem_object {  	struct drm_gem_object base; @@ -89,7 +86,9 @@ struct msm_gem_object {  	uint32_t flags;  	/** -	 * Advice: are the backing pages purgeable? +	 * madv: are the backing pages purgeable? +	 * +	 * Protected by obj lock and LRU lock  	 */  	uint8_t madv; @@ -117,6 +116,11 @@ struct msm_gem_object {  	char name[32]; /* Identifier to print for the debugfs files */ +	/** +	 * pin_count: Number of times the pages are pinned +	 * +	 * Protected by LRU lock. +	 */  	int pin_count;  };  #define to_msm_bo(x) container_of(x, struct msm_gem_object, base) @@ -124,6 +128,7 @@ struct msm_gem_object {  uint64_t msm_gem_mmap_offset(struct drm_gem_object *obj);  int msm_gem_pin_vma_locked(struct drm_gem_object *obj, struct msm_gem_vma *vma);  void msm_gem_unpin_locked(struct drm_gem_object *obj); +void msm_gem_unpin_active(struct drm_gem_object *obj);  struct msm_gem_vma *msm_gem_get_vma_locked(struct drm_gem_object *obj,  					   struct msm_gem_address_space *aspace);  int msm_gem_get_iova(struct drm_gem_object *obj, diff --git a/drivers/gpu/drm/msm/msm_gem_shrinker.c b/drivers/gpu/drm/msm/msm_gem_shrinker.c index 051bdbc093cf..f38296ad8743 100644 --- a/drivers/gpu/drm/msm/msm_gem_shrinker.c +++ b/drivers/gpu/drm/msm/msm_gem_shrinker.c @@ -107,6 +107,7 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)  		bool (*shrink)(struct drm_gem_object *obj);  		bool cond;  		unsigned long freed; +		unsigned long remaining;  	} stages[] = {  		/* Stages of progressively more aggressive/expensive reclaim: */  		{ &priv->lru.dontneed, purge,        true }, @@ -116,14 +117,18 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)  	};  	long nr = sc->nr_to_scan;  	unsigned long freed = 0; +	unsigned long remaining = 0;  	for (unsigned i = 0; (nr > 0) && (i < ARRAY_SIZE(stages)); i++) {  		if (!stages[i].cond)  			continue;  		stages[i].freed = -			drm_gem_lru_scan(stages[i].lru, nr, stages[i].shrink); +			drm_gem_lru_scan(stages[i].lru, nr, +					&stages[i].remaining, +					 stages[i].shrink);  		nr -= stages[i].freed;  		freed += stages[i].freed; +		remaining += stages[i].remaining;  	}  	if (freed) { @@ -132,7 +137,7 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)  				     stages[3].freed);  	} -	return (freed > 0) ? freed : SHRINK_STOP; +	return (freed > 0 && remaining > 0) ? freed : SHRINK_STOP;  }  #ifdef CONFIG_DEBUG_FS @@ -182,10 +187,12 @@ msm_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr)  		NULL,  	};  	unsigned idx, unmapped = 0; +	unsigned long remaining = 0;  	for (idx = 0; lrus[idx] && unmapped < vmap_shrink_limit; idx++) {  		unmapped += drm_gem_lru_scan(lrus[idx],  					     vmap_shrink_limit - unmapped, +					     &remaining,  					     vmap_shrink);  	} diff --git a/drivers/gpu/drm/msm/msm_gem_submit.c b/drivers/gpu/drm/msm/msm_gem_submit.c index ac8ed731f76d..9f5933c75e3d 100644 --- a/drivers/gpu/drm/msm/msm_gem_submit.c +++ b/drivers/gpu/drm/msm/msm_gem_submit.c @@ -41,8 +41,16 @@ static struct msm_gem_submit *submit_create(struct drm_device *dev,  	if (!submit)  		return ERR_PTR(-ENOMEM); +	submit->hw_fence = msm_fence_alloc(); +	if (IS_ERR(submit->hw_fence)) { +		ret = PTR_ERR(submit->hw_fence); +		kfree(submit); +		return ERR_PTR(ret); +	} +  	ret = drm_sched_job_init(&submit->base, queue->entity, queue);  	if (ret) { +		kfree(submit->hw_fence);  		kfree(submit);  		return ERR_PTR(ret);  	} @@ -72,9 +80,9 @@ void __msm_gem_submit_destroy(struct kref *kref)  	unsigned i;  	if (submit->fence_id) { -		mutex_lock(&submit->queue->idr_lock); +		spin_lock(&submit->queue->idr_lock);  		idr_remove(&submit->queue->fence_idr, submit->fence_id); -		mutex_unlock(&submit->queue->idr_lock); +		spin_unlock(&submit->queue->idr_lock);  	}  	dma_fence_put(submit->user_fence); @@ -242,7 +250,7 @@ static void submit_cleanup_bo(struct msm_gem_submit *submit, int i,  	submit->bos[i].flags &= ~cleanup_flags;  	if (flags & BO_VMA_PINNED) -		msm_gem_unpin_vma(submit->bos[i].vma); +		msm_gem_vma_unpin(submit->bos[i].vma);  	if (flags & BO_OBJ_PINNED)  		msm_gem_unpin_locked(obj); @@ -565,7 +573,6 @@ static struct drm_syncobj **msm_parse_deps(struct msm_gem_submit *submit,  	for (i = 0; i < nr_in_syncobjs; ++i) {  		uint64_t address = in_syncobjs_addr + i * syncobj_stride; -		struct dma_fence *fence;  		if (copy_from_user(&syncobj_desc,  			           u64_to_user_ptr(address), @@ -585,12 +592,8 @@ static struct drm_syncobj **msm_parse_deps(struct msm_gem_submit *submit,  			break;  		} -		ret = drm_syncobj_find_fence(file, syncobj_desc.handle, -		                             syncobj_desc.point, 0, &fence); -		if (ret) -			break; - -		ret = drm_sched_job_add_dependency(&submit->base, fence); +		ret = drm_sched_job_add_syncobj_dependency(&submit->base, file, +							   syncobj_desc.handle, syncobj_desc.point);  		if (ret)  			break; @@ -719,7 +722,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	struct msm_drm_private *priv = dev->dev_private;  	struct drm_msm_gem_submit *args = data;  	struct msm_file_private *ctx = file->driver_priv; -	struct msm_gem_submit *submit; +	struct msm_gem_submit *submit = NULL;  	struct msm_gpu *gpu = priv->gpu;  	struct msm_gpu_submitqueue *queue;  	struct msm_ringbuffer *ring; @@ -766,13 +769,15 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  		out_fence_fd = get_unused_fd_flags(O_CLOEXEC);  		if (out_fence_fd < 0) {  			ret = out_fence_fd; -			return ret; +			goto out_post_unlock;  		}  	}  	submit = submit_create(dev, gpu, queue, args->nr_bos, args->nr_cmds); -	if (IS_ERR(submit)) -		return PTR_ERR(submit); +	if (IS_ERR(submit)) { +		ret = PTR_ERR(submit); +		goto out_post_unlock; +	}  	trace_msm_gpu_submit(pid_nr(submit->pid), ring->id, submit->ident,  		args->nr_bos, args->nr_cmds); @@ -874,7 +879,9 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	submit->nr_cmds = i; -	mutex_lock(&queue->idr_lock); +	idr_preload(GFP_KERNEL); + +	spin_lock(&queue->idr_lock);  	/*  	 * If using userspace provided seqno fence, validate that the id @@ -884,7 +891,8 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  	 */  	if ((args->flags & MSM_SUBMIT_FENCE_SN_IN) &&  			idr_find(&queue->fence_idr, args->fence)) { -		mutex_unlock(&queue->idr_lock); +		spin_unlock(&queue->idr_lock); +		idr_preload_end();  		ret = -EINVAL;  		goto out;  	} @@ -902,7 +910,7 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  		submit->fence_id = args->fence;  		ret = idr_alloc_u32(&queue->fence_idr, submit->user_fence,  				    &submit->fence_id, submit->fence_id, -				    GFP_KERNEL); +				    GFP_NOWAIT);  		/*  		 * We've already validated that the fence_id slot is valid,  		 * so if idr_alloc_u32 failed, it is a kernel bug @@ -915,10 +923,11 @@ int msm_ioctl_gem_submit(struct drm_device *dev, void *data,  		 */  		submit->fence_id = idr_alloc_cyclic(&queue->fence_idr,  						    submit->user_fence, 1, -						    INT_MAX, GFP_KERNEL); +						    INT_MAX, GFP_NOWAIT);  	} -	mutex_unlock(&queue->idr_lock); +	spin_unlock(&queue->idr_lock); +	idr_preload_end();  	if (submit->fence_id < 0) {  		ret = submit->fence_id; @@ -955,11 +964,20 @@ out:  	if (has_ww_ticket)  		ww_acquire_fini(&submit->ticket);  out_unlock: -	if (ret && (out_fence_fd >= 0)) -		put_unused_fd(out_fence_fd);  	mutex_unlock(&queue->lock);  out_post_unlock: -	msm_gem_submit_put(submit); +	if (ret && (out_fence_fd >= 0)) +		put_unused_fd(out_fence_fd); + +	if (!IS_ERR_OR_NULL(submit)) { +		msm_gem_submit_put(submit); +	} else { +		/* +		 * If the submit hasn't yet taken ownership of the queue +		 * then we need to drop the reference ourself: +		 */ +		msm_submitqueue_put(queue); +	}  	if (!IS_ERR_OR_NULL(post_deps)) {  		for (i = 0; i < args->nr_out_syncobjs; ++i) {  			kfree(post_deps[i].chain); diff --git a/drivers/gpu/drm/msm/msm_gem_vma.c b/drivers/gpu/drm/msm/msm_gem_vma.c index c471aebcdbab..98287ed99960 100644 --- a/drivers/gpu/drm/msm/msm_gem_vma.c +++ b/drivers/gpu/drm/msm/msm_gem_vma.c @@ -40,25 +40,34 @@ msm_gem_address_space_get(struct msm_gem_address_space *aspace)  bool msm_gem_vma_inuse(struct msm_gem_vma *vma)  { +	bool ret = true; + +	spin_lock(&vma->lock); +  	if (vma->inuse > 0) -		return true; +		goto out;  	while (vma->fence_mask) {  		unsigned idx = ffs(vma->fence_mask) - 1;  		if (!msm_fence_completed(vma->fctx[idx], vma->fence[idx])) -			return true; +			goto out;  		vma->fence_mask &= ~BIT(idx);  	} -	return false; +	ret = false; + +out: +	spin_unlock(&vma->lock); + +	return ret;  }  /* Actually unmap memory for the vma */ -void msm_gem_purge_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma) +void msm_gem_vma_purge(struct msm_gem_vma *vma)  { +	struct msm_gem_address_space *aspace = vma->aspace;  	unsigned size = vma->node.size;  	/* Print a message if we try to purge a vma in use */ @@ -68,14 +77,12 @@ void msm_gem_purge_vma(struct msm_gem_address_space *aspace,  	if (!vma->mapped)  		return; -	if (aspace->mmu) -		aspace->mmu->funcs->unmap(aspace->mmu, vma->iova, size); +	aspace->mmu->funcs->unmap(aspace->mmu, vma->iova, size);  	vma->mapped = false;  } -/* Remove reference counts for the mapping */ -void msm_gem_unpin_vma(struct msm_gem_vma *vma) +static void vma_unpin_locked(struct msm_gem_vma *vma)  {  	if (GEM_WARN_ON(!vma->inuse))  		return; @@ -83,50 +90,75 @@ void msm_gem_unpin_vma(struct msm_gem_vma *vma)  		vma->inuse--;  } +/* Remove reference counts for the mapping */ +void msm_gem_vma_unpin(struct msm_gem_vma *vma) +{ +	spin_lock(&vma->lock); +	vma_unpin_locked(vma); +	spin_unlock(&vma->lock); +} +  /* Replace pin reference with fence: */ -void msm_gem_unpin_vma_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx) +void msm_gem_vma_unpin_fenced(struct msm_gem_vma *vma, struct msm_fence_context *fctx)  { +	spin_lock(&vma->lock);  	vma->fctx[fctx->index] = fctx;  	vma->fence[fctx->index] = fctx->last_fence;  	vma->fence_mask |= BIT(fctx->index); -	msm_gem_unpin_vma(vma); +	vma_unpin_locked(vma); +	spin_unlock(&vma->lock);  }  /* Map and pin vma: */  int -msm_gem_map_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma, int prot, +msm_gem_vma_map(struct msm_gem_vma *vma, int prot,  		struct sg_table *sgt, int size)  { -	int ret = 0; +	struct msm_gem_address_space *aspace = vma->aspace; +	int ret;  	if (GEM_WARN_ON(!vma->iova))  		return -EINVAL;  	/* Increase the usage counter */ +	spin_lock(&vma->lock);  	vma->inuse++; +	spin_unlock(&vma->lock);  	if (vma->mapped)  		return 0;  	vma->mapped = true; -	if (aspace && aspace->mmu) -		ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt, -				size, prot); +	if (!aspace) +		return 0; + +	/* +	 * NOTE: iommu/io-pgtable can allocate pages, so we cannot hold +	 * a lock across map/unmap which is also used in the job_run() +	 * path, as this can cause deadlock in job_run() vs shrinker/ +	 * reclaim. +	 * +	 * Revisit this if we can come up with a scheme to pre-alloc pages +	 * for the pgtable in map/unmap ops. +	 */ +	ret = aspace->mmu->funcs->map(aspace->mmu, vma->iova, sgt, size, prot);  	if (ret) {  		vma->mapped = false; +		spin_lock(&vma->lock);  		vma->inuse--; +		spin_unlock(&vma->lock);  	}  	return ret;  }  /* Close an iova.  Warn if it is still in use */ -void msm_gem_close_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma) +void msm_gem_vma_close(struct msm_gem_vma *vma)  { +	struct msm_gem_address_space *aspace = vma->aspace; +  	GEM_WARN_ON(msm_gem_vma_inuse(vma) || vma->mapped);  	spin_lock(&aspace->lock); @@ -139,13 +171,30 @@ void msm_gem_close_vma(struct msm_gem_address_space *aspace,  	msm_gem_address_space_put(aspace);  } +struct msm_gem_vma *msm_gem_vma_new(struct msm_gem_address_space *aspace) +{ +	struct msm_gem_vma *vma; + +	vma = kzalloc(sizeof(*vma), GFP_KERNEL); +	if (!vma) +		return NULL; + +	spin_lock_init(&vma->lock); +	vma->aspace = aspace; + +	return vma; +} +  /* Initialize a new vma and allocate an iova for it */ -int msm_gem_init_vma(struct msm_gem_address_space *aspace, -		struct msm_gem_vma *vma, int size, +int msm_gem_vma_init(struct msm_gem_vma *vma, int size,  		u64 range_start, u64 range_end)  { +	struct msm_gem_address_space *aspace = vma->aspace;  	int ret; +	if (GEM_WARN_ON(!aspace)) +		return -EINVAL; +  	if (GEM_WARN_ON(vma->iova))  		return -EBUSY; diff --git a/drivers/gpu/drm/msm/msm_gpu.c b/drivers/gpu/drm/msm/msm_gpu.c index 380249500325..26ebda40be4f 100644 --- a/drivers/gpu/drm/msm/msm_gpu.c +++ b/drivers/gpu/drm/msm/msm_gpu.c @@ -16,7 +16,6 @@  #include <generated/utsrelease.h>  #include <linux/string_helpers.h>  #include <linux/devcoredump.h> -#include <linux/reset.h>  #include <linux/sched/task.h>  /* @@ -59,7 +58,7 @@ static int disable_pwrrail(struct msm_gpu *gpu)  static int enable_clk(struct msm_gpu *gpu)  {  	if (gpu->core_clk && gpu->fast_rate) -		clk_set_rate(gpu->core_clk, gpu->fast_rate); +		dev_pm_opp_set_rate(&gpu->pdev->dev, gpu->fast_rate);  	/* Set the RBBM timer rate to 19.2Mhz */  	if (gpu->rbbmtimer_clk) @@ -78,7 +77,7 @@ static int disable_clk(struct msm_gpu *gpu)  	 * will be rounded down to zero anyway so it all works out.  	 */  	if (gpu->core_clk) -		clk_set_rate(gpu->core_clk, 27000000); +		dev_pm_opp_set_rate(&gpu->pdev->dev, 27000000);  	if (gpu->rbbmtimer_clk)  		clk_set_rate(gpu->rbbmtimer_clk, 0); @@ -935,9 +934,6 @@ int msm_gpu_init(struct drm_device *drm, struct platform_device *pdev,  	if (IS_ERR(gpu->gpu_cx))  		gpu->gpu_cx = NULL; -	gpu->cx_collapse = devm_reset_control_get_optional_exclusive(&pdev->dev, -			"cx_collapse"); -  	gpu->pdev = pdev;  	platform_set_drvdata(pdev, &gpu->adreno_smmu); diff --git a/drivers/gpu/drm/msm/msm_gpu.h b/drivers/gpu/drm/msm/msm_gpu.h index fc1c0d8611a8..7a4fa1b8655b 100644 --- a/drivers/gpu/drm/msm/msm_gpu.h +++ b/drivers/gpu/drm/msm/msm_gpu.h @@ -13,7 +13,6 @@  #include <linux/interconnect.h>  #include <linux/pm_opp.h>  #include <linux/regulator/consumer.h> -#include <linux/reset.h>  #include "msm_drv.h"  #include "msm_fence.h" @@ -50,6 +49,12 @@ struct msm_gpu_funcs {  	int (*set_param)(struct msm_gpu *gpu, struct msm_file_private *ctx,  			 uint32_t param, uint64_t value, uint32_t len);  	int (*hw_init)(struct msm_gpu *gpu); + +	/** +	 * @ucode_load: Optional hook to upload fw to GEM objs +	 */ +	int (*ucode_load)(struct msm_gpu *gpu); +  	int (*pm_suspend)(struct msm_gpu *gpu);  	int (*pm_resume)(struct msm_gpu *gpu);  	void (*submit)(struct msm_gpu *gpu, struct msm_gem_submit *submit); @@ -281,9 +286,6 @@ struct msm_gpu {  	bool hw_apriv;  	struct thermal_cooling_device *cooling; - -	/* To poll for cx gdsc collapse during gpu recovery */ -	struct reset_control *cx_collapse;  };  static inline struct msm_gpu *dev_to_gpu(struct device *dev) @@ -499,7 +501,7 @@ struct msm_gpu_submitqueue {  	struct msm_file_private *ctx;  	struct list_head node;  	struct idr fence_idr; -	struct mutex idr_lock; +	struct spinlock idr_lock;  	struct mutex lock;  	struct kref ref;  	struct drm_sched_entity *entity; diff --git a/drivers/gpu/drm/msm/msm_gpu_devfreq.c b/drivers/gpu/drm/msm/msm_gpu_devfreq.c index e27dbf12b5e8..ea70c1c32d94 100644 --- a/drivers/gpu/drm/msm/msm_gpu_devfreq.c +++ b/drivers/gpu/drm/msm/msm_gpu_devfreq.c @@ -48,7 +48,7 @@ static int msm_devfreq_target(struct device *dev, unsigned long *freq,  		gpu->funcs->gpu_set_freq(gpu, opp, df->suspended);  		mutex_unlock(&df->lock);  	} else { -		clk_set_rate(gpu->core_clk, *freq); +		dev_pm_opp_set_rate(dev, *freq);  	}  	dev_pm_opp_put(opp); diff --git a/drivers/gpu/drm/msm/msm_io_utils.c b/drivers/gpu/drm/msm/msm_io_utils.c index d02cd29ce829..59d2788c4510 100644 --- a/drivers/gpu/drm/msm/msm_io_utils.c +++ b/drivers/gpu/drm/msm/msm_io_utils.c @@ -6,6 +6,7 @@   */  #include <linux/interconnect.h> +#include <linux/io.h>  #include "msm_drv.h" diff --git a/drivers/gpu/drm/msm/msm_iommu.c b/drivers/gpu/drm/msm/msm_iommu.c index c2507582ecf3..5cc8d358cc97 100644 --- a/drivers/gpu/drm/msm/msm_iommu.c +++ b/drivers/gpu/drm/msm/msm_iommu.c @@ -234,15 +234,13 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)  	/* Get the pagetable configuration from the domain */  	if (adreno_smmu->cookie)  		ttbr1_cfg = adreno_smmu->get_ttbr1_cfg(adreno_smmu->cookie); -	if (!ttbr1_cfg) -		return ERR_PTR(-ENODEV);  	/* -	 * Defer setting the fault handler until we have a valid adreno_smmu -	 * to avoid accidentially installing a GPU specific fault handler for -	 * the display's iommu +	 * If you hit this WARN_ONCE() you are probably missing an entry in +	 * qcom_smmu_impl_of_match[] in arm-smmu-qcom.c  	 */ -	iommu_set_fault_handler(iommu->domain, msm_fault_handler, iommu); +	if (WARN_ONCE(!ttbr1_cfg, "No per-process page tables")) +		return ERR_PTR(-ENODEV);  	pagetable = kzalloc(sizeof(*pagetable), GFP_KERNEL);  	if (!pagetable) @@ -271,9 +269,6 @@ struct msm_mmu *msm_iommu_pagetable_create(struct msm_mmu *parent)  	 * the arm-smmu driver as a trigger to set up TTBR0  	 */  	if (atomic_inc_return(&iommu->pagetables) == 1) { -		/* Enable stall on iommu fault: */ -		adreno_smmu->set_stall(adreno_smmu->cookie, true); -  		ret = adreno_smmu->set_ttbr0_cfg(adreno_smmu->cookie, &ttbr0_cfg);  		if (ret) {  			free_io_pgtable_ops(pagetable->pgtbl_ops); @@ -302,6 +297,7 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,  		unsigned long iova, int flags, void *arg)  {  	struct msm_iommu *iommu = arg; +	struct msm_mmu *mmu = &iommu->base;  	struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(iommu->base.dev);  	struct adreno_smmu_fault_info info, *ptr = NULL; @@ -314,6 +310,10 @@ static int msm_fault_handler(struct iommu_domain *domain, struct device *dev,  		return iommu->base.handler(iommu->base.arg, iova, flags, ptr);  	pr_warn_ratelimited("*** fault: iova=%16lx, flags=%d\n", iova, flags); + +	if (mmu->funcs->resume_translation) +		mmu->funcs->resume_translation(mmu); +  	return 0;  } @@ -321,7 +321,8 @@ static void msm_iommu_resume_translation(struct msm_mmu *mmu)  {  	struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(mmu->dev); -	adreno_smmu->resume_translation(adreno_smmu->cookie, true); +	if (adreno_smmu->resume_translation) +		adreno_smmu->resume_translation(adreno_smmu->cookie, true);  }  static void msm_iommu_detach(struct msm_mmu *mmu) @@ -406,3 +407,23 @@ struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks)  	return &iommu->base;  } + +struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsigned long quirks) +{ +	struct adreno_smmu_priv *adreno_smmu = dev_get_drvdata(dev); +	struct msm_iommu *iommu; +	struct msm_mmu *mmu; + +	mmu = msm_iommu_new(dev, quirks); +	if (IS_ERR_OR_NULL(mmu)) +		return mmu; + +	iommu = to_msm_iommu(mmu); +	iommu_set_fault_handler(iommu->domain, msm_fault_handler, iommu); + +	/* Enable stall on iommu fault: */ +	if (adreno_smmu->set_stall) +		adreno_smmu->set_stall(adreno_smmu->cookie, true); + +	return mmu; +} diff --git a/drivers/gpu/drm/msm/msm_kms.h b/drivers/gpu/drm/msm/msm_kms.h index f8ed7588928c..086a3f1ff956 100644 --- a/drivers/gpu/drm/msm/msm_kms.h +++ b/drivers/gpu/drm/msm/msm_kms.h @@ -60,14 +60,6 @@ struct msm_kms_funcs {  	void (*disable_commit)(struct msm_kms *kms);  	/** -	 * If the kms backend supports async commit, it should implement -	 * this method to return the time of the next vsync.  This is -	 * used to determine a time slightly before vsync, for the async -	 * commit timer to run and complete an async commit. -	 */ -	ktime_t (*vsync_time)(struct msm_kms *kms, struct drm_crtc *crtc); - -	/**  	 * Prepare for atomic commit.  This is called after any previous  	 * (async or otherwise) commit has completed.  	 */ diff --git a/drivers/gpu/drm/msm/msm_mdss.c b/drivers/gpu/drm/msm/msm_mdss.c index 02646e4bb4cd..e8c93731aaa1 100644 --- a/drivers/gpu/drm/msm/msm_mdss.c +++ b/drivers/gpu/drm/msm/msm_mdss.c @@ -16,9 +16,6 @@  #include "msm_drv.h"  #include "msm_kms.h" -/* for DPU_HW_* defines */ -#include "disp/dpu1/dpu_hw_catalog.h" -  #define HW_REV				0x0  #define HW_INTR_STATUS			0x0010 @@ -29,6 +26,16 @@  #define MIN_IB_BW	400000000UL /* Min ib vote 400MB */ +struct msm_mdss_data { +	u32 ubwc_version; +	/* can be read from register 0x58 */ +	u32 ubwc_dec_version; +	u32 ubwc_swizzle; +	u32 ubwc_static; +	u32 highest_bank_bit; +	u32 macrotile_mode; +}; +  struct msm_mdss {  	struct device *dev; @@ -40,6 +47,7 @@ struct msm_mdss {  		unsigned long enabled_mask;  		struct irq_domain *domain;  	} irq_controller; +	const struct msm_mdss_data *mdss_data;  	struct icc_path *path[2];  	u32 num_paths;  }; @@ -182,46 +190,40 @@ static int _msm_mdss_irq_domain_add(struct msm_mdss *msm_mdss)  #define UBWC_3_0 0x30000000  #define UBWC_4_0 0x40000000 -static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss, -				       u32 ubwc_static) +static void msm_mdss_setup_ubwc_dec_20(struct msm_mdss *msm_mdss)  { -	writel_relaxed(ubwc_static, msm_mdss->mmio + UBWC_STATIC); +	const struct msm_mdss_data *data = msm_mdss->mdss_data; + +	writel_relaxed(data->ubwc_static, msm_mdss->mmio + UBWC_STATIC);  } -static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss, -				       unsigned int ubwc_version, -				       u32 ubwc_swizzle, -				       u32 highest_bank_bit, -				       u32 macrotile_mode) +static void msm_mdss_setup_ubwc_dec_30(struct msm_mdss *msm_mdss)  { -	u32 value = (ubwc_swizzle & 0x1) | -		    (highest_bank_bit & 0x3) << 4 | -		    (macrotile_mode & 0x1) << 12; +	const struct msm_mdss_data *data = msm_mdss->mdss_data; +	u32 value = (data->ubwc_swizzle & 0x1) | +		    (data->highest_bank_bit & 0x3) << 4 | +		    (data->macrotile_mode & 0x1) << 12; -	if (ubwc_version == UBWC_3_0) +	if (data->ubwc_version == UBWC_3_0)  		value |= BIT(10); -	if (ubwc_version == UBWC_1_0) +	if (data->ubwc_version == UBWC_1_0)  		value |= BIT(8);  	writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC);  } -static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss, -				       unsigned int ubwc_version, -				       u32 ubwc_swizzle, -				       u32 ubwc_static, -				       u32 highest_bank_bit, -				       u32 macrotile_mode) +static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss)  { -	u32 value = (ubwc_swizzle & 0x7) | -		    (ubwc_static & 0x1) << 3 | -		    (highest_bank_bit & 0x7) << 4 | -		    (macrotile_mode & 0x1) << 12; +	const struct msm_mdss_data *data = msm_mdss->mdss_data; +	u32 value = (data->ubwc_swizzle & 0x7) | +		    (data->ubwc_static & 0x1) << 3 | +		    (data->highest_bank_bit & 0x7) << 4 | +		    (data->macrotile_mode & 0x1) << 12;  	writel_relaxed(value, msm_mdss->mmio + UBWC_STATIC); -	if (ubwc_version == UBWC_3_0) { +	if (data->ubwc_version == UBWC_3_0) {  		writel_relaxed(1, msm_mdss->mmio + UBWC_CTRL_2);  		writel_relaxed(0, msm_mdss->mmio + UBWC_PREDICTION_MODE);  	} else { @@ -233,7 +235,6 @@ static void msm_mdss_setup_ubwc_dec_40(struct msm_mdss *msm_mdss,  static int msm_mdss_enable(struct msm_mdss *msm_mdss)  {  	int ret; -	u32 hw_rev;  	/*  	 * Several components have AXI clocks that can only be turned on if @@ -249,57 +250,36 @@ static int msm_mdss_enable(struct msm_mdss *msm_mdss)  	}  	/* -	 * HW_REV requires MDSS_MDP_CLK, which is not enabled by the mdss on -	 * mdp5 hardware. Skip reading it for now. +	 * Register access requires MDSS_MDP_CLK, which is not enabled by the +	 * mdss on mdp5 hardware. Skip it for now.  	 */ -	if (msm_mdss->is_mdp5) +	if (msm_mdss->is_mdp5 || !msm_mdss->mdss_data)  		return 0; -	hw_rev = readl_relaxed(msm_mdss->mmio + HW_REV); -	dev_dbg(msm_mdss->dev, "HW_REV: 0x%x\n", hw_rev); -	dev_dbg(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n", -		readl_relaxed(msm_mdss->mmio + UBWC_DEC_HW_VERSION)); -  	/*  	 * ubwc config is part of the "mdss" region which is not accessible  	 * from the rest of the driver. hardcode known configurations here  	 *  	 * Decoder version can be read from the UBWC_DEC_HW_VERSION reg, -	 * UBWC_n and the rest of params comes from hw_catalog. -	 * Unforunately this driver can not access hw catalog, so we have to -	 * hardcode them here. +	 * UBWC_n and the rest of params comes from hw data.  	 */ -	switch (hw_rev) { -	case DPU_HW_VER_500: -	case DPU_HW_VER_501: -		msm_mdss_setup_ubwc_dec_30(msm_mdss, UBWC_3_0, 0, 2, 0); -		break; -	case DPU_HW_VER_600: -		/* TODO: highest_bank_bit = 2 for LP_DDR4 */ -		msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); -		break; -	case DPU_HW_VER_620: -		/* UBWC_2_0 */ -		msm_mdss_setup_ubwc_dec_20(msm_mdss, 0x1e); +	switch (msm_mdss->mdss_data->ubwc_dec_version) { +	case UBWC_2_0: +		msm_mdss_setup_ubwc_dec_20(msm_mdss);  		break; -	case DPU_HW_VER_630: -		/* UBWC_2_0 */ -		msm_mdss_setup_ubwc_dec_20(msm_mdss, 0x11f); +	case UBWC_3_0: +		msm_mdss_setup_ubwc_dec_30(msm_mdss);  		break; -	case DPU_HW_VER_700: -		/* TODO: highest_bank_bit = 2 for LP_DDR4 */ -		msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); +	case UBWC_4_0: +		msm_mdss_setup_ubwc_dec_40(msm_mdss);  		break; -	case DPU_HW_VER_720: -		msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_3_0, 6, 1, 1, 1); -		break; -	case DPU_HW_VER_800: -		msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 2, 1); -		break; -	case DPU_HW_VER_810: -	case DPU_HW_VER_900: -		/* TODO: highest_bank_bit = 2 for LP_DDR4 */ -		msm_mdss_setup_ubwc_dec_40(msm_mdss, UBWC_4_0, 6, 1, 3, 1); +	default: +		dev_err(msm_mdss->dev, "Unsupported UBWC decoder version %x\n", +			msm_mdss->mdss_data->ubwc_dec_version); +		dev_err(msm_mdss->dev, "HW_REV: 0x%x\n", +			readl_relaxed(msm_mdss->mmio + HW_REV)); +		dev_err(msm_mdss->dev, "UBWC_DEC_HW_VERSION: 0x%x\n", +			readl_relaxed(msm_mdss->mmio + UBWC_DEC_HW_VERSION));  		break;  	} @@ -490,6 +470,8 @@ static int mdss_probe(struct platform_device *pdev)  	if (IS_ERR(mdss))  		return PTR_ERR(mdss); +	mdss->mdss_data = of_device_get_match_data(&pdev->dev); +  	platform_set_drvdata(pdev, mdss);  	/* @@ -519,21 +501,81 @@ static int mdss_remove(struct platform_device *pdev)  	return 0;  } +static const struct msm_mdss_data sc7180_data = { +	.ubwc_version = UBWC_2_0, +	.ubwc_dec_version = UBWC_2_0, +	.ubwc_static = 0x1e, +}; + +static const struct msm_mdss_data sc7280_data = { +	.ubwc_version = UBWC_3_0, +	.ubwc_dec_version = UBWC_4_0, +	.ubwc_swizzle = 6, +	.ubwc_static = 1, +	.highest_bank_bit = 1, +	.macrotile_mode = 1, +}; + +static const struct msm_mdss_data sc8180x_data = { +	.ubwc_version = UBWC_3_0, +	.ubwc_dec_version = UBWC_3_0, +	.highest_bank_bit = 3, +	.macrotile_mode = 1, +}; + +static const struct msm_mdss_data sc8280xp_data = { +	.ubwc_version = UBWC_4_0, +	.ubwc_dec_version = UBWC_4_0, +	.ubwc_swizzle = 6, +	.ubwc_static = 1, +	.highest_bank_bit = 2, +	.macrotile_mode = 1, +}; + +static const struct msm_mdss_data sdm845_data = { +	.ubwc_version = UBWC_2_0, +	.ubwc_dec_version = UBWC_2_0, +	.highest_bank_bit = 2, +}; + +static const struct msm_mdss_data sm8150_data = { +	.ubwc_version = UBWC_3_0, +	.ubwc_dec_version = UBWC_3_0, +	.highest_bank_bit = 2, +}; + +static const struct msm_mdss_data sm6115_data = { +	.ubwc_version = UBWC_1_0, +	.ubwc_dec_version = UBWC_2_0, +	.ubwc_swizzle = 7, +	.ubwc_static = 0x11f, +}; + +static const struct msm_mdss_data sm8250_data = { +	.ubwc_version = UBWC_4_0, +	.ubwc_dec_version = UBWC_4_0, +	.ubwc_swizzle = 6, +	.ubwc_static = 1, +	/* TODO: highest_bank_bit = 2 for LP_DDR4 */ +	.highest_bank_bit = 3, +	.macrotile_mode = 1, +}; +  static const struct of_device_id mdss_dt_match[] = {  	{ .compatible = "qcom,mdss" },  	{ .compatible = "qcom,msm8998-mdss" },  	{ .compatible = "qcom,qcm2290-mdss" }, -	{ .compatible = "qcom,sdm845-mdss" }, -	{ .compatible = "qcom,sc7180-mdss" }, -	{ .compatible = "qcom,sc7280-mdss" }, -	{ .compatible = "qcom,sc8180x-mdss" }, -	{ .compatible = "qcom,sc8280xp-mdss" }, -	{ .compatible = "qcom,sm6115-mdss" }, -	{ .compatible = "qcom,sm8150-mdss" }, -	{ .compatible = "qcom,sm8250-mdss" }, -	{ .compatible = "qcom,sm8350-mdss" }, -	{ .compatible = "qcom,sm8450-mdss" }, -	{ .compatible = "qcom,sm8550-mdss" }, +	{ .compatible = "qcom,sdm845-mdss", .data = &sdm845_data }, +	{ .compatible = "qcom,sc7180-mdss", .data = &sc7180_data }, +	{ .compatible = "qcom,sc7280-mdss", .data = &sc7280_data }, +	{ .compatible = "qcom,sc8180x-mdss", .data = &sc8180x_data }, +	{ .compatible = "qcom,sc8280xp-mdss", .data = &sc8280xp_data }, +	{ .compatible = "qcom,sm6115-mdss", .data = &sm6115_data }, +	{ .compatible = "qcom,sm8150-mdss", .data = &sm8150_data }, +	{ .compatible = "qcom,sm8250-mdss", .data = &sm8250_data }, +	{ .compatible = "qcom,sm8350-mdss", .data = &sm8250_data }, +	{ .compatible = "qcom,sm8450-mdss", .data = &sm8250_data }, +	{ .compatible = "qcom,sm8550-mdss", .data = &sm8250_data },  	{}  };  MODULE_DEVICE_TABLE(of, mdss_dt_match); diff --git a/drivers/gpu/drm/msm/msm_mmu.h b/drivers/gpu/drm/msm/msm_mmu.h index 74cd81e701ff..eb72d3645c1d 100644 --- a/drivers/gpu/drm/msm/msm_mmu.h +++ b/drivers/gpu/drm/msm/msm_mmu.h @@ -41,6 +41,7 @@ static inline void msm_mmu_init(struct msm_mmu *mmu, struct device *dev,  }  struct msm_mmu *msm_iommu_new(struct device *dev, unsigned long quirks); +struct msm_mmu *msm_iommu_gpu_new(struct device *dev, struct msm_gpu *gpu, unsigned long quirks);  struct msm_mmu *msm_gpummu_new(struct device *dev, struct msm_gpu *gpu);  static inline void msm_mmu_set_fault_handler(struct msm_mmu *mmu, void *arg, diff --git a/drivers/gpu/drm/msm/msm_ringbuffer.c b/drivers/gpu/drm/msm/msm_ringbuffer.c index 57a8e9564540..b60199184409 100644 --- a/drivers/gpu/drm/msm/msm_ringbuffer.c +++ b/drivers/gpu/drm/msm/msm_ringbuffer.c @@ -18,16 +18,14 @@ static struct dma_fence *msm_job_run(struct drm_sched_job *job)  	struct msm_gpu *gpu = submit->gpu;  	int i; -	submit->hw_fence = msm_fence_alloc(fctx); +	msm_fence_init(submit->hw_fence, fctx);  	for (i = 0; i < submit->nr_bos; i++) {  		struct drm_gem_object *obj = &submit->bos[i].obj->base; -		msm_gem_lock(obj); -		msm_gem_unpin_vma_fenced(submit->bos[i].vma, fctx); -		msm_gem_unpin_locked(obj); +		msm_gem_vma_unpin_fenced(submit->bos[i].vma, fctx); +		msm_gem_unpin_active(obj);  		submit->bos[i].flags &= ~(BO_VMA_PINNED | BO_OBJ_PINNED); -		msm_gem_unlock(obj);  	}  	/* TODO move submit path over to using a per-ring lock.. */ diff --git a/drivers/gpu/drm/msm/msm_submitqueue.c b/drivers/gpu/drm/msm/msm_submitqueue.c index c6929e205b51..0e803125a325 100644 --- a/drivers/gpu/drm/msm/msm_submitqueue.c +++ b/drivers/gpu/drm/msm/msm_submitqueue.c @@ -200,7 +200,7 @@ int msm_submitqueue_create(struct drm_device *drm, struct msm_file_private *ctx,  		*id = queue->id;  	idr_init(&queue->fence_idr); -	mutex_init(&queue->idr_lock); +	spin_lock_init(&queue->idr_lock);  	mutex_init(&queue->lock);  	list_add_tail(&queue->node, &ctx->submitqueues);  |