|
Line
Link Here
|
|
-- |
|
|
| 1 |
drivers/gpu/drm/cirrus/cirrus_drv.h | 2 - |
|
drivers/gpu/drm/cirrus/cirrus_drv.h | 2 - |
| 2 |
drivers/gpu/drm/cirrus/cirrus_fbdev.c | 49 ++++++++++++++++++++-------------- |
1 |
drivers/gpu/drm/cirrus/cirrus_fbdev.c | 49 ++++++++++++++++++++-------------- |
| 3 |
drivers/gpu/drm/cirrus/cirrus_mode.c | 2 - |
2 |
drivers/gpu/drm/cirrus/cirrus_mode.c | 2 - |
| 4 |
3 files changed, 32 insertions(+), 21 deletions(-) |
3 |
3 files changed, 32 insertions(+), 21 deletions(-) |
| 5 |
-- a/drivers/gpu/drm/cirrus/cirrus_drv.h |
4 |
++ b/drivers/gpu/drm/cirrus/cirrus_drv.h |
|
Lines 152-158
struct cirrus_device {
Link Here
|
| 152 |
|
152 |
|
| 153 |
struct cirrus_fbdev { |
153 |
struct cirrus_fbdev { |
| 154 |
struct drm_fb_helper helper; |
154 |
struct drm_fb_helper helper; |
| 155 |
struct cirrus_framebuffer gfb; |
155 |
struct cirrus_framebuffer *gfb; |
| 156 |
void *sysram; |
156 |
void *sysram; |
| 157 |
int size; |
157 |
int size; |
| 158 |
int x1, y1, x2, y2; /* dirty rect */ |
158 |
int x1, y1, x2, y2; /* dirty rect */ |
| 159 |
-- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c |
159 |
++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c |
|
Lines 22-35
static void cirrus_dirty_update(struct c
Link Here
|
| 22 |
struct drm_gem_object *obj; |
22 |
struct drm_gem_object *obj; |
| 23 |
struct cirrus_bo *bo; |
23 |
struct cirrus_bo *bo; |
| 24 |
int src_offset, dst_offset; |
24 |
int src_offset, dst_offset; |
| 25 |
int bpp = afbdev->gfb.base.format->cpp[0]; |
25 |
int bpp = afbdev->gfb->base.format->cpp[0]; |
| 26 |
int ret = -EBUSY; |
26 |
int ret = -EBUSY; |
| 27 |
bool unmap = false; |
27 |
bool unmap = false; |
| 28 |
bool store_for_later = false; |
28 |
bool store_for_later = false; |
| 29 |
int x2, y2; |
29 |
int x2, y2; |
| 30 |
unsigned long flags; |
30 |
unsigned long flags; |
| 31 |
|
31 |
|
| 32 |
obj = afbdev->gfb.obj; |
32 |
obj = afbdev->gfb->obj; |
| 33 |
bo = gem_to_cirrus_bo(obj); |
33 |
bo = gem_to_cirrus_bo(obj); |
| 34 |
|
34 |
|
| 35 |
/* |
35 |
/* |
|
Lines 82-88
static void cirrus_dirty_update(struct c
Link Here
|
| 82 |
} |
82 |
} |
| 83 |
for (i = y; i < y + height; i++) { |
83 |
for (i = y; i < y + height; i++) { |
| 84 |
/* assume equal stride for now */ |
84 |
/* assume equal stride for now */ |
| 85 |
src_offset = dst_offset = i * afbdev->gfb.base.pitches[0] + (x * bpp); |
85 |
src_offset = dst_offset = i * afbdev->gfb->base.pitches[0] + (x * bpp); |
| 86 |
memcpy_toio(bo->kmap.virtual + src_offset, afbdev->sysram + src_offset, width * bpp); |
86 |
memcpy_toio(bo->kmap.virtual + src_offset, afbdev->sysram + src_offset, width * bpp); |
| 87 |
|
87 |
|
| 88 |
} |
88 |
} |
|
Lines 165-171
static int cirrusfb_create(struct drm_fb
Link Here
|
| 165 |
container_of(helper, struct cirrus_fbdev, helper); |
165 |
container_of(helper, struct cirrus_fbdev, helper); |
| 166 |
struct cirrus_device *cdev = gfbdev->helper.dev->dev_private; |
166 |
struct cirrus_device *cdev = gfbdev->helper.dev->dev_private; |
| 167 |
struct fb_info *info; |
167 |
struct fb_info *info; |
| 168 |
struct drm_framebuffer *fb; |
168 |
struct cirrus_framebuffer *fb; |
| 169 |
struct drm_mode_fb_cmd2 mode_cmd; |
169 |
struct drm_mode_fb_cmd2 mode_cmd; |
| 170 |
void *sysram; |
170 |
void *sysram; |
| 171 |
struct drm_gem_object *gobj = NULL; |
171 |
struct drm_gem_object *gobj = NULL; |
|
Lines 192-224
static int cirrusfb_create(struct drm_fb
Link Here
|
| 192 |
return -ENOMEM; |
192 |
return -ENOMEM; |
| 193 |
|
193 |
|
| 194 |
info = drm_fb_helper_alloc_fbi(helper); |
194 |
info = drm_fb_helper_alloc_fbi(helper); |
| 195 |
if (IS_ERR(info)) |
195 |
if (IS_ERR(info)) { |
| 196 |
return PTR_ERR(info); |
196 |
ret = PTR_ERR(info); |
|
|
197 |
goto err_vfree; |
| 198 |
} |
| 197 |
|
199 |
|
| 198 |
info->par = gfbdev; |
200 |
info->par = gfbdev; |
| 199 |
|
201 |
|
| 200 |
ret = cirrus_framebuffer_init(cdev->dev, &gfbdev->gfb, &mode_cmd, gobj); |
202 |
fb = kzalloc(sizeof(*fb), GFP_KERNEL); |
|
|
203 |
if (!fb) { |
| 204 |
ret = -ENOMEM; |
| 205 |
goto err_drm_gem_object_put_unlocked; |
| 206 |
} |
| 207 |
|
| 208 |
ret = cirrus_framebuffer_init(cdev->dev, fb, &mode_cmd, gobj); |
| 201 |
if (ret) |
209 |
if (ret) |
| 202 |
return ret; |
210 |
goto err_kfree; |
| 203 |
|
211 |
|
| 204 |
gfbdev->sysram = sysram; |
212 |
gfbdev->sysram = sysram; |
| 205 |
gfbdev->size = size; |
213 |
gfbdev->size = size; |
| 206 |
|
214 |
gfbdev->gfb = fb; |
| 207 |
fb = &gfbdev->gfb.base; |
|
|
| 208 |
if (!fb) { |
| 209 |
DRM_INFO("fb is NULL\n"); |
| 210 |
return -EINVAL; |
| 211 |
} |
| 212 |
|
215 |
|
| 213 |
/* setup helper */ |
216 |
/* setup helper */ |
| 214 |
gfbdev->helper.fb = fb; |
217 |
gfbdev->helper.fb = &fb->base; |
| 215 |
|
218 |
|
| 216 |
strcpy(info->fix.id, "cirrusdrmfb"); |
219 |
strcpy(info->fix.id, "cirrusdrmfb"); |
| 217 |
|
220 |
|
| 218 |
info->flags = FBINFO_DEFAULT; |
221 |
info->flags = FBINFO_DEFAULT; |
| 219 |
info->fbops = &cirrusfb_ops; |
222 |
info->fbops = &cirrusfb_ops; |
| 220 |
|
223 |
|
| 221 |
drm_fb_helper_fill_fix(info, fb->pitches[0], fb->format->depth); |
224 |
drm_fb_helper_fill_fix(info, fb->base.pitches[0], fb->base.format->depth); |
| 222 |
drm_fb_helper_fill_var(info, &gfbdev->helper, sizes->fb_width, |
225 |
drm_fb_helper_fill_var(info, &gfbdev->helper, sizes->fb_width, |
| 223 |
sizes->fb_height); |
226 |
sizes->fb_height); |
| 224 |
|
227 |
|
|
Lines 238-253
static int cirrusfb_create(struct drm_fb
Link Here
|
| 238 |
DRM_INFO("fb mappable at 0x%lX\n", info->fix.smem_start); |
241 |
DRM_INFO("fb mappable at 0x%lX\n", info->fix.smem_start); |
| 239 |
DRM_INFO("vram aper at 0x%lX\n", (unsigned long)info->fix.smem_start); |
242 |
DRM_INFO("vram aper at 0x%lX\n", (unsigned long)info->fix.smem_start); |
| 240 |
DRM_INFO("size %lu\n", (unsigned long)info->fix.smem_len); |
243 |
DRM_INFO("size %lu\n", (unsigned long)info->fix.smem_len); |
| 241 |
DRM_INFO("fb depth is %d\n", fb->format->depth); |
244 |
DRM_INFO("fb depth is %d\n", fb->base.format->depth); |
| 242 |
DRM_INFO(" pitch is %d\n", fb->pitches[0]); |
245 |
DRM_INFO(" pitch is %d\n", fb->base.pitches[0]); |
| 243 |
|
246 |
|
| 244 |
return 0; |
247 |
return 0; |
|
|
248 |
|
| 249 |
err_kfree: |
| 250 |
kfree(fb); |
| 251 |
err_drm_gem_object_put_unlocked: |
| 252 |
drm_gem_object_put_unlocked(gobj); |
| 253 |
err_vfree: |
| 254 |
vfree(sysram); |
| 255 |
return ret; |
| 245 |
} |
256 |
} |
| 246 |
|
257 |
|
| 247 |
static int cirrus_fbdev_destroy(struct drm_device *dev, |
258 |
static int cirrus_fbdev_destroy(struct drm_device *dev, |
| 248 |
struct cirrus_fbdev *gfbdev) |
259 |
struct cirrus_fbdev *gfbdev) |
| 249 |
{ |
260 |
{ |
| 250 |
struct cirrus_framebuffer *gfb = &gfbdev->gfb; |
261 |
struct cirrus_framebuffer *gfb = gfbdev->gfb; |
| 251 |
|
262 |
|
| 252 |
drm_fb_helper_unregister_fbi(&gfbdev->helper); |
263 |
drm_fb_helper_unregister_fbi(&gfbdev->helper); |
| 253 |
|
264 |
|
| 254 |
-- a/drivers/gpu/drm/cirrus/cirrus_mode.c |
265 |
++ b/drivers/gpu/drm/cirrus/cirrus_mode.c |
|
Lines 133-139
static int cirrus_crtc_do_set_base(struc
Link Here
|
| 133 |
return ret; |
133 |
return ret; |
| 134 |
} |
134 |
} |
| 135 |
|
135 |
|
| 136 |
if (&cdev->mode_info.gfbdev->gfb == cirrus_fb) { |
136 |
if (cdev->mode_info.gfbdev->gfb == cirrus_fb) { |
| 137 |
/* if pushing console in kmap it */ |
137 |
/* if pushing console in kmap it */ |
| 138 |
ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &bo->kmap); |
138 |
ret = ttm_bo_kmap(&bo->bo, 0, bo->bo.num_pages, &bo->kmap); |
| 139 |
if (ret) |
139 |
if (ret) |