1ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu/* 2ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Mesa 3-D graphics library 3ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Version: 7.9 4ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * 5ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Copyright (C) 2010 LunarG Inc. 6ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * 7ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Permission is hereby granted, free of charge, to any person obtaining a 8ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * copy of this software and associated documentation files (the "Software"), 9ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * to deal in the Software without restriction, including without limitation 10ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * and/or sell copies of the Software, and to permit persons to whom the 12ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Software is furnished to do so, subject to the following conditions: 13ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * 14ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * The above copyright notice and this permission notice shall be included 15ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * in all copies or substantial portions of the Software. 16ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * 17ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 21ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 23ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * DEALINGS IN THE SOFTWARE. 24ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * 25ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Authors: 26ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu * Chia-I Wu <olv@lunarg.com> 27ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu */ 28ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 29ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include <sys/mman.h> 30ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include <sys/ioctl.h> 31ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include <linux/fb.h> 32ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 33ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include "pipe/p_compiler.h" 34ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include "util/u_format.h" 35ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include "util/u_math.h" 36ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include "util/u_memory.h" 37ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include "state_tracker/sw_winsys.h" 38ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 39ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu#include "fbdev_sw_winsys.h" 40ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 41ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustruct fbdev_sw_displaytarget 42ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 43ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu enum pipe_format format; 44ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned width; 45ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned height; 46ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned stride; 47ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 48ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu void *data; 49ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu void *mapped; 50ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu}; 51ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 52ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustruct fbdev_sw_winsys 53ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 54ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct sw_winsys base; 55ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 56ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu int fd; 57ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 58ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fb_fix_screeninfo finfo; 59ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned rows; 60ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned stride; 61ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu}; 62ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 63ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic INLINE struct fbdev_sw_displaytarget * 64ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_sw_displaytarget(struct sw_displaytarget *dt) 65ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 66ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return (struct fbdev_sw_displaytarget *) dt; 67ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 68ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 69ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic INLINE struct fbdev_sw_winsys * 70ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_sw_winsys(struct sw_winsys *ws) 71ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 72ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return (struct fbdev_sw_winsys *) ws; 73ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 74ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 75ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic void 76ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_displaytarget_display(struct sw_winsys *ws, 77ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct sw_displaytarget *dt, 78aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu void *winsys_private) 79ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 80ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_winsys *fbdev = fbdev_sw_winsys(ws); 81aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu struct fbdev_sw_displaytarget *src = fbdev_sw_displaytarget(dt); 82aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu const struct fbdev_sw_drawable *dst = 83aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu (const struct fbdev_sw_drawable *) winsys_private; 84aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu unsigned height, row_offset, row_len, i; 85aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu void *fbmem; 86aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu 87aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu /* FIXME format conversion */ 88aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu if (dst->format != src->format) { 89aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu assert(0); 90aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu return; 91aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu } 92ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 93aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu height = dst->height; 94aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu if (dst->y + dst->height > fbdev->rows) { 95aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu /* nothing to copy */ 96aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu if (dst->y >= fbdev->rows) 97aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu return; 98ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 99aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu height = fbdev->rows - dst->y; 100aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu } 101aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu 102aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu row_offset = util_format_get_stride(dst->format, dst->x); 103aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu row_len = util_format_get_stride(dst->format, dst->width); 104aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu if (row_offset + row_len > fbdev->stride) { 105aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu /* nothing to copy */ 106aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu if (row_offset >= fbdev->stride) 107aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu return; 108ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 109aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu row_len = fbdev->stride - row_offset; 110ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu } 111aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu 112aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu fbmem = mmap(0, fbdev->finfo.smem_len, 113aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu PROT_WRITE, MAP_SHARED, fbdev->fd, 0); 114aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu if (fbmem == MAP_FAILED) 115aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu return; 116aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu 117aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu for (i = 0; i < height; i++) { 118aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu char *from = (char *) src->data + src->stride * i; 119aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu char *to = (char *) fbmem + fbdev->stride * (dst->y + i) + row_offset; 120aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu 121aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu memcpy(to, from, row_len); 122aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu } 123aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu 124aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu munmap(fbmem, fbdev->finfo.smem_len); 125ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 126ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 127ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic void 128ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_displaytarget_unmap(struct sw_winsys *ws, 129ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct sw_displaytarget *dt) 130ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 131ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_displaytarget *fbdt = fbdev_sw_displaytarget(dt); 132ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->mapped = NULL; 133ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 134ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 135ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic void * 136ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_displaytarget_map(struct sw_winsys *ws, 137ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct sw_displaytarget *dt, 138ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned flags) 139ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 140ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_displaytarget *fbdt = fbdev_sw_displaytarget(dt); 141ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->mapped = fbdt->data; 142ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return fbdt->mapped; 143ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 144ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 145ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic void 146ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_displaytarget_destroy(struct sw_winsys *ws, 147ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct sw_displaytarget *dt) 148ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 149ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_displaytarget *fbdt = fbdev_sw_displaytarget(dt); 150ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 151ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu if (fbdt->data) 152ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu align_free(fbdt->data); 153ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 154ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu FREE(fbdt); 155ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 156ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 157ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic struct sw_displaytarget * 158ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_displaytarget_create(struct sw_winsys *ws, 159ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned tex_usage, 160ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu enum pipe_format format, 161ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned width, unsigned height, 162ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned alignment, 163ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned *stride) 164ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 165ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_displaytarget *fbdt; 166ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned nblocksy, size, format_stride; 167ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 168ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt = CALLOC_STRUCT(fbdev_sw_displaytarget); 169ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu if (!fbdt) 170ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return NULL; 171ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 172ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->format = format; 173ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->width = width; 174ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->height = height; 175ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 176ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu format_stride = util_format_get_stride(format, width); 177ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->stride = align(format_stride, alignment); 178ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 179ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu nblocksy = util_format_get_nblocksy(format, height); 180ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu size = fbdt->stride * nblocksy; 181ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 182ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdt->data = align_malloc(size, alignment); 183ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu if (!fbdt->data) { 184ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu FREE(fbdt); 185ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return NULL; 186ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu } 187ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 188ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu *stride = fbdt->stride; 189ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 190ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return (struct sw_displaytarget *) fbdt; 191ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 192ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 193ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic boolean 194ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_is_displaytarget_format_supported(struct sw_winsys *ws, 195ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu unsigned tex_usage, 196ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu enum pipe_format format) 197ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 198aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wu return TRUE; 199ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 200ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 201ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustatic void 202ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wufbdev_destroy(struct sw_winsys *ws) 203ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 204ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_winsys *fbdev = fbdev_sw_winsys(ws); 205ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 206ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu FREE(fbdev); 207ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 208ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 209ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wustruct sw_winsys * 210aa281dd3924cf76e24c0e8cbd971f58d082cd4cdChia-I Wufbdev_create_sw_winsys(int fd) 211ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu{ 212ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu struct fbdev_sw_winsys *fbdev; 213ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 214ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev = CALLOC_STRUCT(fbdev_sw_winsys); 215ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu if (!fbdev) 216ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return NULL; 217ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 218ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->fd = fd; 219ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu if (ioctl(fbdev->fd, FBIOGET_FSCREENINFO, &fbdev->finfo)) { 220ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu FREE(fbdev); 221ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return NULL; 222ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu } 223ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 224ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->rows = fbdev->finfo.smem_len / fbdev->finfo.line_length; 225ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->stride = fbdev->finfo.line_length; 226ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 227ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.destroy = fbdev_destroy; 228ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.is_displaytarget_format_supported = 229ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev_is_displaytarget_format_supported; 230ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 231ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.displaytarget_create = fbdev_displaytarget_create; 232ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.displaytarget_destroy = fbdev_displaytarget_destroy; 233ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.displaytarget_map = fbdev_displaytarget_map; 234ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.displaytarget_unmap = fbdev_displaytarget_unmap; 235ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 236ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu fbdev->base.displaytarget_display = fbdev_displaytarget_display; 237ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu 238ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu return &fbdev->base; 239ce0c837f60d951de4f4798e5d4ab559155c09979Chia-I Wu} 240