Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'msm-next' of git://people.freedesktop.org/~robclark/linux into drm-next

prime support, inactive rework, render nodes
* 'msm-next' of git://people.freedesktop.org/~robclark/linux:
drm/msm/mdp4: page_flip cleanups/fixes
drm/msm: EBUSY status handling in msm_gem_fault()
drm/msm: rework inactive-work
drm/msm: add plane support
drm/msm: resync generated headers
drm/msm: support render nodes
drm/msm: prime support

+663 -251
+1
drivers/gpu/drm/msm/Makefile
··· 21 21 msm_drv.o \ 22 22 msm_fb.o \ 23 23 msm_gem.o \ 24 + msm_gem_prime.o \ 24 25 msm_gem_submit.o \ 25 26 msm_gpu.o \ 26 27 msm_ringbuffer.o
+37 -5
drivers/gpu/drm/msm/adreno/a2xx.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml ( 327 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 30005 bytes, from 2013-07-19 21:30:48) 13 + - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 31003 bytes, from 2013-09-19 18:50:16) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/adreno_common.xml ( 8983 bytes, from 2013-07-24 01:38:36) 15 - - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9712 bytes, from 2013-05-26 15:22:37) 16 - - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51415 bytes, from 2013-08-03 14:26:05) 15 + - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9759 bytes, from 2013-09-10 00:52:33) 16 + - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51983 bytes, from 2013-09-10 00:52:32) 17 17 18 18 Copyright (C) 2013 by the following authors: 19 19 - Rob Clark <robdclark@gmail.com> (robclark) ··· 316 316 #define A2XX_RBBM_STATUS_SQ_CNTX0_BUSY 0x10000000 317 317 #define A2XX_RBBM_STATUS_RB_CNTX_BUSY 0x40000000 318 318 #define A2XX_RBBM_STATUS_GUI_ACTIVE 0x80000000 319 + 320 + #define REG_A2XX_MH_ARBITER_CONFIG 0x00000a40 321 + #define A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT__MASK 0x0000003f 322 + #define A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT__SHIFT 0 323 + static inline uint32_t A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT(uint32_t val) 324 + { 325 + return ((val) << A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT__SHIFT) & A2XX_MH_ARBITER_CONFIG_SAME_PAGE_LIMIT__MASK; 326 + } 327 + #define A2XX_MH_ARBITER_CONFIG_SAME_PAGE_GRANULARITY 0x00000040 328 + #define A2XX_MH_ARBITER_CONFIG_L1_ARB_ENABLE 0x00000080 329 + #define A2XX_MH_ARBITER_CONFIG_L1_ARB_HOLD_ENABLE 0x00000100 330 + #define A2XX_MH_ARBITER_CONFIG_L2_ARB_CONTROL 0x00000200 331 + #define A2XX_MH_ARBITER_CONFIG_PAGE_SIZE__MASK 0x00001c00 332 + #define A2XX_MH_ARBITER_CONFIG_PAGE_SIZE__SHIFT 10 333 + static inline uint32_t A2XX_MH_ARBITER_CONFIG_PAGE_SIZE(uint32_t val) 334 + { 335 + return ((val) << A2XX_MH_ARBITER_CONFIG_PAGE_SIZE__SHIFT) & A2XX_MH_ARBITER_CONFIG_PAGE_SIZE__MASK; 336 + } 337 + #define A2XX_MH_ARBITER_CONFIG_TC_REORDER_ENABLE 0x00002000 338 + #define A2XX_MH_ARBITER_CONFIG_TC_ARB_HOLD_ENABLE 0x00004000 339 + #define A2XX_MH_ARBITER_CONFIG_IN_FLIGHT_LIMIT_ENABLE 0x00008000 340 + #define A2XX_MH_ARBITER_CONFIG_IN_FLIGHT_LIMIT__MASK 0x003f0000 341 + #define A2XX_MH_ARBITER_CONFIG_IN_FLIGHT_LIMIT__SHIFT 16 342 + static inline uint32_t A2XX_MH_ARBITER_CONFIG_IN_FLIGHT_LIMIT(uint32_t val) 343 + { 344 + return ((val) << A2XX_MH_ARBITER_CONFIG_IN_FLIGHT_LIMIT__SHIFT) & A2XX_MH_ARBITER_CONFIG_IN_FLIGHT_LIMIT__MASK; 345 + } 346 + #define A2XX_MH_ARBITER_CONFIG_CP_CLNT_ENABLE 0x00400000 347 + #define A2XX_MH_ARBITER_CONFIG_VGT_CLNT_ENABLE 0x00800000 348 + #define A2XX_MH_ARBITER_CONFIG_TC_CLNT_ENABLE 0x01000000 349 + #define A2XX_MH_ARBITER_CONFIG_RB_CLNT_ENABLE 0x02000000 350 + #define A2XX_MH_ARBITER_CONFIG_PA_CLNT_ENABLE 0x04000000 319 351 320 352 #define REG_A2XX_A220_VSC_BIN_SIZE 0x00000c01 321 353 #define A2XX_A220_VSC_BIN_SIZE_WIDTH__MASK 0x0000001f
+34 -12
drivers/gpu/drm/msm/adreno/a3xx.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml ( 327 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 30005 bytes, from 2013-07-19 21:30:48) 13 + - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 31003 bytes, from 2013-09-19 18:50:16) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/adreno_common.xml ( 8983 bytes, from 2013-07-24 01:38:36) 15 - - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9712 bytes, from 2013-05-26 15:22:37) 16 - - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51415 bytes, from 2013-08-03 14:26:05) 15 + - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9759 bytes, from 2013-09-10 00:52:33) 16 + - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51983 bytes, from 2013-09-10 00:52:32) 17 17 18 18 Copyright (C) 2013 by the following authors: 19 19 - Rob Clark <robdclark@gmail.com> (robclark) ··· 637 637 #define REG_A3XX_GRAS_SU_MODE_CONTROL 0x00002070 638 638 #define A3XX_GRAS_SU_MODE_CONTROL_CULL_FRONT 0x00000001 639 639 #define A3XX_GRAS_SU_MODE_CONTROL_CULL_BACK 0x00000002 640 - #define A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__MASK 0x000007fc 641 - #define A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__SHIFT 2 642 - static inline uint32_t A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH(uint32_t val) 640 + #define A3XX_GRAS_SU_MODE_CONTROL_FRONT_CW 0x00000004 641 + #define A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__MASK 0x000007f8 642 + #define A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__SHIFT 3 643 + static inline uint32_t A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH(float val) 643 644 { 644 - return ((val) << A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__SHIFT) & A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__MASK; 645 + return ((((uint32_t)(val * 4.0))) << A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__SHIFT) & A3XX_GRAS_SU_MODE_CONTROL_LINEHALFWIDTH__MASK; 645 646 } 646 647 #define A3XX_GRAS_SU_MODE_CONTROL_POLY_OFFSET 0x00000800 647 648 ··· 746 745 } 747 746 #define A3XX_RB_RENDER_CONTROL_DISABLE_COLOR_PIPE 0x00001000 748 747 #define A3XX_RB_RENDER_CONTROL_ENABLE_GMEM 0x00002000 748 + #define A3XX_RB_RENDER_CONTROL_ALPHA_TEST 0x00400000 749 749 #define A3XX_RB_RENDER_CONTROL_ALPHA_TEST_FUNC__MASK 0x07000000 750 750 #define A3XX_RB_RENDER_CONTROL_ALPHA_TEST_FUNC__SHIFT 24 751 751 static inline uint32_t A3XX_RB_RENDER_CONTROL_ALPHA_TEST_FUNC(enum adreno_compare_func val) ··· 769 767 return ((val) << A3XX_RB_MSAA_CONTROL_SAMPLE_MASK__SHIFT) & A3XX_RB_MSAA_CONTROL_SAMPLE_MASK__MASK; 770 768 } 771 769 772 - #define REG_A3XX_UNKNOWN_20C3 0x000020c3 770 + #define REG_A3XX_RB_ALPHA_REF 0x000020c3 771 + #define A3XX_RB_ALPHA_REF_UINT__MASK 0x0000ff00 772 + #define A3XX_RB_ALPHA_REF_UINT__SHIFT 8 773 + static inline uint32_t A3XX_RB_ALPHA_REF_UINT(uint32_t val) 774 + { 775 + return ((val) << A3XX_RB_ALPHA_REF_UINT__SHIFT) & A3XX_RB_ALPHA_REF_UINT__MASK; 776 + } 777 + #define A3XX_RB_ALPHA_REF_FLOAT__MASK 0xffff0000 778 + #define A3XX_RB_ALPHA_REF_FLOAT__SHIFT 16 779 + static inline uint32_t A3XX_RB_ALPHA_REF_FLOAT(float val) 780 + { 781 + return ((util_float_to_half(val)) << A3XX_RB_ALPHA_REF_FLOAT__SHIFT) & A3XX_RB_ALPHA_REF_FLOAT__MASK; 782 + } 773 783 774 784 static inline uint32_t REG_A3XX_RB_MRT(uint32_t i0) { return 0x000020c4 + 0x4*i0; } 775 785 ··· 1016 1002 #define REG_A3XX_RB_DEPTH_CONTROL 0x00002100 1017 1003 #define A3XX_RB_DEPTH_CONTROL_Z_ENABLE 0x00000002 1018 1004 #define A3XX_RB_DEPTH_CONTROL_Z_WRITE_ENABLE 0x00000004 1019 - #define A3XX_RB_DEPTH_CONTROL_EARLY_Z_ENABLE 0x00000008 1005 + #define A3XX_RB_DEPTH_CONTROL_EARLY_Z_DISABLE 0x00000008 1020 1006 #define A3XX_RB_DEPTH_CONTROL_ZFUNC__MASK 0x00000070 1021 1007 #define A3XX_RB_DEPTH_CONTROL_ZFUNC__SHIFT 4 1022 1008 static inline uint32_t A3XX_RB_DEPTH_CONTROL_ZFUNC(enum adreno_compare_func val) ··· 1052 1038 1053 1039 #define REG_A3XX_RB_STENCIL_CONTROL 0x00002104 1054 1040 #define A3XX_RB_STENCIL_CONTROL_STENCIL_ENABLE 0x00000001 1055 - #define A3XX_RB_STENCIL_CONTROL_STENCIL_ENABLE_BF 0x00000004 1041 + #define A3XX_RB_STENCIL_CONTROL_STENCIL_ENABLE_BF 0x00000002 1042 + #define A3XX_RB_STENCIL_CONTROL_STENCIL_READ 0x00000004 1056 1043 #define A3XX_RB_STENCIL_CONTROL_FUNC__MASK 0x00000700 1057 1044 #define A3XX_RB_STENCIL_CONTROL_FUNC__SHIFT 8 1058 1045 static inline uint32_t A3XX_RB_STENCIL_CONTROL_FUNC(enum adreno_compare_func val) ··· 2089 2074 #define REG_A3XX_TP_PERFCOUNTER5_SELECT 0x00000f09 2090 2075 2091 2076 #define REG_A3XX_TEX_SAMP_0 0x00000000 2077 + #define A3XX_TEX_SAMP_0_MIPFILTER_LINEAR 0x00000002 2092 2078 #define A3XX_TEX_SAMP_0_XY_MAG__MASK 0x0000000c 2093 2079 #define A3XX_TEX_SAMP_0_XY_MAG__SHIFT 2 2094 2080 static inline uint32_t A3XX_TEX_SAMP_0_XY_MAG(enum a3xx_tex_filter val) ··· 2149 2133 static inline uint32_t A3XX_TEX_CONST_0_SWIZ_W(enum a3xx_tex_swiz val) 2150 2134 { 2151 2135 return ((val) << A3XX_TEX_CONST_0_SWIZ_W__SHIFT) & A3XX_TEX_CONST_0_SWIZ_W__MASK; 2136 + } 2137 + #define A3XX_TEX_CONST_0_MIPLVLS__MASK 0x000f0000 2138 + #define A3XX_TEX_CONST_0_MIPLVLS__SHIFT 16 2139 + static inline uint32_t A3XX_TEX_CONST_0_MIPLVLS(uint32_t val) 2140 + { 2141 + return ((val) << A3XX_TEX_CONST_0_MIPLVLS__SHIFT) & A3XX_TEX_CONST_0_MIPLVLS__MASK; 2152 2142 } 2153 2143 #define A3XX_TEX_CONST_0_FMT__MASK 0x1fc00000 2154 2144 #define A3XX_TEX_CONST_0_FMT__SHIFT 22
+5 -5
drivers/gpu/drm/msm/adreno/adreno_common.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml ( 327 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 30005 bytes, from 2013-07-19 21:30:48) 13 + - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 31003 bytes, from 2013-09-19 18:50:16) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/adreno_common.xml ( 8983 bytes, from 2013-07-24 01:38:36) 15 - - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9712 bytes, from 2013-05-26 15:22:37) 16 - - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51415 bytes, from 2013-08-03 14:26:05) 15 + - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9759 bytes, from 2013-09-10 00:52:33) 16 + - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51983 bytes, from 2013-09-10 00:52:32) 17 17 18 18 Copyright (C) 2013 by the following authors: 19 19 - Rob Clark <robdclark@gmail.com> (robclark)
+5 -5
drivers/gpu/drm/msm/adreno/adreno_pm4.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/adreno.xml ( 327 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 30005 bytes, from 2013-07-19 21:30:48) 13 + - /home/robclark/src/freedreno/envytools/rnndb/a2xx/a2xx.xml ( 31003 bytes, from 2013-09-19 18:50:16) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/adreno_common.xml ( 8983 bytes, from 2013-07-24 01:38:36) 15 - - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9712 bytes, from 2013-05-26 15:22:37) 16 - - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51415 bytes, from 2013-08-03 14:26:05) 15 + - /home/robclark/src/freedreno/envytools/rnndb/adreno_pm4.xml ( 9759 bytes, from 2013-09-10 00:52:33) 16 + - /home/robclark/src/freedreno/envytools/rnndb/a3xx/a3xx.xml ( 51983 bytes, from 2013-09-10 00:52:32) 17 17 18 18 Copyright (C) 2013 by the following authors: 19 19 - Rob Clark <robdclark@gmail.com> (robclark)
+3 -3
drivers/gpu/drm/msm/dsi/dsi.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/msm.xml ( 595 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-08-16 22:16:36) 13 + - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-10-07 16:36:48) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml ( 11712 bytes, from 2013-08-17 17:13:43) 15 15 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml ( 344 bytes, from 2013-08-11 19:26:32) 16 16 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml ( 1544 bytes, from 2013-08-16 19:17:05)
+3 -3
drivers/gpu/drm/msm/dsi/mmss_cc.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/msm.xml ( 595 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-08-16 22:16:36) 13 + - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-10-07 16:36:48) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml ( 11712 bytes, from 2013-08-17 17:13:43) 15 15 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml ( 344 bytes, from 2013-08-11 19:26:32) 16 16 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml ( 1544 bytes, from 2013-08-16 19:17:05)
+3 -3
drivers/gpu/drm/msm/dsi/sfpb.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/msm.xml ( 595 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-08-16 22:16:36) 13 + - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-10-07 16:36:48) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml ( 11712 bytes, from 2013-08-17 17:13:43) 15 15 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml ( 344 bytes, from 2013-08-11 19:26:32) 16 16 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml ( 1544 bytes, from 2013-08-16 19:17:05)
+3 -3
drivers/gpu/drm/msm/hdmi/hdmi.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/msm.xml ( 595 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-08-16 22:16:36) 13 + - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-10-07 16:36:48) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml ( 11712 bytes, from 2013-08-17 17:13:43) 15 15 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml ( 344 bytes, from 2013-08-11 19:26:32) 16 16 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml ( 1544 bytes, from 2013-08-16 19:17:05)
+3 -3
drivers/gpu/drm/msm/hdmi/qfprom.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/msm.xml ( 595 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-08-16 22:16:36) 13 + - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-10-07 16:36:48) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml ( 11712 bytes, from 2013-08-17 17:13:43) 15 15 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml ( 344 bytes, from 2013-08-11 19:26:32) 16 16 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml ( 1544 bytes, from 2013-08-16 19:17:05)
+63 -63
drivers/gpu/drm/msm/mdp4/mdp4.xml.h
··· 4 4 /* Autogenerated file, DO NOT EDIT manually! 5 5 6 6 This file was generated by the rules-ng-ng headergen tool in this git repository: 7 - http://0x04.net/cgit/index.cgi/rules-ng-ng 8 - git clone git://0x04.net/rules-ng-ng 7 + http://github.com/freedreno/envytools/ 8 + git clone https://github.com/freedreno/envytools.git 9 9 10 10 The rules-ng-ng source files this header was generated from are: 11 11 - /home/robclark/src/freedreno/envytools/rnndb/msm.xml ( 595 bytes, from 2013-07-05 19:21:12) 12 12 - /home/robclark/src/freedreno/envytools/rnndb/freedreno_copyright.xml ( 1453 bytes, from 2013-03-31 16:51:27) 13 - - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-08-16 22:16:36) 13 + - /home/robclark/src/freedreno/envytools/rnndb/mdp4/mdp4.xml ( 19332 bytes, from 2013-10-07 16:36:48) 14 14 - /home/robclark/src/freedreno/envytools/rnndb/dsi/dsi.xml ( 11712 bytes, from 2013-08-17 17:13:43) 15 15 - /home/robclark/src/freedreno/envytools/rnndb/dsi/sfpb.xml ( 344 bytes, from 2013-08-11 19:26:32) 16 16 - /home/robclark/src/freedreno/envytools/rnndb/dsi/mmss_cc.xml ( 1544 bytes, from 2013-08-16 19:17:05) ··· 42 42 */ 43 43 44 44 45 - enum mpd4_bpc { 45 + enum mdp4_bpc { 46 46 BPC1 = 0, 47 47 BPC5 = 1, 48 48 BPC6 = 2, 49 49 BPC8 = 3, 50 50 }; 51 51 52 - enum mpd4_bpc_alpha { 52 + enum mdp4_bpc_alpha { 53 53 BPC1A = 0, 54 54 BPC4A = 1, 55 55 BPC6A = 2, 56 56 BPC8A = 3, 57 57 }; 58 58 59 - enum mpd4_alpha_type { 59 + enum mdp4_alpha_type { 60 60 FG_CONST = 0, 61 61 BG_CONST = 1, 62 62 FG_PIXEL = 2, 63 63 BG_PIXEL = 3, 64 64 }; 65 65 66 - enum mpd4_pipe { 66 + enum mdp4_pipe { 67 67 VG1 = 0, 68 68 VG2 = 1, 69 69 RGB1 = 2, ··· 73 73 VG4 = 6, 74 74 }; 75 75 76 - enum mpd4_mixer { 76 + enum mdp4_mixer { 77 77 MIXER0 = 0, 78 78 MIXER1 = 1, 79 79 MIXER2 = 2, 80 80 }; 81 81 82 - enum mpd4_mixer_stage_id { 82 + enum mdp4_mixer_stage_id { 83 83 STAGE_UNUSED = 0, 84 84 STAGE_BASE = 1, 85 85 STAGE0 = 2, ··· 194 194 #define REG_MDP4_LAYERMIXER2_IN_CFG 0x000100f0 195 195 #define MDP4_LAYERMIXER2_IN_CFG_PIPE0__MASK 0x00000007 196 196 #define MDP4_LAYERMIXER2_IN_CFG_PIPE0__SHIFT 0 197 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE0(enum mpd4_mixer_stage_id val) 197 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE0(enum mdp4_mixer_stage_id val) 198 198 { 199 199 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE0__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE0__MASK; 200 200 } 201 201 #define MDP4_LAYERMIXER2_IN_CFG_PIPE0_MIXER1 0x00000008 202 202 #define MDP4_LAYERMIXER2_IN_CFG_PIPE1__MASK 0x00000070 203 203 #define MDP4_LAYERMIXER2_IN_CFG_PIPE1__SHIFT 4 204 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE1(enum mpd4_mixer_stage_id val) 204 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE1(enum mdp4_mixer_stage_id val) 205 205 { 206 206 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE1__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE1__MASK; 207 207 } 208 208 #define MDP4_LAYERMIXER2_IN_CFG_PIPE1_MIXER1 0x00000080 209 209 #define MDP4_LAYERMIXER2_IN_CFG_PIPE2__MASK 0x00000700 210 210 #define MDP4_LAYERMIXER2_IN_CFG_PIPE2__SHIFT 8 211 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE2(enum mpd4_mixer_stage_id val) 211 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE2(enum mdp4_mixer_stage_id val) 212 212 { 213 213 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE2__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE2__MASK; 214 214 } 215 215 #define MDP4_LAYERMIXER2_IN_CFG_PIPE2_MIXER1 0x00000800 216 216 #define MDP4_LAYERMIXER2_IN_CFG_PIPE3__MASK 0x00007000 217 217 #define MDP4_LAYERMIXER2_IN_CFG_PIPE3__SHIFT 12 218 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE3(enum mpd4_mixer_stage_id val) 218 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE3(enum mdp4_mixer_stage_id val) 219 219 { 220 220 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE3__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE3__MASK; 221 221 } 222 222 #define MDP4_LAYERMIXER2_IN_CFG_PIPE3_MIXER1 0x00008000 223 223 #define MDP4_LAYERMIXER2_IN_CFG_PIPE4__MASK 0x00070000 224 224 #define MDP4_LAYERMIXER2_IN_CFG_PIPE4__SHIFT 16 225 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE4(enum mpd4_mixer_stage_id val) 225 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE4(enum mdp4_mixer_stage_id val) 226 226 { 227 227 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE4__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE4__MASK; 228 228 } 229 229 #define MDP4_LAYERMIXER2_IN_CFG_PIPE4_MIXER1 0x00080000 230 230 #define MDP4_LAYERMIXER2_IN_CFG_PIPE5__MASK 0x00700000 231 231 #define MDP4_LAYERMIXER2_IN_CFG_PIPE5__SHIFT 20 232 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE5(enum mpd4_mixer_stage_id val) 232 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE5(enum mdp4_mixer_stage_id val) 233 233 { 234 234 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE5__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE5__MASK; 235 235 } 236 236 #define MDP4_LAYERMIXER2_IN_CFG_PIPE5_MIXER1 0x00800000 237 237 #define MDP4_LAYERMIXER2_IN_CFG_PIPE6__MASK 0x07000000 238 238 #define MDP4_LAYERMIXER2_IN_CFG_PIPE6__SHIFT 24 239 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE6(enum mpd4_mixer_stage_id val) 239 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE6(enum mdp4_mixer_stage_id val) 240 240 { 241 241 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE6__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE6__MASK; 242 242 } 243 243 #define MDP4_LAYERMIXER2_IN_CFG_PIPE6_MIXER1 0x08000000 244 244 #define MDP4_LAYERMIXER2_IN_CFG_PIPE7__MASK 0x70000000 245 245 #define MDP4_LAYERMIXER2_IN_CFG_PIPE7__SHIFT 28 246 - static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE7(enum mpd4_mixer_stage_id val) 246 + static inline uint32_t MDP4_LAYERMIXER2_IN_CFG_PIPE7(enum mdp4_mixer_stage_id val) 247 247 { 248 248 return ((val) << MDP4_LAYERMIXER2_IN_CFG_PIPE7__SHIFT) & MDP4_LAYERMIXER2_IN_CFG_PIPE7__MASK; 249 249 } ··· 254 254 #define REG_MDP4_LAYERMIXER_IN_CFG 0x00010100 255 255 #define MDP4_LAYERMIXER_IN_CFG_PIPE0__MASK 0x00000007 256 256 #define MDP4_LAYERMIXER_IN_CFG_PIPE0__SHIFT 0 257 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE0(enum mpd4_mixer_stage_id val) 257 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE0(enum mdp4_mixer_stage_id val) 258 258 { 259 259 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE0__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE0__MASK; 260 260 } 261 261 #define MDP4_LAYERMIXER_IN_CFG_PIPE0_MIXER1 0x00000008 262 262 #define MDP4_LAYERMIXER_IN_CFG_PIPE1__MASK 0x00000070 263 263 #define MDP4_LAYERMIXER_IN_CFG_PIPE1__SHIFT 4 264 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE1(enum mpd4_mixer_stage_id val) 264 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE1(enum mdp4_mixer_stage_id val) 265 265 { 266 266 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE1__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE1__MASK; 267 267 } 268 268 #define MDP4_LAYERMIXER_IN_CFG_PIPE1_MIXER1 0x00000080 269 269 #define MDP4_LAYERMIXER_IN_CFG_PIPE2__MASK 0x00000700 270 270 #define MDP4_LAYERMIXER_IN_CFG_PIPE2__SHIFT 8 271 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE2(enum mpd4_mixer_stage_id val) 271 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE2(enum mdp4_mixer_stage_id val) 272 272 { 273 273 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE2__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE2__MASK; 274 274 } 275 275 #define MDP4_LAYERMIXER_IN_CFG_PIPE2_MIXER1 0x00000800 276 276 #define MDP4_LAYERMIXER_IN_CFG_PIPE3__MASK 0x00007000 277 277 #define MDP4_LAYERMIXER_IN_CFG_PIPE3__SHIFT 12 278 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE3(enum mpd4_mixer_stage_id val) 278 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE3(enum mdp4_mixer_stage_id val) 279 279 { 280 280 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE3__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE3__MASK; 281 281 } 282 282 #define MDP4_LAYERMIXER_IN_CFG_PIPE3_MIXER1 0x00008000 283 283 #define MDP4_LAYERMIXER_IN_CFG_PIPE4__MASK 0x00070000 284 284 #define MDP4_LAYERMIXER_IN_CFG_PIPE4__SHIFT 16 285 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE4(enum mpd4_mixer_stage_id val) 285 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE4(enum mdp4_mixer_stage_id val) 286 286 { 287 287 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE4__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE4__MASK; 288 288 } 289 289 #define MDP4_LAYERMIXER_IN_CFG_PIPE4_MIXER1 0x00080000 290 290 #define MDP4_LAYERMIXER_IN_CFG_PIPE5__MASK 0x00700000 291 291 #define MDP4_LAYERMIXER_IN_CFG_PIPE5__SHIFT 20 292 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE5(enum mpd4_mixer_stage_id val) 292 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE5(enum mdp4_mixer_stage_id val) 293 293 { 294 294 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE5__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE5__MASK; 295 295 } 296 296 #define MDP4_LAYERMIXER_IN_CFG_PIPE5_MIXER1 0x00800000 297 297 #define MDP4_LAYERMIXER_IN_CFG_PIPE6__MASK 0x07000000 298 298 #define MDP4_LAYERMIXER_IN_CFG_PIPE6__SHIFT 24 299 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE6(enum mpd4_mixer_stage_id val) 299 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE6(enum mdp4_mixer_stage_id val) 300 300 { 301 301 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE6__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE6__MASK; 302 302 } 303 303 #define MDP4_LAYERMIXER_IN_CFG_PIPE6_MIXER1 0x08000000 304 304 #define MDP4_LAYERMIXER_IN_CFG_PIPE7__MASK 0x70000000 305 305 #define MDP4_LAYERMIXER_IN_CFG_PIPE7__SHIFT 28 306 - static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE7(enum mpd4_mixer_stage_id val) 306 + static inline uint32_t MDP4_LAYERMIXER_IN_CFG_PIPE7(enum mdp4_mixer_stage_id val) 307 307 { 308 308 return ((val) << MDP4_LAYERMIXER_IN_CFG_PIPE7__SHIFT) & MDP4_LAYERMIXER_IN_CFG_PIPE7__MASK; 309 309 } ··· 369 369 static inline uint32_t REG_MDP4_OVLP_STAGE_OP(uint32_t i0, uint32_t i1) { return 0x00000000 + __offset_OVLP(i0) + __offset_STAGE(i1); } 370 370 #define MDP4_OVLP_STAGE_OP_FG_ALPHA__MASK 0x00000003 371 371 #define MDP4_OVLP_STAGE_OP_FG_ALPHA__SHIFT 0 372 - static inline uint32_t MDP4_OVLP_STAGE_OP_FG_ALPHA(enum mpd4_alpha_type val) 372 + static inline uint32_t MDP4_OVLP_STAGE_OP_FG_ALPHA(enum mdp4_alpha_type val) 373 373 { 374 374 return ((val) << MDP4_OVLP_STAGE_OP_FG_ALPHA__SHIFT) & MDP4_OVLP_STAGE_OP_FG_ALPHA__MASK; 375 375 } ··· 377 377 #define MDP4_OVLP_STAGE_OP_FG_MOD_ALPHA 0x00000008 378 378 #define MDP4_OVLP_STAGE_OP_BG_ALPHA__MASK 0x00000030 379 379 #define MDP4_OVLP_STAGE_OP_BG_ALPHA__SHIFT 4 380 - static inline uint32_t MDP4_OVLP_STAGE_OP_BG_ALPHA(enum mpd4_alpha_type val) 380 + static inline uint32_t MDP4_OVLP_STAGE_OP_BG_ALPHA(enum mdp4_alpha_type val) 381 381 { 382 382 return ((val) << MDP4_OVLP_STAGE_OP_BG_ALPHA__SHIFT) & MDP4_OVLP_STAGE_OP_BG_ALPHA__MASK; 383 383 } ··· 472 472 static inline uint32_t REG_MDP4_DMA_CONFIG(enum mdp4_dma i0) { return 0x00000000 + __offset_DMA(i0); } 473 473 #define MDP4_DMA_CONFIG_G_BPC__MASK 0x00000003 474 474 #define MDP4_DMA_CONFIG_G_BPC__SHIFT 0 475 - static inline uint32_t MDP4_DMA_CONFIG_G_BPC(enum mpd4_bpc val) 475 + static inline uint32_t MDP4_DMA_CONFIG_G_BPC(enum mdp4_bpc val) 476 476 { 477 477 return ((val) << MDP4_DMA_CONFIG_G_BPC__SHIFT) & MDP4_DMA_CONFIG_G_BPC__MASK; 478 478 } 479 479 #define MDP4_DMA_CONFIG_B_BPC__MASK 0x0000000c 480 480 #define MDP4_DMA_CONFIG_B_BPC__SHIFT 2 481 - static inline uint32_t MDP4_DMA_CONFIG_B_BPC(enum mpd4_bpc val) 481 + static inline uint32_t MDP4_DMA_CONFIG_B_BPC(enum mdp4_bpc val) 482 482 { 483 483 return ((val) << MDP4_DMA_CONFIG_B_BPC__SHIFT) & MDP4_DMA_CONFIG_B_BPC__MASK; 484 484 } 485 485 #define MDP4_DMA_CONFIG_R_BPC__MASK 0x00000030 486 486 #define MDP4_DMA_CONFIG_R_BPC__SHIFT 4 487 - static inline uint32_t MDP4_DMA_CONFIG_R_BPC(enum mpd4_bpc val) 487 + static inline uint32_t MDP4_DMA_CONFIG_R_BPC(enum mdp4_bpc val) 488 488 { 489 489 return ((val) << MDP4_DMA_CONFIG_R_BPC__SHIFT) & MDP4_DMA_CONFIG_R_BPC__MASK; 490 490 } ··· 601 601 602 602 static inline uint32_t REG_MDP4_DMA_CSC_POST_LV_VAL(enum mdp4_dma i0, uint32_t i1) { return 0x00003680 + __offset_DMA(i0) + 0x4*i1; } 603 603 604 - static inline uint32_t REG_MDP4_PIPE(enum mpd4_pipe i0) { return 0x00020000 + 0x10000*i0; } 604 + static inline uint32_t REG_MDP4_PIPE(enum mdp4_pipe i0) { return 0x00020000 + 0x10000*i0; } 605 605 606 - static inline uint32_t REG_MDP4_PIPE_SRC_SIZE(enum mpd4_pipe i0) { return 0x00020000 + 0x10000*i0; } 606 + static inline uint32_t REG_MDP4_PIPE_SRC_SIZE(enum mdp4_pipe i0) { return 0x00020000 + 0x10000*i0; } 607 607 #define MDP4_PIPE_SRC_SIZE_HEIGHT__MASK 0xffff0000 608 608 #define MDP4_PIPE_SRC_SIZE_HEIGHT__SHIFT 16 609 609 static inline uint32_t MDP4_PIPE_SRC_SIZE_HEIGHT(uint32_t val) ··· 617 617 return ((val) << MDP4_PIPE_SRC_SIZE_WIDTH__SHIFT) & MDP4_PIPE_SRC_SIZE_WIDTH__MASK; 618 618 } 619 619 620 - static inline uint32_t REG_MDP4_PIPE_SRC_XY(enum mpd4_pipe i0) { return 0x00020004 + 0x10000*i0; } 620 + static inline uint32_t REG_MDP4_PIPE_SRC_XY(enum mdp4_pipe i0) { return 0x00020004 + 0x10000*i0; } 621 621 #define MDP4_PIPE_SRC_XY_Y__MASK 0xffff0000 622 622 #define MDP4_PIPE_SRC_XY_Y__SHIFT 16 623 623 static inline uint32_t MDP4_PIPE_SRC_XY_Y(uint32_t val) ··· 631 631 return ((val) << MDP4_PIPE_SRC_XY_X__SHIFT) & MDP4_PIPE_SRC_XY_X__MASK; 632 632 } 633 633 634 - static inline uint32_t REG_MDP4_PIPE_DST_SIZE(enum mpd4_pipe i0) { return 0x00020008 + 0x10000*i0; } 634 + static inline uint32_t REG_MDP4_PIPE_DST_SIZE(enum mdp4_pipe i0) { return 0x00020008 + 0x10000*i0; } 635 635 #define MDP4_PIPE_DST_SIZE_HEIGHT__MASK 0xffff0000 636 636 #define MDP4_PIPE_DST_SIZE_HEIGHT__SHIFT 16 637 637 static inline uint32_t MDP4_PIPE_DST_SIZE_HEIGHT(uint32_t val) ··· 645 645 return ((val) << MDP4_PIPE_DST_SIZE_WIDTH__SHIFT) & MDP4_PIPE_DST_SIZE_WIDTH__MASK; 646 646 } 647 647 648 - static inline uint32_t REG_MDP4_PIPE_DST_XY(enum mpd4_pipe i0) { return 0x0002000c + 0x10000*i0; } 648 + static inline uint32_t REG_MDP4_PIPE_DST_XY(enum mdp4_pipe i0) { return 0x0002000c + 0x10000*i0; } 649 649 #define MDP4_PIPE_DST_XY_Y__MASK 0xffff0000 650 650 #define MDP4_PIPE_DST_XY_Y__SHIFT 16 651 651 static inline uint32_t MDP4_PIPE_DST_XY_Y(uint32_t val) ··· 659 659 return ((val) << MDP4_PIPE_DST_XY_X__SHIFT) & MDP4_PIPE_DST_XY_X__MASK; 660 660 } 661 661 662 - static inline uint32_t REG_MDP4_PIPE_SRCP0_BASE(enum mpd4_pipe i0) { return 0x00020010 + 0x10000*i0; } 662 + static inline uint32_t REG_MDP4_PIPE_SRCP0_BASE(enum mdp4_pipe i0) { return 0x00020010 + 0x10000*i0; } 663 663 664 - static inline uint32_t REG_MDP4_PIPE_SRCP1_BASE(enum mpd4_pipe i0) { return 0x00020014 + 0x10000*i0; } 664 + static inline uint32_t REG_MDP4_PIPE_SRCP1_BASE(enum mdp4_pipe i0) { return 0x00020014 + 0x10000*i0; } 665 665 666 - static inline uint32_t REG_MDP4_PIPE_SRCP2_BASE(enum mpd4_pipe i0) { return 0x00020018 + 0x10000*i0; } 666 + static inline uint32_t REG_MDP4_PIPE_SRCP2_BASE(enum mdp4_pipe i0) { return 0x00020018 + 0x10000*i0; } 667 667 668 - static inline uint32_t REG_MDP4_PIPE_SRC_STRIDE_A(enum mpd4_pipe i0) { return 0x00020040 + 0x10000*i0; } 668 + static inline uint32_t REG_MDP4_PIPE_SRC_STRIDE_A(enum mdp4_pipe i0) { return 0x00020040 + 0x10000*i0; } 669 669 #define MDP4_PIPE_SRC_STRIDE_A_P0__MASK 0x0000ffff 670 670 #define MDP4_PIPE_SRC_STRIDE_A_P0__SHIFT 0 671 671 static inline uint32_t MDP4_PIPE_SRC_STRIDE_A_P0(uint32_t val) ··· 679 679 return ((val) << MDP4_PIPE_SRC_STRIDE_A_P1__SHIFT) & MDP4_PIPE_SRC_STRIDE_A_P1__MASK; 680 680 } 681 681 682 - static inline uint32_t REG_MDP4_PIPE_SRC_STRIDE_B(enum mpd4_pipe i0) { return 0x00020044 + 0x10000*i0; } 682 + static inline uint32_t REG_MDP4_PIPE_SRC_STRIDE_B(enum mdp4_pipe i0) { return 0x00020044 + 0x10000*i0; } 683 683 #define MDP4_PIPE_SRC_STRIDE_B_P2__MASK 0x0000ffff 684 684 #define MDP4_PIPE_SRC_STRIDE_B_P2__SHIFT 0 685 685 static inline uint32_t MDP4_PIPE_SRC_STRIDE_B_P2(uint32_t val) ··· 693 693 return ((val) << MDP4_PIPE_SRC_STRIDE_B_P3__SHIFT) & MDP4_PIPE_SRC_STRIDE_B_P3__MASK; 694 694 } 695 695 696 - static inline uint32_t REG_MDP4_PIPE_FRAME_SIZE(enum mpd4_pipe i0) { return 0x00020048 + 0x10000*i0; } 696 + static inline uint32_t REG_MDP4_PIPE_FRAME_SIZE(enum mdp4_pipe i0) { return 0x00020048 + 0x10000*i0; } 697 697 #define MDP4_PIPE_FRAME_SIZE_HEIGHT__MASK 0xffff0000 698 698 #define MDP4_PIPE_FRAME_SIZE_HEIGHT__SHIFT 16 699 699 static inline uint32_t MDP4_PIPE_FRAME_SIZE_HEIGHT(uint32_t val) ··· 707 707 return ((val) << MDP4_PIPE_FRAME_SIZE_WIDTH__SHIFT) & MDP4_PIPE_FRAME_SIZE_WIDTH__MASK; 708 708 } 709 709 710 - static inline uint32_t REG_MDP4_PIPE_SRC_FORMAT(enum mpd4_pipe i0) { return 0x00020050 + 0x10000*i0; } 710 + static inline uint32_t REG_MDP4_PIPE_SRC_FORMAT(enum mdp4_pipe i0) { return 0x00020050 + 0x10000*i0; } 711 711 #define MDP4_PIPE_SRC_FORMAT_G_BPC__MASK 0x00000003 712 712 #define MDP4_PIPE_SRC_FORMAT_G_BPC__SHIFT 0 713 - static inline uint32_t MDP4_PIPE_SRC_FORMAT_G_BPC(enum mpd4_bpc val) 713 + static inline uint32_t MDP4_PIPE_SRC_FORMAT_G_BPC(enum mdp4_bpc val) 714 714 { 715 715 return ((val) << MDP4_PIPE_SRC_FORMAT_G_BPC__SHIFT) & MDP4_PIPE_SRC_FORMAT_G_BPC__MASK; 716 716 } 717 717 #define MDP4_PIPE_SRC_FORMAT_B_BPC__MASK 0x0000000c 718 718 #define MDP4_PIPE_SRC_FORMAT_B_BPC__SHIFT 2 719 - static inline uint32_t MDP4_PIPE_SRC_FORMAT_B_BPC(enum mpd4_bpc val) 719 + static inline uint32_t MDP4_PIPE_SRC_FORMAT_B_BPC(enum mdp4_bpc val) 720 720 { 721 721 return ((val) << MDP4_PIPE_SRC_FORMAT_B_BPC__SHIFT) & MDP4_PIPE_SRC_FORMAT_B_BPC__MASK; 722 722 } 723 723 #define MDP4_PIPE_SRC_FORMAT_R_BPC__MASK 0x00000030 724 724 #define MDP4_PIPE_SRC_FORMAT_R_BPC__SHIFT 4 725 - static inline uint32_t MDP4_PIPE_SRC_FORMAT_R_BPC(enum mpd4_bpc val) 725 + static inline uint32_t MDP4_PIPE_SRC_FORMAT_R_BPC(enum mdp4_bpc val) 726 726 { 727 727 return ((val) << MDP4_PIPE_SRC_FORMAT_R_BPC__SHIFT) & MDP4_PIPE_SRC_FORMAT_R_BPC__MASK; 728 728 } 729 729 #define MDP4_PIPE_SRC_FORMAT_A_BPC__MASK 0x000000c0 730 730 #define MDP4_PIPE_SRC_FORMAT_A_BPC__SHIFT 6 731 - static inline uint32_t MDP4_PIPE_SRC_FORMAT_A_BPC(enum mpd4_bpc_alpha val) 731 + static inline uint32_t MDP4_PIPE_SRC_FORMAT_A_BPC(enum mdp4_bpc_alpha val) 732 732 { 733 733 return ((val) << MDP4_PIPE_SRC_FORMAT_A_BPC__SHIFT) & MDP4_PIPE_SRC_FORMAT_A_BPC__MASK; 734 734 } ··· 750 750 #define MDP4_PIPE_SRC_FORMAT_UNPACK_ALIGN_MSB 0x00040000 751 751 #define MDP4_PIPE_SRC_FORMAT_SOLID_FILL 0x00400000 752 752 753 - static inline uint32_t REG_MDP4_PIPE_SRC_UNPACK(enum mpd4_pipe i0) { return 0x00020054 + 0x10000*i0; } 753 + static inline uint32_t REG_MDP4_PIPE_SRC_UNPACK(enum mdp4_pipe i0) { return 0x00020054 + 0x10000*i0; } 754 754 #define MDP4_PIPE_SRC_UNPACK_ELEM0__MASK 0x000000ff 755 755 #define MDP4_PIPE_SRC_UNPACK_ELEM0__SHIFT 0 756 756 static inline uint32_t MDP4_PIPE_SRC_UNPACK_ELEM0(uint32_t val) ··· 776 776 return ((val) << MDP4_PIPE_SRC_UNPACK_ELEM3__SHIFT) & MDP4_PIPE_SRC_UNPACK_ELEM3__MASK; 777 777 } 778 778 779 - static inline uint32_t REG_MDP4_PIPE_OP_MODE(enum mpd4_pipe i0) { return 0x00020058 + 0x10000*i0; } 779 + static inline uint32_t REG_MDP4_PIPE_OP_MODE(enum mdp4_pipe i0) { return 0x00020058 + 0x10000*i0; } 780 780 #define MDP4_PIPE_OP_MODE_SCALEX_EN 0x00000001 781 781 #define MDP4_PIPE_OP_MODE_SCALEY_EN 0x00000002 782 782 #define MDP4_PIPE_OP_MODE_SRC_YCBCR 0x00000200 ··· 789 789 #define MDP4_PIPE_OP_MODE_DEINT_EN 0x00040000 790 790 #define MDP4_PIPE_OP_MODE_DEINT_ODD_REF 0x00080000 791 791 792 - static inline uint32_t REG_MDP4_PIPE_PHASEX_STEP(enum mpd4_pipe i0) { return 0x0002005c + 0x10000*i0; } 792 + static inline uint32_t REG_MDP4_PIPE_PHASEX_STEP(enum mdp4_pipe i0) { return 0x0002005c + 0x10000*i0; } 793 793 794 - static inline uint32_t REG_MDP4_PIPE_PHASEY_STEP(enum mpd4_pipe i0) { return 0x00020060 + 0x10000*i0; } 794 + static inline uint32_t REG_MDP4_PIPE_PHASEY_STEP(enum mdp4_pipe i0) { return 0x00020060 + 0x10000*i0; } 795 795 796 - static inline uint32_t REG_MDP4_PIPE_FETCH_CONFIG(enum mpd4_pipe i0) { return 0x00021004 + 0x10000*i0; } 796 + static inline uint32_t REG_MDP4_PIPE_FETCH_CONFIG(enum mdp4_pipe i0) { return 0x00021004 + 0x10000*i0; } 797 797 798 - static inline uint32_t REG_MDP4_PIPE_SOLID_COLOR(enum mpd4_pipe i0) { return 0x00021008 + 0x10000*i0; } 798 + static inline uint32_t REG_MDP4_PIPE_SOLID_COLOR(enum mdp4_pipe i0) { return 0x00021008 + 0x10000*i0; } 799 799 800 - static inline uint32_t REG_MDP4_PIPE_CSC(enum mpd4_pipe i0) { return 0x00024000 + 0x10000*i0; } 800 + static inline uint32_t REG_MDP4_PIPE_CSC(enum mdp4_pipe i0) { return 0x00024000 + 0x10000*i0; } 801 801 802 802 803 - static inline uint32_t REG_MDP4_PIPE_CSC_MV(enum mpd4_pipe i0, uint32_t i1) { return 0x00024400 + 0x10000*i0 + 0x4*i1; } 803 + static inline uint32_t REG_MDP4_PIPE_CSC_MV(enum mdp4_pipe i0, uint32_t i1) { return 0x00024400 + 0x10000*i0 + 0x4*i1; } 804 804 805 - static inline uint32_t REG_MDP4_PIPE_CSC_MV_VAL(enum mpd4_pipe i0, uint32_t i1) { return 0x00024400 + 0x10000*i0 + 0x4*i1; } 805 + static inline uint32_t REG_MDP4_PIPE_CSC_MV_VAL(enum mdp4_pipe i0, uint32_t i1) { return 0x00024400 + 0x10000*i0 + 0x4*i1; } 806 806 807 - static inline uint32_t REG_MDP4_PIPE_CSC_PRE_BV(enum mpd4_pipe i0, uint32_t i1) { return 0x00024500 + 0x10000*i0 + 0x4*i1; } 807 + static inline uint32_t REG_MDP4_PIPE_CSC_PRE_BV(enum mdp4_pipe i0, uint32_t i1) { return 0x00024500 + 0x10000*i0 + 0x4*i1; } 808 808 809 - static inline uint32_t REG_MDP4_PIPE_CSC_PRE_BV_VAL(enum mpd4_pipe i0, uint32_t i1) { return 0x00024500 + 0x10000*i0 + 0x4*i1; } 809 + static inline uint32_t REG_MDP4_PIPE_CSC_PRE_BV_VAL(enum mdp4_pipe i0, uint32_t i1) { return 0x00024500 + 0x10000*i0 + 0x4*i1; } 810 810 811 - static inline uint32_t REG_MDP4_PIPE_CSC_POST_BV(enum mpd4_pipe i0, uint32_t i1) { return 0x00024580 + 0x10000*i0 + 0x4*i1; } 811 + static inline uint32_t REG_MDP4_PIPE_CSC_POST_BV(enum mdp4_pipe i0, uint32_t i1) { return 0x00024580 + 0x10000*i0 + 0x4*i1; } 812 812 813 - static inline uint32_t REG_MDP4_PIPE_CSC_POST_BV_VAL(enum mpd4_pipe i0, uint32_t i1) { return 0x00024580 + 0x10000*i0 + 0x4*i1; } 813 + static inline uint32_t REG_MDP4_PIPE_CSC_POST_BV_VAL(enum mdp4_pipe i0, uint32_t i1) { return 0x00024580 + 0x10000*i0 + 0x4*i1; } 814 814 815 - static inline uint32_t REG_MDP4_PIPE_CSC_PRE_LV(enum mpd4_pipe i0, uint32_t i1) { return 0x00024600 + 0x10000*i0 + 0x4*i1; } 815 + static inline uint32_t REG_MDP4_PIPE_CSC_PRE_LV(enum mdp4_pipe i0, uint32_t i1) { return 0x00024600 + 0x10000*i0 + 0x4*i1; } 816 816 817 - static inline uint32_t REG_MDP4_PIPE_CSC_PRE_LV_VAL(enum mpd4_pipe i0, uint32_t i1) { return 0x00024600 + 0x10000*i0 + 0x4*i1; } 817 + static inline uint32_t REG_MDP4_PIPE_CSC_PRE_LV_VAL(enum mdp4_pipe i0, uint32_t i1) { return 0x00024600 + 0x10000*i0 + 0x4*i1; } 818 818 819 - static inline uint32_t REG_MDP4_PIPE_CSC_POST_LV(enum mpd4_pipe i0, uint32_t i1) { return 0x00024680 + 0x10000*i0 + 0x4*i1; } 819 + static inline uint32_t REG_MDP4_PIPE_CSC_POST_LV(enum mdp4_pipe i0, uint32_t i1) { return 0x00024680 + 0x10000*i0 + 0x4*i1; } 820 820 821 - static inline uint32_t REG_MDP4_PIPE_CSC_POST_LV_VAL(enum mpd4_pipe i0, uint32_t i1) { return 0x00024680 + 0x10000*i0 + 0x4*i1; } 821 + static inline uint32_t REG_MDP4_PIPE_CSC_POST_LV_VAL(enum mdp4_pipe i0, uint32_t i1) { return 0x00024680 + 0x10000*i0 + 0x4*i1; } 822 822 823 823 #define REG_MDP4_LCDC 0x000c0000 824 824
+137 -69
drivers/gpu/drm/msm/mdp4/mdp4_crtc.c
··· 26 26 struct drm_crtc base; 27 27 char name[8]; 28 28 struct drm_plane *plane; 29 + struct drm_plane *planes[8]; 29 30 int id; 30 31 int ovlp; 31 32 enum mdp4_dma dma; ··· 51 50 52 51 /* if there is a pending flip, these will be non-null: */ 53 52 struct drm_pending_vblank_event *event; 54 - struct work_struct pageflip_work; 53 + struct msm_fence_cb pageflip_cb; 54 + 55 + #define PENDING_CURSOR 0x1 56 + #define PENDING_FLIP 0x2 57 + atomic_t pending; 55 58 56 59 /* the fb that we currently hold a scanout ref to: */ 57 60 struct drm_framebuffer *fb; ··· 97 92 } 98 93 } 99 94 100 - static void complete_flip(struct drm_crtc *crtc, bool canceled) 95 + /* if file!=NULL, this is preclose potential cancel-flip path */ 96 + static void complete_flip(struct drm_crtc *crtc, struct drm_file *file) 101 97 { 102 98 struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); 103 99 struct drm_device *dev = crtc->dev; ··· 108 102 spin_lock_irqsave(&dev->event_lock, flags); 109 103 event = mdp4_crtc->event; 110 104 if (event) { 111 - mdp4_crtc->event = NULL; 112 - if (canceled) 113 - event->base.destroy(&event->base); 114 - else 105 + /* if regular vblank case (!file) or if cancel-flip from 106 + * preclose on file that requested flip, then send the 107 + * event: 108 + */ 109 + if (!file || (event->base.file_priv == file)) { 110 + mdp4_crtc->event = NULL; 115 111 drm_send_vblank_event(dev, mdp4_crtc->id, event); 112 + } 116 113 } 117 114 spin_unlock_irqrestore(&dev->event_lock, flags); 118 115 } ··· 124 115 { 125 116 struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); 126 117 struct mdp4_kms *mdp4_kms = get_kms(crtc); 127 - uint32_t flush = 0; 118 + uint32_t i, flush = 0; 128 119 129 - flush |= pipe2flush(mdp4_plane_pipe(mdp4_crtc->plane)); 120 + for (i = 0; i < ARRAY_SIZE(mdp4_crtc->planes); i++) { 121 + struct drm_plane *plane = mdp4_crtc->planes[i]; 122 + if (plane) { 123 + enum mdp4_pipe pipe_id = mdp4_plane_pipe(plane); 124 + flush |= pipe2flush(pipe_id); 125 + } 126 + } 130 127 flush |= ovlp2flush(mdp4_crtc->ovlp); 131 128 132 129 DBG("%s: flush=%08x", mdp4_crtc->name, flush); ··· 140 125 mdp4_write(mdp4_kms, REG_MDP4_OVERLAY_FLUSH, flush); 141 126 } 142 127 143 - static void pageflip_worker(struct work_struct *work) 128 + static void request_pending(struct drm_crtc *crtc, uint32_t pending) 129 + { 130 + struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); 131 + 132 + atomic_or(pending, &mdp4_crtc->pending); 133 + mdp4_irq_register(get_kms(crtc), &mdp4_crtc->vblank); 134 + } 135 + 136 + static void pageflip_cb(struct msm_fence_cb *cb) 144 137 { 145 138 struct mdp4_crtc *mdp4_crtc = 146 - container_of(work, struct mdp4_crtc, pageflip_work); 139 + container_of(cb, struct mdp4_crtc, pageflip_cb); 147 140 struct drm_crtc *crtc = &mdp4_crtc->base; 141 + struct drm_framebuffer *fb = crtc->fb; 148 142 149 - mdp4_plane_set_scanout(mdp4_crtc->plane, crtc->fb); 143 + if (!fb) 144 + return; 145 + 146 + mdp4_plane_set_scanout(mdp4_crtc->plane, fb); 150 147 crtc_flush(crtc); 151 148 152 149 /* enable vblank to complete flip: */ 153 - mdp4_irq_register(get_kms(crtc), &mdp4_crtc->vblank); 150 + request_pending(crtc, PENDING_FLIP); 154 151 } 155 152 156 153 static void unref_fb_worker(struct drm_flip_work *work, void *val) ··· 232 205 struct mdp4_kms *mdp4_kms = get_kms(crtc); 233 206 int i, ovlp = mdp4_crtc->ovlp; 234 207 uint32_t mixer_cfg = 0; 208 + static const enum mdp4_mixer_stage_id stages[] = { 209 + STAGE_BASE, STAGE0, STAGE1, STAGE2, STAGE3, 210 + }; 211 + /* statically (for now) map planes to mixer stage (z-order): */ 212 + static const int idxs[] = { 213 + [VG1] = 1, 214 + [VG2] = 2, 215 + [RGB1] = 0, 216 + [RGB2] = 0, 217 + [RGB3] = 0, 218 + [VG3] = 3, 219 + [VG4] = 4, 235 220 236 - /* 237 - * This probably would also need to be triggered by any attached 238 - * plane when it changes.. for now since we are only using a single 239 - * private plane, the configuration is hard-coded: 240 - */ 221 + }; 222 + bool alpha[4]= { false, false, false, false }; 241 223 242 224 mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_LOW0(ovlp), 0); 243 225 mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_LOW1(ovlp), 0); 244 226 mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_HIGH0(ovlp), 0); 245 227 mdp4_write(mdp4_kms, REG_MDP4_OVLP_TRANSP_HIGH1(ovlp), 0); 246 228 229 + /* TODO single register for all CRTCs, so this won't work properly 230 + * when multiple CRTCs are active.. 231 + */ 232 + for (i = 0; i < ARRAY_SIZE(mdp4_crtc->planes); i++) { 233 + struct drm_plane *plane = mdp4_crtc->planes[i]; 234 + if (plane) { 235 + enum mdp4_pipe pipe_id = mdp4_plane_pipe(plane); 236 + int idx = idxs[pipe_id]; 237 + if (idx > 0) { 238 + const struct mdp4_format *format = 239 + to_mdp4_format(msm_framebuffer_format(plane->fb)); 240 + alpha[idx-1] = format->alpha_enable; 241 + } 242 + mixer_cfg |= mixercfg(mdp4_crtc->mixer, pipe_id, stages[idx]); 243 + } 244 + } 245 + 246 + /* this shouldn't happen.. and seems to cause underflow: */ 247 + WARN_ON(!mixer_cfg); 248 + 247 249 for (i = 0; i < 4; i++) { 248 - mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_FG_ALPHA(ovlp, i), 0); 249 - mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_BG_ALPHA(ovlp, i), 0); 250 - mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_OP(ovlp, i), 251 - MDP4_OVLP_STAGE_OP_FG_ALPHA(FG_CONST) | 252 - MDP4_OVLP_STAGE_OP_BG_ALPHA(BG_CONST)); 253 - mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_CO3(ovlp, i), 0); 250 + uint32_t op; 251 + 252 + if (alpha[i]) { 253 + op = MDP4_OVLP_STAGE_OP_FG_ALPHA(FG_PIXEL) | 254 + MDP4_OVLP_STAGE_OP_BG_ALPHA(FG_PIXEL) | 255 + MDP4_OVLP_STAGE_OP_BG_INV_ALPHA; 256 + } else { 257 + op = MDP4_OVLP_STAGE_OP_FG_ALPHA(FG_CONST) | 258 + MDP4_OVLP_STAGE_OP_BG_ALPHA(BG_CONST); 259 + } 260 + 261 + mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_FG_ALPHA(ovlp, i), 0xff); 262 + mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_BG_ALPHA(ovlp, i), 0x00); 263 + mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_OP(ovlp, i), op); 264 + mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_CO3(ovlp, i), 1); 254 265 mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_TRANSP_LOW0(ovlp, i), 0); 255 266 mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_TRANSP_LOW1(ovlp, i), 0); 256 267 mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_TRANSP_HIGH0(ovlp, i), 0); 257 268 mdp4_write(mdp4_kms, REG_MDP4_OVLP_STAGE_TRANSP_HIGH1(ovlp, i), 0); 258 269 } 259 270 260 - /* TODO single register for all CRTCs, so this won't work properly 261 - * when multiple CRTCs are active.. 262 - */ 263 - switch (mdp4_plane_pipe(mdp4_crtc->plane)) { 264 - case VG1: 265 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE0(STAGE_BASE) | 266 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE0_MIXER1); 267 - break; 268 - case VG2: 269 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE1(STAGE_BASE) | 270 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE1_MIXER1); 271 - break; 272 - case RGB1: 273 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE2(STAGE_BASE) | 274 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE2_MIXER1); 275 - break; 276 - case RGB2: 277 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE3(STAGE_BASE) | 278 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE3_MIXER1); 279 - break; 280 - case RGB3: 281 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE4(STAGE_BASE) | 282 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE4_MIXER1); 283 - break; 284 - case VG3: 285 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE5(STAGE_BASE) | 286 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE5_MIXER1); 287 - break; 288 - case VG4: 289 - mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE6(STAGE_BASE) | 290 - COND(mdp4_crtc->mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE6_MIXER1); 291 - break; 292 - default: 293 - WARN_ON("invalid pipe"); 294 - break; 295 - } 296 271 mdp4_write(mdp4_kms, REG_MDP4_LAYERMIXER_IN_CFG, mixer_cfg); 297 272 } 298 273 ··· 406 377 struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); 407 378 struct drm_device *dev = crtc->dev; 408 379 struct drm_gem_object *obj; 380 + unsigned long flags; 409 381 410 382 if (mdp4_crtc->event) { 411 383 dev_err(dev->dev, "already pending flip!\n"); ··· 415 385 416 386 obj = msm_framebuffer_bo(new_fb, 0); 417 387 388 + spin_lock_irqsave(&dev->event_lock, flags); 418 389 mdp4_crtc->event = event; 390 + spin_unlock_irqrestore(&dev->event_lock, flags); 391 + 419 392 update_fb(crtc, true, new_fb); 420 393 421 - return msm_gem_queue_inactive_work(obj, 422 - &mdp4_crtc->pageflip_work); 394 + return msm_gem_queue_inactive_cb(obj, &mdp4_crtc->pageflip_cb); 423 395 } 424 396 425 397 static int mdp4_crtc_set_property(struct drm_crtc *crtc, ··· 530 498 drm_gem_object_unreference_unlocked(old_bo); 531 499 } 532 500 501 + request_pending(crtc, PENDING_CURSOR); 502 + 533 503 return 0; 534 504 535 505 fail: ··· 576 542 struct mdp4_crtc *mdp4_crtc = container_of(irq, struct mdp4_crtc, vblank); 577 543 struct drm_crtc *crtc = &mdp4_crtc->base; 578 544 struct msm_drm_private *priv = crtc->dev->dev_private; 545 + unsigned pending; 579 546 580 - update_cursor(crtc); 581 - complete_flip(crtc, false); 582 547 mdp4_irq_unregister(get_kms(crtc), &mdp4_crtc->vblank); 583 548 584 - drm_flip_work_commit(&mdp4_crtc->unref_fb_work, priv->wq); 585 - drm_flip_work_commit(&mdp4_crtc->unref_cursor_work, priv->wq); 549 + pending = atomic_xchg(&mdp4_crtc->pending, 0); 550 + 551 + if (pending & PENDING_FLIP) { 552 + complete_flip(crtc, NULL); 553 + drm_flip_work_commit(&mdp4_crtc->unref_fb_work, priv->wq); 554 + } 555 + 556 + if (pending & PENDING_CURSOR) { 557 + update_cursor(crtc); 558 + drm_flip_work_commit(&mdp4_crtc->unref_cursor_work, priv->wq); 559 + } 586 560 } 587 561 588 562 static void mdp4_crtc_err_irq(struct mdp4_irq *irq, uint32_t irqstatus) ··· 607 565 return mdp4_crtc->vblank.irqmask; 608 566 } 609 567 610 - void mdp4_crtc_cancel_pending_flip(struct drm_crtc *crtc) 568 + void mdp4_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file) 611 569 { 612 - complete_flip(crtc, true); 570 + DBG("cancel: %p", file); 571 + complete_flip(crtc, file); 613 572 } 614 573 615 574 /* set dma config, ie. the format the encoder wants. */ ··· 665 622 mdp4_write(mdp4_kms, REG_MDP4_DISP_INTF_SEL, intf_sel); 666 623 } 667 624 625 + static void set_attach(struct drm_crtc *crtc, enum mdp4_pipe pipe_id, 626 + struct drm_plane *plane) 627 + { 628 + struct mdp4_crtc *mdp4_crtc = to_mdp4_crtc(crtc); 629 + 630 + BUG_ON(pipe_id >= ARRAY_SIZE(mdp4_crtc->planes)); 631 + 632 + if (mdp4_crtc->planes[pipe_id] == plane) 633 + return; 634 + 635 + mdp4_crtc->planes[pipe_id] = plane; 636 + blend_setup(crtc); 637 + if (mdp4_crtc->enabled && (plane != mdp4_crtc->plane)) 638 + crtc_flush(crtc); 639 + } 640 + 641 + void mdp4_crtc_attach(struct drm_crtc *crtc, struct drm_plane *plane) 642 + { 643 + set_attach(crtc, mdp4_plane_pipe(plane), plane); 644 + } 645 + 646 + void mdp4_crtc_detach(struct drm_crtc *crtc, struct drm_plane *plane) 647 + { 648 + set_attach(crtc, mdp4_plane_pipe(plane), NULL); 649 + } 650 + 668 651 static const char *dma_names[] = { 669 652 "DMA_P", "DMA_S", "DMA_E", 670 653 }; ··· 713 644 crtc = &mdp4_crtc->base; 714 645 715 646 mdp4_crtc->plane = plane; 716 - mdp4_crtc->plane->crtc = crtc; 717 647 718 648 mdp4_crtc->ovlp = ovlp_id; 719 649 mdp4_crtc->dma = dma_id; ··· 736 668 ret = drm_flip_work_init(&mdp4_crtc->unref_cursor_work, 64, 737 669 "unref cursor", unref_cursor_worker); 738 670 739 - INIT_WORK(&mdp4_crtc->pageflip_work, pageflip_worker); 671 + INIT_FENCE_CB(&mdp4_crtc->pageflip_cb, pageflip_cb); 740 672 741 673 drm_crtc_init(dev, crtc, &mdp4_crtc_funcs); 742 674 drm_crtc_helper_add(crtc, &mdp4_crtc_helper_funcs);
+16
drivers/gpu/drm/msm/mdp4/mdp4_format.c
··· 44 44 FMT(BGR565, 0, 5, 6, 5, 2, 0, 1, 0, false, true, 2, 3), 45 45 }; 46 46 47 + uint32_t mdp4_get_formats(enum mdp4_pipe pipe_id, uint32_t *pixel_formats, 48 + uint32_t max_formats) 49 + { 50 + uint32_t i; 51 + for (i = 0; i < ARRAY_SIZE(formats); i++) { 52 + const struct mdp4_format *f = &formats[i]; 53 + 54 + if (i == max_formats) 55 + break; 56 + 57 + pixel_formats[i] = f->base.pixel_format; 58 + } 59 + 60 + return i; 61 + } 62 + 47 63 const struct msm_format *mdp4_get_format(struct msm_kms *kms, uint32_t format) 48 64 { 49 65 int i;
+18 -1
drivers/gpu/drm/msm/mdp4/mdp4_kms.c
··· 135 135 unsigned i; 136 136 137 137 for (i = 0; i < priv->num_crtcs; i++) 138 - mdp4_crtc_cancel_pending_flip(priv->crtcs[i]); 138 + mdp4_crtc_cancel_pending_flip(priv->crtcs[i], file); 139 139 } 140 140 141 141 static void mdp4_destroy(struct msm_kms *kms) ··· 195 195 * NOTE: this is a bit simplistic until we add support 196 196 * for more than just RGB1->DMA_E->DTV->HDMI 197 197 */ 198 + 199 + /* construct non-private planes: */ 200 + plane = mdp4_plane_init(dev, VG1, false); 201 + if (IS_ERR(plane)) { 202 + dev_err(dev->dev, "failed to construct plane for VG1\n"); 203 + ret = PTR_ERR(plane); 204 + goto fail; 205 + } 206 + priv->planes[priv->num_planes++] = plane; 207 + 208 + plane = mdp4_plane_init(dev, VG2, false); 209 + if (IS_ERR(plane)) { 210 + dev_err(dev->dev, "failed to construct plane for VG2\n"); 211 + ret = PTR_ERR(plane); 212 + goto fail; 213 + } 214 + priv->planes[priv->num_planes++] = plane; 198 215 199 216 /* the CRTCs get constructed with a private plane: */ 200 217 plane = mdp4_plane_init(dev, RGB1, true);
+52 -6
drivers/gpu/drm/msm/mdp4/mdp4_kms.h
··· 75 75 76 76 struct mdp4_format { 77 77 struct msm_format base; 78 - enum mpd4_bpc bpc_r, bpc_g, bpc_b; 79 - enum mpd4_bpc_alpha bpc_a; 78 + enum mdp4_bpc bpc_r, bpc_g, bpc_b; 79 + enum mdp4_bpc_alpha bpc_a; 80 80 uint8_t unpack[4]; 81 81 bool alpha_enable, unpack_tight; 82 82 uint8_t cpp, unpack_count; ··· 93 93 return msm_readl(mdp4_kms->mmio + reg); 94 94 } 95 95 96 - static inline uint32_t pipe2flush(enum mpd4_pipe pipe) 96 + static inline uint32_t pipe2flush(enum mdp4_pipe pipe) 97 97 { 98 98 switch (pipe) { 99 99 case VG1: return MDP4_OVERLAY_FLUSH_VG1; ··· 133 133 } 134 134 } 135 135 136 + static inline uint32_t mixercfg(int mixer, enum mdp4_pipe pipe, 137 + enum mdp4_mixer_stage_id stage) 138 + { 139 + uint32_t mixer_cfg = 0; 140 + 141 + switch (pipe) { 142 + case VG1: 143 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE0(stage) | 144 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE0_MIXER1); 145 + break; 146 + case VG2: 147 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE1(stage) | 148 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE1_MIXER1); 149 + break; 150 + case RGB1: 151 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE2(stage) | 152 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE2_MIXER1); 153 + break; 154 + case RGB2: 155 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE3(stage) | 156 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE3_MIXER1); 157 + break; 158 + case RGB3: 159 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE4(stage) | 160 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE4_MIXER1); 161 + break; 162 + case VG3: 163 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE5(stage) | 164 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE5_MIXER1); 165 + break; 166 + case VG4: 167 + mixer_cfg = MDP4_LAYERMIXER_IN_CFG_PIPE6(stage) | 168 + COND(mixer == 1, MDP4_LAYERMIXER_IN_CFG_PIPE6_MIXER1); 169 + break; 170 + default: 171 + WARN_ON("invalid pipe"); 172 + break; 173 + } 174 + 175 + return mixer_cfg; 176 + } 177 + 136 178 int mdp4_disable(struct mdp4_kms *mdp4_kms); 137 179 int mdp4_enable(struct mdp4_kms *mdp4_kms); 138 180 ··· 188 146 int mdp4_enable_vblank(struct msm_kms *kms, struct drm_crtc *crtc); 189 147 void mdp4_disable_vblank(struct msm_kms *kms, struct drm_crtc *crtc); 190 148 149 + uint32_t mdp4_get_formats(enum mdp4_pipe pipe_id, uint32_t *formats, 150 + uint32_t max_formats); 191 151 const struct msm_format *mdp4_get_format(struct msm_kms *kms, uint32_t format); 192 152 193 153 void mdp4_plane_install_properties(struct drm_plane *plane, ··· 202 158 unsigned int crtc_w, unsigned int crtc_h, 203 159 uint32_t src_x, uint32_t src_y, 204 160 uint32_t src_w, uint32_t src_h); 205 - enum mpd4_pipe mdp4_plane_pipe(struct drm_plane *plane); 161 + enum mdp4_pipe mdp4_plane_pipe(struct drm_plane *plane); 206 162 struct drm_plane *mdp4_plane_init(struct drm_device *dev, 207 - enum mpd4_pipe pipe_id, bool private_plane); 163 + enum mdp4_pipe pipe_id, bool private_plane); 208 164 209 165 uint32_t mdp4_crtc_vblank(struct drm_crtc *crtc); 210 - void mdp4_crtc_cancel_pending_flip(struct drm_crtc *crtc); 166 + void mdp4_crtc_cancel_pending_flip(struct drm_crtc *crtc, struct drm_file *file); 211 167 void mdp4_crtc_set_config(struct drm_crtc *crtc, uint32_t config); 212 168 void mdp4_crtc_set_intf(struct drm_crtc *crtc, enum mdp4_intf intf); 169 + void mdp4_crtc_attach(struct drm_crtc *crtc, struct drm_plane *plane); 170 + void mdp4_crtc_detach(struct drm_crtc *crtc, struct drm_plane *plane); 213 171 struct drm_crtc *mdp4_crtc_init(struct drm_device *dev, 214 172 struct drm_plane *plane, int id, int ovlp_id, 215 173 enum mdp4_dma dma_id);
+20 -10
drivers/gpu/drm/msm/mdp4/mdp4_plane.c
··· 22 22 struct drm_plane base; 23 23 const char *name; 24 24 25 - enum mpd4_pipe pipe; 25 + enum mdp4_pipe pipe; 26 26 27 27 uint32_t nformats; 28 28 uint32_t formats[32]; ··· 61 61 static int mdp4_plane_disable(struct drm_plane *plane) 62 62 { 63 63 struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane); 64 - DBG("%s: TODO", mdp4_plane->name); // XXX 64 + DBG("%s: disable", mdp4_plane->name); 65 + if (plane->crtc) 66 + mdp4_crtc_detach(plane->crtc, plane); 65 67 return 0; 66 68 } 67 69 ··· 103 101 { 104 102 struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane); 105 103 struct mdp4_kms *mdp4_kms = get_kms(plane); 106 - enum mpd4_pipe pipe = mdp4_plane->pipe; 104 + enum mdp4_pipe pipe = mdp4_plane->pipe; 107 105 uint32_t iova; 108 106 109 107 mdp4_write(mdp4_kms, REG_MDP4_PIPE_SRC_STRIDE_A(pipe), ··· 131 129 { 132 130 struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane); 133 131 struct mdp4_kms *mdp4_kms = get_kms(plane); 134 - enum mpd4_pipe pipe = mdp4_plane->pipe; 132 + enum mdp4_pipe pipe = mdp4_plane->pipe; 135 133 const struct mdp4_format *format; 136 134 uint32_t op_mode = 0; 137 135 uint32_t phasex_step = MDP4_VG_PHASE_STEP_DEFAULT; ··· 142 140 src_y = src_y >> 16; 143 141 src_w = src_w >> 16; 144 142 src_h = src_h >> 16; 143 + 144 + DBG("%s: FB[%u] %u,%u,%u,%u -> CRTC[%u] %d,%d,%u,%u", mdp4_plane->name, 145 + fb->base.id, src_x, src_y, src_w, src_h, 146 + crtc->base.id, crtc_x, crtc_y, crtc_w, crtc_h); 145 147 146 148 if (src_w != crtc_w) { 147 149 op_mode |= MDP4_PIPE_OP_MODE_SCALEX_EN; ··· 197 191 mdp4_write(mdp4_kms, REG_MDP4_PIPE_PHASEX_STEP(pipe), phasex_step); 198 192 mdp4_write(mdp4_kms, REG_MDP4_PIPE_PHASEY_STEP(pipe), phasey_step); 199 193 200 - plane->crtc = crtc; 194 + /* TODO detach from old crtc (if we had more than one) */ 195 + mdp4_crtc_attach(crtc, plane); 201 196 202 197 return 0; 203 198 } ··· 209 202 "VG3", "VG4", 210 203 }; 211 204 212 - enum mpd4_pipe mdp4_plane_pipe(struct drm_plane *plane) 205 + enum mdp4_pipe mdp4_plane_pipe(struct drm_plane *plane) 213 206 { 214 207 struct mdp4_plane *mdp4_plane = to_mdp4_plane(plane); 215 208 return mdp4_plane->pipe; ··· 217 210 218 211 /* initialize plane */ 219 212 struct drm_plane *mdp4_plane_init(struct drm_device *dev, 220 - enum mpd4_pipe pipe_id, bool private_plane) 213 + enum mdp4_pipe pipe_id, bool private_plane) 221 214 { 222 - struct msm_drm_private *priv = dev->dev_private; 223 215 struct drm_plane *plane = NULL; 224 216 struct mdp4_plane *mdp4_plane; 225 217 int ret; ··· 234 228 mdp4_plane->pipe = pipe_id; 235 229 mdp4_plane->name = pipe_names[pipe_id]; 236 230 237 - drm_plane_init(dev, plane, (1 << priv->num_crtcs) - 1, &mdp4_plane_funcs, 238 - mdp4_plane->formats, mdp4_plane->nformats, private_plane); 231 + mdp4_plane->nformats = mdp4_get_formats(pipe_id, mdp4_plane->formats, 232 + ARRAY_SIZE(mdp4_plane->formats)); 233 + 234 + drm_plane_init(dev, plane, 0xff, &mdp4_plane_funcs, 235 + mdp4_plane->formats, mdp4_plane->nformats, 236 + private_plane); 239 237 240 238 mdp4_plane_install_properties(plane, &plane->base); 241 239
+48 -12
drivers/gpu/drm/msm/msm_drv.c
··· 187 187 init_waitqueue_head(&priv->fence_event); 188 188 189 189 INIT_LIST_HEAD(&priv->inactive_list); 190 + INIT_LIST_HEAD(&priv->fence_cbs); 190 191 191 192 drm_mode_config_init(dev); 192 193 ··· 540 539 return ret; 541 540 } 542 541 543 - /* call under struct_mutex */ 542 + /* called from workqueue */ 544 543 void msm_update_fence(struct drm_device *dev, uint32_t fence) 545 544 { 546 545 struct msm_drm_private *priv = dev->dev_private; 547 546 548 - if (fence > priv->completed_fence) { 549 - priv->completed_fence = fence; 550 - wake_up_all(&priv->fence_event); 547 + mutex_lock(&dev->struct_mutex); 548 + priv->completed_fence = max(fence, priv->completed_fence); 549 + 550 + while (!list_empty(&priv->fence_cbs)) { 551 + struct msm_fence_cb *cb; 552 + 553 + cb = list_first_entry(&priv->fence_cbs, 554 + struct msm_fence_cb, work.entry); 555 + 556 + if (cb->fence > priv->completed_fence) 557 + break; 558 + 559 + list_del_init(&cb->work.entry); 560 + queue_work(priv->wq, &cb->work); 551 561 } 562 + 563 + mutex_unlock(&dev->struct_mutex); 564 + 565 + wake_up_all(&priv->fence_event); 566 + } 567 + 568 + void __msm_fence_worker(struct work_struct *work) 569 + { 570 + struct msm_fence_cb *cb = container_of(work, struct msm_fence_cb, work); 571 + cb->func(cb); 552 572 } 553 573 554 574 /* ··· 672 650 } 673 651 674 652 static const struct drm_ioctl_desc msm_ioctls[] = { 675 - DRM_IOCTL_DEF_DRV(MSM_GET_PARAM, msm_ioctl_get_param, DRM_UNLOCKED|DRM_AUTH), 676 - DRM_IOCTL_DEF_DRV(MSM_GEM_NEW, msm_ioctl_gem_new, DRM_UNLOCKED|DRM_AUTH), 677 - DRM_IOCTL_DEF_DRV(MSM_GEM_INFO, msm_ioctl_gem_info, DRM_UNLOCKED|DRM_AUTH), 678 - DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_PREP, msm_ioctl_gem_cpu_prep, DRM_UNLOCKED|DRM_AUTH), 679 - DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_FINI, msm_ioctl_gem_cpu_fini, DRM_UNLOCKED|DRM_AUTH), 680 - DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT, msm_ioctl_gem_submit, DRM_UNLOCKED|DRM_AUTH), 681 - DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE, msm_ioctl_wait_fence, DRM_UNLOCKED|DRM_AUTH), 653 + DRM_IOCTL_DEF_DRV(MSM_GET_PARAM, msm_ioctl_get_param, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 654 + DRM_IOCTL_DEF_DRV(MSM_GEM_NEW, msm_ioctl_gem_new, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 655 + DRM_IOCTL_DEF_DRV(MSM_GEM_INFO, msm_ioctl_gem_info, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 656 + DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_PREP, msm_ioctl_gem_cpu_prep, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 657 + DRM_IOCTL_DEF_DRV(MSM_GEM_CPU_FINI, msm_ioctl_gem_cpu_fini, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 658 + DRM_IOCTL_DEF_DRV(MSM_GEM_SUBMIT, msm_ioctl_gem_submit, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 659 + DRM_IOCTL_DEF_DRV(MSM_WAIT_FENCE, msm_ioctl_wait_fence, DRM_UNLOCKED|DRM_AUTH|DRM_RENDER_ALLOW), 682 660 }; 683 661 684 662 static const struct vm_operations_struct vm_ops = { ··· 702 680 }; 703 681 704 682 static struct drm_driver msm_driver = { 705 - .driver_features = DRIVER_HAVE_IRQ | DRIVER_GEM | DRIVER_MODESET, 683 + .driver_features = DRIVER_HAVE_IRQ | 684 + DRIVER_GEM | 685 + DRIVER_PRIME | 686 + DRIVER_RENDER | 687 + DRIVER_MODESET, 706 688 .load = msm_load, 707 689 .unload = msm_unload, 708 690 .open = msm_open, ··· 724 698 .dumb_create = msm_gem_dumb_create, 725 699 .dumb_map_offset = msm_gem_dumb_map_offset, 726 700 .dumb_destroy = drm_gem_dumb_destroy, 701 + .prime_handle_to_fd = drm_gem_prime_handle_to_fd, 702 + .prime_fd_to_handle = drm_gem_prime_fd_to_handle, 703 + .gem_prime_export = drm_gem_prime_export, 704 + .gem_prime_import = drm_gem_prime_import, 705 + .gem_prime_pin = msm_gem_prime_pin, 706 + .gem_prime_unpin = msm_gem_prime_unpin, 707 + .gem_prime_get_sg_table = msm_gem_prime_get_sg_table, 708 + .gem_prime_import_sg_table = msm_gem_prime_import_sg_table, 709 + .gem_prime_vmap = msm_gem_prime_vmap, 710 + .gem_prime_vunmap = msm_gem_prime_vunmap, 727 711 #ifdef CONFIG_DEBUG_FS 728 712 .debugfs_init = msm_debugfs_init, 729 713 .debugfs_cleanup = msm_debugfs_cleanup,
+33 -4
drivers/gpu/drm/msm/msm_drv.h
··· 73 73 74 74 struct workqueue_struct *wq; 75 75 76 + /* callbacks deferred until bo is inactive: */ 77 + struct list_head fence_cbs; 78 + 76 79 /* registered IOMMU domains: */ 77 80 unsigned int num_iommus; 78 81 struct iommu_domain *iommus[NUM_DOMAINS]; 82 + 83 + unsigned int num_planes; 84 + struct drm_plane *planes[8]; 79 85 80 86 unsigned int num_crtcs; 81 87 struct drm_crtc *crtcs[8]; ··· 99 93 struct msm_format { 100 94 uint32_t pixel_format; 101 95 }; 96 + 97 + /* callback from wq once fence has passed: */ 98 + struct msm_fence_cb { 99 + struct work_struct work; 100 + uint32_t fence; 101 + void (*func)(struct msm_fence_cb *cb); 102 + }; 103 + 104 + void __msm_fence_worker(struct work_struct *work); 105 + 106 + #define INIT_FENCE_CB(_cb, _func) do { \ 107 + INIT_WORK(&(_cb)->work, __msm_fence_worker); \ 108 + (_cb)->func = _func; \ 109 + } while (0) 102 110 103 111 /* As there are different display controller blocks depending on the 104 112 * snapdragon version, the kms support is split out and the appropriate ··· 161 141 int msm_gem_get_iova_locked(struct drm_gem_object *obj, int id, 162 142 uint32_t *iova); 163 143 int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova); 144 + struct page **msm_gem_get_pages(struct drm_gem_object *obj); 145 + void msm_gem_put_pages(struct drm_gem_object *obj); 164 146 void msm_gem_put_iova(struct drm_gem_object *obj, int id); 165 147 int msm_gem_dumb_create(struct drm_file *file, struct drm_device *dev, 166 148 struct drm_mode_create_dumb *args); 167 - int msm_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev, 168 - uint32_t handle); 169 149 int msm_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, 170 150 uint32_t handle, uint64_t *offset); 151 + struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj); 152 + void *msm_gem_prime_vmap(struct drm_gem_object *obj); 153 + void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr); 154 + struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 155 + size_t size, struct sg_table *sg); 156 + int msm_gem_prime_pin(struct drm_gem_object *obj); 157 + void msm_gem_prime_unpin(struct drm_gem_object *obj); 171 158 void *msm_gem_vaddr_locked(struct drm_gem_object *obj); 172 159 void *msm_gem_vaddr(struct drm_gem_object *obj); 173 - int msm_gem_queue_inactive_work(struct drm_gem_object *obj, 174 - struct work_struct *work); 160 + int msm_gem_queue_inactive_cb(struct drm_gem_object *obj, 161 + struct msm_fence_cb *cb); 175 162 void msm_gem_move_to_active(struct drm_gem_object *obj, 176 163 struct msm_gpu *gpu, bool write, uint32_t fence); 177 164 void msm_gem_move_to_inactive(struct drm_gem_object *obj); ··· 190 163 uint32_t size, uint32_t flags, uint32_t *handle); 191 164 struct drm_gem_object *msm_gem_new(struct drm_device *dev, 192 165 uint32_t size, uint32_t flags); 166 + struct drm_gem_object *msm_gem_import(struct drm_device *dev, 167 + uint32_t size, struct sg_table *sgt); 193 168 194 169 struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane); 195 170 const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
+121 -39
drivers/gpu/drm/msm/msm_gem.c
··· 17 17 18 18 #include <linux/spinlock.h> 19 19 #include <linux/shmem_fs.h> 20 + #include <linux/dma-buf.h> 20 21 21 22 #include "msm_drv.h" 22 23 #include "msm_gem.h" ··· 76 75 drm_gem_put_pages(obj, msm_obj->pages, true, false); 77 76 msm_obj->pages = NULL; 78 77 } 78 + } 79 + 80 + struct page **msm_gem_get_pages(struct drm_gem_object *obj) 81 + { 82 + struct drm_device *dev = obj->dev; 83 + struct page **p; 84 + mutex_lock(&dev->struct_mutex); 85 + p = get_pages(obj); 86 + mutex_unlock(&dev->struct_mutex); 87 + return p; 88 + } 89 + 90 + void msm_gem_put_pages(struct drm_gem_object *obj) 91 + { 92 + /* when we start tracking the pin count, then do something here */ 79 93 } 80 94 81 95 int msm_gem_mmap_obj(struct drm_gem_object *obj, ··· 178 162 case 0: 179 163 case -ERESTARTSYS: 180 164 case -EINTR: 165 + case -EBUSY: 166 + /* 167 + * EBUSY is ok: this just means that another thread 168 + * already did the job. 169 + */ 181 170 return VM_FAULT_NOPAGE; 182 171 case -ENOMEM: 183 172 return VM_FAULT_OOM; ··· 314 293 315 294 int msm_gem_get_iova(struct drm_gem_object *obj, int id, uint32_t *iova) 316 295 { 296 + struct msm_gem_object *msm_obj = to_msm_bo(obj); 317 297 int ret; 298 + 299 + /* this is safe right now because we don't unmap until the 300 + * bo is deleted: 301 + */ 302 + if (msm_obj->domain[id].iova) { 303 + *iova = msm_obj->domain[id].iova; 304 + return 0; 305 + } 306 + 318 307 mutex_lock(&obj->dev->struct_mutex); 319 308 ret = msm_gem_get_iova_locked(obj, id, iova); 320 309 mutex_unlock(&obj->dev->struct_mutex); ··· 394 363 return ret; 395 364 } 396 365 397 - int msm_gem_queue_inactive_work(struct drm_gem_object *obj, 398 - struct work_struct *work) 366 + /* setup callback for when bo is no longer busy.. 367 + * TODO probably want to differentiate read vs write.. 368 + */ 369 + int msm_gem_queue_inactive_cb(struct drm_gem_object *obj, 370 + struct msm_fence_cb *cb) 399 371 { 400 372 struct drm_device *dev = obj->dev; 401 373 struct msm_drm_private *priv = dev->dev_private; ··· 406 372 int ret = 0; 407 373 408 374 mutex_lock(&dev->struct_mutex); 409 - if (!list_empty(&work->entry)) { 375 + if (!list_empty(&cb->work.entry)) { 410 376 ret = -EINVAL; 411 377 } else if (is_active(msm_obj)) { 412 - list_add_tail(&work->entry, &msm_obj->inactive_work); 378 + cb->fence = max(msm_obj->read_fence, msm_obj->write_fence); 379 + list_add_tail(&cb->work.entry, &priv->fence_cbs); 413 380 } else { 414 - queue_work(priv->wq, work); 381 + queue_work(priv->wq, &cb->work); 415 382 } 416 383 mutex_unlock(&dev->struct_mutex); 417 384 ··· 445 410 msm_obj->write_fence = 0; 446 411 list_del_init(&msm_obj->mm_list); 447 412 list_add_tail(&msm_obj->mm_list, &priv->inactive_list); 448 - 449 - while (!list_empty(&msm_obj->inactive_work)) { 450 - struct work_struct *work; 451 - 452 - work = list_first_entry(&msm_obj->inactive_work, 453 - struct work_struct, entry); 454 - 455 - list_del_init(&work->entry); 456 - queue_work(priv->wq, work); 457 - } 458 413 } 459 414 460 415 int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op, ··· 535 510 536 511 drm_gem_free_mmap_offset(obj); 537 512 538 - if (msm_obj->vaddr) 539 - vunmap(msm_obj->vaddr); 513 + if (obj->import_attach) { 514 + if (msm_obj->vaddr) 515 + dma_buf_vunmap(obj->import_attach->dmabuf, msm_obj->vaddr); 540 516 541 - put_pages(obj); 517 + /* Don't drop the pages for imported dmabuf, as they are not 518 + * ours, just free the array we allocated: 519 + */ 520 + if (msm_obj->pages) 521 + drm_free_large(msm_obj->pages); 522 + 523 + } else { 524 + if (msm_obj->vaddr) 525 + vunmap(msm_obj->vaddr); 526 + put_pages(obj); 527 + } 542 528 543 529 if (msm_obj->resv == &msm_obj->_resv) 544 530 reservation_object_fini(msm_obj->resv); ··· 585 549 return ret; 586 550 } 587 551 588 - struct drm_gem_object *msm_gem_new(struct drm_device *dev, 589 - uint32_t size, uint32_t flags) 552 + static int msm_gem_new_impl(struct drm_device *dev, 553 + uint32_t size, uint32_t flags, 554 + struct drm_gem_object **obj) 590 555 { 591 556 struct msm_drm_private *priv = dev->dev_private; 592 557 struct msm_gem_object *msm_obj; 593 - struct drm_gem_object *obj = NULL; 594 - int ret; 595 - 596 - WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 597 - 598 - size = PAGE_ALIGN(size); 599 558 600 559 switch (flags & MSM_BO_CACHE_MASK) { 601 560 case MSM_BO_UNCACHED: ··· 600 569 default: 601 570 dev_err(dev->dev, "invalid cache flag: %x\n", 602 571 (flags & MSM_BO_CACHE_MASK)); 603 - ret = -EINVAL; 604 - goto fail; 572 + return -EINVAL; 605 573 } 606 574 607 575 msm_obj = kzalloc(sizeof(*msm_obj), GFP_KERNEL); 608 - if (!msm_obj) { 609 - ret = -ENOMEM; 610 - goto fail; 611 - } 612 - 613 - obj = &msm_obj->base; 614 - 615 - ret = drm_gem_object_init(dev, obj, size); 616 - if (ret) 617 - goto fail; 576 + if (!msm_obj) 577 + return -ENOMEM; 618 578 619 579 msm_obj->flags = flags; 620 580 ··· 613 591 reservation_object_init(msm_obj->resv); 614 592 615 593 INIT_LIST_HEAD(&msm_obj->submit_entry); 616 - INIT_LIST_HEAD(&msm_obj->inactive_work); 617 594 list_add_tail(&msm_obj->mm_list, &priv->inactive_list); 595 + 596 + *obj = &msm_obj->base; 597 + 598 + return 0; 599 + } 600 + 601 + struct drm_gem_object *msm_gem_new(struct drm_device *dev, 602 + uint32_t size, uint32_t flags) 603 + { 604 + struct drm_gem_object *obj; 605 + int ret; 606 + 607 + WARN_ON(!mutex_is_locked(&dev->struct_mutex)); 608 + 609 + size = PAGE_ALIGN(size); 610 + 611 + ret = msm_gem_new_impl(dev, size, flags, &obj); 612 + if (ret) 613 + goto fail; 614 + 615 + ret = drm_gem_object_init(dev, obj, size); 616 + if (ret) 617 + goto fail; 618 + 619 + return obj; 620 + 621 + fail: 622 + if (obj) 623 + drm_gem_object_unreference_unlocked(obj); 624 + 625 + return ERR_PTR(ret); 626 + } 627 + 628 + struct drm_gem_object *msm_gem_import(struct drm_device *dev, 629 + uint32_t size, struct sg_table *sgt) 630 + { 631 + struct msm_gem_object *msm_obj; 632 + struct drm_gem_object *obj; 633 + int ret, npages; 634 + 635 + size = PAGE_ALIGN(size); 636 + 637 + ret = msm_gem_new_impl(dev, size, MSM_BO_WC, &obj); 638 + if (ret) 639 + goto fail; 640 + 641 + drm_gem_private_object_init(dev, obj, size); 642 + 643 + npages = size / PAGE_SIZE; 644 + 645 + msm_obj = to_msm_bo(obj); 646 + msm_obj->sgt = sgt; 647 + msm_obj->pages = drm_malloc_ab(npages, sizeof(struct page *)); 648 + if (!msm_obj->pages) { 649 + ret = -ENOMEM; 650 + goto fail; 651 + } 652 + 653 + ret = drm_prime_sg_to_page_addr_arrays(sgt, msm_obj->pages, NULL, npages); 654 + if (ret) 655 + goto fail; 618 656 619 657 return obj; 620 658
-3
drivers/gpu/drm/msm/msm_gem.h
··· 45 45 */ 46 46 struct list_head submit_entry; 47 47 48 - /* work defered until bo is inactive: */ 49 - struct list_head inactive_work; 50 - 51 48 struct page **pages; 52 49 struct sg_table *sgt; 53 50 void *vaddr;
+56
drivers/gpu/drm/msm/msm_gem_prime.c
··· 1 + /* 2 + * Copyright (C) 2013 Red Hat 3 + * Author: Rob Clark <robdclark@gmail.com> 4 + * 5 + * This program is free software; you can redistribute it and/or modify it 6 + * under the terms of the GNU General Public License version 2 as published by 7 + * the Free Software Foundation. 8 + * 9 + * This program is distributed in the hope that it will be useful, but WITHOUT 10 + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 12 + * more details. 13 + * 14 + * You should have received a copy of the GNU General Public License along with 15 + * this program. If not, see <http://www.gnu.org/licenses/>. 16 + */ 17 + 18 + #include "msm_drv.h" 19 + #include "msm_gem.h" 20 + 21 + 22 + struct sg_table *msm_gem_prime_get_sg_table(struct drm_gem_object *obj) 23 + { 24 + struct msm_gem_object *msm_obj = to_msm_bo(obj); 25 + BUG_ON(!msm_obj->sgt); /* should have already pinned! */ 26 + return msm_obj->sgt; 27 + } 28 + 29 + void *msm_gem_prime_vmap(struct drm_gem_object *obj) 30 + { 31 + return msm_gem_vaddr(obj); 32 + } 33 + 34 + void msm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) 35 + { 36 + /* TODO msm_gem_vunmap() */ 37 + } 38 + 39 + struct drm_gem_object *msm_gem_prime_import_sg_table(struct drm_device *dev, 40 + size_t size, struct sg_table *sg) 41 + { 42 + return msm_gem_import(dev, size, sg); 43 + } 44 + 45 + int msm_gem_prime_pin(struct drm_gem_object *obj) 46 + { 47 + if (!obj->import_attach) 48 + msm_gem_get_pages(obj); 49 + return 0; 50 + } 51 + 52 + void msm_gem_prime_unpin(struct drm_gem_object *obj) 53 + { 54 + if (!obj->import_attach) 55 + msm_gem_put_pages(obj); 56 + }
+2 -2
drivers/gpu/drm/msm/msm_gpu.c
··· 268 268 struct drm_device *dev = gpu->dev; 269 269 uint32_t fence = gpu->funcs->last_fence(gpu); 270 270 271 + msm_update_fence(gpu->dev, fence); 272 + 271 273 mutex_lock(&dev->struct_mutex); 272 274 273 275 while (!list_empty(&gpu->active_list)) { ··· 288 286 break; 289 287 } 290 288 } 291 - 292 - msm_update_fence(gpu->dev, fence); 293 289 294 290 mutex_unlock(&dev->struct_mutex); 295 291 }