disp: remove kernel mapping of writeback framebuffer
This change removes the fb_kmap debugfs node along with kernel mapping of writeback framebuffer. It also replaces dma_buf_kmap calls with dma_buf_vmap. Change-Id: I2fbee7fa5922071f6805d8e6df540ce87056bc0b Signed-off-by: Narendra Muppalla <NarendraM@codeaurora.org>
This commit is contained in:
@@ -1095,7 +1095,6 @@ void msm_gem_object_set_name(struct drm_gem_object *bo, const char *fmt, ...);
|
|||||||
|
|
||||||
int msm_gem_delayed_import(struct drm_gem_object *obj);
|
int msm_gem_delayed_import(struct drm_gem_object *obj);
|
||||||
|
|
||||||
void msm_framebuffer_set_kmap(struct drm_framebuffer *fb, bool enable);
|
|
||||||
void msm_framebuffer_set_keepattrs(struct drm_framebuffer *fb, bool enable);
|
void msm_framebuffer_set_keepattrs(struct drm_framebuffer *fb, bool enable);
|
||||||
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
|
int msm_framebuffer_prepare(struct drm_framebuffer *fb,
|
||||||
struct msm_gem_address_space *aspace);
|
struct msm_gem_address_space *aspace);
|
||||||
|
91
msm/msm_fb.c
91
msm/msm_fb.c
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
|
||||||
* Copyright (C) 2013 Red Hat
|
* Copyright (C) 2013 Red Hat
|
||||||
* Author: Rob Clark <robdclark@gmail.com>
|
* Author: Rob Clark <robdclark@gmail.com>
|
||||||
*
|
*
|
||||||
@@ -16,8 +16,6 @@
|
|||||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/dma-mapping.h>
|
|
||||||
#include <linux/dma-buf.h>
|
|
||||||
#include <drm/drm_crtc.h>
|
#include <drm/drm_crtc.h>
|
||||||
#include <drm/drm_damage_helper.h>
|
#include <drm/drm_damage_helper.h>
|
||||||
#include <drm/drm_gem_framebuffer_helper.h>
|
#include <drm/drm_gem_framebuffer_helper.h>
|
||||||
@@ -27,14 +25,9 @@
|
|||||||
#include "msm_kms.h"
|
#include "msm_kms.h"
|
||||||
#include "msm_gem.h"
|
#include "msm_gem.h"
|
||||||
|
|
||||||
#define MSM_FRAMEBUFFER_FLAG_KMAP BIT(0)
|
|
||||||
|
|
||||||
struct msm_framebuffer {
|
struct msm_framebuffer {
|
||||||
struct drm_framebuffer base;
|
struct drm_framebuffer base;
|
||||||
const struct msm_format *format;
|
const struct msm_format *format;
|
||||||
void *vaddr[MAX_PLANE];
|
|
||||||
atomic_t kmap_count;
|
|
||||||
u32 flags;
|
|
||||||
};
|
};
|
||||||
#define to_msm_framebuffer(x) container_of(x, struct msm_framebuffer, base)
|
#define to_msm_framebuffer(x) container_of(x, struct msm_framebuffer, base)
|
||||||
|
|
||||||
@@ -101,81 +94,6 @@ void msm_framebuffer_set_keepattrs(struct drm_framebuffer *fb, bool enable)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void msm_framebuffer_set_kmap(struct drm_framebuffer *fb, bool enable)
|
|
||||||
{
|
|
||||||
struct msm_framebuffer *msm_fb;
|
|
||||||
|
|
||||||
if (!fb) {
|
|
||||||
DRM_ERROR("from:%pS null fb\n", __builtin_return_address(0));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
msm_fb = to_msm_framebuffer(fb);
|
|
||||||
if (enable)
|
|
||||||
msm_fb->flags |= MSM_FRAMEBUFFER_FLAG_KMAP;
|
|
||||||
else
|
|
||||||
msm_fb->flags &= ~MSM_FRAMEBUFFER_FLAG_KMAP;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int msm_framebuffer_kmap(struct drm_framebuffer *fb)
|
|
||||||
{
|
|
||||||
struct msm_framebuffer *msm_fb;
|
|
||||||
int i, n;
|
|
||||||
struct drm_gem_object *bo;
|
|
||||||
|
|
||||||
if (!fb) {
|
|
||||||
DRM_ERROR("from:%pS null fb\n", __builtin_return_address(0));
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
msm_fb = to_msm_framebuffer(fb);
|
|
||||||
n = fb->format->num_planes;
|
|
||||||
if (atomic_inc_return(&msm_fb->kmap_count) > 1)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
bo = msm_framebuffer_bo(fb, i);
|
|
||||||
if (!bo || !bo->dma_buf) {
|
|
||||||
msm_fb->vaddr[i] = NULL;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
dma_buf_begin_cpu_access(bo->dma_buf, DMA_BIDIRECTIONAL);
|
|
||||||
msm_fb->vaddr[i] = dma_buf_kmap(bo->dma_buf, 0);
|
|
||||||
DRM_INFO("FB[%u]: vaddr[%d]:%ux%u:0x%llx\n", fb->base.id, i,
|
|
||||||
fb->width, fb->height, (u64) msm_fb->vaddr[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void msm_framebuffer_kunmap(struct drm_framebuffer *fb)
|
|
||||||
{
|
|
||||||
struct msm_framebuffer *msm_fb;
|
|
||||||
int i, n;
|
|
||||||
struct drm_gem_object *bo;
|
|
||||||
|
|
||||||
if (!fb) {
|
|
||||||
DRM_ERROR("from:%pS null fb\n", __builtin_return_address(0));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
msm_fb = to_msm_framebuffer(fb);
|
|
||||||
n = fb->format->num_planes;
|
|
||||||
if (atomic_dec_return(&msm_fb->kmap_count) > 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++) {
|
|
||||||
bo = msm_framebuffer_bo(fb, i);
|
|
||||||
if (!bo || !msm_fb->vaddr[i])
|
|
||||||
continue;
|
|
||||||
if (bo->dma_buf) {
|
|
||||||
dma_buf_kunmap(bo->dma_buf, 0, msm_fb->vaddr[i]);
|
|
||||||
dma_buf_end_cpu_access(bo->dma_buf, DMA_BIDIRECTIONAL);
|
|
||||||
}
|
|
||||||
msm_fb->vaddr[i] = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* prepare/pin all the fb's bo's for scanout. Note that it is not valid
|
/* prepare/pin all the fb's bo's for scanout. Note that it is not valid
|
||||||
* to prepare an fb more multiple different initiator 'id's. But that
|
* to prepare an fb more multiple different initiator 'id's. But that
|
||||||
* should be fine, since only the scanout (mdpN) side of things needs
|
* should be fine, since only the scanout (mdpN) side of things needs
|
||||||
@@ -202,9 +120,6 @@ int msm_framebuffer_prepare(struct drm_framebuffer *fb,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (msm_fb->flags & MSM_FRAMEBUFFER_FLAG_KMAP)
|
|
||||||
msm_framebuffer_kmap(fb);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -222,9 +137,6 @@ void msm_framebuffer_cleanup(struct drm_framebuffer *fb,
|
|||||||
msm_fb = to_msm_framebuffer(fb);
|
msm_fb = to_msm_framebuffer(fb);
|
||||||
n = fb->format->num_planes;
|
n = fb->format->num_planes;
|
||||||
|
|
||||||
if (msm_fb->flags & MSM_FRAMEBUFFER_FLAG_KMAP)
|
|
||||||
msm_framebuffer_kunmap(fb);
|
|
||||||
|
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
msm_gem_put_iova(fb->obj[i], aspace);
|
msm_gem_put_iova(fb->obj[i], aspace);
|
||||||
}
|
}
|
||||||
@@ -351,7 +263,6 @@ struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
|
|||||||
fb = &msm_fb->base;
|
fb = &msm_fb->base;
|
||||||
|
|
||||||
msm_fb->format = format;
|
msm_fb->format = format;
|
||||||
atomic_set(&msm_fb->kmap_count, 0);
|
|
||||||
|
|
||||||
if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
|
if (mode_cmd->flags & DRM_MODE_FB_MODIFIERS) {
|
||||||
for (i = 0; i < ARRAY_SIZE(mode_cmd->modifier); i++) {
|
for (i = 0; i < ARRAY_SIZE(mode_cmd->modifier); i++) {
|
||||||
|
@@ -1368,9 +1368,6 @@ static int sde_connector_atomic_set_property(struct drm_connector *connector,
|
|||||||
} else if (!c_state->out_fb && !val) {
|
} else if (!c_state->out_fb && !val) {
|
||||||
SDE_DEBUG("cleared fb_id\n");
|
SDE_DEBUG("cleared fb_id\n");
|
||||||
rc = 0;
|
rc = 0;
|
||||||
} else {
|
|
||||||
msm_framebuffer_set_kmap(c_state->out_fb,
|
|
||||||
c_conn->fb_kmap);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CONNECTOR_PROP_RETIRE_FENCE:
|
case CONNECTOR_PROP_RETIRE_FENCE:
|
||||||
@@ -1921,12 +1918,6 @@ static int sde_connector_init_debugfs(struct drm_connector *connector)
|
|||||||
&sde_connector->esd_status_interval);
|
&sde_connector->esd_status_interval);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!debugfs_create_bool("fb_kmap", 0600, connector->debugfs_entry,
|
|
||||||
&sde_connector->fb_kmap)) {
|
|
||||||
SDE_ERROR("failed to create connector fb_kmap\n");
|
|
||||||
return -ENOMEM;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sde_connector->ops.cmd_transfer) {
|
if (sde_connector->ops.cmd_transfer) {
|
||||||
if (!debugfs_create_file("tx_cmd", 0600,
|
if (!debugfs_create_file("tx_cmd", 0600,
|
||||||
connector->debugfs_entry,
|
connector->debugfs_entry,
|
||||||
|
@@ -408,7 +408,6 @@ struct sde_connector_dyn_hdr_metadata {
|
|||||||
* @blob_dither: Pointer to blob structure for default dither config
|
* @blob_dither: Pointer to blob structure for default dither config
|
||||||
* @blob_mode_info: Pointer to blob structure for mode info
|
* @blob_mode_info: Pointer to blob structure for mode info
|
||||||
* @blob_panel_id: Pointer to blob structure for blob_panel_id
|
* @blob_panel_id: Pointer to blob structure for blob_panel_id
|
||||||
* @fb_kmap: true if kernel mapping of framebuffer is requested
|
|
||||||
* @event_table: Array of registered events
|
* @event_table: Array of registered events
|
||||||
* @event_lock: Lock object for event_table
|
* @event_lock: Lock object for event_table
|
||||||
* @bl_device: backlight device node
|
* @bl_device: backlight device node
|
||||||
@@ -465,7 +464,6 @@ struct sde_connector {
|
|||||||
struct drm_property_blob *blob_mode_info;
|
struct drm_property_blob *blob_mode_info;
|
||||||
struct drm_property_blob *blob_panel_id;
|
struct drm_property_blob *blob_panel_id;
|
||||||
|
|
||||||
bool fb_kmap;
|
|
||||||
struct sde_connector_evt event_table[SDE_CONN_EVENT_COUNT];
|
struct sde_connector_evt event_table[SDE_CONN_EVENT_COUNT];
|
||||||
spinlock_t event_lock;
|
spinlock_t event_lock;
|
||||||
|
|
||||||
|
@@ -1220,7 +1220,7 @@ static void sde_hw_rotator_map_vaddr(struct sde_dbg_buf *dbgbuf,
|
|||||||
|
|
||||||
if (dbgbuf->dmabuf && (dbgbuf->buflen > 0)) {
|
if (dbgbuf->dmabuf && (dbgbuf->buflen > 0)) {
|
||||||
dma_buf_begin_cpu_access(dbgbuf->dmabuf, DMA_FROM_DEVICE);
|
dma_buf_begin_cpu_access(dbgbuf->dmabuf, DMA_FROM_DEVICE);
|
||||||
dbgbuf->vaddr = dma_buf_kmap(dbgbuf->dmabuf, 0);
|
dbgbuf->vaddr = dma_buf_vmap(dbgbuf->dmabuf);
|
||||||
SDEROT_DBG("vaddr mapping: 0x%pK/%ld w:%d/h:%d\n",
|
SDEROT_DBG("vaddr mapping: 0x%pK/%ld w:%d/h:%d\n",
|
||||||
dbgbuf->vaddr, dbgbuf->buflen,
|
dbgbuf->vaddr, dbgbuf->buflen,
|
||||||
dbgbuf->width, dbgbuf->height);
|
dbgbuf->width, dbgbuf->height);
|
||||||
|
Reference in New Issue
Block a user