mtkfb.c 73 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711
  1. /*#include <generated/autoconf.h>*/
  2. #include <linux/module.h>
  3. #include <linux/mm.h>
  4. #include <linux/init.h>
  5. #include <linux/fb.h>
  6. #include <linux/delay.h>
  7. #include <linux/device.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/dma-mapping.h>
  10. #include <linux/kthread.h>
  11. #include <linux/vmalloc.h>
  12. #include <linux/semaphore.h>
  13. #include <linux/mutex.h>
  14. #include <linux/suspend.h>
  15. #include <linux/of_fdt.h>
  16. #include <linux/of.h>
  17. #include <linux/of_address.h>
  18. #include <linux/dma-buf.h>
  19. #include <linux/uaccess.h>
  20. #include <linux/atomic.h>
  21. #include <asm/cacheflush.h>
  22. #include <linux/io.h>
  23. #include <linux/compat.h>
  24. #include <linux/dma-mapping.h>
  25. /* #include <linux/earlysuspend.h> */
  26. /* #include <linux/rtpm_prio.h> */
  27. /* #include <linux/leds-mt65xx.h> */
  28. /* #include <asm/mach-types.h> */
  29. /* #include "mach/mt_boot.h" */
  30. /* #include <mach/irqs.h> */
  31. #include <mt-plat/dma.h>
  32. #include "disp_assert_layer.h"
  33. #include "debug.h"
  34. #include "ddp_hal.h"
  35. #include "ddp_log.h"
  36. #include "disp_drv_log.h"
  37. #include "disp_lcm.h"
  38. #include "mtkfb.h"
  39. #include "mtkfb_console.h"
  40. #include "mtkfb_fence.h"
  41. #include "mtkfb_info.h"
  42. #include "ddp_ovl.h"
  43. #include "disp_drv_platform.h"
  44. #include "primary_display.h"
  45. #include "ddp_dump.h"
  46. #include "display_recorder.h"
  47. #include "fbconfig_kdebug.h"
  48. #include "ddp_manager.h"
  49. #include "mtk_ovl.h"
  50. #include "ion_drv.h"
  51. #include "ddp_drv.h"
  52. #ifdef DISP_GPIO_DTS
  53. #include "disp_dts_gpio.h" /* set gpio via DTS */
  54. #endif
  55. #include "disp_helper.h"
  56. #define ALIGN_TO(x, n) (((x) + ((n) - 1)) & ~((n) - 1))
  57. /* xuecheng, remove this because we use session now */
  58. /* mtk_dispif_info_t dispif_info[MTKFB_MAX_DISPLAY_COUNT]; */
  59. struct notifier_block pm_nb;
  60. unsigned int EnableVSyncLog = 0;
  61. static u32 MTK_FB_XRES;
  62. static u32 MTK_FB_YRES;
  63. static u32 MTK_FB_BPP;
  64. static u32 MTK_FB_PAGES;
  65. static u32 fb_xres_update;
  66. static u32 fb_yres_update;
  67. #define MTK_FB_XRESV (ALIGN_TO(MTK_FB_XRES, MTK_FB_ALIGNMENT))
  68. #define MTK_FB_YRESV (MTK_FB_YRES * MTK_FB_PAGES) /* For page flipping */
  69. #define MTK_FB_BYPP ((MTK_FB_BPP + 7) >> 3)
  70. #define MTK_FB_LINE (ALIGN_TO(MTK_FB_XRES, MTK_FB_ALIGNMENT) * MTK_FB_BYPP)
  71. #define MTK_FB_SIZE (MTK_FB_LINE * MTK_FB_YRES)
  72. #define MTK_FB_SIZEV (MTK_FB_LINE * MTK_FB_YRES * MTK_FB_PAGES)
  73. #define CHECK_RET(expr) \
  74. do { \
  75. int ret = (expr); \
  76. ASSERT(0 == ret); \
  77. } while (0)
  78. static size_t mtkfb_log_on = true;
  79. #define MTKFB_LOG(fmt, arg...) \
  80. do { \
  81. if (mtkfb_log_on) \
  82. pr_debug("DISP/MTKFB " fmt, ##arg); \
  83. } while (0)
  84. /* always show this debug info while the global debug log is off */
  85. #define MTKFB_LOG_DBG(fmt, arg...) \
  86. do { \
  87. if (!mtkfb_log_on) \
  88. pr_debug("DISP/MTKFB " fmt, ##arg); \
  89. } while (0)
  90. #define MTKFB_FUNC() \
  91. do { \
  92. if (mtkfb_log_on) \
  93. pr_debug("DISP/MTKFB " "[Func]%s\n", __func__); \
  94. } while (0)
  95. #define PRNERR(fmt, args...) pr_debug("DISP/MTKFB " fmt, ##args)
  96. void mtkfb_log_enable(int enable)
  97. {
  98. mtkfb_log_on = enable;
  99. MTKFB_LOG("mtkfb log %s\n", enable ? "enabled" : "disabled");
  100. }
  101. /* --------------------------------------------------------------------------- */
  102. /* local variables */
  103. /* --------------------------------------------------------------------------- */
  104. unsigned long fb_pa = 0;
  105. static const struct timeval FRAME_INTERVAL = { 0, 30000 }; /* 33ms */
  106. atomic_t has_pending_update = ATOMIC_INIT(0);
  107. struct fb_overlay_layer video_layerInfo;
  108. uint32_t dbr_backup = 0;
  109. uint32_t dbg_backup = 0;
  110. uint32_t dbb_backup = 0;
  111. bool fblayer_dither_needed = false;
  112. bool is_ipoh_bootup = false;
  113. struct fb_info *mtkfb_fbi;
  114. struct fb_overlay_layer fb_layer_context;
  115. mtk_dispif_info_t dispif_info[MTKFB_MAX_DISPLAY_COUNT];
  116. /**
  117. * This mutex is used to prevent tearing due to page flipping when adbd is
  118. * reading the front buffer
  119. */
  120. DEFINE_SEMAPHORE(sem_flipping);
  121. DEFINE_SEMAPHORE(sem_early_suspend);
  122. DEFINE_SEMAPHORE(sem_overlay_buffer);
  123. DEFINE_MUTEX(OverlaySettingMutex);
  124. atomic_t OverlaySettingDirtyFlag = ATOMIC_INIT(0);
  125. atomic_t OverlaySettingApplied = ATOMIC_INIT(0);
  126. unsigned int PanDispSettingPending = 0;
  127. unsigned int PanDispSettingDirty = 0;
  128. unsigned int PanDispSettingApplied = 0;
  129. DECLARE_WAIT_QUEUE_HEAD(reg_update_wq);
  130. unsigned int need_esd_check = 0;
  131. DECLARE_WAIT_QUEUE_HEAD(esd_check_wq);
  132. /* extern unsigned int disp_running; */
  133. /* extern wait_queue_head_t disp_done_wq; */
  134. DEFINE_MUTEX(ScreenCaptureMutex);
  135. bool is_early_suspended = false;
  136. static int sem_flipping_cnt = 1;
  137. static int sem_early_suspend_cnt = 1;
  138. static int vsync_cnt;
  139. /* extern BOOL is_engine_in_suspend_mode; */
  140. /* extern BOOL is_lcm_in_suspend_mode; */
  141. /* --------------------------------------------------------------------------- */
  142. /* local function declarations */
  143. /* --------------------------------------------------------------------------- */
  144. static int init_framebuffer(struct fb_info *info);
  145. static int mtkfb_get_overlay_layer_info(struct fb_overlay_layer_info *layerInfo);
  146. /* --------------------------------------------------------------------------- */
  147. /* Timer Routines */
  148. /* --------------------------------------------------------------------------- */
  149. unsigned int lcd_fps = 6000;
  150. wait_queue_head_t screen_update_wq;
  151. /*
  152. * ---------------------------------------------------------------------------
  153. * mtkfb_set_lcm_inited() will be called in mt6516_board_init()
  154. * ---------------------------------------------------------------------------
  155. */
  156. static bool is_lcm_inited;
  157. void mtkfb_set_lcm_inited(bool inited)
  158. {
  159. is_lcm_inited = inited;
  160. }
  161. /*
  162. * ---------------------------------------------------------------------------
  163. * fbdev framework callbacks and the ioctl interface
  164. * ---------------------------------------------------------------------------
  165. */
  166. /* Called each time the mtkfb device is opened */
  167. static int mtkfb_open(struct fb_info *info, int user)
  168. {
  169. /* NOT_REFERENCED(info); */
  170. /* NOT_REFERENCED(user); */
  171. /* DISPFUNC();*/
  172. DISPPRINT("%s\n", __func__);
  173. MSG_FUNC_ENTER();
  174. MSG_FUNC_LEAVE();
  175. return 0;
  176. }
  177. /* Called when the mtkfb device is closed. We make sure that any pending
  178. * gfx DMA operations are ended, before we return. */
  179. static int mtkfb_release(struct fb_info *info, int user)
  180. {
  181. /* NOT_REFERENCED(info); */
  182. /* NOT_REFERENCED(user); */
  183. DISPFUNC();
  184. MSG_FUNC_ENTER();
  185. MSG_FUNC_LEAVE();
  186. return 0;
  187. }
  188. /* Store a single color palette entry into a pseudo palette or the hardware
  189. * palette if one is available. For now we support only 16bpp and thus store
  190. * the entry only to the pseudo palette.
  191. */
  192. static int mtkfb_setcolreg(u_int regno, u_int red, u_int green,
  193. u_int blue, u_int transp, struct fb_info *info)
  194. {
  195. int r = 0;
  196. unsigned bpp, m;
  197. /* NOT_REFERENCED(transp); */
  198. MSG_FUNC_ENTER();
  199. bpp = info->var.bits_per_pixel;
  200. m = 1 << bpp;
  201. if (regno >= m) {
  202. r = -EINVAL;
  203. goto exit;
  204. }
  205. switch (bpp) {
  206. case 16:
  207. /* RGB 565 */
  208. ((u32 *) (info->pseudo_palette))[regno] =
  209. ((red & 0xF800) | ((green & 0xFC00) >> 5) | ((blue & 0xF800) >> 11));
  210. break;
  211. case 32:
  212. /* ARGB8888 */
  213. ((u32 *) (info->pseudo_palette))[regno] =
  214. (0xff000000) |
  215. ((red & 0xFF00) << 8) | ((green & 0xFF00)) | ((blue & 0xFF00) >> 8);
  216. break;
  217. /* TODO: RGB888, BGR888, ABGR8888 */
  218. default:
  219. ASSERT(0);
  220. }
  221. exit:
  222. MSG_FUNC_LEAVE();
  223. return r;
  224. }
  225. int mtkfb_set_backlight_level(unsigned int level)
  226. {
  227. MTKFB_FUNC();
  228. pr_debug("mtkfb_set_backlight_level:%d Start\n", level);
  229. primary_display_setbacklight(level);
  230. pr_debug("mtkfb_set_backlight_level End\n");
  231. return 0;
  232. }
  233. EXPORT_SYMBOL(mtkfb_set_backlight_level);
  234. int mtkfb_set_backlight_mode(unsigned int mode)
  235. {
  236. MTKFB_FUNC();
  237. if (down_interruptible(&sem_flipping)) {
  238. pr_debug("[FB Driver] can't get semaphore:%d\n", __LINE__);
  239. return -ERESTARTSYS;
  240. }
  241. sem_flipping_cnt--;
  242. if (down_interruptible(&sem_early_suspend)) {
  243. pr_debug("[FB Driver] can't get semaphore:%d\n", __LINE__);
  244. sem_flipping_cnt++;
  245. up(&sem_flipping);
  246. return -ERESTARTSYS;
  247. }
  248. sem_early_suspend_cnt--;
  249. if (primary_display_is_sleepd())
  250. goto End;
  251. /* DISP_SetBacklight_mode(mode); */
  252. End:
  253. sem_flipping_cnt++;
  254. sem_early_suspend_cnt++;
  255. up(&sem_early_suspend);
  256. up(&sem_flipping);
  257. return 0;
  258. }
  259. EXPORT_SYMBOL(mtkfb_set_backlight_mode);
  260. int mtkfb_set_backlight_pwm(int div)
  261. {
  262. MTKFB_FUNC();
  263. if (down_interruptible(&sem_flipping)) {
  264. pr_debug("[FB Driver] can't get semaphore:%d\n", __LINE__);
  265. return -ERESTARTSYS;
  266. }
  267. sem_flipping_cnt--;
  268. if (down_interruptible(&sem_early_suspend)) {
  269. pr_debug("[FB Driver] can't get semaphore:%d\n", __LINE__);
  270. sem_flipping_cnt++;
  271. up(&sem_flipping);
  272. return -ERESTARTSYS;
  273. }
  274. sem_early_suspend_cnt--;
  275. if (primary_display_is_sleepd())
  276. goto End;
  277. /* DISP_SetPWM(div); */
  278. End:
  279. sem_flipping_cnt++;
  280. sem_early_suspend_cnt++;
  281. up(&sem_early_suspend);
  282. up(&sem_flipping);
  283. return 0;
  284. }
  285. EXPORT_SYMBOL(mtkfb_set_backlight_pwm);
  286. int mtkfb_get_backlight_pwm(int div, unsigned int *freq)
  287. {
  288. /* DISP_GetPWM(div, freq); */
  289. return 0;
  290. }
  291. EXPORT_SYMBOL(mtkfb_get_backlight_pwm);
  292. void mtkfb_waitVsync(void)
  293. {
  294. if (primary_display_is_sleepd()) {
  295. pr_debug("[MTKFB_VSYNC]:mtkfb has suspend, return directly\n");
  296. msleep(20);
  297. return;
  298. }
  299. vsync_cnt++;
  300. #ifdef CONFIG_FPGA_EARLY_PORTING
  301. msleep(20);
  302. #else
  303. primary_display_wait_for_vsync(NULL);
  304. #endif
  305. vsync_cnt--;
  306. }
  307. EXPORT_SYMBOL(mtkfb_waitVsync);
  308. static int mtkfb_set_par(struct fb_info *fbi);
  309. static bool no_update;
  310. static int _convert_fb_layer_to_disp_input(struct fb_overlay_layer *src, disp_input_config *dst)
  311. {
  312. dst->layer_id = src->layer_id;
  313. if (!src->layer_enable) {
  314. dst->layer_enable = 0;
  315. return 0;
  316. }
  317. switch (src->src_fmt) {
  318. case MTK_FB_FORMAT_YUV422:
  319. dst->src_fmt = DISP_FORMAT_YUV422;
  320. break;
  321. case MTK_FB_FORMAT_RGB565:
  322. dst->src_fmt = DISP_FORMAT_RGB565;
  323. break;
  324. case MTK_FB_FORMAT_RGB888:
  325. dst->src_fmt = DISP_FORMAT_RGB888;
  326. break;
  327. case MTK_FB_FORMAT_BGR888:
  328. dst->src_fmt = DISP_FORMAT_BGR888;
  329. break;
  330. case MTK_FB_FORMAT_ARGB8888:
  331. dst->src_fmt = DISP_FORMAT_ARGB8888;
  332. break;
  333. case MTK_FB_FORMAT_ABGR8888:
  334. dst->src_fmt = DISP_FORMAT_ABGR8888;
  335. break;
  336. case MTK_FB_FORMAT_XRGB8888:
  337. dst->src_fmt = DISP_FORMAT_XRGB8888;
  338. break;
  339. case MTK_FB_FORMAT_XBGR8888:
  340. dst->src_fmt = DISP_FORMAT_XBGR8888;
  341. break;
  342. case MTK_FB_FORMAT_UYVY:
  343. dst->src_fmt = DISP_FORMAT_UYVY;
  344. break;
  345. default:
  346. DISPERR("Invalid color format: 0x%x\n", src->src_fmt);
  347. return -1;
  348. }
  349. dst->src_base_addr = src->src_base_addr;
  350. dst->security = src->security;
  351. dst->src_phy_addr = src->src_phy_addr;
  352. DISPDBG("_convert_fb_layer_to_disp_input, dst->addr=0x%08lx\n",
  353. (unsigned long)(dst->src_phy_addr));
  354. dst->isTdshp = src->isTdshp;
  355. dst->next_buff_idx = src->next_buff_idx;
  356. dst->identity = src->identity;
  357. dst->connected_type = src->connected_type;
  358. /* set Alpha blending */
  359. dst->alpha = src->alpha;
  360. if (MTK_FB_FORMAT_ARGB8888 == src->src_fmt || MTK_FB_FORMAT_ABGR8888 == src->src_fmt)
  361. dst->alpha_enable = true;
  362. else
  363. dst->alpha_enable = false;
  364. /* set src width, src height */
  365. dst->src_offset_x = src->src_offset_x;
  366. dst->src_offset_y = src->src_offset_y;
  367. dst->src_width = src->src_width;
  368. dst->src_height = src->src_height;
  369. dst->tgt_offset_x = src->tgt_offset_x;
  370. dst->tgt_offset_y = src->tgt_offset_y;
  371. dst->tgt_width = src->tgt_width;
  372. dst->tgt_height = src->tgt_height;
  373. if (dst->tgt_width > dst->src_width)
  374. dst->tgt_width = dst->src_width;
  375. if (dst->tgt_height > dst->src_height)
  376. dst->tgt_height = dst->src_height;
  377. dst->src_pitch = src->src_pitch;
  378. /* set color key */
  379. dst->src_color_key = src->src_color_key;
  380. dst->src_use_color_key = src->src_use_color_key;
  381. /* data transferring is triggerred in MTKFB_TRIG_OVERLAY_OUT */
  382. dst->layer_enable = src->layer_enable;
  383. #if 1
  384. DISPDBG("_convert_fb_layer_to_disp_input():id=%u, en=%u, next_idx=%u, vaddr=%p, paddr=%p,\n",
  385. dst->layer_id, dst->layer_enable, dst->next_buff_idx, dst->src_base_addr, dst->src_phy_addr);
  386. DISPDBG("src fmt=%u, dst fmt=%u, pitch=%u, xoff=%u, yoff=%u, w=%u, h=%u\n",
  387. src->src_fmt, dst->src_fmt, dst->src_pitch, dst->src_offset_x,
  388. dst->src_offset_y, dst->src_width, dst->src_height);
  389. DISPDBG("_convert_fb_layer_to_disp_input():target xoff=%u, target yoff=%u, target w=%u, target h=%u, aen=%u\n",
  390. dst->tgt_offset_x, dst->tgt_offset_y, dst->tgt_width, dst->tgt_height,
  391. dst->alpha_enable);
  392. #endif
  393. return 0;
  394. }
  395. static int mtkfb_pan_display_impl(struct fb_var_screeninfo *var, struct fb_info *info)
  396. {
  397. uint32_t offset = 0;
  398. uint32_t paStart = 0;
  399. char *vaStart = NULL, *vaEnd = NULL;
  400. int ret = 0;
  401. unsigned int src_pitch = 0;
  402. static unsigned int pan_display_cnt;
  403. disp_session_input_config session_input;
  404. disp_input_config *input;
  405. /* DISPFUNC(); */
  406. if (no_update) {
  407. DISPMSG("FB_ACTIVATE_NO_UPDATE flag found, ignore mtkfb_pan_display_impl\n");
  408. no_update = false;
  409. return ret;
  410. }
  411. DDPMLOG("pan_display: offset(%u,%u), res(%u,%u), resv(%u,%u), cnt=%d.\n",
  412. var->xoffset, var->yoffset, info->var.xres, info->var.yres, info->var.xres_virtual,
  413. info->var.yres_virtual, pan_display_cnt++);
  414. info->var.yoffset = var->yoffset;
  415. offset = var->yoffset * info->fix.line_length;
  416. paStart = fb_pa + offset;
  417. vaStart = info->screen_base + offset;
  418. vaEnd = vaStart + info->var.yres * info->fix.line_length;
  419. memset((void *)&session_input, 0, sizeof(session_input));
  420. /* pan display use layer 0 */
  421. input = &session_input.config[0];
  422. input->layer_id = 0;
  423. input->src_phy_addr = (void *)((unsigned long)paStart);
  424. input->src_base_addr = (void *)((unsigned long)vaStart);
  425. input->layer_id = primary_display_get_option("FB_LAYER");
  426. input->layer_enable = 1;
  427. input->src_offset_x = 0;
  428. input->src_offset_y = 0;
  429. input->src_width = var->xres;
  430. input->src_height = var->yres;
  431. input->tgt_offset_x = 0;
  432. input->tgt_offset_y = 0;
  433. input->tgt_width = var->xres;
  434. input->tgt_height = var->yres;
  435. switch (var->bits_per_pixel) {
  436. case 16:
  437. input->src_fmt = DISP_FORMAT_RGB565;
  438. break;
  439. case 24:
  440. input->src_fmt = DISP_FORMAT_RGB888;
  441. break;
  442. case 32:
  443. input->src_fmt = (0 == var->blue.offset) ? DISP_FORMAT_BGRA8888 : DISP_FORMAT_RGBX8888;
  444. break;
  445. default:
  446. DISPERR("Invalid color format bpp: 0x%d\n", var->bits_per_pixel);
  447. return -1;
  448. }
  449. input->alpha_enable = false;
  450. input->alpha = 0xFF;
  451. input->next_buff_idx = -1;
  452. src_pitch = ALIGN_TO(var->xres, MTK_FB_ALIGNMENT);
  453. input->src_pitch = src_pitch;
  454. session_input.config_layer_num++;
  455. if (!is_DAL_Enabled()) {
  456. /* disable font layer(layer3) drawed in lk */
  457. session_input.config[1].layer_id = primary_display_get_option("ASSERT_LAYER");
  458. session_input.config[1].next_buff_idx = -1;
  459. session_input.config[1].layer_enable = 0;
  460. session_input.config_layer_num++;
  461. }
  462. ret = primary_display_config_input_multiple(&session_input);
  463. ret = primary_display_trigger(true, NULL, 0);
  464. /* primary_display_diagnose(); */
  465. #ifdef XXXX_TODO
  466. #error "need to wait rdma0 done here"
  467. #error "aee dynamic switch, set overlay race condition protection"
  468. #endif
  469. return ret;
  470. }
  471. /**
  472. * Set fb_info.fix fields and also updates fbdev.
  473. * When calling this fb_info.var must be set up already.
  474. */
  475. static void set_fb_fix(struct mtkfb_device *fbdev)
  476. {
  477. struct fb_info *fbi = fbdev->fb_info;
  478. struct fb_fix_screeninfo *fix = &fbi->fix;
  479. struct fb_var_screeninfo *var = &fbi->var;
  480. struct fb_ops *fbops = fbi->fbops;
  481. strncpy(fix->id, MTKFB_DRIVER, sizeof(fix->id));
  482. fix->type = FB_TYPE_PACKED_PIXELS;
  483. switch (var->bits_per_pixel) {
  484. case 16:
  485. case 24:
  486. case 32:
  487. fix->visual = FB_VISUAL_TRUECOLOR;
  488. break;
  489. case 1:
  490. case 2:
  491. case 4:
  492. case 8:
  493. fix->visual = FB_VISUAL_PSEUDOCOLOR;
  494. break;
  495. default:
  496. ASSERT(0);
  497. }
  498. fix->accel = FB_ACCEL_NONE;
  499. fix->line_length = ALIGN_TO(var->xres_virtual, MTK_FB_ALIGNMENT) * var->bits_per_pixel / 8;
  500. fix->smem_len = fbdev->fb_size_in_byte;
  501. fix->smem_start = fbdev->fb_pa_base;
  502. fix->xpanstep = 0;
  503. fix->ypanstep = 1;
  504. fbops->fb_fillrect = cfb_fillrect;
  505. fbops->fb_copyarea = cfb_copyarea;
  506. fbops->fb_imageblit = cfb_imageblit;
  507. }
  508. /**
  509. * Check values in var, try to adjust them in case of out of bound values if
  510. * possible, or return error.
  511. */
  512. static int mtkfb_check_var(struct fb_var_screeninfo *var, struct fb_info *fbi)
  513. {
  514. unsigned int bpp;
  515. unsigned long max_frame_size;
  516. unsigned long line_size;
  517. struct mtkfb_device *fbdev = (struct mtkfb_device *)fbi->par;
  518. /* DISPFUNC(); */
  519. DISPDBG("mtkfb_check_var, xres=%u, yres=%u, xres_virtual=%u, yres_virtual=%u,\n",
  520. var->xres, var->yres, var->xres_virtual, var->yres_virtual);
  521. DISPDBG("xoffset=%u, yoffset=%u, bits_per_pixel=%u\n", var->xoffset, var->yoffset, var->bits_per_pixel);
  522. bpp = var->bits_per_pixel;
  523. if (bpp != 16 && bpp != 24 && bpp != 32) {
  524. MTKFB_LOG("[%s]unsupported bpp: %d", __func__, bpp);
  525. return -1;
  526. }
  527. switch (var->rotate) {
  528. case 0:
  529. case 180:
  530. var->xres = MTK_FB_XRES;
  531. var->yres = MTK_FB_YRES;
  532. break;
  533. case 90:
  534. case 270:
  535. var->xres = MTK_FB_YRES;
  536. var->yres = MTK_FB_XRES;
  537. break;
  538. default:
  539. return -1;
  540. }
  541. if (var->xres_virtual < var->xres)
  542. var->xres_virtual = var->xres;
  543. if (var->yres_virtual < var->yres)
  544. var->yres_virtual = var->yres;
  545. max_frame_size = fbdev->fb_size_in_byte;
  546. DISPDBG("fbdev->fb_size_in_byte=0x%08lx\n", fbdev->fb_size_in_byte);
  547. line_size = var->xres_virtual * bpp / 8;
  548. if (line_size * var->yres_virtual > max_frame_size) {
  549. /* Try to keep yres_virtual first */
  550. line_size = max_frame_size / var->yres_virtual;
  551. var->xres_virtual = line_size * 8 / bpp;
  552. if (var->xres_virtual < var->xres) {
  553. /* Still doesn't fit. Shrink yres_virtual too */
  554. var->xres_virtual = var->xres;
  555. line_size = var->xres * bpp / 8;
  556. var->yres_virtual = max_frame_size / line_size;
  557. }
  558. }
  559. DISPDBG("mtkfb_check_var, xres=%u, yres=%u, xres_virtual=%u, yres_virtual=%u,\n",
  560. var->xres, var->yres, var->xres_virtual, var->yres_virtual);
  561. DISPDBG("xoffset=%u, yoffset=%u, bits_per_pixel=%u\n", var->xoffset, var->yoffset, var->bits_per_pixel);
  562. if (var->xres + var->xoffset > var->xres_virtual)
  563. var->xoffset = var->xres_virtual - var->xres;
  564. if (var->yres + var->yoffset > var->yres_virtual)
  565. var->yoffset = var->yres_virtual - var->yres;
  566. DISPDBG("mtkfb_check_var, xres=%u, yres=%u, xres_virtual=%u, yres_virtual=%u,\n",
  567. var->xres, var->yres, var->xres_virtual, var->yres_virtual);
  568. DISPDBG("xoffset=%u, yoffset=%u, bits_per_pixel=%u\n", var->xoffset, var->yoffset, var->bits_per_pixel);
  569. if (16 == bpp) {
  570. var->red.offset = 11;
  571. var->red.length = 5;
  572. var->green.offset = 5;
  573. var->green.length = 6;
  574. var->blue.offset = 0;
  575. var->blue.length = 5;
  576. var->transp.offset = 0;
  577. var->transp.length = 0;
  578. } else if (24 == bpp) {
  579. var->red.length = var->green.length = var->blue.length = 8;
  580. var->transp.length = 0;
  581. /* Check if format is RGB565 or BGR565 */
  582. ASSERT(8 == var->green.offset);
  583. ASSERT(16 == var->red.offset + var->blue.offset);
  584. ASSERT(16 == var->red.offset || 0 == var->red.offset);
  585. } else if (32 == bpp) {
  586. var->red.length = var->green.length = var->blue.length = var->transp.length = 8;
  587. /* Check if format is ARGB565 or ABGR565 */
  588. ASSERT(8 == var->green.offset && 24 == var->transp.offset);
  589. ASSERT(16 == var->red.offset + var->blue.offset);
  590. ASSERT(16 == var->red.offset || 0 == var->red.offset);
  591. }
  592. var->red.msb_right = 0;
  593. var->green.msb_right = 0;
  594. var->blue.msb_right = 0;
  595. var->transp.msb_right = 0;
  596. if (var->activate & FB_ACTIVATE_NO_UPDATE)
  597. no_update = true;
  598. else
  599. no_update = false;
  600. var->activate = FB_ACTIVATE_NOW;
  601. var->height = UINT_MAX;
  602. var->width = UINT_MAX;
  603. var->grayscale = 0;
  604. var->nonstd = 0;
  605. var->pixclock = UINT_MAX;
  606. var->left_margin = UINT_MAX;
  607. var->right_margin = UINT_MAX;
  608. var->upper_margin = UINT_MAX;
  609. var->lower_margin = UINT_MAX;
  610. var->hsync_len = UINT_MAX;
  611. var->vsync_len = UINT_MAX;
  612. var->vmode = FB_VMODE_NONINTERLACED;
  613. var->sync = 0;
  614. MSG_FUNC_LEAVE();
  615. return 0;
  616. }
  617. unsigned int FB_LAYER = 2;
  618. /* Switch to a new mode. The parameters for it has been check already by
  619. * mtkfb_check_var.
  620. */
  621. static int mtkfb_set_par(struct fb_info *fbi)
  622. {
  623. struct fb_var_screeninfo *var = &fbi->var;
  624. struct mtkfb_device *fbdev = (struct mtkfb_device *)fbi->par;
  625. struct fb_overlay_layer fb_layer;
  626. u32 bpp = var->bits_per_pixel;
  627. disp_session_input_config session_input;
  628. disp_input_config *input;
  629. /* DISPFUNC(); */
  630. memset(&fb_layer, 0, sizeof(struct fb_overlay_layer));
  631. switch (bpp) {
  632. case 16:
  633. fb_layer.src_fmt = MTK_FB_FORMAT_RGB565;
  634. fb_layer.src_use_color_key = 1;
  635. fb_layer.src_color_key = 0xFF000000;
  636. break;
  637. case 24:
  638. fb_layer.src_use_color_key = 1;
  639. fb_layer.src_fmt = (0 == var->blue.offset) ? MTK_FB_FORMAT_RGB888 : MTK_FB_FORMAT_BGR888;
  640. fb_layer.src_color_key = 0xFF000000;
  641. break;
  642. case 32:
  643. fb_layer.src_use_color_key = 0;
  644. DISPDBG("set_par,var->blue.offset=%d\n", var->blue.offset);
  645. fb_layer.src_fmt = (0 == var->blue.offset) ? MTK_FB_FORMAT_ARGB8888 : MTK_FB_FORMAT_ABGR8888;
  646. fb_layer.src_color_key = 0;
  647. break;
  648. default:
  649. fb_layer.src_fmt = MTK_FB_FORMAT_UNKNOWN;
  650. DISPERR("[%s]unsupported bpp: %d", __func__, bpp);
  651. return -1;
  652. }
  653. set_fb_fix(fbdev);
  654. fb_layer.layer_id = primary_display_get_option("FB_LAYER");
  655. fb_layer.layer_enable = 1;
  656. fb_layer.src_base_addr = (void *)((unsigned long)fbdev->fb_va_base + var->yoffset * fbi->fix.line_length);
  657. DISPDBG("fb_pa=0x%08lx, var->yoffset=0x%08x,fbi->fix.line_length=0x%08x\n",
  658. fb_pa, var->yoffset, fbi->fix.line_length);
  659. fb_layer.src_phy_addr = (void *)(fb_pa + var->yoffset * fbi->fix.line_length);
  660. fb_layer.src_direct_link = 0;
  661. fb_layer.src_offset_x = fb_layer.src_offset_y = 0;
  662. /* fb_layer.src_width = fb_layer.tgt_width = fb_layer.src_pitch = var->xres; */
  663. /* xuecheng, does HWGPU_SUPPORT still in use now? */
  664. #if defined(HWGPU_SUPPORT)
  665. fb_layer.src_pitch = ALIGN_TO(var->xres, MTK_FB_ALIGNMENT);
  666. #else
  667. #ifndef DISP_NO_MT_BOOT
  668. if (get_boot_mode() == META_BOOT || get_boot_mode() == FACTORY_BOOT ||
  669. get_boot_mode() == ADVMETA_BOOT || get_boot_mode() == RECOVERY_BOOT)
  670. fb_layer.src_pitch = ALIGN_TO(var->xres, MTK_FB_ALIGNMENT);
  671. else
  672. fb_layer.src_pitch = ALIGN_TO(var->xres, MTK_FB_ALIGNMENT);
  673. #endif
  674. #endif
  675. fb_layer.src_width = fb_layer.tgt_width = var->xres;
  676. fb_layer.src_height = fb_layer.tgt_height = var->yres;
  677. fb_layer.tgt_offset_x = fb_layer.tgt_offset_y = 0;
  678. /* fb_layer.src_color_key = 0; */
  679. fb_layer.layer_rotation = MTK_FB_ORIENTATION_0;
  680. fb_layer.layer_type = LAYER_2D;
  681. DISPDBG("mtkfb_set_par, fb_layer.src_fmt=%x\n", fb_layer.src_fmt);
  682. memset((void *)&session_input, 0, sizeof(session_input));
  683. session_input.config_layer_num = 0;
  684. if (!isAEEEnabled) {
  685. /* DISPCHECK("AEE is not enabled, will disable layer 3\n"); */
  686. input = &session_input.config[session_input.config_layer_num++];
  687. input->layer_id = primary_display_get_option("ASSERT_LAYER");
  688. input->layer_enable = 0;
  689. } else {
  690. DISPCHECK("AEE is enabled, should not disable layer 3\n");
  691. }
  692. input = &session_input.config[session_input.config_layer_num++];
  693. _convert_fb_layer_to_disp_input(&fb_layer, input);
  694. primary_display_config_input_multiple(&session_input);
  695. /* backup fb_layer information. */
  696. memcpy(&fb_layer_context, &fb_layer, sizeof(fb_layer));
  697. MSG_FUNC_LEAVE();
  698. return 0;
  699. }
  700. static int mtkfb_soft_cursor(struct fb_info *info, struct fb_cursor *cursor)
  701. {
  702. /* NOT_REFERENCED(info); */
  703. /* NOT_REFERENCED(cursor); */
  704. return 0;
  705. }
  706. static int mtkfb_get_overlay_layer_info(struct fb_overlay_layer_info *layerInfo)
  707. {
  708. #if 0
  709. DISP_LAYER_INFO layer;
  710. if (layerInfo->layer_id >= DDP_OVL_LAYER_MUN)
  711. return 0;
  712. layer.id = layerInfo->layer_id;
  713. /* DISP_GetLayerInfo(&layer); */
  714. int id = layerInfo->layer_id;
  715. layer.curr_en = captured_layer_config[id].layer_en;
  716. layer.next_en = cached_layer_config[id].layer_en;
  717. layer.hw_en = realtime_layer_config[id].layer_en;
  718. layer.curr_idx = captured_layer_config[id].buff_idx;
  719. layer.next_idx = cached_layer_config[id].buff_idx;
  720. layer.hw_idx = realtime_layer_config[id].buff_idx;
  721. layer.curr_identity = captured_layer_config[id].identity;
  722. layer.next_identity = cached_layer_config[id].identity;
  723. layer.hw_identity = realtime_layer_config[id].identity;
  724. layer.curr_conn_type = captured_layer_config[id].connected_type;
  725. layer.next_conn_type = cached_layer_config[id].connected_type;
  726. layer.hw_conn_type = realtime_layer_config[id].connected_type;
  727. layerInfo->layer_enabled = layer.hw_en;
  728. layerInfo->curr_en = layer.curr_en;
  729. layerInfo->next_en = layer.next_en;
  730. layerInfo->hw_en = layer.hw_en;
  731. layerInfo->curr_idx = layer.curr_idx;
  732. layerInfo->next_idx = layer.next_idx;
  733. layerInfo->hw_idx = layer.hw_idx;
  734. layerInfo->curr_identity = layer.curr_identity;
  735. layerInfo->next_identity = layer.next_identity;
  736. layerInfo->hw_identity = layer.hw_identity;
  737. layerInfo->curr_conn_type = layer.curr_conn_type;
  738. layerInfo->next_conn_type = layer.next_conn_type;
  739. layerInfo->hw_conn_type = layer.hw_conn_type;
  740. #if 0
  741. MTKFB_LOG("[FB Driver] mtkfb_get_overlay_layer_info():id=%u, layer en=%u, next_en=%u,\n",
  742. layerInfo->layer_id, layerInfo->layer_enabled, layerInfo->next_en);
  743. MTKFB_LOG("curr_en=%u, hw_en=%u, next_idx=%u, curr_idx=%u, hw_idx=%u\n",
  744. layerInfo->curr_en, layerInfo->hw_en, layerInfo->next_idx, layerInfo->curr_idx, layerInfo->hw_idx);
  745. #endif
  746. #endif
  747. return 0;
  748. }
  749. #include <mt-plat/aee.h>
  750. #define mtkfb_aee_print(string, args...) aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_MMPROFILE_BUFFER, \
  751. "sf-mtkfb blocked", string, ##args)
  752. void mtkfb_dump_layer_info(void)
  753. {
  754. #if 0
  755. unsigned int i;
  756. pr_debug("[mtkfb] start dump layer info, early_suspend=%d\n", primary_display_is_sleepd());
  757. pr_debug("[mtkfb] cache(next):\n");
  758. for (i = 0; i < 4; i++) {
  759. pr_debug("[mtkfb] layer=%d, layer_en=%d, idx=%d, fmt=%d, addr=0x%x, %d, %d, %d\n ",
  760. cached_layer_config[i].layer, /* layer */
  761. cached_layer_config[i].layer_en, cached_layer_config[i].buff_idx,
  762. cached_layer_config[i].fmt,
  763. cached_layer_config[i].addr, /* addr */
  764. cached_layer_config[i].identity,
  765. cached_layer_config[i].connected_type, cached_layer_config[i].security);
  766. }
  767. pr_debug("[mtkfb] captured(current):\n");
  768. for (i = 0; i < 4; i++) {
  769. pr_debug("[mtkfb] layer=%d, layer_en=%d, idx=%d, fmt=%d, addr=0x%x, %d, %d, %d\n ",
  770. captured_layer_config[i].layer, /* layer */
  771. captured_layer_config[i].layer_en, captured_layer_config[i].buff_idx,
  772. captured_layer_config[i].fmt,
  773. captured_layer_config[i].addr, /* addr */
  774. captured_layer_config[i].identity,
  775. captured_layer_config[i].connected_type,
  776. captured_layer_config[i].security);
  777. }
  778. pr_debug("[mtkfb] realtime(hw):\n");
  779. for (i = 0; i < 4; i++) {
  780. pr_debug("[mtkfb] layer=%d, layer_en=%d, idx=%d, fmt=%d, addr=0x%x, %d, %d, %d\n ",
  781. realtime_layer_config[i].layer, /* layer */
  782. realtime_layer_config[i].layer_en, realtime_layer_config[i].buff_idx,
  783. realtime_layer_config[i].fmt,
  784. realtime_layer_config[i].addr, /* addr */
  785. realtime_layer_config[i].identity,
  786. realtime_layer_config[i].connected_type,
  787. realtime_layer_config[i].security);
  788. }
  789. /* dump mmp data */
  790. /* mtkfb_aee_print("surfaceflinger-mtkfb blocked"); */
  791. #endif
  792. }
  793. static disp_session_input_config session_input;
  794. static int mtkfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  795. {
  796. void __user *argp = (void __user *)arg;
  797. DISP_STATUS ret = 0;
  798. int r = 0;
  799. DISPFUNC();
  800. /* M: dump debug mmprofile log info */
  801. MMProfileLogEx(MTKFB_MMP_Events.IOCtrl, MMProfileFlagPulse, _IOC_NR(cmd), arg);
  802. pr_debug("mtkfb_ioctl, info=%p, cmd nr=0x%08x, cmd size=0x%08x\n", info,
  803. (unsigned int)_IOC_NR(cmd), (unsigned int)_IOC_SIZE(cmd));
  804. switch (cmd) {
  805. case MTKFB_GET_FRAMEBUFFER_MVA:
  806. return copy_to_user(argp, &fb_pa, sizeof(fb_pa)) ? -EFAULT : 0;
  807. /* remain this for engineer mode dfo multiple resolution */
  808. #if 1
  809. case MTKFB_GET_DISPLAY_IF_INFORMATION:
  810. {
  811. int displayid = 0;
  812. if (copy_from_user(&displayid, (void __user *)arg, sizeof(displayid))) {
  813. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  814. return -EFAULT;
  815. }
  816. if (displayid > MTKFB_MAX_DISPLAY_COUNT) {
  817. DISPERR("[FB]: invalid display id:%d\n", displayid);
  818. return -EFAULT;
  819. }
  820. if (displayid == 0) {
  821. dispif_info[displayid].displayWidth = primary_display_get_width();
  822. dispif_info[displayid].displayHeight = primary_display_get_height();
  823. dispif_info[displayid].lcmOriginalWidth =
  824. primary_display_get_original_width();
  825. dispif_info[displayid].lcmOriginalHeight =
  826. primary_display_get_original_height();
  827. dispif_info[displayid].displayMode =
  828. primary_display_is_video_mode() ? 0 : 1;
  829. } else {
  830. DISPERR("information for displayid: %d is not available now\n",
  831. displayid);
  832. }
  833. if (copy_to_user((void __user *)arg, &(dispif_info[displayid]), sizeof(mtk_dispif_info_t))) {
  834. MTKFB_LOG("[FB]: copy_to_user failed! line:%d\n", __LINE__);
  835. r = -EFAULT;
  836. }
  837. return r;
  838. }
  839. #endif
  840. case MTKFB_POWEROFF:
  841. {
  842. MTKFB_FUNC();
  843. if (primary_display_is_sleepd()) {
  844. pr_debug("[FB Driver] Still in MTKFB_POWEROFF!!!\n");
  845. return r;
  846. }
  847. pr_debug("[FB Driver] enter MTKFB_POWEROFF\n");
  848. /* cci400_sel_for_ddp(); */
  849. ret = primary_display_suspend();
  850. if (ret < 0)
  851. DISPERR("primary display suspend failed\n");
  852. pr_debug("[FB Driver] leave MTKFB_POWEROFF\n");
  853. is_early_suspended = true; /* no care */
  854. return r;
  855. }
  856. case MTKFB_POWERON:
  857. {
  858. MTKFB_FUNC();
  859. if (primary_display_is_alive()) {
  860. pr_debug("[FB Driver] Still in MTKFB_POWERON!!!\n");
  861. return r;
  862. }
  863. pr_debug("[FB Driver] enter MTKFB_POWERON\n");
  864. primary_display_resume();
  865. pr_debug("[FB Driver] leave MTKFB_POWERON\n");
  866. is_early_suspended = false; /* no care */
  867. return r;
  868. }
  869. case MTKFB_GET_POWERSTATE:
  870. {
  871. int power_state;
  872. if (primary_display_is_sleepd())
  873. power_state = 0;
  874. else
  875. power_state = 1;
  876. if (copy_to_user(argp, &power_state, sizeof(power_state))) {
  877. pr_debug("[FB]: MTKFB_GET_POWERSTATE failed!\n");
  878. return -EFAULT;
  879. }
  880. return 0;
  881. }
  882. case MTKFB_CONFIG_IMMEDIATE_UPDATE:
  883. {
  884. MTKFB_LOG("[%s] MTKFB_CONFIG_IMMEDIATE_UPDATE, enable = %lu\n", __func__, arg);
  885. if (down_interruptible(&sem_early_suspend)) {
  886. MTKFB_LOG("[mtkfb_ioctl] can't get semaphore:%d\n", __LINE__);
  887. return -ERESTARTSYS;
  888. }
  889. sem_early_suspend_cnt--;
  890. /* DISP_WaitForLCDNotBusy(); */
  891. /* ret = DISP_ConfigImmediateUpdate((BOOL)arg); */
  892. /* sem_early_suspend_cnt++; */
  893. up(&sem_early_suspend);
  894. return r;
  895. }
  896. case MTKFB_CAPTURE_FRAMEBUFFER:
  897. {
  898. unsigned long dst_pbuf = 0;
  899. unsigned long *src_pbuf = 0;
  900. unsigned int pixel_bpp = info->var.bits_per_pixel / 8;
  901. unsigned int fbsize = DISP_GetScreenHeight() * DISP_GetScreenWidth() * pixel_bpp;
  902. if (copy_from_user(&dst_pbuf, (void __user *)arg, sizeof(dst_pbuf))) {
  903. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  904. r = -EFAULT;
  905. } else {
  906. src_pbuf = vmalloc(fbsize);
  907. if (!src_pbuf) {
  908. MTKFB_LOG("[FB]: vmalloc capture src_pbuf failed! line:%d\n", __LINE__);
  909. r = -EFAULT;
  910. } else {
  911. dprec_logger_start(DPREC_LOGGER_WDMA_DUMP, 0, 0);
  912. primary_display_capture_framebuffer_ovl((unsigned long)src_pbuf, eBGRA8888);
  913. dprec_logger_done(DPREC_LOGGER_WDMA_DUMP, 0, 0);
  914. if (copy_to_user((unsigned long *)dst_pbuf, src_pbuf, fbsize)) {
  915. MTKFB_LOG("[FB]: copy_to_user failed! line:%d\n", __LINE__);
  916. r = -EFAULT;
  917. }
  918. vfree(src_pbuf);
  919. }
  920. }
  921. return r;
  922. }
  923. case MTKFB_SLT_AUTO_CAPTURE:
  924. {
  925. struct fb_slt_catpure capConfig;
  926. char *dst_buffer;
  927. unsigned int fb_size;
  928. if (copy_from_user(&capConfig, (void __user *)arg, sizeof(capConfig))) {
  929. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  930. r = -EFAULT;
  931. } else {
  932. unsigned int format;
  933. switch (capConfig.format) {
  934. case MTK_FB_FORMAT_RGB888:
  935. format = eRGB888;
  936. break;
  937. case MTK_FB_FORMAT_BGR888:
  938. format = eBGR888;
  939. break;
  940. case MTK_FB_FORMAT_ARGB8888:
  941. format = eARGB8888;
  942. break;
  943. case MTK_FB_FORMAT_RGB565:
  944. format = eRGB565;
  945. break;
  946. case MTK_FB_FORMAT_UYVY:
  947. format = eYUV_420_2P_UYVY;
  948. break;
  949. case MTK_FB_FORMAT_ABGR8888:
  950. default:
  951. format = eABGR8888;
  952. break;
  953. }
  954. dst_buffer = (char *)capConfig.outputBuffer;
  955. fb_size = DISP_GetScreenWidth() * DISP_GetScreenHeight() * 4;
  956. if (!capConfig.outputBuffer) {
  957. MTKFB_LOG("[FB]: vmalloc capture outputBuffer failed! line:%d\n", __LINE__);
  958. r = -EFAULT;
  959. } else {
  960. capConfig.outputBuffer = vmalloc(fb_size);
  961. primary_display_capture_framebuffer_ovl((unsigned long)capConfig.outputBuffer, format);
  962. if (copy_to_user(dst_buffer, (char *)capConfig.outputBuffer, fb_size)) {
  963. MTKFB_LOG("[FB]: copy_to_user failed! line:%d\n", __LINE__);
  964. r = -EFAULT;
  965. }
  966. vfree((char *)capConfig.outputBuffer);
  967. }
  968. }
  969. return r;
  970. }
  971. case MTKFB_GET_OVERLAY_LAYER_INFO:
  972. {
  973. struct fb_overlay_layer_info layerInfo;
  974. MTKFB_LOG(" mtkfb_ioctl():MTKFB_GET_OVERLAY_LAYER_INFO\n");
  975. if (copy_from_user(&layerInfo, (void __user *)arg, sizeof(layerInfo))) {
  976. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  977. return -EFAULT;
  978. }
  979. if (mtkfb_get_overlay_layer_info(&layerInfo) < 0) {
  980. MTKFB_LOG("[FB]: Failed to get overlay layer info\n");
  981. return -EFAULT;
  982. }
  983. if (copy_to_user((void __user *)arg, &layerInfo, sizeof(layerInfo))) {
  984. MTKFB_LOG("[FB]: copy_to_user failed! line:%d\n", __LINE__);
  985. r = -EFAULT;
  986. }
  987. return r;
  988. }
  989. case MTKFB_SET_OVERLAY_LAYER:
  990. {
  991. struct fb_overlay_layer layerInfo;
  992. if (copy_from_user(&layerInfo, (void __user *)arg, sizeof(layerInfo))) {
  993. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  994. r = -EFAULT;
  995. } else {
  996. disp_input_config *input;
  997. memset((void *)&session_input, 0, sizeof(session_input));
  998. if (layerInfo.layer_id >= TOTAL_OVL_LAYER_NUM) {
  999. MTKFB_LOG
  1000. ("MTKFB_SET_OVERLAY_LAYER, layer_id invalid=%d\n",
  1001. layerInfo.layer_id);
  1002. } else {
  1003. input = &session_input.config[session_input.config_layer_num++];
  1004. _convert_fb_layer_to_disp_input(&layerInfo, input);
  1005. }
  1006. primary_display_config_input_multiple(&session_input);
  1007. primary_display_trigger(1, NULL, 0);
  1008. }
  1009. return r;
  1010. }
  1011. case MTKFB_ERROR_INDEX_UPDATE_TIMEOUT:
  1012. {
  1013. pr_debug("[DDP] mtkfb_ioctl():MTKFB_ERROR_INDEX_UPDATE_TIMEOUT\n");
  1014. /* call info dump function here */
  1015. /* mtkfb_dump_layer_info(); */
  1016. return r;
  1017. }
  1018. case MTKFB_ERROR_INDEX_UPDATE_TIMEOUT_AEE:
  1019. {
  1020. pr_debug("[DDP] mtkfb_ioctl():MTKFB_ERROR_INDEX_UPDATE_TIMEOUT\n");
  1021. /* call info dump function here */
  1022. /* mtkfb_dump_layer_info(); */
  1023. /* mtkfb_aee_print("surfaceflinger-mtkfb blocked"); */
  1024. return r;
  1025. }
  1026. case MTKFB_SET_VIDEO_LAYERS:
  1027. {
  1028. struct mmp_fb_overlay_layers {
  1029. struct fb_overlay_layer Layer0;
  1030. struct fb_overlay_layer Layer1;
  1031. struct fb_overlay_layer Layer2;
  1032. struct fb_overlay_layer Layer3;
  1033. };
  1034. struct fb_overlay_layer layerInfo[VIDEO_LAYER_COUNT];
  1035. MTKFB_LOG(" mtkfb_ioctl():MTKFB_SET_VIDEO_LAYERS\n");
  1036. MMProfileLog(MTKFB_MMP_Events.SetOverlayLayers, MMProfileFlagStart);
  1037. if (copy_from_user(&layerInfo, (void __user *)arg, sizeof(layerInfo))) {
  1038. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  1039. MMProfileLogMetaString(MTKFB_MMP_Events.SetOverlayLayers,
  1040. MMProfileFlagEnd, "Copy_from_user failed!");
  1041. r = -EFAULT;
  1042. } else {
  1043. int32_t i;
  1044. /* mutex_lock(&OverlaySettingMutex); */
  1045. disp_input_config *input;
  1046. memset((void *)&session_input, 0, sizeof(session_input));
  1047. for (i = 0; i < VIDEO_LAYER_COUNT; ++i) {
  1048. if (layerInfo[i].layer_id >= OVL_LAYER_NUM) {
  1049. DDPAEE
  1050. ("MTKFB_SET_VIDEO_LAYERS, layer_id invalid=%d\n",
  1051. layerInfo[i].layer_id);
  1052. continue;
  1053. }
  1054. input =
  1055. &session_input.config[session_input.config_layer_num++];
  1056. _convert_fb_layer_to_disp_input(&layerInfo[i], input);
  1057. }
  1058. /* is_ipoh_bootup = false; */
  1059. /* atomic_set(&OverlaySettingDirtyFlag, 1); */
  1060. /* atomic_set(&OverlaySettingApplied, 0); */
  1061. /* mutex_unlock(&OverlaySettingMutex); */
  1062. /* MMProfileLogStructure(MTKFB_MMP_Events.SetOverlayLayers, MMProfileFlagEnd,
  1063. layerInfo, struct mmp_fb_overlay_layers); */
  1064. primary_display_config_input_multiple(&session_input);
  1065. primary_display_trigger(1, NULL, 0);
  1066. }
  1067. return r;
  1068. }
  1069. case MTKFB_TRIG_OVERLAY_OUT:
  1070. {
  1071. MTKFB_LOG(" mtkfb_ioctl():MTKFB_TRIG_OVERLAY_OUT\n");
  1072. MMProfileLog(MTKFB_MMP_Events.TrigOverlayOut, MMProfileFlagPulse);
  1073. primary_display_trigger(1, NULL, 0);
  1074. return 0;
  1075. }
  1076. case MTKFB_META_RESTORE_SCREEN:
  1077. {
  1078. struct fb_var_screeninfo var;
  1079. if (copy_from_user(&var, argp, sizeof(var)))
  1080. return -EFAULT;
  1081. info->var.yoffset = var.yoffset;
  1082. init_framebuffer(info);
  1083. return mtkfb_pan_display_impl(&var, info);
  1084. }
  1085. case MTKFB_GET_DEFAULT_UPDATESPEED:
  1086. {
  1087. unsigned int speed;
  1088. MTKFB_LOG("[MTKFB] get default update speed\n");
  1089. /* DISP_Get_Default_UpdateSpeed(&speed); */
  1090. pr_debug("[MTKFB EM]MTKFB_GET_DEFAULT_UPDATESPEED is %d\n", speed);
  1091. return copy_to_user(argp, &speed, sizeof(speed)) ? -EFAULT : 0;
  1092. }
  1093. case MTKFB_GET_CURR_UPDATESPEED:
  1094. {
  1095. unsigned int speed;
  1096. MTKFB_LOG("[MTKFB] get current update speed\n");
  1097. /* DISP_Get_Current_UpdateSpeed(&speed); */
  1098. pr_debug("[MTKFB EM]MTKFB_GET_CURR_UPDATESPEED is %d\n", speed);
  1099. return copy_to_user(argp, &speed, sizeof(speed)) ? -EFAULT : 0;
  1100. }
  1101. case MTKFB_CHANGE_UPDATESPEED:
  1102. {
  1103. unsigned int speed;
  1104. MTKFB_LOG("[MTKFB] change update speed\n");
  1105. if (copy_from_user(&speed, (void __user *)arg, sizeof(speed))) {
  1106. MTKFB_LOG("[FB]: copy_from_user failed! line:%d\n", __LINE__);
  1107. r = -EFAULT;
  1108. } else {
  1109. /* DISP_Change_Update(speed); */
  1110. pr_debug("[MTKFB EM]MTKFB_CHANGE_UPDATESPEED is %d\n", speed);
  1111. }
  1112. return r;
  1113. }
  1114. case MTKFB_AEE_LAYER_EXIST:
  1115. {
  1116. /* pr_debug("[MTKFB] isAEEEnabled=%d\n", isAEEEnabled); */
  1117. return copy_to_user(argp, &isAEEEnabled,
  1118. sizeof(isAEEEnabled)) ? -EFAULT : 0;
  1119. }
  1120. case MTKFB_LOCK_FRONT_BUFFER:
  1121. return 0;
  1122. case MTKFB_UNLOCK_FRONT_BUFFER:
  1123. return 0;
  1124. case MTKFB_FACTORY_AUTO_TEST:
  1125. {
  1126. unsigned int result = 0;
  1127. pr_debug("factory mode: lcm auto test\n");
  1128. result = mtkfb_fm_auto_test();
  1129. return copy_to_user(argp, &result, sizeof(result)) ? -EFAULT : 0;
  1130. }
  1131. default:
  1132. pr_debug("mtkfb_ioctl Not support, info=%p, cmd=0x%08x, arg=0x%lx\n", info,
  1133. (unsigned int)cmd, arg);
  1134. return -EINVAL;
  1135. }
  1136. }
  1137. #ifdef CONFIG_COMPAT
  1138. struct compat_fb_overlay_layer {
  1139. compat_uint_t layer_id;
  1140. compat_uint_t layer_enable;
  1141. compat_uptr_t src_base_addr;
  1142. compat_uptr_t src_phy_addr;
  1143. compat_uint_t src_direct_link;
  1144. compat_int_t src_fmt;
  1145. compat_uint_t src_use_color_key;
  1146. compat_uint_t src_color_key;
  1147. compat_uint_t src_pitch;
  1148. compat_uint_t src_offset_x, src_offset_y;
  1149. compat_uint_t src_width, src_height;
  1150. compat_uint_t tgt_offset_x, tgt_offset_y;
  1151. compat_uint_t tgt_width, tgt_height;
  1152. compat_int_t layer_rotation;
  1153. compat_int_t layer_type;
  1154. compat_int_t video_rotation;
  1155. compat_uint_t isTdshp; /* set to 1, will go through tdshp first, then layer blending, then to color */
  1156. compat_int_t next_buff_idx;
  1157. compat_int_t identity;
  1158. compat_int_t connected_type;
  1159. compat_uint_t security;
  1160. compat_uint_t alpha_enable;
  1161. compat_uint_t alpha;
  1162. compat_int_t fence_fd; /* 8135 */
  1163. compat_int_t ion_fd; /* 8135 CL 2340210 */
  1164. };
  1165. #define COMPAT_MTKFB_SET_OVERLAY_LAYER MTK_IOW(0, struct compat_fb_overlay_layer)
  1166. #define COMPAT_MTKFB_TRIG_OVERLAY_OUT MTK_IO(1)
  1167. #define COMPAT_MTKFB_SET_VIDEO_LAYERS MTK_IOW(2, struct compat_fb_overlay_layer)
  1168. #define COMPAT_MTKFB_CAPTURE_FRAMEBUFFER MTK_IOW(3, compat_ulong_t)
  1169. #define COMPAT_MTKFB_CONFIG_IMMEDIATE_UPDATE MTK_IOW(4, compat_ulong_t)
  1170. #define COMPAT_MTKFB_GET_POWERSTATE MTK_IOR(21, compat_ulong_t)
  1171. #define COMPAT_MTKFB_META_RESTORE_SCREEN MTK_IOW(101, compat_ulong_t)
  1172. static void compat_convert(struct compat_fb_overlay_layer *compat_info,
  1173. struct fb_overlay_layer *info)
  1174. {
  1175. info->layer_id = compat_info->layer_id;
  1176. info->layer_enable = compat_info->layer_enable;
  1177. info->src_base_addr = (void *)((unsigned long)compat_info->src_base_addr);
  1178. info->src_phy_addr = (void *)((unsigned long)compat_info->src_phy_addr);
  1179. info->src_direct_link = compat_info->src_direct_link;
  1180. info->src_fmt = compat_info->src_fmt;
  1181. info->src_use_color_key = compat_info->src_use_color_key;
  1182. info->src_color_key = compat_info->src_color_key;
  1183. info->src_pitch = compat_info->src_pitch;
  1184. info->src_offset_x = compat_info->src_offset_x;
  1185. info->src_offset_y = compat_info->src_offset_y;
  1186. info->src_width = compat_info->src_width;
  1187. info->src_height = compat_info->src_height;
  1188. info->tgt_offset_x = compat_info->tgt_offset_x;
  1189. info->tgt_offset_y = compat_info->tgt_offset_y;
  1190. info->tgt_width = compat_info->tgt_width;
  1191. info->tgt_height = compat_info->tgt_height;
  1192. info->layer_rotation = compat_info->layer_rotation;
  1193. info->layer_type = compat_info->layer_type;
  1194. info->video_rotation = compat_info->video_rotation;
  1195. info->isTdshp = compat_info->isTdshp;
  1196. info->next_buff_idx = compat_info->next_buff_idx;
  1197. info->identity = compat_info->identity;
  1198. info->connected_type = compat_info->connected_type;
  1199. info->security = compat_info->security;
  1200. info->alpha_enable = compat_info->alpha_enable;
  1201. info->alpha = compat_info->alpha;
  1202. info->fence_fd = compat_info->fence_fd;
  1203. info->ion_fd = compat_info->ion_fd;
  1204. }
  1205. static int mtkfb_compat_ioctl(struct fb_info *info, unsigned int cmd, unsigned long arg)
  1206. {
  1207. struct fb_overlay_layer layerInfo;
  1208. long ret = 0;
  1209. pr_debug("[FB Driver] mtkfb_compat_ioctl, cmd=0x%08x, cmd nr=0x%08x, cmd size=0x%08x\n",
  1210. cmd, (unsigned int)_IOC_NR(cmd), (unsigned int)_IOC_SIZE(cmd));
  1211. switch (cmd) {
  1212. case COMPAT_MTKFB_GET_POWERSTATE:
  1213. {
  1214. compat_uint_t __user *data32;
  1215. int power_state = 0;
  1216. data32 = compat_ptr(arg);
  1217. if (primary_display_is_sleepd())
  1218. power_state = 0;
  1219. else
  1220. power_state = 1;
  1221. if (put_user(power_state, data32)) {
  1222. pr_debug("MTKFB_GET_POWERSTATE failed\n");
  1223. ret = -EFAULT;
  1224. }
  1225. pr_debug("MTKFB_GET_POWERSTATE success %d\n", power_state);
  1226. break;
  1227. }
  1228. case COMPAT_MTKFB_CAPTURE_FRAMEBUFFER:
  1229. {
  1230. compat_ulong_t __user *data32;
  1231. unsigned long *pbuf;
  1232. unsigned int pixel_bpp = info->var.bits_per_pixel / 8;
  1233. unsigned int fbsize = DISP_GetScreenHeight() * DISP_GetScreenWidth() * pixel_bpp;
  1234. unsigned long dest;
  1235. data32 = compat_ptr(arg);
  1236. pbuf = compat_alloc_user_space(fbsize);
  1237. if (!pbuf) {
  1238. pr_warn("[FB]: vmalloc capture src_pbuf failed! line:%d\n", __LINE__);
  1239. ret = -EFAULT;
  1240. } else {
  1241. dprec_logger_start(DPREC_LOGGER_WDMA_DUMP, 0, 0);
  1242. primary_display_capture_framebuffer_ovl((unsigned long)pbuf, eBGRA8888);
  1243. dprec_logger_done(DPREC_LOGGER_WDMA_DUMP, 0, 0);
  1244. ret = get_user(dest, data32);
  1245. if (copy_in_user((unsigned long *)dest, pbuf, fbsize/2)) {
  1246. pr_warn("[FB]: copy_to_user failed! line:%d\n", __LINE__);
  1247. ret = -EFAULT;
  1248. }
  1249. }
  1250. break;
  1251. }
  1252. case COMPAT_MTKFB_TRIG_OVERLAY_OUT:
  1253. {
  1254. arg = (unsigned long)compat_ptr(arg);
  1255. ret = mtkfb_ioctl(info, MTKFB_TRIG_OVERLAY_OUT, arg);
  1256. break;
  1257. }
  1258. case COMPAT_MTKFB_META_RESTORE_SCREEN:
  1259. {
  1260. arg = (unsigned long)compat_ptr(arg);
  1261. ret = mtkfb_ioctl(info, MTKFB_META_RESTORE_SCREEN, arg);
  1262. break;
  1263. }
  1264. case COMPAT_MTKFB_SET_OVERLAY_LAYER:
  1265. {
  1266. struct compat_fb_overlay_layer compat_layerInfo;
  1267. MTKFB_LOG(" mtkfb_compat_ioctl():MTKFB_SET_OVERLAY_LAYER\n");
  1268. arg = (unsigned long)compat_ptr(arg);
  1269. if (copy_from_user(&compat_layerInfo, (void __user *)arg, sizeof(compat_layerInfo))) {
  1270. MTKFB_LOG("[FB Driver]: copy_from_user failed! line:%d\n",
  1271. __LINE__);
  1272. ret = -EFAULT;
  1273. } else {
  1274. disp_input_config *input;
  1275. compat_convert(&compat_layerInfo, &layerInfo);
  1276. /* in early suspend mode ,will not update buffer index, info SF by return value */
  1277. if (primary_display_is_sleepd()) {
  1278. pr_debug("[FB Driver] error, set overlay in early suspend ,skip!\n");
  1279. return MTKFB_ERROR_IS_EARLY_SUSPEND;
  1280. }
  1281. memset((void *)&session_input, 0, sizeof(session_input));
  1282. if (layerInfo.layer_id >= TOTAL_OVL_LAYER_NUM) {
  1283. DDPAEE
  1284. ("COMPAT_MTKFB_SET_OVERLAY_LAYER, layer_id invalid=%d\n",
  1285. layerInfo.layer_id);
  1286. } else {
  1287. input = &session_input.config[session_input.config_layer_num++];
  1288. _convert_fb_layer_to_disp_input(&layerInfo, input);
  1289. }
  1290. primary_display_config_input_multiple(&session_input);
  1291. /* primary_display_trigger(1, NULL, 0); */
  1292. }
  1293. }
  1294. break;
  1295. case COMPAT_MTKFB_SET_VIDEO_LAYERS:
  1296. {
  1297. struct compat_fb_overlay_layer compat_layerInfo[VIDEO_LAYER_COUNT];
  1298. MTKFB_LOG(" mtkfb_compat_ioctl():MTKFB_SET_VIDEO_LAYERS\n");
  1299. if (copy_from_user(&compat_layerInfo, (void __user *)arg, sizeof(compat_layerInfo))) {
  1300. MTKFB_LOG("[FB Driver]: copy_from_user failed! line:%d\n",
  1301. __LINE__);
  1302. ret = -EFAULT;
  1303. } else {
  1304. int32_t i;
  1305. /* mutex_lock(&OverlaySettingMutex); */
  1306. disp_input_config *input;
  1307. memset((void *)&session_input, 0, sizeof(session_input));
  1308. for (i = 0; i < VIDEO_LAYER_COUNT; ++i) {
  1309. compat_convert(&compat_layerInfo[i], &layerInfo);
  1310. if (layerInfo.layer_id >= OVL_LAYER_NUM) {
  1311. DDPAEE
  1312. ("COMPAT_MTKFB_SET_VIDEO_LAYERS, layer_id invalid=%d\n",
  1313. layerInfo.layer_id);
  1314. continue;
  1315. }
  1316. input =
  1317. &session_input.config[session_input.config_layer_num++];
  1318. _convert_fb_layer_to_disp_input(&layerInfo, input);
  1319. }
  1320. /* is_ipoh_bootup = false; */
  1321. /* atomic_set(&OverlaySettingDirtyFlag, 1); */
  1322. /* atomic_set(&OverlaySettingApplied, 0); */
  1323. /* mutex_unlock(&OverlaySettingMutex); */
  1324. /* MMProfileLogStructure(MTKFB_MMP_Events.SetOverlayLayers, MMProfileFlagEnd,
  1325. layerInfo, struct mmp_fb_overlay_layers); */
  1326. primary_display_config_input_multiple(&session_input);
  1327. /* primary_display_trigger(1, NULL, 0); */
  1328. }
  1329. }
  1330. break;
  1331. default:
  1332. /* NOTHING DIFFERENCE with standard ioctl calling */
  1333. arg = (unsigned long)compat_ptr(arg);
  1334. ret = mtkfb_ioctl(info, cmd, arg);
  1335. break;
  1336. }
  1337. return ret;
  1338. }
  1339. #endif
  1340. static int mtkfb_pan_display_proxy(struct fb_var_screeninfo *var, struct fb_info *info)
  1341. {
  1342. #ifdef CONFIG_MTPROF_APPLAUNCH /* eng enable, user disable */
  1343. pr_debug("AppLaunch " "mtkfb_pan_display_proxy.\n");
  1344. #endif
  1345. return mtkfb_pan_display_impl(var, info);
  1346. }
  1347. static void mtkfb_blank_suspend(void);
  1348. static void mtkfb_blank_resume(void);
  1349. #if defined(CONFIG_PM_AUTOSLEEP)
  1350. static int mtkfb_blank(int blank_mode, struct fb_info *info)
  1351. {
  1352. switch (blank_mode) {
  1353. case FB_BLANK_UNBLANK:
  1354. case FB_BLANK_NORMAL:
  1355. mtkfb_blank_resume();
  1356. if (!lcd_fps)
  1357. msleep(30);
  1358. else
  1359. msleep(2 * 100000 / lcd_fps); /* Delay 2 frames. */
  1360. break;
  1361. case FB_BLANK_VSYNC_SUSPEND:
  1362. case FB_BLANK_HSYNC_SUSPEND:
  1363. break;
  1364. case FB_BLANK_POWERDOWN:
  1365. mtkfb_blank_suspend();
  1366. break;
  1367. default:
  1368. return -EINVAL;
  1369. }
  1370. return 0;
  1371. }
  1372. #endif
  1373. /* Callback table for the frame buffer framework. Some of these pointers
  1374. * will be changed according to the current setting of fb_info->accel_flags.
  1375. */
  1376. static struct fb_ops mtkfb_ops = {
  1377. .owner = THIS_MODULE,
  1378. .fb_open = mtkfb_open,
  1379. .fb_release = mtkfb_release,
  1380. .fb_setcolreg = mtkfb_setcolreg,
  1381. .fb_pan_display = mtkfb_pan_display_proxy,
  1382. .fb_fillrect = cfb_fillrect,
  1383. .fb_copyarea = cfb_copyarea,
  1384. .fb_imageblit = cfb_imageblit,
  1385. .fb_cursor = mtkfb_soft_cursor,
  1386. .fb_check_var = mtkfb_check_var,
  1387. .fb_set_par = mtkfb_set_par,
  1388. .fb_ioctl = mtkfb_ioctl,
  1389. #ifdef CONFIG_COMPAT
  1390. .fb_compat_ioctl = mtkfb_compat_ioctl,
  1391. #endif
  1392. #if defined(CONFIG_PM_AUTOSLEEP)
  1393. .fb_blank = mtkfb_blank,
  1394. #endif
  1395. };
  1396. /**
  1397. * ---------------------------------------------------------------------------
  1398. * Sysfs interface
  1399. * ---------------------------------------------------------------------------
  1400. */
  1401. static int mtkfb_register_sysfs(struct mtkfb_device *fbdev)
  1402. {
  1403. /* NOT_REFERENCED(fbdev); */
  1404. return 0;
  1405. }
  1406. static void mtkfb_unregister_sysfs(struct mtkfb_device *fbdev)
  1407. {
  1408. /* NOT_REFERENCED(fbdev); */
  1409. }
  1410. /**
  1411. * ---------------------------------------------------------------------------
  1412. * LDM callbacks
  1413. * ---------------------------------------------------------------------------
  1414. */
  1415. /* Initialize system fb_info object and set the default video mode.
  1416. * The frame buffer memory already allocated by lcddma_init
  1417. */
  1418. static int mtkfb_fbinfo_init(struct fb_info *info)
  1419. {
  1420. struct mtkfb_device *fbdev = (struct mtkfb_device *)info->par;
  1421. struct fb_var_screeninfo var;
  1422. int r = 0;
  1423. /*DISPFUNC(); */
  1424. BUG_ON(!fbdev->fb_va_base);
  1425. info->fbops = &mtkfb_ops;
  1426. info->flags = FBINFO_FLAG_DEFAULT;
  1427. info->screen_base = (char *)fbdev->fb_va_base;
  1428. info->screen_size = fbdev->fb_size_in_byte;
  1429. info->pseudo_palette = fbdev->pseudo_palette;
  1430. r = fb_alloc_cmap(&info->cmap, 32, 0);
  1431. if (r != 0)
  1432. DISPERR("unable to allocate color map memory\n");
  1433. /* setup the initial video mode (RGB565) */
  1434. memset(&var, 0, sizeof(var));
  1435. var.xres = MTK_FB_XRES;
  1436. var.yres = MTK_FB_YRES;
  1437. var.xres_virtual = MTK_FB_XRESV;
  1438. var.yres_virtual = MTK_FB_YRESV;
  1439. DISPMSG("FB_XRES=%d, FB_YRES=%d, FB_XRES_V=%d, FB_YRES_V=%d, BPP=%d, FB_PAGES=%d, FB_LINE=%d, FB_SIZEV=%d\n",
  1440. MTK_FB_XRES, MTK_FB_YRES, MTK_FB_XRESV, MTK_FB_YRESV, MTK_FB_BPP, MTK_FB_PAGES, MTK_FB_LINE,
  1441. MTK_FB_SIZEV);
  1442. /* use 32 bit framebuffer as default */
  1443. var.bits_per_pixel = 32;
  1444. var.transp.offset = 24;
  1445. var.red.length = 8;
  1446. #if 0
  1447. var.red.offset = 16;
  1448. var.red.length = 8;
  1449. var.green.offset = 8;
  1450. var.green.length = 8;
  1451. var.blue.offset = 0;
  1452. var.blue.length = 8;
  1453. #else
  1454. var.red.offset = 0;
  1455. var.red.length = 8;
  1456. var.green.offset = 8;
  1457. var.green.length = 8;
  1458. var.blue.offset = 16;
  1459. var.blue.length = 8;
  1460. #endif
  1461. var.width = DISP_GetActiveWidth();
  1462. var.height = DISP_GetActiveHeight();
  1463. var.activate = FB_ACTIVATE_NOW;
  1464. r = mtkfb_check_var(&var, info);
  1465. if (r != 0)
  1466. DISPERR("failed to mtkfb_check_var\n");
  1467. info->var = var;
  1468. r = mtkfb_set_par(info);
  1469. if (r != 0)
  1470. DISPERR("failed to mtkfb_set_par\n");
  1471. MSG_FUNC_LEAVE();
  1472. return r;
  1473. }
  1474. /* Release the fb_info object */
  1475. static void mtkfb_fbinfo_cleanup(struct mtkfb_device *fbdev)
  1476. {
  1477. MSG_FUNC_ENTER();
  1478. fb_dealloc_cmap(&fbdev->fb_info->cmap);
  1479. MSG_FUNC_LEAVE();
  1480. }
  1481. #define RGB565_TO_ARGB8888(x) \
  1482. ((((x) & 0x1F) << 3) | \
  1483. (((x) & 0x7E0) << 5) | \
  1484. (((x) & 0xF800) << 8) | \
  1485. (0xFF << 24)) /* opaque */
  1486. /* Init frame buffer content as 3 R/G/B color bars for debug */
  1487. static int init_framebuffer(struct fb_info *info)
  1488. {
  1489. void *buffer = info->screen_base + info->var.yoffset * info->fix.line_length;
  1490. /* clean whole frame buffer as black */
  1491. int size = info->var.xres_virtual * info->var.yres * info->var.bits_per_pixel/8;
  1492. /*memset_io(buffer, 0, info->screen_size)*/;
  1493. if (info->var.yres + info->var.yoffset <= info->var.yres_virtual)
  1494. memset_io(buffer, 0, size);
  1495. return 0;
  1496. }
  1497. /**
  1498. * Free driver resources. Can be called to rollback an aborted initialization
  1499. * sequence.
  1500. */
  1501. static void mtkfb_free_resources(struct mtkfb_device *fbdev, int state)
  1502. {
  1503. int r = 0;
  1504. switch (state) {
  1505. case MTKFB_ACTIVE:
  1506. r = unregister_framebuffer(fbdev->fb_info);
  1507. ASSERT(0 == r);
  1508. /* lint -fallthrough */
  1509. case 5:
  1510. mtkfb_unregister_sysfs(fbdev);
  1511. /* lint -fallthrough */
  1512. case 4:
  1513. mtkfb_fbinfo_cleanup(fbdev);
  1514. /* lint -fallthrough */
  1515. case 3:
  1516. /* DISP_CHECK_RET(DISP_Deinit()); */
  1517. /* lint -fallthrough */
  1518. case 2:
  1519. #ifndef CONFIG_FPGA_EARLY_PORTING
  1520. dma_free_coherent(0, fbdev->fb_size_in_byte, fbdev->fb_va_base, fbdev->fb_pa_base);
  1521. #endif
  1522. /* lint -fallthrough */
  1523. case 1:
  1524. dev_set_drvdata(fbdev->dev, NULL);
  1525. framebuffer_release(fbdev->fb_info);
  1526. /* lint -fallthrough */
  1527. case 0:
  1528. /* nothing to free */
  1529. break;
  1530. default:
  1531. BUG();
  1532. }
  1533. }
  1534. char mtkfb_lcm_name[256] = { 0 };
  1535. void disp_get_fb_address(unsigned long *fbVirAddr, unsigned long *fbPhysAddr)
  1536. {
  1537. struct mtkfb_device *fbdev = (struct mtkfb_device *)mtkfb_fbi->par;
  1538. *fbVirAddr = (unsigned long)fbdev->fb_va_base + mtkfb_fbi->var.yoffset * mtkfb_fbi->fix.line_length;
  1539. *fbPhysAddr = (unsigned long)fbdev->fb_pa_base + mtkfb_fbi->var.yoffset * mtkfb_fbi->fix.line_length;
  1540. }
  1541. char *mtkfb_find_lcm_driver(void)
  1542. {
  1543. #ifdef CONFIG_OF
  1544. if (1 == _parse_tag_videolfb()) {
  1545. pr_debug("[mtkfb] not found LCM driver, return NULL\n");
  1546. return NULL;
  1547. }
  1548. #else
  1549. {
  1550. char *p, *q;
  1551. p = strstr(saved_command_line, "lcm=");
  1552. /* we can't find lcm string in the command line, the uboot should be old version */
  1553. if (p == NULL)
  1554. return NULL;
  1555. p += 6;
  1556. if ((p - saved_command_line) > strlen(saved_command_line + 1))
  1557. return NULL;
  1558. pr_debug("%s, %s\n", __func__, p);
  1559. q = p;
  1560. while (*q != ' ' && *q != '\0')
  1561. q++;
  1562. memset((void *)mtkfb_lcm_name, 0, sizeof(mtkfb_lcm_name));
  1563. strncpy((char *)mtkfb_lcm_name, (const char *)p, (int)(q - p));
  1564. mtkfb_lcm_name[q - p + 1] = '\0';
  1565. }
  1566. #endif
  1567. /* printk("%s, %s\n", __func__, mtkfb_lcm_name); */
  1568. return mtkfb_lcm_name;
  1569. }
  1570. uint32_t color = 0;
  1571. unsigned int mtkfb_fm_auto_test(void)
  1572. {
  1573. unsigned int result = 0;
  1574. unsigned int i = 0;
  1575. unsigned long fbVirAddr;
  1576. uint32_t fbsize;
  1577. int r = 0;
  1578. unsigned int *fb_buffer;
  1579. struct mtkfb_device *fbdev = (struct mtkfb_device *)mtkfb_fbi->par;
  1580. struct fb_var_screeninfo var;
  1581. fbVirAddr = (unsigned long)fbdev->fb_va_base;
  1582. fb_buffer = (unsigned int *)fbVirAddr;
  1583. memcpy(&var, &(mtkfb_fbi->var), sizeof(var));
  1584. var.activate = FB_ACTIVATE_NOW;
  1585. var.bits_per_pixel = 32;
  1586. var.transp.offset = 24;
  1587. var.transp.length = 8;
  1588. var.red.offset = 16;
  1589. var.red.length = 8;
  1590. var.green.offset = 8;
  1591. var.green.length = 8;
  1592. var.blue.offset = 0;
  1593. var.blue.length = 8;
  1594. r = mtkfb_check_var(&var, mtkfb_fbi);
  1595. if (r != 0)
  1596. PRNERR("failed to mtkfb_check_var\n");
  1597. mtkfb_fbi->var = var;
  1598. #if 0
  1599. r = mtkfb_set_par(mtkfb_fbi);
  1600. if (r != 0)
  1601. PRNERR("failed to mtkfb_set_par\n");
  1602. #endif
  1603. if (color == 0)
  1604. color = 0xFF00FF00;
  1605. fbsize = ALIGN_TO(DISP_GetScreenWidth(), MTK_FB_ALIGNMENT) * DISP_GetScreenHeight() * MTK_FB_PAGES;
  1606. for (i = 0; i < fbsize; i++)
  1607. *fb_buffer++ = color;
  1608. #if 0
  1609. if (!primary_display_is_video_mode())
  1610. primary_display_trigger(1, NULL, 0);
  1611. #endif
  1612. mtkfb_pan_display_impl(&mtkfb_fbi->var, mtkfb_fbi);
  1613. msleep(100);
  1614. result = primary_display_lcm_ATA();
  1615. if (result == 0)
  1616. pr_debug("ATA LCM failed\n");
  1617. else
  1618. pr_debug("ATA LCM passed\n");
  1619. return result;
  1620. }
  1621. #if 0
  1622. static void _mtkfb_draw_block(unsigned long addr, unsigned int x, unsigned int y, unsigned int w,
  1623. unsigned int h, unsigned int color)
  1624. {
  1625. int i = 0;
  1626. int j = 0;
  1627. unsigned long start_addr = addr + MTK_FB_XRESV * 4 * y + x * 4;
  1628. for (j = 0; j < h; j++) {
  1629. for (i = 0; i < w; i++)
  1630. /* *(unsigned long*)(start_addr + i*4 + j*MTK_FB_XRESV*4) = color; */
  1631. mt_reg_sync_writel(color, (start_addr + i * 4 + j * MTK_FB_XRESV * 4));
  1632. }
  1633. }
  1634. static long int get_current_time_us(void)
  1635. {
  1636. struct timeval t;
  1637. do_gettimeofday(&t);
  1638. return (t.tv_sec & 0xFFF) * 1000000 + t.tv_usec;
  1639. }
  1640. static int _mtkfb_internal_test(unsigned long va, unsigned int w, unsigned int h)
  1641. {
  1642. /* this is for debug, used in bring up day */
  1643. unsigned int i = 0;
  1644. unsigned int color = 0;
  1645. int _internal_test_block_size = 120;
  1646. for (i = 0; i < w * h / _internal_test_block_size / _internal_test_block_size; i++) {
  1647. color = (i & 0x1) * 0xff;
  1648. /* color += ((i&0x2)>>1)*0xff00; */
  1649. /* color += ((i&0x4)>>2)*0xff0000; */
  1650. color += 0xff000000U;
  1651. _mtkfb_draw_block(va, i % (w / _internal_test_block_size) * _internal_test_block_size,
  1652. i / (w / _internal_test_block_size) * _internal_test_block_size,
  1653. _internal_test_block_size, _internal_test_block_size, color);
  1654. }
  1655. /* unsigned long ttt = get_current_time_us(); */
  1656. /* for (i = 0; i < 1000; i++) */
  1657. primary_display_trigger(1, NULL, 0);
  1658. /* ttt = get_current_time_us() - ttt; */
  1659. /* DISPMSG("%s, update 1000 times, fps=%2d.%2d\n",
  1660. __func__, (1000*100/(ttt/1000/1000))/100, (1000*100/(ttt/1000/1000))%100);
  1661. */
  1662. return 0;
  1663. _internal_test_block_size = 20;
  1664. for (i = 0; i < w * h / _internal_test_block_size / _internal_test_block_size; i++) {
  1665. color = (i & 0x1) * 0xff;
  1666. color += ((i & 0x2) >> 1) * 0xff00;
  1667. color += ((i & 0x4) >> 2) * 0xff0000;
  1668. color += 0xff000000U;
  1669. _mtkfb_draw_block(va, i % (w / _internal_test_block_size) * _internal_test_block_size,
  1670. i / (w / _internal_test_block_size) * _internal_test_block_size,
  1671. _internal_test_block_size, _internal_test_block_size, color);
  1672. }
  1673. primary_display_trigger(1, NULL, 0);
  1674. _internal_test_block_size = 30;
  1675. for (i = 0; i < w * h / _internal_test_block_size / _internal_test_block_size; i++) {
  1676. color = (i & 0x1) * 0xff;
  1677. color += ((i & 0x2) >> 1) * 0xff00;
  1678. color += ((i & 0x4) >> 2) * 0xff0000;
  1679. color += 0xff000000U;
  1680. _mtkfb_draw_block(va, i % (w / _internal_test_block_size) * _internal_test_block_size,
  1681. i / (w / _internal_test_block_size) * _internal_test_block_size,
  1682. _internal_test_block_size, _internal_test_block_size, color);
  1683. }
  1684. primary_display_trigger(1, NULL, 0);
  1685. #if 0
  1686. /* extern unsigned char data_rgb888_64x64[12288]; */
  1687. /* memset_io(va, 0xff, w*h*4); */
  1688. int i = 0;
  1689. int j = 0;
  1690. for (j = 0; j < 10; j++) {
  1691. for (i = 0; i < 64; i++)
  1692. memcpy((void *)(va + j * 720 * 70 * 3 + 720 * 3 * i),
  1693. data_rgb888_64x64 + 64 * 3 * i, 64 * 3);
  1694. }
  1695. for (j = 0; j < 10; j++) {
  1696. for (i = 0; i < 64; i++)
  1697. memcpy((void *)(va + 720 * 1280 * 3 + 360 * 3 + j * 720 * 70 * 3 +
  1698. 720 * 3 * i), data_rgb888_64x64 + 64 * 3 * i, 64 * 3);
  1699. }
  1700. primary_display_trigger(1);
  1701. memset_io(va, 0xff, w * h * 4);
  1702. primary_display_trigger(1);
  1703. memset_io(va, 0x00, w * h * 4);
  1704. primary_display_trigger(1);
  1705. memset_io(va, 0x88, w * h * 4);
  1706. primary_display_trigger(1);
  1707. memset_io(va, 0xcc, w * h * 4);
  1708. primary_display_trigger(1);
  1709. memset_io(va, 0x22, w * h * 4);
  1710. primary_display_trigger(1);
  1711. #endif
  1712. return 0;
  1713. }
  1714. #endif
  1715. #ifdef CONFIG_OF
  1716. struct tag_videolfb {
  1717. u64 fb_base;
  1718. u32 islcmfound;
  1719. u32 fps;
  1720. u32 vram;
  1721. char lcmname[1]; /* this is the minimum size */
  1722. };
  1723. unsigned int islcmconnected = 0;
  1724. unsigned int vramsize = 0;
  1725. phys_addr_t fb_base = 0;
  1726. static int is_videofb_parse_done;
  1727. static unsigned long video_node;
  1728. static int fb_early_init_dt_get_chosen(unsigned long node, const char *uname, int depth, void *data)
  1729. {
  1730. if (depth != 1 || (strcmp(uname, "chosen") != 0 && strcmp(uname, "chosen@0") != 0))
  1731. return 0;
  1732. video_node = node;
  1733. return 1;
  1734. }
  1735. /* Retrun value: 0: success, 1: fail */
  1736. int _parse_tag_videolfb(void)
  1737. {
  1738. struct tag_videolfb *videolfb_tag = NULL;
  1739. /* not necessary */
  1740. /* DISPCHECK("[DT][videolfb]isvideofb_parse_done = %d\n",is_videofb_parse_done); */
  1741. if (is_videofb_parse_done)
  1742. return 0;
  1743. #ifdef MTK_NO_DISP_IN_LK
  1744. DISPCHECK("[DT][videolfb] zaikuo, workaround for LK not ready\n"); /* after LK ready, remove this code */
  1745. return 1;
  1746. #endif
  1747. if (of_scan_flat_dt(fb_early_init_dt_get_chosen, NULL) > 0) {
  1748. videolfb_tag = (struct tag_videolfb *)of_get_flat_dt_prop(video_node, "atag,videolfb", NULL);
  1749. if (videolfb_tag) {
  1750. memset((void *)mtkfb_lcm_name, 0, sizeof(mtkfb_lcm_name));
  1751. strcpy((char *)mtkfb_lcm_name, videolfb_tag->lcmname);
  1752. mtkfb_lcm_name[strlen(videolfb_tag->lcmname)] = '\0';
  1753. lcd_fps = videolfb_tag->fps;
  1754. if (0 == lcd_fps)
  1755. lcd_fps = 6000;
  1756. islcmconnected = videolfb_tag->islcmfound;
  1757. vramsize = videolfb_tag->vram;
  1758. fb_base = videolfb_tag->fb_base;
  1759. is_videofb_parse_done = 1;
  1760. DISPPRINT("[DT][videolfb] lcmfound=%d, fps=%d, fb_base=%p, vram=%d, lcmname=%s\n",
  1761. islcmconnected, lcd_fps, (void *)fb_base, vramsize, mtkfb_lcm_name);
  1762. #if 0
  1763. DISPCHECK("[DT][videolfb] islcmfound = %d\n", islcmconnected);
  1764. DISPCHECK("[DT][videolfb] fps = %d\n", lcd_fps);
  1765. DISPCHECK("[DT][videolfb] fb_base = %p\n", (void *)fb_base);
  1766. DISPCHECK("[DT][videolfb] vram = %d\n", vramsize);
  1767. DISPCHECK("[DT][videolfb] lcmname = %s\n", mtkfb_lcm_name);
  1768. #endif
  1769. return 0;
  1770. }
  1771. DISPCHECK("[DT][videolfb] videolfb_tag not found\n");
  1772. return 1;
  1773. }
  1774. DISPCHECK("[DT][videolfb] of_chosen not found\n");
  1775. return 1;
  1776. }
  1777. phys_addr_t mtkfb_get_fb_base(void)
  1778. {
  1779. _parse_tag_videolfb();
  1780. return fb_base;
  1781. }
  1782. EXPORT_SYMBOL(mtkfb_get_fb_base);
  1783. size_t mtkfb_get_fb_size(void)
  1784. {
  1785. _parse_tag_videolfb();
  1786. return vramsize;
  1787. }
  1788. EXPORT_SYMBOL(mtkfb_get_fb_size);
  1789. #endif
  1790. #ifdef FPGA_DEBUG_PAN
  1791. static int update_test_kthread(void *data)
  1792. {
  1793. /* struct sched_param param = { .sched_priority = RTPM_PRIO_SCRN_UPDATE }; */
  1794. /* sched_setscheduler(current, SCHED_RR, &param); */
  1795. unsigned int i = 0, j = 0;
  1796. unsigned long fb_va;
  1797. unsigned long fb_pa;
  1798. unsigned int *fb_start;
  1799. unsigned int fbsize = primary_display_get_height() * primary_display_get_width();
  1800. mtkfb_fbi->var.yoffset = 0;
  1801. disp_get_fb_address(&fb_va, &fb_pa);
  1802. for (;;) {
  1803. if (kthread_should_stop())
  1804. break;
  1805. msleep(1000); /* 2s */
  1806. pr_debug("update test thread work,offset = %d\n", i);
  1807. mtkfb_fbi->var.yoffset = 0;
  1808. disp_get_fb_address(&fb_va, &fb_pa);
  1809. fb_start = (unsigned int *)fb_va;
  1810. for (j = 0; j < fbsize; j++) {
  1811. *fb_start = (0x55) << ((i % 4) * 8);
  1812. fb_start++;
  1813. }
  1814. mtkfb_pan_display_impl(&mtkfb_fbi->var, mtkfb_fbi);
  1815. i++;
  1816. }
  1817. MTKFB_LOG("exit esd_recovery_kthread()\n");
  1818. return 0;
  1819. }
  1820. #endif
  1821. static int mtkfb_probe(struct device *dev)
  1822. {
  1823. struct platform_device *pdev;
  1824. struct mtkfb_device *fbdev = NULL;
  1825. struct fb_info *fbi;
  1826. int init_state;
  1827. int r = 0;
  1828. #ifdef DISP_GPIO_DTS
  1829. long dts_gpio_state = 0;
  1830. #endif
  1831. /* DISPFUNC(); */
  1832. DISPPRINT("%s\n", __func__);
  1833. #ifdef CONFIG_OF
  1834. _parse_tag_videolfb();
  1835. #else
  1836. {
  1837. char *p = NULL;
  1838. pr_debug("%s, %s\n", __func__, saved_command_line);
  1839. p = strstr(saved_command_line, "fps=");
  1840. if (p == NULL) {
  1841. lcd_fps = 6000;
  1842. pr_debug("[FB driver]can not get fps from uboot\n");
  1843. } else {
  1844. p += 4;
  1845. r = kstrtol(p, 10, &lcd_fps);
  1846. if (r)
  1847. pr_err("DISP/%s: errno %d\n", __func__, r);
  1848. if (0 == lcd_fps)
  1849. lcd_fps = 6000;
  1850. }
  1851. }
  1852. #endif
  1853. init_state = 0;
  1854. pdev = to_platform_device(dev);
  1855. #ifdef DISP_GPIO_DTS
  1856. /* repo call DTS gpio module, if not necessary, invoke nothing */
  1857. dts_gpio_state = disp_dts_gpio_init_repo(pdev);
  1858. if (dts_gpio_state != 0)
  1859. dev_err(&pdev->dev, "retrieve GPIO DTS failed.");
  1860. #endif
  1861. fbi = framebuffer_alloc(sizeof(struct mtkfb_device), dev);
  1862. if (!fbi) {
  1863. DISPERR("unable to allocate memory for device info\n");
  1864. r = -ENOMEM;
  1865. goto cleanup;
  1866. }
  1867. fbdev = (struct mtkfb_device *)fbi->par;
  1868. fbdev->fb_info = fbi;
  1869. fbdev->dev = dev;
  1870. dev_set_drvdata(dev, fbdev);
  1871. {
  1872. #ifndef MTK_NO_DISP_IN_LK
  1873. #ifdef CONFIG_OF
  1874. /* printk("mtkfb_probe:get FB MEM REG\n"); */
  1875. _parse_tag_videolfb();
  1876. /* printk("mtkfb_probe: fb_pa = %p\n",(void *)fb_base); */
  1877. disp_hal_allocate_framebuffer(fb_base, (fb_base + vramsize - 1),
  1878. (unsigned long *)&fbdev->fb_va_base, &fb_pa);
  1879. fbdev->fb_pa_base = fb_base;
  1880. #else
  1881. struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  1882. vramsize = res->end - res->start + 1;
  1883. /* ASSERT(DISP_GetVRamSize() <= (res->end - res->start + 1)); */
  1884. disp_hal_allocate_framebuffer(res->start, res->end,
  1885. (unsigned int *)&fbdev->fb_va_base, &fb_pa);
  1886. fbdev->fb_pa_base = res->start;
  1887. #endif
  1888. #else
  1889. {
  1890. struct resource res;
  1891. unsigned long fb_mem_addr_pa = 0;
  1892. unsigned long fb_mem_addr_va = 0;
  1893. pr_debug("mtkfb_probe:get FB MEM REG\n");
  1894. if (0 != of_address_to_resource(dev->of_node, 0, &res)) {
  1895. r = -ENOMEM;
  1896. goto cleanup;
  1897. }
  1898. fb_mem_addr_pa = res.start;
  1899. fb_mem_addr_va = (unsigned long)of_iomap(dev->of_node, 0);
  1900. pr_debug("mtkfb_probe: fb_pa = 0x%lx, fb_va = 0x%lx\n", fb_mem_addr_pa,
  1901. fb_mem_addr_va);
  1902. disp_hal_allocate_framebuffer(res.start, res.end,
  1903. (unsigned int *)&fbdev->fb_va_base, &fb_pa);
  1904. fbdev->fb_pa_base = res.start;
  1905. fbdev->fb_va_base = fb_mem_addr_va;
  1906. }
  1907. #endif
  1908. }
  1909. primary_display_set_frame_buffer_address((unsigned long)fbdev->fb_va_base, fb_pa);
  1910. /* mtkfb should parse lcm name from kernel boot command line */
  1911. primary_display_init(mtkfb_find_lcm_driver(), lcd_fps);
  1912. init_state++; /* 1 */
  1913. MTK_FB_XRES = primary_display_get_width();
  1914. MTK_FB_YRES = primary_display_get_height();
  1915. fb_xres_update = MTK_FB_XRES;
  1916. fb_yres_update = MTK_FB_YRES;
  1917. MTK_FB_BPP = primary_display_get_bpp();
  1918. MTK_FB_PAGES = primary_display_get_pages();
  1919. /* DISPMSG("MTK_FB_XRES=%d, MTKFB_YRES=%d, MTKFB_BPP=%d, MTK_FB_PAGES=%d, MTKFB_LINE=%d, MTKFB_SIZEV=%d\n",
  1920. MTK_FB_XRES, MTK_FB_YRES, MTK_FB_BPP, MTK_FB_PAGES, MTK_FB_LINE, MTK_FB_SIZEV); */
  1921. fbdev->fb_size_in_byte = MTK_FB_SIZEV;
  1922. /* Allocate and initialize video frame buffer */
  1923. DISPPRINT("[FB Driver] fbdev->fb_pa_base = %p, fbdev->fb_va_base = %p\n",
  1924. &(fbdev->fb_pa_base), fbdev->fb_va_base);
  1925. if (!fbdev->fb_va_base) {
  1926. DISPERR("unable to allocate memory for frame buffer\n");
  1927. r = -ENOMEM;
  1928. goto cleanup;
  1929. }
  1930. init_state++; /* 2 */
  1931. /* Register to system */
  1932. r = mtkfb_fbinfo_init(fbi);
  1933. if (r) {
  1934. DISPERR("mtkfb_fbinfo_init fail, r = %d\n", r);
  1935. goto cleanup;
  1936. }
  1937. init_state++; /* 4 */
  1938. mtkfb_fbi = fbi;
  1939. if (disp_helper_get_stage() == DISP_HELPER_STAGE_NORMAL) {
  1940. /* dal_init should after mtkfb_fbinfo_init, otherwise layer 3 will show dal background color */
  1941. DAL_STATUS ret;
  1942. unsigned long fbVA = (unsigned long)fbdev->fb_va_base;
  1943. unsigned long fbPA = fb_pa;
  1944. /* DAL init here */
  1945. fbVA += DISP_GetFBRamSize();
  1946. fbPA += DISP_GetFBRamSize();
  1947. ret = DAL_Init(fbVA, fbPA);
  1948. }
  1949. #if 0 /* def FPGA_DEBUG_PAN */
  1950. _mtkfb_internal_test(fbdev->fb_va_base, MTK_FB_XRES, MTK_FB_YRES);
  1951. #endif
  1952. r = mtkfb_register_sysfs(fbdev);
  1953. if (r) {
  1954. DISPERR("mtkfb_register_sysfs fail, r = %d\n", r);
  1955. goto cleanup;
  1956. }
  1957. init_state++; /* 5 */
  1958. r = register_framebuffer(fbi);
  1959. if (r != 0) {
  1960. DISPERR("register_framebuffer failed\n");
  1961. goto cleanup;
  1962. }
  1963. if (disp_helper_get_stage() != DISP_HELPER_STAGE_NORMAL)
  1964. primary_display_diagnose();
  1965. /* this function will get fb_heap base address to ion for management frame buffer */
  1966. ion_drv_create_FB_heap(mtkfb_get_fb_base(), mtkfb_get_fb_size() - DAL_GetLayerSize());
  1967. fbdev->state = MTKFB_ACTIVE;
  1968. #ifdef FPGA_DEBUG_PAN
  1969. #if 0
  1970. {
  1971. unsigned int cnt = 0;
  1972. void *fb_va = (void *)fbdev->fb_va_base;
  1973. unsigned int fbsize = primary_display_get_height() * primary_display_get_width();
  1974. #if 0
  1975. for (cnt = 0; cnt < fbsize; cnt++)
  1976. *(fb_va++) = 0xFFFF0000;
  1977. for (cnt = 0; cnt < fbsize; cnt++)
  1978. *(fb_va++) = 0xFF00FF00;
  1979. #else
  1980. memset_io(fb_va, 0xFF, fbsize * 4);
  1981. memset_io(fb_va + fbsize * 4, 0x55, fbsize * 4);
  1982. #endif
  1983. }
  1984. pr_debug("memset_io done\n");
  1985. #endif
  1986. {
  1987. struct task_struct *update_test_task = NULL;
  1988. update_test_task = kthread_create(update_test_kthread, NULL, "update_test_kthread");
  1989. if (IS_ERR(update_test_task))
  1990. MTKFB_LOG("update test task create fail\n");
  1991. else
  1992. wake_up_process(update_test_task);
  1993. }
  1994. #endif
  1995. MSG_FUNC_LEAVE();
  1996. return 0;
  1997. cleanup:
  1998. mtkfb_free_resources(fbdev, init_state);
  1999. /* printk("mtkfb_probe end\n"); */
  2000. return r;
  2001. }
  2002. /* Called when the device is being detached from the driver */
  2003. static int mtkfb_remove(struct device *dev)
  2004. {
  2005. struct mtkfb_device *fbdev = dev_get_drvdata(dev);
  2006. enum mtkfb_state saved_state = fbdev->state;
  2007. MSG_FUNC_ENTER();
  2008. /* FIXME: wait till completion of pending events */
  2009. fbdev->state = MTKFB_DISABLED;
  2010. mtkfb_free_resources(fbdev, saved_state);
  2011. MSG_FUNC_LEAVE();
  2012. return 0;
  2013. }
  2014. /* PM suspend */
  2015. static int mtkfb_suspend(struct device *pdev, pm_message_t mesg)
  2016. {
  2017. /* NOT_REFERENCED(pdev); */
  2018. MSG_FUNC_ENTER();
  2019. MTKFB_LOG("[FB Driver] mtkfb_suspend(): 0x%x\n", mesg.event);
  2020. ovl2mem_wait_done();
  2021. MSG_FUNC_LEAVE();
  2022. return 0;
  2023. }
  2024. bool mtkfb_is_suspend(void)
  2025. {
  2026. return primary_display_is_sleepd();
  2027. }
  2028. EXPORT_SYMBOL(mtkfb_is_suspend);
  2029. int mtkfb_ipoh_restore(struct notifier_block *nb, unsigned long val, void *ign)
  2030. {
  2031. switch (val) {
  2032. case PM_RESTORE_PREPARE:
  2033. primary_display_ipoh_restore();
  2034. pr_debug("[FB Driver] mtkfb_ipoh_restore PM_RESTORE_PREPARE\n");
  2035. return NOTIFY_DONE;
  2036. case PM_POST_RESTORE:
  2037. primary_display_ipoh_recover();
  2038. pr_debug("[FB Driver] %s pm_event: %lu\n", __func__, val);
  2039. return NOTIFY_DONE;
  2040. }
  2041. return NOTIFY_OK;
  2042. }
  2043. int mtkfb_ipo_init(void)
  2044. {
  2045. pm_nb.notifier_call = mtkfb_ipoh_restore;
  2046. pm_nb.priority = 0;
  2047. register_pm_notifier(&pm_nb);
  2048. return 0;
  2049. }
  2050. static void mtkfb_shutdown(struct device *pdev)
  2051. {
  2052. MTKFB_LOG("[FB Driver] mtkfb_shutdown()\n");
  2053. /* mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF); */
  2054. if (!lcd_fps)
  2055. msleep(30);
  2056. else
  2057. msleep(2 * 100000 / lcd_fps); /* Delay 2 frames. */
  2058. if (primary_display_is_sleepd()) {
  2059. MTKFB_LOG("mtkfb has been power off\n");
  2060. return;
  2061. }
  2062. MTKFB_LOG("[FB Driver] cci400_sel_for_ddp\n");
  2063. /* cci400_sel_for_ddp(); //FIXME:need confirm with Zhihui */
  2064. primary_display_suspend();
  2065. MTKFB_LOG("[FB Driver] leave mtkfb_shutdown\n");
  2066. }
  2067. void mtkfb_clear_lcm(void)
  2068. {
  2069. #if 0
  2070. int i;
  2071. unsigned int layer_status[DDP_OVL_LAYER_MUN] = { 0 };
  2072. mutex_lock(&OverlaySettingMutex);
  2073. for (i = 0; i < DDP_OVL_LAYER_MUN; i++) {
  2074. layer_status[i] = cached_layer_config[i].layer_en;
  2075. cached_layer_config[i].layer_en = 0;
  2076. cached_layer_config[i].isDirty = 1;
  2077. }
  2078. atomic_set(&OverlaySettingDirtyFlag, 1);
  2079. atomic_set(&OverlaySettingApplied, 0);
  2080. mutex_unlock(&OverlaySettingMutex);
  2081. /* DISP_CHECK_RET(DISP_UpdateScreen(0, 0, fb_xres_update, fb_yres_update)); */
  2082. /* DISP_CHECK_RET(DISP_UpdateScreen(0, 0, fb_xres_update, fb_yres_update)); */
  2083. /* DISP_WaitForLCDNotBusy(); */
  2084. mutex_lock(&OverlaySettingMutex);
  2085. for (i = 0; i < DDP_OVL_LAYER_MUN; i++) {
  2086. cached_layer_config[i].layer_en = layer_status[i];
  2087. cached_layer_config[i].isDirty = 1;
  2088. }
  2089. atomic_set(&OverlaySettingDirtyFlag, 1);
  2090. atomic_set(&OverlaySettingApplied, 0);
  2091. mutex_unlock(&OverlaySettingMutex);
  2092. #endif
  2093. }
  2094. static void mtkfb_blank_suspend(void)
  2095. {
  2096. int ret = 0;
  2097. MSG_FUNC_ENTER();
  2098. if (disp_helper_get_stage() != DISP_HELPER_STAGE_NORMAL)
  2099. return;
  2100. #ifdef CONFIG_SINGLE_PANEL_OUTPUT
  2101. is_early_suspended = true;
  2102. #endif
  2103. pr_debug("[FB Driver] enter early_suspend\n");
  2104. #ifdef CONFIG_MTK_LEDS
  2105. /* mt65xx_leds_brightness_set(MT65XX_LED_TYPE_LCD, LED_OFF); */
  2106. #endif
  2107. msleep(30);
  2108. ret = primary_display_suspend();
  2109. if (ret < 0) {
  2110. DISPERR("primary display suspend failed\n");
  2111. return;
  2112. }
  2113. pr_debug("[FB Driver] leave early_suspend\n");
  2114. }
  2115. /* PM resume */
  2116. static int mtkfb_resume(struct device *pdev)
  2117. {
  2118. /* NOT_REFERENCED(pdev); */
  2119. MSG_FUNC_ENTER();
  2120. MTKFB_LOG("[FB Driver] mtkfb_resume()\n");
  2121. MSG_FUNC_LEAVE();
  2122. return 0;
  2123. }
  2124. static void mtkfb_blank_resume(void)
  2125. {
  2126. int ret = 0;
  2127. MSG_FUNC_ENTER();
  2128. if (disp_helper_get_stage() != DISP_HELPER_STAGE_NORMAL)
  2129. return;
  2130. pr_debug("[FB Driver] enter late_resume\n");
  2131. #ifdef CONFIG_SINGLE_PANEL_OUTPUT
  2132. is_early_suspended = false;
  2133. #endif
  2134. ret = primary_display_resume();
  2135. if (ret) {
  2136. DISPERR("primary display resume failed\n");
  2137. return;
  2138. }
  2139. pr_debug("[FB Driver] leave late_resume\n");
  2140. }
  2141. /*---------------------------------------------------------------------------*/
  2142. #ifdef CONFIG_PM
  2143. /*---------------------------------------------------------------------------*/
  2144. int mtkfb_pm_suspend(struct device *device)
  2145. {
  2146. /* pr_debug("calling %s()\n", __func__); */
  2147. struct platform_device *pdev = to_platform_device(device);
  2148. BUG_ON(pdev == NULL);
  2149. return mtkfb_suspend((struct device *)pdev, PMSG_SUSPEND);
  2150. }
  2151. int mtkfb_pm_resume(struct device *device)
  2152. {
  2153. /* pr_debug("calling %s()\n", __func__); */
  2154. struct platform_device *pdev = to_platform_device(device);
  2155. BUG_ON(pdev == NULL);
  2156. return mtkfb_resume((struct device *)pdev);
  2157. }
  2158. int mtkfb_pm_freeze(struct device *device)
  2159. {
  2160. primary_display_esd_check_enable(0);
  2161. return 0;
  2162. }
  2163. int mtkfb_pm_restore_noirq(struct device *device)
  2164. {
  2165. DISPCHECK("%s: %d\n", __func__, __LINE__);
  2166. is_ipoh_bootup = true;
  2167. #ifndef CONFIG_MTK_CLKMGR
  2168. dpmgr_path_power_on(primary_get_dpmgr_handle(), CMDQ_DISABLE);
  2169. #endif
  2170. return 0;
  2171. }
  2172. /*---------------------------------------------------------------------------*/
  2173. #else /*CONFIG_PM */
  2174. /*---------------------------------------------------------------------------*/
  2175. #define mtkfb_pm_suspend NULL
  2176. #define mtkfb_pm_resume NULL
  2177. #define mtkfb_pm_restore_noirq NULL
  2178. #define mtkfb_pm_freeze NULL
  2179. /*---------------------------------------------------------------------------*/
  2180. #endif /*CONFIG_PM */
  2181. /*---------------------------------------------------------------------------*/
  2182. static const struct of_device_id mtkfb_of_ids[] = {
  2183. {.compatible = "mediatek,mtkfb",},
  2184. {}
  2185. };
  2186. const struct dev_pm_ops mtkfb_pm_ops = {
  2187. .suspend = mtkfb_pm_suspend,
  2188. .resume = mtkfb_pm_resume,
  2189. .freeze = mtkfb_pm_freeze,
  2190. .thaw = mtkfb_pm_resume,
  2191. .poweroff = mtkfb_pm_suspend,
  2192. .restore = mtkfb_pm_resume,
  2193. .restore_noirq = mtkfb_pm_restore_noirq,
  2194. };
  2195. static struct platform_driver mtkfb_driver = {
  2196. .driver = {
  2197. .name = MTKFB_DRIVER,
  2198. #ifdef CONFIG_PM
  2199. .pm = &mtkfb_pm_ops,
  2200. #endif
  2201. .bus = &platform_bus_type,
  2202. .probe = mtkfb_probe,
  2203. .remove = mtkfb_remove,
  2204. .suspend = mtkfb_suspend,
  2205. .resume = mtkfb_resume,
  2206. .shutdown = mtkfb_shutdown,
  2207. .of_match_table = mtkfb_of_ids,
  2208. },
  2209. };
  2210. #if 0
  2211. #ifdef CONFIG_HAS_EARLYSUSPEND
  2212. static struct early_suspend mtkfb_early_suspend_handler = {
  2213. .level = EARLY_SUSPEND_LEVEL_DISABLE_FB,
  2214. .suspend = mtkfb_early_suspend,
  2215. .resume = mtkfb_late_resume,
  2216. };
  2217. #endif
  2218. #endif
  2219. int mtkfb_get_debug_state(char *stringbuf, int buf_len)
  2220. {
  2221. int len = 0;
  2222. struct mtkfb_device *fbdev = (struct mtkfb_device *)mtkfb_fbi->par;
  2223. unsigned long va = (unsigned long)fbdev->fb_va_base;
  2224. unsigned long mva = (unsigned long)fbdev->fb_pa_base;
  2225. unsigned long pa = fbdev->fb_pa_base;
  2226. unsigned int resv_size = vramsize;
  2227. len += scnprintf(stringbuf + len, buf_len - len,
  2228. "|--------------------------------------------------------------------------------------|\n");
  2229. /* len += scnprintf(stringbuf+len, buf_len - len, "********MTKFB Driver General Information********\n"); */
  2230. len += scnprintf(stringbuf + len, buf_len - len,
  2231. "|Framebuffer VA:0x%lx, PA:0x%lx, MVA:0x%lx, Reserved Size:0x%08x|%d\n", va,
  2232. pa, mva, resv_size, resv_size);
  2233. len += scnprintf(stringbuf + len, buf_len - len, "|xoffset=%d, yoffset=%d\n",
  2234. mtkfb_fbi->var.xoffset, mtkfb_fbi->var.yoffset);
  2235. len += scnprintf(stringbuf + len, buf_len - len, "|framebuffer line alignment(for gpu)=%d\n",
  2236. MTK_FB_ALIGNMENT);
  2237. len += scnprintf(stringbuf + len, buf_len - len,
  2238. "|xres=%d, yres=%d,bpp=%d,pages=%d,linebytes=%d,total size=%d\n", MTK_FB_XRES,
  2239. MTK_FB_YRES, MTK_FB_BPP, MTK_FB_PAGES, MTK_FB_LINE, MTK_FB_SIZEV);
  2240. /* use extern in case DAL_LOCK is hold, then can't get any debug info */
  2241. len += scnprintf(stringbuf + len, buf_len - len, "|AEE Layer is %s\n",
  2242. isAEEEnabled ? "enabled" : "disabled");
  2243. return len;
  2244. }
  2245. /* Register both the driver and the device */
  2246. int __init mtkfb_init(void)
  2247. {
  2248. int r = 0;
  2249. MSG_FUNC_ENTER();
  2250. if (platform_driver_register(&mtkfb_driver)) {
  2251. PRNERR("failed to register mtkfb driver\n");
  2252. r = -ENODEV;
  2253. goto exit;
  2254. }
  2255. #if 0
  2256. #ifdef CONFIG_HAS_EARLYSUSPEND
  2257. register_early_suspend(&mtkfb_early_suspend_handler);
  2258. #endif
  2259. #endif
  2260. /* FIXME: find definition */
  2261. PanelMaster_Init();
  2262. DBG_Init();
  2263. mtkfb_ipo_init();
  2264. exit:
  2265. MSG_FUNC_LEAVE();
  2266. return r;
  2267. }
  2268. static void __exit mtkfb_cleanup(void)
  2269. {
  2270. MSG_FUNC_ENTER();
  2271. platform_driver_unregister(&mtkfb_driver);
  2272. #if 0
  2273. #ifdef CONFIG_HAS_EARLYSUSPEND
  2274. unregister_early_suspend(&mtkfb_early_suspend_handler);
  2275. #endif
  2276. #endif
  2277. /* FIXME: find definition of PanelMaster_Deinit */
  2278. /* PanelMaster_Deinit(); */
  2279. DBG_Deinit();
  2280. MSG_FUNC_LEAVE();
  2281. }
  2282. module_init(mtkfb_init);
  2283. module_exit(mtkfb_cleanup);
  2284. MODULE_DESCRIPTION("MEDIATEK framebuffer driver");
  2285. MODULE_AUTHOR("Xuecheng Zhang <Xuecheng.Zhang@mediatek.com>");
  2286. MODULE_LICENSE("GPL");