fb_decoder.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505
  1. /*
  2. * Copyright(c) 2011-2016 Intel Corporation. All rights reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  21. * SOFTWARE.
  22. *
  23. * Authors:
  24. * Kevin Tian <kevin.tian@intel.com>
  25. *
  26. * Contributors:
  27. * Bing Niu <bing.niu@intel.com>
  28. * Xu Han <xu.han@intel.com>
  29. * Ping Gao <ping.a.gao@intel.com>
  30. * Xiaoguang Chen <xiaoguang.chen@intel.com>
  31. * Yang Liu <yang2.liu@intel.com>
  32. * Tina Zhang <tina.zhang@intel.com>
  33. *
  34. */
  35. #include <uapi/drm/drm_fourcc.h>
  36. #include "i915_drv.h"
  37. #include "gvt.h"
  38. #define PRIMARY_FORMAT_NUM 16
  39. struct pixel_format {
  40. int drm_format; /* Pixel format in DRM definition */
  41. int bpp; /* Bits per pixel, 0 indicates invalid */
  42. char *desc; /* The description */
  43. };
  44. static struct pixel_format bdw_pixel_formats[] = {
  45. {DRM_FORMAT_C8, 8, "8-bit Indexed"},
  46. {DRM_FORMAT_RGB565, 16, "16-bit BGRX (5:6:5 MSB-R:G:B)"},
  47. {DRM_FORMAT_XRGB8888, 32, "32-bit BGRX (8:8:8:8 MSB-X:R:G:B)"},
  48. {DRM_FORMAT_XBGR2101010, 32, "32-bit RGBX (2:10:10:10 MSB-X:B:G:R)"},
  49. {DRM_FORMAT_XRGB2101010, 32, "32-bit BGRX (2:10:10:10 MSB-X:R:G:B)"},
  50. {DRM_FORMAT_XBGR8888, 32, "32-bit RGBX (8:8:8:8 MSB-X:B:G:R)"},
  51. /* non-supported format has bpp default to 0 */
  52. {0, 0, NULL},
  53. };
  54. static struct pixel_format skl_pixel_formats[] = {
  55. {DRM_FORMAT_YUYV, 16, "16-bit packed YUYV (8:8:8:8 MSB-V:Y2:U:Y1)"},
  56. {DRM_FORMAT_UYVY, 16, "16-bit packed UYVY (8:8:8:8 MSB-Y2:V:Y1:U)"},
  57. {DRM_FORMAT_YVYU, 16, "16-bit packed YVYU (8:8:8:8 MSB-U:Y2:V:Y1)"},
  58. {DRM_FORMAT_VYUY, 16, "16-bit packed VYUY (8:8:8:8 MSB-Y2:U:Y1:V)"},
  59. {DRM_FORMAT_C8, 8, "8-bit Indexed"},
  60. {DRM_FORMAT_RGB565, 16, "16-bit BGRX (5:6:5 MSB-R:G:B)"},
  61. {DRM_FORMAT_ABGR8888, 32, "32-bit RGBA (8:8:8:8 MSB-A:B:G:R)"},
  62. {DRM_FORMAT_XBGR8888, 32, "32-bit RGBX (8:8:8:8 MSB-X:B:G:R)"},
  63. {DRM_FORMAT_ARGB8888, 32, "32-bit BGRA (8:8:8:8 MSB-A:R:G:B)"},
  64. {DRM_FORMAT_XRGB8888, 32, "32-bit BGRX (8:8:8:8 MSB-X:R:G:B)"},
  65. {DRM_FORMAT_XBGR2101010, 32, "32-bit RGBX (2:10:10:10 MSB-X:B:G:R)"},
  66. {DRM_FORMAT_XRGB2101010, 32, "32-bit BGRX (2:10:10:10 MSB-X:R:G:B)"},
  67. /* non-supported format has bpp default to 0 */
  68. {0, 0, NULL},
  69. };
  70. static int bdw_format_to_drm(int format)
  71. {
  72. int bdw_pixel_formats_index = 6;
  73. switch (format) {
  74. case DISPPLANE_8BPP:
  75. bdw_pixel_formats_index = 0;
  76. break;
  77. case DISPPLANE_BGRX565:
  78. bdw_pixel_formats_index = 1;
  79. break;
  80. case DISPPLANE_BGRX888:
  81. bdw_pixel_formats_index = 2;
  82. break;
  83. case DISPPLANE_RGBX101010:
  84. bdw_pixel_formats_index = 3;
  85. break;
  86. case DISPPLANE_BGRX101010:
  87. bdw_pixel_formats_index = 4;
  88. break;
  89. case DISPPLANE_RGBX888:
  90. bdw_pixel_formats_index = 5;
  91. break;
  92. default:
  93. break;
  94. }
  95. return bdw_pixel_formats_index;
  96. }
  97. static int skl_format_to_drm(int format, bool rgb_order, bool alpha,
  98. int yuv_order)
  99. {
  100. int skl_pixel_formats_index = 12;
  101. switch (format) {
  102. case PLANE_CTL_FORMAT_INDEXED:
  103. skl_pixel_formats_index = 4;
  104. break;
  105. case PLANE_CTL_FORMAT_RGB_565:
  106. skl_pixel_formats_index = 5;
  107. break;
  108. case PLANE_CTL_FORMAT_XRGB_8888:
  109. if (rgb_order)
  110. skl_pixel_formats_index = alpha ? 6 : 7;
  111. else
  112. skl_pixel_formats_index = alpha ? 8 : 9;
  113. break;
  114. case PLANE_CTL_FORMAT_XRGB_2101010:
  115. skl_pixel_formats_index = rgb_order ? 10 : 11;
  116. break;
  117. case PLANE_CTL_FORMAT_YUV422:
  118. skl_pixel_formats_index = yuv_order >> 16;
  119. if (skl_pixel_formats_index > 3)
  120. return -EINVAL;
  121. break;
  122. default:
  123. break;
  124. }
  125. return skl_pixel_formats_index;
  126. }
  127. static u32 intel_vgpu_get_stride(struct intel_vgpu *vgpu, int pipe,
  128. u32 tiled, int stride_mask, int bpp)
  129. {
  130. struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
  131. u32 stride_reg = vgpu_vreg_t(vgpu, DSPSTRIDE(pipe)) & stride_mask;
  132. u32 stride = stride_reg;
  133. if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
  134. switch (tiled) {
  135. case PLANE_CTL_TILED_LINEAR:
  136. stride = stride_reg * 64;
  137. break;
  138. case PLANE_CTL_TILED_X:
  139. stride = stride_reg * 512;
  140. break;
  141. case PLANE_CTL_TILED_Y:
  142. stride = stride_reg * 128;
  143. break;
  144. case PLANE_CTL_TILED_YF:
  145. if (bpp == 8)
  146. stride = stride_reg * 64;
  147. else if (bpp == 16 || bpp == 32 || bpp == 64)
  148. stride = stride_reg * 128;
  149. else
  150. gvt_dbg_core("skl: unsupported bpp:%d\n", bpp);
  151. break;
  152. default:
  153. gvt_dbg_core("skl: unsupported tile format:%x\n",
  154. tiled);
  155. }
  156. }
  157. return stride;
  158. }
  159. static int get_active_pipe(struct intel_vgpu *vgpu)
  160. {
  161. int i;
  162. for (i = 0; i < I915_MAX_PIPES; i++)
  163. if (pipe_is_enabled(vgpu, i))
  164. break;
  165. return i;
  166. }
  167. /**
  168. * intel_vgpu_decode_primary_plane - Decode primary plane
  169. * @vgpu: input vgpu
  170. * @plane: primary plane to save decoded info
  171. * This function is called for decoding plane
  172. *
  173. * Returns:
  174. * 0 on success, non-zero if failed.
  175. */
  176. int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu,
  177. struct intel_vgpu_primary_plane_format *plane)
  178. {
  179. u32 val, fmt;
  180. struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
  181. int pipe;
  182. pipe = get_active_pipe(vgpu);
  183. if (pipe >= I915_MAX_PIPES)
  184. return -ENODEV;
  185. val = vgpu_vreg_t(vgpu, DSPCNTR(pipe));
  186. plane->enabled = !!(val & DISPLAY_PLANE_ENABLE);
  187. if (!plane->enabled)
  188. return -ENODEV;
  189. if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) {
  190. plane->tiled = (val & PLANE_CTL_TILED_MASK) >>
  191. _PLANE_CTL_TILED_SHIFT;
  192. fmt = skl_format_to_drm(
  193. val & PLANE_CTL_FORMAT_MASK,
  194. val & PLANE_CTL_ORDER_RGBX,
  195. val & PLANE_CTL_ALPHA_MASK,
  196. val & PLANE_CTL_YUV422_ORDER_MASK);
  197. if (fmt >= ARRAY_SIZE(skl_pixel_formats)) {
  198. gvt_vgpu_err("Out-of-bounds pixel format index\n");
  199. return -EINVAL;
  200. }
  201. plane->bpp = skl_pixel_formats[fmt].bpp;
  202. plane->drm_format = skl_pixel_formats[fmt].drm_format;
  203. } else {
  204. plane->tiled = !!(val & DISPPLANE_TILED);
  205. fmt = bdw_format_to_drm(val & DISPPLANE_PIXFORMAT_MASK);
  206. plane->bpp = bdw_pixel_formats[fmt].bpp;
  207. plane->drm_format = bdw_pixel_formats[fmt].drm_format;
  208. }
  209. if (!plane->bpp) {
  210. gvt_vgpu_err("Non-supported pixel format (0x%x)\n", fmt);
  211. return -EINVAL;
  212. }
  213. plane->hw_format = fmt;
  214. plane->base = vgpu_vreg_t(vgpu, DSPSURF(pipe)) & I915_GTT_PAGE_MASK;
  215. if (!intel_gvt_ggtt_validate_range(vgpu, plane->base, 0))
  216. return -EINVAL;
  217. plane->base_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, plane->base);
  218. if (plane->base_gpa == INTEL_GVT_INVALID_ADDR) {
  219. gvt_vgpu_err("Translate primary plane gma 0x%x to gpa fail\n",
  220. plane->base);
  221. return -EINVAL;
  222. }
  223. plane->stride = intel_vgpu_get_stride(vgpu, pipe, (plane->tiled << 10),
  224. (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) ?
  225. (_PRI_PLANE_STRIDE_MASK >> 6) :
  226. _PRI_PLANE_STRIDE_MASK, plane->bpp);
  227. plane->width = (vgpu_vreg_t(vgpu, PIPESRC(pipe)) & _PIPE_H_SRCSZ_MASK) >>
  228. _PIPE_H_SRCSZ_SHIFT;
  229. plane->width += 1;
  230. plane->height = (vgpu_vreg_t(vgpu, PIPESRC(pipe)) &
  231. _PIPE_V_SRCSZ_MASK) >> _PIPE_V_SRCSZ_SHIFT;
  232. plane->height += 1; /* raw height is one minus the real value */
  233. val = vgpu_vreg_t(vgpu, DSPTILEOFF(pipe));
  234. plane->x_offset = (val & _PRI_PLANE_X_OFF_MASK) >>
  235. _PRI_PLANE_X_OFF_SHIFT;
  236. plane->y_offset = (val & _PRI_PLANE_Y_OFF_MASK) >>
  237. _PRI_PLANE_Y_OFF_SHIFT;
  238. return 0;
  239. }
  240. #define CURSOR_FORMAT_NUM (1 << 6)
  241. struct cursor_mode_format {
  242. int drm_format; /* Pixel format in DRM definition */
  243. u8 bpp; /* Bits per pixel; 0 indicates invalid */
  244. u32 width; /* In pixel */
  245. u32 height; /* In lines */
  246. char *desc; /* The description */
  247. };
  248. static struct cursor_mode_format cursor_pixel_formats[] = {
  249. {DRM_FORMAT_ARGB8888, 32, 128, 128, "128x128 32bpp ARGB"},
  250. {DRM_FORMAT_ARGB8888, 32, 256, 256, "256x256 32bpp ARGB"},
  251. {DRM_FORMAT_ARGB8888, 32, 64, 64, "64x64 32bpp ARGB"},
  252. {DRM_FORMAT_ARGB8888, 32, 64, 64, "64x64 32bpp ARGB"},
  253. /* non-supported format has bpp default to 0 */
  254. {0, 0, 0, 0, NULL},
  255. };
  256. static int cursor_mode_to_drm(int mode)
  257. {
  258. int cursor_pixel_formats_index = 4;
  259. switch (mode) {
  260. case CURSOR_MODE_128_ARGB_AX:
  261. cursor_pixel_formats_index = 0;
  262. break;
  263. case CURSOR_MODE_256_ARGB_AX:
  264. cursor_pixel_formats_index = 1;
  265. break;
  266. case CURSOR_MODE_64_ARGB_AX:
  267. cursor_pixel_formats_index = 2;
  268. break;
  269. case CURSOR_MODE_64_32B_AX:
  270. cursor_pixel_formats_index = 3;
  271. break;
  272. default:
  273. break;
  274. }
  275. return cursor_pixel_formats_index;
  276. }
  277. /**
  278. * intel_vgpu_decode_cursor_plane - Decode sprite plane
  279. * @vgpu: input vgpu
  280. * @plane: cursor plane to save decoded info
  281. * This function is called for decoding plane
  282. *
  283. * Returns:
  284. * 0 on success, non-zero if failed.
  285. */
  286. int intel_vgpu_decode_cursor_plane(struct intel_vgpu *vgpu,
  287. struct intel_vgpu_cursor_plane_format *plane)
  288. {
  289. u32 val, mode, index;
  290. u32 alpha_plane, alpha_force;
  291. struct drm_i915_private *dev_priv = vgpu->gvt->dev_priv;
  292. int pipe;
  293. pipe = get_active_pipe(vgpu);
  294. if (pipe >= I915_MAX_PIPES)
  295. return -ENODEV;
  296. val = vgpu_vreg_t(vgpu, CURCNTR(pipe));
  297. mode = val & CURSOR_MODE;
  298. plane->enabled = (mode != CURSOR_MODE_DISABLE);
  299. if (!plane->enabled)
  300. return -ENODEV;
  301. index = cursor_mode_to_drm(mode);
  302. if (!cursor_pixel_formats[index].bpp) {
  303. gvt_vgpu_err("Non-supported cursor mode (0x%x)\n", mode);
  304. return -EINVAL;
  305. }
  306. plane->mode = mode;
  307. plane->bpp = cursor_pixel_formats[index].bpp;
  308. plane->drm_format = cursor_pixel_formats[index].drm_format;
  309. plane->width = cursor_pixel_formats[index].width;
  310. plane->height = cursor_pixel_formats[index].height;
  311. alpha_plane = (val & _CURSOR_ALPHA_PLANE_MASK) >>
  312. _CURSOR_ALPHA_PLANE_SHIFT;
  313. alpha_force = (val & _CURSOR_ALPHA_FORCE_MASK) >>
  314. _CURSOR_ALPHA_FORCE_SHIFT;
  315. if (alpha_plane || alpha_force)
  316. gvt_dbg_core("alpha_plane=0x%x, alpha_force=0x%x\n",
  317. alpha_plane, alpha_force);
  318. plane->base = vgpu_vreg_t(vgpu, CURBASE(pipe)) & I915_GTT_PAGE_MASK;
  319. if (!intel_gvt_ggtt_validate_range(vgpu, plane->base, 0))
  320. return -EINVAL;
  321. plane->base_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, plane->base);
  322. if (plane->base_gpa == INTEL_GVT_INVALID_ADDR) {
  323. gvt_vgpu_err("Translate cursor plane gma 0x%x to gpa fail\n",
  324. plane->base);
  325. return -EINVAL;
  326. }
  327. val = vgpu_vreg_t(vgpu, CURPOS(pipe));
  328. plane->x_pos = (val & _CURSOR_POS_X_MASK) >> _CURSOR_POS_X_SHIFT;
  329. plane->x_sign = (val & _CURSOR_SIGN_X_MASK) >> _CURSOR_SIGN_X_SHIFT;
  330. plane->y_pos = (val & _CURSOR_POS_Y_MASK) >> _CURSOR_POS_Y_SHIFT;
  331. plane->y_sign = (val & _CURSOR_SIGN_Y_MASK) >> _CURSOR_SIGN_Y_SHIFT;
  332. return 0;
  333. }
  334. #define SPRITE_FORMAT_NUM (1 << 3)
  335. static struct pixel_format sprite_pixel_formats[SPRITE_FORMAT_NUM] = {
  336. [0x0] = {DRM_FORMAT_YUV422, 16, "YUV 16-bit 4:2:2 packed"},
  337. [0x1] = {DRM_FORMAT_XRGB2101010, 32, "RGB 32-bit 2:10:10:10"},
  338. [0x2] = {DRM_FORMAT_XRGB8888, 32, "RGB 32-bit 8:8:8:8"},
  339. [0x4] = {DRM_FORMAT_AYUV, 32,
  340. "YUV 32-bit 4:4:4 packed (8:8:8:8 MSB-X:Y:U:V)"},
  341. };
  342. /**
  343. * intel_vgpu_decode_sprite_plane - Decode sprite plane
  344. * @vgpu: input vgpu
  345. * @plane: sprite plane to save decoded info
  346. * This function is called for decoding plane
  347. *
  348. * Returns:
  349. * 0 on success, non-zero if failed.
  350. */
  351. int intel_vgpu_decode_sprite_plane(struct intel_vgpu *vgpu,
  352. struct intel_vgpu_sprite_plane_format *plane)
  353. {
  354. u32 val, fmt;
  355. u32 color_order, yuv_order;
  356. int drm_format;
  357. int pipe;
  358. pipe = get_active_pipe(vgpu);
  359. if (pipe >= I915_MAX_PIPES)
  360. return -ENODEV;
  361. val = vgpu_vreg_t(vgpu, SPRCTL(pipe));
  362. plane->enabled = !!(val & SPRITE_ENABLE);
  363. if (!plane->enabled)
  364. return -ENODEV;
  365. plane->tiled = !!(val & SPRITE_TILED);
  366. color_order = !!(val & SPRITE_RGB_ORDER_RGBX);
  367. yuv_order = (val & SPRITE_YUV_BYTE_ORDER_MASK) >>
  368. _SPRITE_YUV_ORDER_SHIFT;
  369. fmt = (val & SPRITE_PIXFORMAT_MASK) >> _SPRITE_FMT_SHIFT;
  370. if (!sprite_pixel_formats[fmt].bpp) {
  371. gvt_vgpu_err("Non-supported pixel format (0x%x)\n", fmt);
  372. return -EINVAL;
  373. }
  374. plane->hw_format = fmt;
  375. plane->bpp = sprite_pixel_formats[fmt].bpp;
  376. drm_format = sprite_pixel_formats[fmt].drm_format;
  377. /* Order of RGB values in an RGBxxx buffer may be ordered RGB or
  378. * BGR depending on the state of the color_order field
  379. */
  380. if (!color_order) {
  381. if (drm_format == DRM_FORMAT_XRGB2101010)
  382. drm_format = DRM_FORMAT_XBGR2101010;
  383. else if (drm_format == DRM_FORMAT_XRGB8888)
  384. drm_format = DRM_FORMAT_XBGR8888;
  385. }
  386. if (drm_format == DRM_FORMAT_YUV422) {
  387. switch (yuv_order) {
  388. case 0:
  389. drm_format = DRM_FORMAT_YUYV;
  390. break;
  391. case 1:
  392. drm_format = DRM_FORMAT_UYVY;
  393. break;
  394. case 2:
  395. drm_format = DRM_FORMAT_YVYU;
  396. break;
  397. case 3:
  398. drm_format = DRM_FORMAT_VYUY;
  399. break;
  400. default:
  401. /* yuv_order has only 2 bits */
  402. break;
  403. }
  404. }
  405. plane->drm_format = drm_format;
  406. plane->base = vgpu_vreg_t(vgpu, SPRSURF(pipe)) & I915_GTT_PAGE_MASK;
  407. if (!intel_gvt_ggtt_validate_range(vgpu, plane->base, 0))
  408. return -EINVAL;
  409. plane->base_gpa = intel_vgpu_gma_to_gpa(vgpu->gtt.ggtt_mm, plane->base);
  410. if (plane->base_gpa == INTEL_GVT_INVALID_ADDR) {
  411. gvt_vgpu_err("Translate sprite plane gma 0x%x to gpa fail\n",
  412. plane->base);
  413. return -EINVAL;
  414. }
  415. plane->stride = vgpu_vreg_t(vgpu, SPRSTRIDE(pipe)) &
  416. _SPRITE_STRIDE_MASK;
  417. val = vgpu_vreg_t(vgpu, SPRSIZE(pipe));
  418. plane->height = (val & _SPRITE_SIZE_HEIGHT_MASK) >>
  419. _SPRITE_SIZE_HEIGHT_SHIFT;
  420. plane->width = (val & _SPRITE_SIZE_WIDTH_MASK) >>
  421. _SPRITE_SIZE_WIDTH_SHIFT;
  422. plane->height += 1; /* raw height is one minus the real value */
  423. plane->width += 1; /* raw width is one minus the real value */
  424. val = vgpu_vreg_t(vgpu, SPRPOS(pipe));
  425. plane->x_pos = (val & _SPRITE_POS_X_MASK) >> _SPRITE_POS_X_SHIFT;
  426. plane->y_pos = (val & _SPRITE_POS_Y_MASK) >> _SPRITE_POS_Y_SHIFT;
  427. val = vgpu_vreg_t(vgpu, SPROFFSET(pipe));
  428. plane->x_offset = (val & _SPRITE_OFFSET_START_X_MASK) >>
  429. _SPRITE_OFFSET_START_X_SHIFT;
  430. plane->y_offset = (val & _SPRITE_OFFSET_START_Y_MASK) >>
  431. _SPRITE_OFFSET_START_Y_SHIFT;
  432. return 0;
  433. }