Merge branch 'exynos-drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos into drm-fixes
This pull request includes regression fixups, build warnings, and trivial cleanups which mostly remove some codes not used anymore. * 'exynos-drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/daeinki/drm-exynos: drm/exynos: Staticize local function in exynos_drm_gem.c drm/exynos: fimd: actually disable dp clock drm/exynos: dp: remove suspend/resume functions drm/exynos: remove unused mode_fixup() code drm/exynos: remove decon_mode_fixup() drm/exynos: remove fimd_mode_fixup() drm/exynos: rotator: Clock control is unused if !PM drm/exynos: fimc: Clock control is unused if !PM drm/exynos: Suspend/resume is unused if !PM drm/exynos: create a fake mmap offset with gem creation drm/exynos: remove call to drm_gem_free_mmap_offset() drm/exynos: Remove useless EXPORT_SYMBOL_GPLs drm/exynos: cleanup line feed in exynos_drm_gem_get_ioctl drm/exynos: cleanup function calling written twice drm/exynos: staticize exynos_drm_gem_init() drm/exynos: remove unnecessary NULL assignment drm/exynos: fix missed calling of drm_prime_gem_destroy() drm/exynos: fix layering violation of address
This commit is contained in:
Коммит
8e592eab04
|
@ -37,7 +37,6 @@
|
|||
* DECON stands for Display and Enhancement controller.
|
||||
*/
|
||||
|
||||
#define DECON_DEFAULT_FRAMERATE 60
|
||||
#define MIN_FB_WIDTH_FOR_16WORD_BURST 128
|
||||
|
||||
#define WINDOWS_NR 2
|
||||
|
@ -165,16 +164,6 @@ static u32 decon_calc_clkdiv(struct decon_context *ctx,
|
|||
return (clkdiv < 0x100) ? clkdiv : 0xff;
|
||||
}
|
||||
|
||||
static bool decon_mode_fixup(struct exynos_drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
if (adjusted_mode->vrefresh == 0)
|
||||
adjusted_mode->vrefresh = DECON_DEFAULT_FRAMERATE;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void decon_commit(struct exynos_drm_crtc *crtc)
|
||||
{
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
|
@ -637,7 +626,6 @@ static void decon_disable(struct exynos_drm_crtc *crtc)
|
|||
static const struct exynos_drm_crtc_ops decon_crtc_ops = {
|
||||
.enable = decon_enable,
|
||||
.disable = decon_disable,
|
||||
.mode_fixup = decon_mode_fixup,
|
||||
.commit = decon_commit,
|
||||
.enable_vblank = decon_enable_vblank,
|
||||
.disable_vblank = decon_disable_vblank,
|
||||
|
|
|
@ -1383,28 +1383,6 @@ static int exynos_dp_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int exynos_dp_suspend(struct device *dev)
|
||||
{
|
||||
struct exynos_dp_device *dp = dev_get_drvdata(dev);
|
||||
|
||||
exynos_dp_disable(&dp->encoder);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int exynos_dp_resume(struct device *dev)
|
||||
{
|
||||
struct exynos_dp_device *dp = dev_get_drvdata(dev);
|
||||
|
||||
exynos_dp_enable(&dp->encoder);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static const struct dev_pm_ops exynos_dp_pm_ops = {
|
||||
SET_SYSTEM_SLEEP_PM_OPS(exynos_dp_suspend, exynos_dp_resume)
|
||||
};
|
||||
|
||||
static const struct of_device_id exynos_dp_match[] = {
|
||||
{ .compatible = "samsung,exynos5-dp" },
|
||||
{},
|
||||
|
@ -1417,7 +1395,6 @@ struct platform_driver dp_driver = {
|
|||
.driver = {
|
||||
.name = "exynos-dp",
|
||||
.owner = THIS_MODULE,
|
||||
.pm = &exynos_dp_pm_ops,
|
||||
.of_match_table = exynos_dp_match,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -28,7 +28,6 @@ int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_drm_subdrv_register);
|
||||
|
||||
int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv)
|
||||
{
|
||||
|
@ -39,7 +38,6 @@ int exynos_drm_subdrv_unregister(struct exynos_drm_subdrv *subdrv)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_drm_subdrv_unregister);
|
||||
|
||||
int exynos_drm_device_subdrv_probe(struct drm_device *dev)
|
||||
{
|
||||
|
@ -69,7 +67,6 @@ int exynos_drm_device_subdrv_probe(struct drm_device *dev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_drm_device_subdrv_probe);
|
||||
|
||||
int exynos_drm_device_subdrv_remove(struct drm_device *dev)
|
||||
{
|
||||
|
@ -87,7 +84,6 @@ int exynos_drm_device_subdrv_remove(struct drm_device *dev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_drm_device_subdrv_remove);
|
||||
|
||||
int exynos_drm_subdrv_open(struct drm_device *dev, struct drm_file *file)
|
||||
{
|
||||
|
@ -111,7 +107,6 @@ err:
|
|||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_drm_subdrv_open);
|
||||
|
||||
void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file)
|
||||
{
|
||||
|
@ -122,4 +117,3 @@ void exynos_drm_subdrv_close(struct drm_device *dev, struct drm_file *file)
|
|||
subdrv->close(dev, subdrv->dev, file);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_drm_subdrv_close);
|
||||
|
|
|
@ -41,20 +41,6 @@ static void exynos_drm_crtc_disable(struct drm_crtc *crtc)
|
|||
exynos_crtc->ops->disable(exynos_crtc);
|
||||
}
|
||||
|
||||
static bool
|
||||
exynos_drm_crtc_mode_fixup(struct drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
|
||||
|
||||
if (exynos_crtc->ops->mode_fixup)
|
||||
return exynos_crtc->ops->mode_fixup(exynos_crtc, mode,
|
||||
adjusted_mode);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void
|
||||
exynos_drm_crtc_mode_set_nofb(struct drm_crtc *crtc)
|
||||
{
|
||||
|
@ -99,7 +85,6 @@ static void exynos_crtc_atomic_flush(struct drm_crtc *crtc,
|
|||
static struct drm_crtc_helper_funcs exynos_crtc_helper_funcs = {
|
||||
.enable = exynos_drm_crtc_enable,
|
||||
.disable = exynos_drm_crtc_disable,
|
||||
.mode_fixup = exynos_drm_crtc_mode_fixup,
|
||||
.mode_set_nofb = exynos_drm_crtc_mode_set_nofb,
|
||||
.atomic_begin = exynos_crtc_atomic_begin,
|
||||
.atomic_flush = exynos_crtc_atomic_flush,
|
||||
|
|
|
@ -304,6 +304,7 @@ int exynos_atomic_commit(struct drm_device *dev, struct drm_atomic_state *state,
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int exynos_drm_suspend(struct drm_device *dev, pm_message_t state)
|
||||
{
|
||||
struct drm_connector *connector;
|
||||
|
@ -340,6 +341,7 @@ static int exynos_drm_resume(struct drm_device *dev)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int exynos_drm_open(struct drm_device *dev, struct drm_file *file)
|
||||
{
|
||||
|
|
|
@ -82,7 +82,6 @@ struct exynos_drm_plane {
|
|||
*
|
||||
* @enable: enable the device
|
||||
* @disable: disable the device
|
||||
* @mode_fixup: fix mode data before applying it
|
||||
* @commit: set current hw specific display mode to hw.
|
||||
* @enable_vblank: specific driver callback for enabling vblank interrupt.
|
||||
* @disable_vblank: specific driver callback for disabling vblank interrupt.
|
||||
|
@ -103,9 +102,6 @@ struct exynos_drm_crtc;
|
|||
struct exynos_drm_crtc_ops {
|
||||
void (*enable)(struct exynos_drm_crtc *crtc);
|
||||
void (*disable)(struct exynos_drm_crtc *crtc);
|
||||
bool (*mode_fixup)(struct exynos_drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode);
|
||||
void (*commit)(struct exynos_drm_crtc *crtc);
|
||||
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
|
||||
void (*disable_vblank)(struct exynos_drm_crtc *crtc);
|
||||
|
|
|
@ -1206,23 +1206,6 @@ static struct exynos_drm_ipp_ops fimc_dst_ops = {
|
|||
.set_addr = fimc_dst_set_addr,
|
||||
};
|
||||
|
||||
static int fimc_clk_ctrl(struct fimc_context *ctx, bool enable)
|
||||
{
|
||||
DRM_DEBUG_KMS("enable[%d]\n", enable);
|
||||
|
||||
if (enable) {
|
||||
clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]);
|
||||
clk_prepare_enable(ctx->clocks[FIMC_CLK_WB_A]);
|
||||
ctx->suspended = false;
|
||||
} else {
|
||||
clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]);
|
||||
clk_disable_unprepare(ctx->clocks[FIMC_CLK_WB_A]);
|
||||
ctx->suspended = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t fimc_irq_handler(int irq, void *dev_id)
|
||||
{
|
||||
struct fimc_context *ctx = dev_id;
|
||||
|
@ -1780,6 +1763,24 @@ static int fimc_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int fimc_clk_ctrl(struct fimc_context *ctx, bool enable)
|
||||
{
|
||||
DRM_DEBUG_KMS("enable[%d]\n", enable);
|
||||
|
||||
if (enable) {
|
||||
clk_prepare_enable(ctx->clocks[FIMC_CLK_GATE]);
|
||||
clk_prepare_enable(ctx->clocks[FIMC_CLK_WB_A]);
|
||||
ctx->suspended = false;
|
||||
} else {
|
||||
clk_disable_unprepare(ctx->clocks[FIMC_CLK_GATE]);
|
||||
clk_disable_unprepare(ctx->clocks[FIMC_CLK_WB_A]);
|
||||
ctx->suspended = true;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
static int fimc_suspend(struct device *dev)
|
||||
{
|
||||
|
@ -1806,7 +1807,6 @@ static int fimc_resume(struct device *dev)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int fimc_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct fimc_context *ctx = get_fimc_context(dev);
|
||||
|
|
|
@ -41,7 +41,6 @@
|
|||
* CPU Interface.
|
||||
*/
|
||||
|
||||
#define FIMD_DEFAULT_FRAMERATE 60
|
||||
#define MIN_FB_WIDTH_FOR_16WORD_BURST 128
|
||||
|
||||
/* position control register for hardware window 0, 2 ~ 4.*/
|
||||
|
@ -377,16 +376,6 @@ static u32 fimd_calc_clkdiv(struct fimd_context *ctx,
|
|||
return (clkdiv < 0x100) ? clkdiv : 0xff;
|
||||
}
|
||||
|
||||
static bool fimd_mode_fixup(struct exynos_drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode,
|
||||
struct drm_display_mode *adjusted_mode)
|
||||
{
|
||||
if (adjusted_mode->vrefresh == 0)
|
||||
adjusted_mode->vrefresh = FIMD_DEFAULT_FRAMERATE;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void fimd_commit(struct exynos_drm_crtc *crtc)
|
||||
{
|
||||
struct fimd_context *ctx = crtc->ctx;
|
||||
|
@ -882,13 +871,12 @@ static void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable)
|
|||
return;
|
||||
|
||||
val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE;
|
||||
writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON);
|
||||
writel(val, ctx->regs + DP_MIE_CLKCON);
|
||||
}
|
||||
|
||||
static const struct exynos_drm_crtc_ops fimd_crtc_ops = {
|
||||
.enable = fimd_enable,
|
||||
.disable = fimd_disable,
|
||||
.mode_fixup = fimd_mode_fixup,
|
||||
.commit = fimd_commit,
|
||||
.enable_vblank = fimd_enable_vblank,
|
||||
.disable_vblank = fimd_disable_vblank,
|
||||
|
|
|
@ -1059,7 +1059,6 @@ int exynos_g2d_get_ver_ioctl(struct drm_device *drm_dev, void *data,
|
|||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_g2d_get_ver_ioctl);
|
||||
|
||||
int exynos_g2d_set_cmdlist_ioctl(struct drm_device *drm_dev, void *data,
|
||||
struct drm_file *file)
|
||||
|
@ -1230,7 +1229,6 @@ err:
|
|||
g2d_put_cmdlist(g2d, node);
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_g2d_set_cmdlist_ioctl);
|
||||
|
||||
int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data,
|
||||
struct drm_file *file)
|
||||
|
@ -1293,7 +1291,6 @@ int exynos_g2d_exec_ioctl(struct drm_device *drm_dev, void *data,
|
|||
out:
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(exynos_g2d_exec_ioctl);
|
||||
|
||||
static int g2d_subdrv_probe(struct drm_device *drm_dev, struct device *dev)
|
||||
{
|
||||
|
|
|
@ -56,39 +56,35 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem_obj *obj)
|
|||
nr_pages = obj->size >> PAGE_SHIFT;
|
||||
|
||||
if (!is_drm_iommu_supported(dev)) {
|
||||
dma_addr_t start_addr;
|
||||
unsigned int i = 0;
|
||||
|
||||
obj->pages = drm_calloc_large(nr_pages, sizeof(struct page *));
|
||||
if (!obj->pages) {
|
||||
DRM_ERROR("failed to allocate pages.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
}
|
||||
|
||||
obj->cookie = dma_alloc_attrs(dev->dev,
|
||||
obj->size,
|
||||
&obj->dma_addr, GFP_KERNEL,
|
||||
&obj->dma_attrs);
|
||||
if (!obj->cookie) {
|
||||
DRM_ERROR("failed to allocate buffer.\n");
|
||||
obj->cookie = dma_alloc_attrs(dev->dev, obj->size, &obj->dma_addr,
|
||||
GFP_KERNEL, &obj->dma_attrs);
|
||||
if (!obj->cookie) {
|
||||
DRM_ERROR("failed to allocate buffer.\n");
|
||||
if (obj->pages)
|
||||
drm_free_large(obj->pages);
|
||||
return -ENOMEM;
|
||||
}
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
if (obj->pages) {
|
||||
dma_addr_t start_addr;
|
||||
unsigned int i = 0;
|
||||
|
||||
start_addr = obj->dma_addr;
|
||||
while (i < nr_pages) {
|
||||
obj->pages[i] = phys_to_page(start_addr);
|
||||
obj->pages[i] = pfn_to_page(dma_to_pfn(dev->dev,
|
||||
start_addr));
|
||||
start_addr += PAGE_SIZE;
|
||||
i++;
|
||||
}
|
||||
} else {
|
||||
obj->pages = dma_alloc_attrs(dev->dev, obj->size,
|
||||
&obj->dma_addr, GFP_KERNEL,
|
||||
&obj->dma_attrs);
|
||||
if (!obj->pages) {
|
||||
DRM_ERROR("failed to allocate buffer.\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
obj->pages = obj->cookie;
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n",
|
||||
|
@ -110,15 +106,11 @@ static void exynos_drm_free_buf(struct exynos_drm_gem_obj *obj)
|
|||
DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n",
|
||||
(unsigned long)obj->dma_addr, obj->size);
|
||||
|
||||
if (!is_drm_iommu_supported(dev)) {
|
||||
dma_free_attrs(dev->dev, obj->size, obj->cookie,
|
||||
(dma_addr_t)obj->dma_addr, &obj->dma_attrs);
|
||||
drm_free_large(obj->pages);
|
||||
} else
|
||||
dma_free_attrs(dev->dev, obj->size, obj->pages,
|
||||
(dma_addr_t)obj->dma_addr, &obj->dma_attrs);
|
||||
dma_free_attrs(dev->dev, obj->size, obj->cookie,
|
||||
(dma_addr_t)obj->dma_addr, &obj->dma_attrs);
|
||||
|
||||
obj->dma_addr = (dma_addr_t)NULL;
|
||||
if (!is_drm_iommu_supported(dev))
|
||||
drm_free_large(obj->pages);
|
||||
}
|
||||
|
||||
static int exynos_drm_gem_handle_create(struct drm_gem_object *obj,
|
||||
|
@ -156,18 +148,14 @@ void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj)
|
|||
* once dmabuf's refcount becomes 0.
|
||||
*/
|
||||
if (obj->import_attach)
|
||||
goto out;
|
||||
|
||||
exynos_drm_free_buf(exynos_gem_obj);
|
||||
|
||||
out:
|
||||
drm_gem_free_mmap_offset(obj);
|
||||
drm_prime_gem_destroy(obj, exynos_gem_obj->sgt);
|
||||
else
|
||||
exynos_drm_free_buf(exynos_gem_obj);
|
||||
|
||||
/* release file pointer to gem object. */
|
||||
drm_gem_object_release(obj);
|
||||
|
||||
kfree(exynos_gem_obj);
|
||||
exynos_gem_obj = NULL;
|
||||
}
|
||||
|
||||
unsigned long exynos_drm_gem_get_size(struct drm_device *dev,
|
||||
|
@ -190,8 +178,7 @@ unsigned long exynos_drm_gem_get_size(struct drm_device *dev,
|
|||
return exynos_gem_obj->size;
|
||||
}
|
||||
|
||||
|
||||
struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev,
|
||||
static struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev,
|
||||
unsigned long size)
|
||||
{
|
||||
struct exynos_drm_gem_obj *exynos_gem_obj;
|
||||
|
@ -212,6 +199,13 @@ struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev,
|
|||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
ret = drm_gem_create_mmap_offset(obj);
|
||||
if (ret < 0) {
|
||||
drm_gem_object_release(obj);
|
||||
kfree(exynos_gem_obj);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp);
|
||||
|
||||
return exynos_gem_obj;
|
||||
|
@ -313,7 +307,7 @@ void exynos_drm_gem_put_dma_addr(struct drm_device *dev,
|
|||
drm_gem_object_unreference_unlocked(obj);
|
||||
}
|
||||
|
||||
int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj,
|
||||
static int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
struct drm_device *drm_dev = exynos_gem_obj->base.dev;
|
||||
|
@ -342,7 +336,8 @@ int exynos_drm_gem_mmap_buffer(struct exynos_drm_gem_obj *exynos_gem_obj,
|
|||
|
||||
int exynos_drm_gem_get_ioctl(struct drm_device *dev, void *data,
|
||||
struct drm_file *file_priv)
|
||||
{ struct exynos_drm_gem_obj *exynos_gem_obj;
|
||||
{
|
||||
struct exynos_drm_gem_obj *exynos_gem_obj;
|
||||
struct drm_exynos_gem_info *args = data;
|
||||
struct drm_gem_object *obj;
|
||||
|
||||
|
@ -402,6 +397,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|||
struct drm_mode_create_dumb *args)
|
||||
{
|
||||
struct exynos_drm_gem_obj *exynos_gem_obj;
|
||||
unsigned int flags;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
|
@ -413,16 +409,12 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
|
|||
args->pitch = args->width * ((args->bpp + 7) / 8);
|
||||
args->size = args->pitch * args->height;
|
||||
|
||||
if (is_drm_iommu_supported(dev)) {
|
||||
exynos_gem_obj = exynos_drm_gem_create(dev,
|
||||
EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC,
|
||||
args->size);
|
||||
} else {
|
||||
exynos_gem_obj = exynos_drm_gem_create(dev,
|
||||
EXYNOS_BO_CONTIG | EXYNOS_BO_WC,
|
||||
args->size);
|
||||
}
|
||||
if (is_drm_iommu_supported(dev))
|
||||
flags = EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC;
|
||||
else
|
||||
flags = EXYNOS_BO_CONTIG | EXYNOS_BO_WC;
|
||||
|
||||
exynos_gem_obj = exynos_drm_gem_create(dev, flags, args->size);
|
||||
if (IS_ERR(exynos_gem_obj)) {
|
||||
dev_warn(dev->dev, "FB allocation failed.\n");
|
||||
return PTR_ERR(exynos_gem_obj);
|
||||
|
@ -460,14 +452,9 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv,
|
|||
goto unlock;
|
||||
}
|
||||
|
||||
ret = drm_gem_create_mmap_offset(obj);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
*offset = drm_vma_node_offset_addr(&obj->vma_node);
|
||||
DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset);
|
||||
|
||||
out:
|
||||
drm_gem_object_unreference(obj);
|
||||
unlock:
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
@ -543,7 +530,6 @@ int exynos_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
|
|||
|
||||
err_close_vm:
|
||||
drm_gem_vm_close(vma);
|
||||
drm_gem_free_mmap_offset(obj);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -588,6 +574,8 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
|
|||
if (ret < 0)
|
||||
goto err_free_large;
|
||||
|
||||
exynos_gem_obj->sgt = sgt;
|
||||
|
||||
if (sgt->nents == 1) {
|
||||
/* always physically continuous memory if sgt->nents is 1. */
|
||||
exynos_gem_obj->flags |= EXYNOS_BO_CONTIG;
|
||||
|
|
|
@ -39,6 +39,7 @@
|
|||
* - this address could be physical address without IOMMU and
|
||||
* device address with IOMMU.
|
||||
* @pages: Array of backing pages.
|
||||
* @sgt: Imported sg_table.
|
||||
*
|
||||
* P.S. this object would be transferred to user as kms_bo.handle so
|
||||
* user can access the buffer through kms_bo.handle.
|
||||
|
@ -52,6 +53,7 @@ struct exynos_drm_gem_obj {
|
|||
dma_addr_t dma_addr;
|
||||
struct dma_attrs dma_attrs;
|
||||
struct page **pages;
|
||||
struct sg_table *sgt;
|
||||
};
|
||||
|
||||
struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask);
|
||||
|
@ -59,10 +61,6 @@ struct page **exynos_gem_get_pages(struct drm_gem_object *obj, gfp_t gfpmask);
|
|||
/* destroy a buffer with gem object */
|
||||
void exynos_drm_gem_destroy(struct exynos_drm_gem_obj *exynos_gem_obj);
|
||||
|
||||
/* create a private gem object and initialize it. */
|
||||
struct exynos_drm_gem_obj *exynos_drm_gem_init(struct drm_device *dev,
|
||||
unsigned long size);
|
||||
|
||||
/* create a new buffer with gem object */
|
||||
struct exynos_drm_gem_obj *exynos_drm_gem_create(struct drm_device *dev,
|
||||
unsigned int flags,
|
||||
|
|
|
@ -786,6 +786,7 @@ static int rotator_remove(struct platform_device *pdev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int rotator_clk_crtl(struct rot_context *rot, bool enable)
|
||||
{
|
||||
if (enable) {
|
||||
|
@ -822,7 +823,6 @@ static int rotator_resume(struct device *dev)
|
|||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int rotator_runtime_suspend(struct device *dev)
|
||||
{
|
||||
struct rot_context *rot = dev_get_drvdata(dev);
|
||||
|
|
Загрузка…
Ссылка в новой задаче