diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_overlay.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_overlay.c | 116 |
1 files changed, 76 insertions, 40 deletions
diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c index 02ff0a481f47..3fbb98b948d6 100644 --- a/drivers/gpu/drm/i915/intel_overlay.c +++ b/drivers/gpu/drm/i915/intel_overlay.c | |||
@@ -221,15 +221,16 @@ static int intel_overlay_do_wait_request(struct intel_overlay *overlay, | |||
221 | int ret; | 221 | int ret; |
222 | 222 | ||
223 | BUG_ON(overlay->last_flip_req); | 223 | BUG_ON(overlay->last_flip_req); |
224 | overlay->last_flip_req = | 224 | ret = i915_add_request(dev, NULL, request, LP_RING(dev_priv)); |
225 | i915_add_request(dev, NULL, request, &dev_priv->render_ring); | 225 | if (ret) { |
226 | if (overlay->last_flip_req == 0) | 226 | kfree(request); |
227 | return -ENOMEM; | 227 | return ret; |
228 | 228 | } | |
229 | overlay->last_flip_req = request->seqno; | ||
229 | overlay->flip_tail = tail; | 230 | overlay->flip_tail = tail; |
230 | ret = i915_do_wait_request(dev, | 231 | ret = i915_do_wait_request(dev, |
231 | overlay->last_flip_req, true, | 232 | overlay->last_flip_req, true, |
232 | &dev_priv->render_ring); | 233 | LP_RING(dev_priv)); |
233 | if (ret) | 234 | if (ret) |
234 | return ret; | 235 | return ret; |
235 | 236 | ||
@@ -289,6 +290,7 @@ i830_deactivate_pipe_a(struct drm_device *dev) | |||
289 | static int intel_overlay_on(struct intel_overlay *overlay) | 290 | static int intel_overlay_on(struct intel_overlay *overlay) |
290 | { | 291 | { |
291 | struct drm_device *dev = overlay->dev; | 292 | struct drm_device *dev = overlay->dev; |
293 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
292 | struct drm_i915_gem_request *request; | 294 | struct drm_i915_gem_request *request; |
293 | int pipe_a_quirk = 0; | 295 | int pipe_a_quirk = 0; |
294 | int ret; | 296 | int ret; |
@@ -308,7 +310,12 @@ static int intel_overlay_on(struct intel_overlay *overlay) | |||
308 | goto out; | 310 | goto out; |
309 | } | 311 | } |
310 | 312 | ||
311 | BEGIN_LP_RING(4); | 313 | ret = BEGIN_LP_RING(4); |
314 | if (ret) { | ||
315 | kfree(request); | ||
316 | goto out; | ||
317 | } | ||
318 | |||
312 | OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_ON); | 319 | OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_ON); |
313 | OUT_RING(overlay->flip_addr | OFC_UPDATE); | 320 | OUT_RING(overlay->flip_addr | OFC_UPDATE); |
314 | OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); | 321 | OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); |
@@ -332,6 +339,7 @@ static int intel_overlay_continue(struct intel_overlay *overlay, | |||
332 | struct drm_i915_gem_request *request; | 339 | struct drm_i915_gem_request *request; |
333 | u32 flip_addr = overlay->flip_addr; | 340 | u32 flip_addr = overlay->flip_addr; |
334 | u32 tmp; | 341 | u32 tmp; |
342 | int ret; | ||
335 | 343 | ||
336 | BUG_ON(!overlay->active); | 344 | BUG_ON(!overlay->active); |
337 | 345 | ||
@@ -347,36 +355,44 @@ static int intel_overlay_continue(struct intel_overlay *overlay, | |||
347 | if (tmp & (1 << 17)) | 355 | if (tmp & (1 << 17)) |
348 | DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp); | 356 | DRM_DEBUG("overlay underrun, DOVSTA: %x\n", tmp); |
349 | 357 | ||
350 | BEGIN_LP_RING(2); | 358 | ret = BEGIN_LP_RING(2); |
359 | if (ret) { | ||
360 | kfree(request); | ||
361 | return ret; | ||
362 | } | ||
351 | OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); | 363 | OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); |
352 | OUT_RING(flip_addr); | 364 | OUT_RING(flip_addr); |
353 | ADVANCE_LP_RING(); | 365 | ADVANCE_LP_RING(); |
354 | 366 | ||
355 | overlay->last_flip_req = | 367 | ret = i915_add_request(dev, NULL, request, LP_RING(dev_priv)); |
356 | i915_add_request(dev, NULL, request, &dev_priv->render_ring); | 368 | if (ret) { |
369 | kfree(request); | ||
370 | return ret; | ||
371 | } | ||
372 | |||
373 | overlay->last_flip_req = request->seqno; | ||
357 | return 0; | 374 | return 0; |
358 | } | 375 | } |
359 | 376 | ||
360 | static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) | 377 | static void intel_overlay_release_old_vid_tail(struct intel_overlay *overlay) |
361 | { | 378 | { |
362 | struct drm_gem_object *obj = &overlay->old_vid_bo->base; | 379 | struct drm_i915_gem_object *obj = overlay->old_vid_bo; |
363 | 380 | ||
364 | i915_gem_object_unpin(obj); | 381 | i915_gem_object_unpin(obj); |
365 | drm_gem_object_unreference(obj); | 382 | drm_gem_object_unreference(&obj->base); |
366 | 383 | ||
367 | overlay->old_vid_bo = NULL; | 384 | overlay->old_vid_bo = NULL; |
368 | } | 385 | } |
369 | 386 | ||
370 | static void intel_overlay_off_tail(struct intel_overlay *overlay) | 387 | static void intel_overlay_off_tail(struct intel_overlay *overlay) |
371 | { | 388 | { |
372 | struct drm_gem_object *obj; | 389 | struct drm_i915_gem_object *obj = overlay->vid_bo; |
373 | 390 | ||
374 | /* never have the overlay hw on without showing a frame */ | 391 | /* never have the overlay hw on without showing a frame */ |
375 | BUG_ON(!overlay->vid_bo); | 392 | BUG_ON(!overlay->vid_bo); |
376 | obj = &overlay->vid_bo->base; | ||
377 | 393 | ||
378 | i915_gem_object_unpin(obj); | 394 | i915_gem_object_unpin(obj); |
379 | drm_gem_object_unreference(obj); | 395 | drm_gem_object_unreference(&obj->base); |
380 | overlay->vid_bo = NULL; | 396 | overlay->vid_bo = NULL; |
381 | 397 | ||
382 | overlay->crtc->overlay = NULL; | 398 | overlay->crtc->overlay = NULL; |
@@ -389,8 +405,10 @@ static int intel_overlay_off(struct intel_overlay *overlay, | |||
389 | bool interruptible) | 405 | bool interruptible) |
390 | { | 406 | { |
391 | struct drm_device *dev = overlay->dev; | 407 | struct drm_device *dev = overlay->dev; |
408 | struct drm_i915_private *dev_priv = dev->dev_private; | ||
392 | u32 flip_addr = overlay->flip_addr; | 409 | u32 flip_addr = overlay->flip_addr; |
393 | struct drm_i915_gem_request *request; | 410 | struct drm_i915_gem_request *request; |
411 | int ret; | ||
394 | 412 | ||
395 | BUG_ON(!overlay->active); | 413 | BUG_ON(!overlay->active); |
396 | 414 | ||
@@ -404,7 +422,11 @@ static int intel_overlay_off(struct intel_overlay *overlay, | |||
404 | * of the hw. Do it in both cases */ | 422 | * of the hw. Do it in both cases */ |
405 | flip_addr |= OFC_UPDATE; | 423 | flip_addr |= OFC_UPDATE; |
406 | 424 | ||
407 | BEGIN_LP_RING(6); | 425 | ret = BEGIN_LP_RING(6); |
426 | if (ret) { | ||
427 | kfree(request); | ||
428 | return ret; | ||
429 | } | ||
408 | /* wait for overlay to go idle */ | 430 | /* wait for overlay to go idle */ |
409 | OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); | 431 | OUT_RING(MI_OVERLAY_FLIP | MI_OVERLAY_CONTINUE); |
410 | OUT_RING(flip_addr); | 432 | OUT_RING(flip_addr); |
@@ -432,7 +454,7 @@ static int intel_overlay_recover_from_interrupt(struct intel_overlay *overlay, | |||
432 | return 0; | 454 | return 0; |
433 | 455 | ||
434 | ret = i915_do_wait_request(dev, overlay->last_flip_req, | 456 | ret = i915_do_wait_request(dev, overlay->last_flip_req, |
435 | interruptible, &dev_priv->render_ring); | 457 | interruptible, LP_RING(dev_priv)); |
436 | if (ret) | 458 | if (ret) |
437 | return ret; | 459 | return ret; |
438 | 460 | ||
@@ -467,7 +489,12 @@ static int intel_overlay_release_old_vid(struct intel_overlay *overlay) | |||
467 | if (request == NULL) | 489 | if (request == NULL) |
468 | return -ENOMEM; | 490 | return -ENOMEM; |
469 | 491 | ||
470 | BEGIN_LP_RING(2); | 492 | ret = BEGIN_LP_RING(2); |
493 | if (ret) { | ||
494 | kfree(request); | ||
495 | return ret; | ||
496 | } | ||
497 | |||
471 | OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); | 498 | OUT_RING(MI_WAIT_FOR_EVENT | MI_WAIT_FOR_OVERLAY_FLIP); |
472 | OUT_RING(MI_NOOP); | 499 | OUT_RING(MI_NOOP); |
473 | ADVANCE_LP_RING(); | 500 | ADVANCE_LP_RING(); |
@@ -736,13 +763,12 @@ static u32 overlay_cmd_reg(struct put_image_params *params) | |||
736 | } | 763 | } |
737 | 764 | ||
738 | static int intel_overlay_do_put_image(struct intel_overlay *overlay, | 765 | static int intel_overlay_do_put_image(struct intel_overlay *overlay, |
739 | struct drm_gem_object *new_bo, | 766 | struct drm_i915_gem_object *new_bo, |
740 | struct put_image_params *params) | 767 | struct put_image_params *params) |
741 | { | 768 | { |
742 | int ret, tmp_width; | 769 | int ret, tmp_width; |
743 | struct overlay_registers *regs; | 770 | struct overlay_registers *regs; |
744 | bool scale_changed = false; | 771 | bool scale_changed = false; |
745 | struct drm_i915_gem_object *bo_priv = to_intel_bo(new_bo); | ||
746 | struct drm_device *dev = overlay->dev; | 772 | struct drm_device *dev = overlay->dev; |
747 | 773 | ||
748 | BUG_ON(!mutex_is_locked(&dev->struct_mutex)); | 774 | BUG_ON(!mutex_is_locked(&dev->struct_mutex)); |
@@ -753,7 +779,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, | |||
753 | if (ret != 0) | 779 | if (ret != 0) |
754 | return ret; | 780 | return ret; |
755 | 781 | ||
756 | ret = i915_gem_object_pin(new_bo, PAGE_SIZE); | 782 | ret = i915_gem_object_pin(new_bo, PAGE_SIZE, true); |
757 | if (ret != 0) | 783 | if (ret != 0) |
758 | return ret; | 784 | return ret; |
759 | 785 | ||
@@ -761,6 +787,10 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, | |||
761 | if (ret != 0) | 787 | if (ret != 0) |
762 | goto out_unpin; | 788 | goto out_unpin; |
763 | 789 | ||
790 | ret = i915_gem_object_put_fence(new_bo); | ||
791 | if (ret) | ||
792 | goto out_unpin; | ||
793 | |||
764 | if (!overlay->active) { | 794 | if (!overlay->active) { |
765 | regs = intel_overlay_map_regs(overlay); | 795 | regs = intel_overlay_map_regs(overlay); |
766 | if (!regs) { | 796 | if (!regs) { |
@@ -797,7 +827,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, | |||
797 | regs->SWIDTHSW = calc_swidthsw(overlay->dev, | 827 | regs->SWIDTHSW = calc_swidthsw(overlay->dev, |
798 | params->offset_Y, tmp_width); | 828 | params->offset_Y, tmp_width); |
799 | regs->SHEIGHT = params->src_h; | 829 | regs->SHEIGHT = params->src_h; |
800 | regs->OBUF_0Y = bo_priv->gtt_offset + params-> offset_Y; | 830 | regs->OBUF_0Y = new_bo->gtt_offset + params-> offset_Y; |
801 | regs->OSTRIDE = params->stride_Y; | 831 | regs->OSTRIDE = params->stride_Y; |
802 | 832 | ||
803 | if (params->format & I915_OVERLAY_YUV_PLANAR) { | 833 | if (params->format & I915_OVERLAY_YUV_PLANAR) { |
@@ -811,8 +841,8 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, | |||
811 | params->src_w/uv_hscale); | 841 | params->src_w/uv_hscale); |
812 | regs->SWIDTHSW |= max_t(u32, tmp_U, tmp_V) << 16; | 842 | regs->SWIDTHSW |= max_t(u32, tmp_U, tmp_V) << 16; |
813 | regs->SHEIGHT |= (params->src_h/uv_vscale) << 16; | 843 | regs->SHEIGHT |= (params->src_h/uv_vscale) << 16; |
814 | regs->OBUF_0U = bo_priv->gtt_offset + params->offset_U; | 844 | regs->OBUF_0U = new_bo->gtt_offset + params->offset_U; |
815 | regs->OBUF_0V = bo_priv->gtt_offset + params->offset_V; | 845 | regs->OBUF_0V = new_bo->gtt_offset + params->offset_V; |
816 | regs->OSTRIDE |= params->stride_UV << 16; | 846 | regs->OSTRIDE |= params->stride_UV << 16; |
817 | } | 847 | } |
818 | 848 | ||
@@ -829,7 +859,7 @@ static int intel_overlay_do_put_image(struct intel_overlay *overlay, | |||
829 | goto out_unpin; | 859 | goto out_unpin; |
830 | 860 | ||
831 | overlay->old_vid_bo = overlay->vid_bo; | 861 | overlay->old_vid_bo = overlay->vid_bo; |
832 | overlay->vid_bo = to_intel_bo(new_bo); | 862 | overlay->vid_bo = new_bo; |
833 | 863 | ||
834 | return 0; | 864 | return 0; |
835 | 865 | ||
@@ -942,7 +972,7 @@ static int check_overlay_scaling(struct put_image_params *rec) | |||
942 | 972 | ||
943 | static int check_overlay_src(struct drm_device *dev, | 973 | static int check_overlay_src(struct drm_device *dev, |
944 | struct drm_intel_overlay_put_image *rec, | 974 | struct drm_intel_overlay_put_image *rec, |
945 | struct drm_gem_object *new_bo) | 975 | struct drm_i915_gem_object *new_bo) |
946 | { | 976 | { |
947 | int uv_hscale = uv_hsubsampling(rec->flags); | 977 | int uv_hscale = uv_hsubsampling(rec->flags); |
948 | int uv_vscale = uv_vsubsampling(rec->flags); | 978 | int uv_vscale = uv_vsubsampling(rec->flags); |
@@ -1027,7 +1057,7 @@ static int check_overlay_src(struct drm_device *dev, | |||
1027 | return -EINVAL; | 1057 | return -EINVAL; |
1028 | 1058 | ||
1029 | tmp = rec->stride_Y*rec->src_height; | 1059 | tmp = rec->stride_Y*rec->src_height; |
1030 | if (rec->offset_Y + tmp > new_bo->size) | 1060 | if (rec->offset_Y + tmp > new_bo->base.size) |
1031 | return -EINVAL; | 1061 | return -EINVAL; |
1032 | break; | 1062 | break; |
1033 | 1063 | ||
@@ -1038,12 +1068,12 @@ static int check_overlay_src(struct drm_device *dev, | |||
1038 | return -EINVAL; | 1068 | return -EINVAL; |
1039 | 1069 | ||
1040 | tmp = rec->stride_Y * rec->src_height; | 1070 | tmp = rec->stride_Y * rec->src_height; |
1041 | if (rec->offset_Y + tmp > new_bo->size) | 1071 | if (rec->offset_Y + tmp > new_bo->base.size) |
1042 | return -EINVAL; | 1072 | return -EINVAL; |
1043 | 1073 | ||
1044 | tmp = rec->stride_UV * (rec->src_height / uv_vscale); | 1074 | tmp = rec->stride_UV * (rec->src_height / uv_vscale); |
1045 | if (rec->offset_U + tmp > new_bo->size || | 1075 | if (rec->offset_U + tmp > new_bo->base.size || |
1046 | rec->offset_V + tmp > new_bo->size) | 1076 | rec->offset_V + tmp > new_bo->base.size) |
1047 | return -EINVAL; | 1077 | return -EINVAL; |
1048 | break; | 1078 | break; |
1049 | } | 1079 | } |
@@ -1086,7 +1116,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data, | |||
1086 | struct intel_overlay *overlay; | 1116 | struct intel_overlay *overlay; |
1087 | struct drm_mode_object *drmmode_obj; | 1117 | struct drm_mode_object *drmmode_obj; |
1088 | struct intel_crtc *crtc; | 1118 | struct intel_crtc *crtc; |
1089 | struct drm_gem_object *new_bo; | 1119 | struct drm_i915_gem_object *new_bo; |
1090 | struct put_image_params *params; | 1120 | struct put_image_params *params; |
1091 | int ret; | 1121 | int ret; |
1092 | 1122 | ||
@@ -1125,8 +1155,8 @@ int intel_overlay_put_image(struct drm_device *dev, void *data, | |||
1125 | } | 1155 | } |
1126 | crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); | 1156 | crtc = to_intel_crtc(obj_to_crtc(drmmode_obj)); |
1127 | 1157 | ||
1128 | new_bo = drm_gem_object_lookup(dev, file_priv, | 1158 | new_bo = to_intel_bo(drm_gem_object_lookup(dev, file_priv, |
1129 | put_image_rec->bo_handle); | 1159 | put_image_rec->bo_handle)); |
1130 | if (!new_bo) { | 1160 | if (!new_bo) { |
1131 | ret = -ENOENT; | 1161 | ret = -ENOENT; |
1132 | goto out_free; | 1162 | goto out_free; |
@@ -1135,6 +1165,12 @@ int intel_overlay_put_image(struct drm_device *dev, void *data, | |||
1135 | mutex_lock(&dev->mode_config.mutex); | 1165 | mutex_lock(&dev->mode_config.mutex); |
1136 | mutex_lock(&dev->struct_mutex); | 1166 | mutex_lock(&dev->struct_mutex); |
1137 | 1167 | ||
1168 | if (new_bo->tiling_mode) { | ||
1169 | DRM_ERROR("buffer used for overlay image can not be tiled\n"); | ||
1170 | ret = -EINVAL; | ||
1171 | goto out_unlock; | ||
1172 | } | ||
1173 | |||
1138 | ret = intel_overlay_recover_from_interrupt(overlay, true); | 1174 | ret = intel_overlay_recover_from_interrupt(overlay, true); |
1139 | if (ret != 0) | 1175 | if (ret != 0) |
1140 | goto out_unlock; | 1176 | goto out_unlock; |
@@ -1217,7 +1253,7 @@ int intel_overlay_put_image(struct drm_device *dev, void *data, | |||
1217 | out_unlock: | 1253 | out_unlock: |
1218 | mutex_unlock(&dev->struct_mutex); | 1254 | mutex_unlock(&dev->struct_mutex); |
1219 | mutex_unlock(&dev->mode_config.mutex); | 1255 | mutex_unlock(&dev->mode_config.mutex); |
1220 | drm_gem_object_unreference_unlocked(new_bo); | 1256 | drm_gem_object_unreference_unlocked(&new_bo->base); |
1221 | out_free: | 1257 | out_free: |
1222 | kfree(params); | 1258 | kfree(params); |
1223 | 1259 | ||
@@ -1370,7 +1406,7 @@ void intel_setup_overlay(struct drm_device *dev) | |||
1370 | { | 1406 | { |
1371 | drm_i915_private_t *dev_priv = dev->dev_private; | 1407 | drm_i915_private_t *dev_priv = dev->dev_private; |
1372 | struct intel_overlay *overlay; | 1408 | struct intel_overlay *overlay; |
1373 | struct drm_gem_object *reg_bo; | 1409 | struct drm_i915_gem_object *reg_bo; |
1374 | struct overlay_registers *regs; | 1410 | struct overlay_registers *regs; |
1375 | int ret; | 1411 | int ret; |
1376 | 1412 | ||
@@ -1385,7 +1421,7 @@ void intel_setup_overlay(struct drm_device *dev) | |||
1385 | reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); | 1421 | reg_bo = i915_gem_alloc_object(dev, PAGE_SIZE); |
1386 | if (!reg_bo) | 1422 | if (!reg_bo) |
1387 | goto out_free; | 1423 | goto out_free; |
1388 | overlay->reg_bo = to_intel_bo(reg_bo); | 1424 | overlay->reg_bo = reg_bo; |
1389 | 1425 | ||
1390 | if (OVERLAY_NEEDS_PHYSICAL(dev)) { | 1426 | if (OVERLAY_NEEDS_PHYSICAL(dev)) { |
1391 | ret = i915_gem_attach_phys_object(dev, reg_bo, | 1427 | ret = i915_gem_attach_phys_object(dev, reg_bo, |
@@ -1395,14 +1431,14 @@ void intel_setup_overlay(struct drm_device *dev) | |||
1395 | DRM_ERROR("failed to attach phys overlay regs\n"); | 1431 | DRM_ERROR("failed to attach phys overlay regs\n"); |
1396 | goto out_free_bo; | 1432 | goto out_free_bo; |
1397 | } | 1433 | } |
1398 | overlay->flip_addr = overlay->reg_bo->phys_obj->handle->busaddr; | 1434 | overlay->flip_addr = reg_bo->phys_obj->handle->busaddr; |
1399 | } else { | 1435 | } else { |
1400 | ret = i915_gem_object_pin(reg_bo, PAGE_SIZE); | 1436 | ret = i915_gem_object_pin(reg_bo, PAGE_SIZE, true); |
1401 | if (ret) { | 1437 | if (ret) { |
1402 | DRM_ERROR("failed to pin overlay register bo\n"); | 1438 | DRM_ERROR("failed to pin overlay register bo\n"); |
1403 | goto out_free_bo; | 1439 | goto out_free_bo; |
1404 | } | 1440 | } |
1405 | overlay->flip_addr = overlay->reg_bo->gtt_offset; | 1441 | overlay->flip_addr = reg_bo->gtt_offset; |
1406 | 1442 | ||
1407 | ret = i915_gem_object_set_to_gtt_domain(reg_bo, true); | 1443 | ret = i915_gem_object_set_to_gtt_domain(reg_bo, true); |
1408 | if (ret) { | 1444 | if (ret) { |
@@ -1434,7 +1470,7 @@ void intel_setup_overlay(struct drm_device *dev) | |||
1434 | out_unpin_bo: | 1470 | out_unpin_bo: |
1435 | i915_gem_object_unpin(reg_bo); | 1471 | i915_gem_object_unpin(reg_bo); |
1436 | out_free_bo: | 1472 | out_free_bo: |
1437 | drm_gem_object_unreference(reg_bo); | 1473 | drm_gem_object_unreference(®_bo->base); |
1438 | out_free: | 1474 | out_free: |
1439 | kfree(overlay); | 1475 | kfree(overlay); |
1440 | return; | 1476 | return; |