提交 cf539cbd 编写于 作者: L Linus Torvalds

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Pull drm fixes from Dave Airlie:
 "Radeon has two displayport fixes, one for a regression.

  i915 regression flicker fix needed so 4.0 can get fixed.

  A bunch of msm fixes and a bunch of exynos fixes, these two are
  probably a bit larger than I'd like, but most of them seems pretty
  good"

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux: (29 commits)
  drm/radeon: fix error flag checking in native aux path
  drm/radeon: retry dcpd fetch
  drm/msm/mdp5: fix incorrect parameter for msm_framebuffer_iova()
  drm/exynos: dp: Lower level of EDID read success message
  drm/exynos: cleanup exynos_drm_plane
  drm/exynos: 'win' is always unsigned
  drm/exynos: mixer: don't dump registers under spinlock
  drm/exynos: Consolidate return statements in fimd_bind()
  drm/exynos: Constify exynos_drm_crtc_ops
  drm/exynos: Fix build breakage on !DRM_EXYNOS_FIMD
  drm/exynos: mixer: Constify platform_device_id
  drm/exynos: mixer: cleanup pixelformat handling
  drm/exynos: mixer: also allow NV21 for the video processor
  drm/exynos: mixer: remove buffer count handling in vp_video_buffer()
  drm/exynos: plane: honor buffer offset for dma_addr
  drm/exynos: fb: use drm_format_num_planes to get buffer count
  drm/i915: fix screen flickering
  drm/msm: fix locking inconsistencies in gpu->destroy()
  drm/msm/dsi: Simplify the code to get the number of read byte
  drm/msm: Attach assigned encoder to eDP and DSI connectors
  ...
...@@ -91,7 +91,7 @@ static void decon_wait_for_vblank(struct exynos_drm_crtc *crtc) ...@@ -91,7 +91,7 @@ static void decon_wait_for_vblank(struct exynos_drm_crtc *crtc)
static void decon_clear_channel(struct decon_context *ctx) static void decon_clear_channel(struct decon_context *ctx)
{ {
int win, ch_enabled = 0; unsigned int win, ch_enabled = 0;
DRM_DEBUG_KMS("%s\n", __FILE__); DRM_DEBUG_KMS("%s\n", __FILE__);
...@@ -710,7 +710,7 @@ static void decon_dpms(struct exynos_drm_crtc *crtc, int mode) ...@@ -710,7 +710,7 @@ static void decon_dpms(struct exynos_drm_crtc *crtc, int mode)
} }
} }
static struct exynos_drm_crtc_ops decon_crtc_ops = { static const struct exynos_drm_crtc_ops decon_crtc_ops = {
.dpms = decon_dpms, .dpms = decon_dpms,
.mode_fixup = decon_mode_fixup, .mode_fixup = decon_mode_fixup,
.commit = decon_commit, .commit = decon_commit,
......
...@@ -32,7 +32,6 @@ ...@@ -32,7 +32,6 @@
#include <drm/bridge/ptn3460.h> #include <drm/bridge/ptn3460.h>
#include "exynos_dp_core.h" #include "exynos_dp_core.h"
#include "exynos_drm_fimd.h"
#define ctx_from_connector(c) container_of(c, struct exynos_dp_device, \ #define ctx_from_connector(c) container_of(c, struct exynos_dp_device, \
connector) connector)
...@@ -196,7 +195,7 @@ static int exynos_dp_read_edid(struct exynos_dp_device *dp) ...@@ -196,7 +195,7 @@ static int exynos_dp_read_edid(struct exynos_dp_device *dp)
} }
} }
dev_err(dp->dev, "EDID Read success!\n"); dev_dbg(dp->dev, "EDID Read success!\n");
return 0; return 0;
} }
...@@ -1066,6 +1065,8 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp) ...@@ -1066,6 +1065,8 @@ static void exynos_dp_phy_exit(struct exynos_dp_device *dp)
static void exynos_dp_poweron(struct exynos_dp_device *dp) static void exynos_dp_poweron(struct exynos_dp_device *dp)
{ {
struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
if (dp->dpms_mode == DRM_MODE_DPMS_ON) if (dp->dpms_mode == DRM_MODE_DPMS_ON)
return; return;
...@@ -1076,7 +1077,8 @@ static void exynos_dp_poweron(struct exynos_dp_device *dp) ...@@ -1076,7 +1077,8 @@ static void exynos_dp_poweron(struct exynos_dp_device *dp)
} }
} }
fimd_dp_clock_enable(dp_to_crtc(dp), true); if (crtc->ops->clock_enable)
crtc->ops->clock_enable(dp_to_crtc(dp), true);
clk_prepare_enable(dp->clock); clk_prepare_enable(dp->clock);
exynos_dp_phy_init(dp); exynos_dp_phy_init(dp);
...@@ -1087,6 +1089,8 @@ static void exynos_dp_poweron(struct exynos_dp_device *dp) ...@@ -1087,6 +1089,8 @@ static void exynos_dp_poweron(struct exynos_dp_device *dp)
static void exynos_dp_poweroff(struct exynos_dp_device *dp) static void exynos_dp_poweroff(struct exynos_dp_device *dp)
{ {
struct exynos_drm_crtc *crtc = dp_to_crtc(dp);
if (dp->dpms_mode != DRM_MODE_DPMS_ON) if (dp->dpms_mode != DRM_MODE_DPMS_ON)
return; return;
...@@ -1102,7 +1106,8 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp) ...@@ -1102,7 +1106,8 @@ static void exynos_dp_poweroff(struct exynos_dp_device *dp)
exynos_dp_phy_exit(dp); exynos_dp_phy_exit(dp);
clk_disable_unprepare(dp->clock); clk_disable_unprepare(dp->clock);
fimd_dp_clock_enable(dp_to_crtc(dp), false); if (crtc->ops->clock_enable)
crtc->ops->clock_enable(dp_to_crtc(dp), false);
if (dp->panel) { if (dp->panel) {
if (drm_panel_unprepare(dp->panel)) if (drm_panel_unprepare(dp->panel))
......
...@@ -238,11 +238,11 @@ static struct drm_crtc_funcs exynos_crtc_funcs = { ...@@ -238,11 +238,11 @@ static struct drm_crtc_funcs exynos_crtc_funcs = {
}; };
struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev, struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
struct drm_plane *plane, struct drm_plane *plane,
int pipe, int pipe,
enum exynos_drm_output_type type, enum exynos_drm_output_type type,
struct exynos_drm_crtc_ops *ops, const struct exynos_drm_crtc_ops *ops,
void *ctx) void *ctx)
{ {
struct exynos_drm_crtc *exynos_crtc; struct exynos_drm_crtc *exynos_crtc;
struct exynos_drm_private *private = drm_dev->dev_private; struct exynos_drm_private *private = drm_dev->dev_private;
......
...@@ -18,11 +18,11 @@ ...@@ -18,11 +18,11 @@
#include "exynos_drm_drv.h" #include "exynos_drm_drv.h"
struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev, struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
struct drm_plane *plane, struct drm_plane *plane,
int pipe, int pipe,
enum exynos_drm_output_type type, enum exynos_drm_output_type type,
struct exynos_drm_crtc_ops *ops, const struct exynos_drm_crtc_ops *ops,
void *context); void *context);
int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe); int exynos_drm_crtc_enable_vblank(struct drm_device *dev, int pipe);
void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe); void exynos_drm_crtc_disable_vblank(struct drm_device *dev, int pipe);
void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int pipe); void exynos_drm_crtc_finish_pageflip(struct drm_device *dev, int pipe);
......
...@@ -71,13 +71,6 @@ enum exynos_drm_output_type { ...@@ -71,13 +71,6 @@ enum exynos_drm_output_type {
* @dma_addr: array of bus(accessed by dma) address to the memory region * @dma_addr: array of bus(accessed by dma) address to the memory region
* allocated for a overlay. * allocated for a overlay.
* @zpos: order of overlay layer(z position). * @zpos: order of overlay layer(z position).
* @index_color: if using color key feature then this value would be used
* as index color.
* @default_win: a window to be enabled.
* @color_key: color key on or off.
* @local_path: in case of lcd type, local path mode on or off.
* @transparency: transparency on or off.
* @activated: activated or not.
* @enabled: enabled or not. * @enabled: enabled or not.
* @resume: to resume or not. * @resume: to resume or not.
* *
...@@ -108,13 +101,7 @@ struct exynos_drm_plane { ...@@ -108,13 +101,7 @@ struct exynos_drm_plane {
uint32_t pixel_format; uint32_t pixel_format;
dma_addr_t dma_addr[MAX_FB_BUFFER]; dma_addr_t dma_addr[MAX_FB_BUFFER];
unsigned int zpos; unsigned int zpos;
unsigned int index_color;
bool default_win:1;
bool color_key:1;
bool local_path:1;
bool transparency:1;
bool activated:1;
bool enabled:1; bool enabled:1;
bool resume:1; bool resume:1;
}; };
...@@ -181,6 +168,10 @@ struct exynos_drm_display { ...@@ -181,6 +168,10 @@ struct exynos_drm_display {
* @win_disable: disable hardware specific overlay. * @win_disable: disable hardware specific overlay.
* @te_handler: trigger to transfer video image at the tearing effect * @te_handler: trigger to transfer video image at the tearing effect
* synchronization signal if there is a page flip request. * synchronization signal if there is a page flip request.
* @clock_enable: optional function enabling/disabling display domain clock,
* called from exynos-dp driver before powering up (with
* 'enable' argument as true) and after powering down (with
* 'enable' as false).
*/ */
struct exynos_drm_crtc; struct exynos_drm_crtc;
struct exynos_drm_crtc_ops { struct exynos_drm_crtc_ops {
...@@ -195,6 +186,7 @@ struct exynos_drm_crtc_ops { ...@@ -195,6 +186,7 @@ struct exynos_drm_crtc_ops {
void (*win_commit)(struct exynos_drm_crtc *crtc, unsigned int zpos); void (*win_commit)(struct exynos_drm_crtc *crtc, unsigned int zpos);
void (*win_disable)(struct exynos_drm_crtc *crtc, unsigned int zpos); void (*win_disable)(struct exynos_drm_crtc *crtc, unsigned int zpos);
void (*te_handler)(struct exynos_drm_crtc *crtc); void (*te_handler)(struct exynos_drm_crtc *crtc);
void (*clock_enable)(struct exynos_drm_crtc *crtc, bool enable);
}; };
/* /*
...@@ -221,7 +213,7 @@ struct exynos_drm_crtc { ...@@ -221,7 +213,7 @@ struct exynos_drm_crtc {
unsigned int dpms; unsigned int dpms;
wait_queue_head_t pending_flip_queue; wait_queue_head_t pending_flip_queue;
struct drm_pending_vblank_event *event; struct drm_pending_vblank_event *event;
struct exynos_drm_crtc_ops *ops; const struct exynos_drm_crtc_ops *ops;
void *ctx; void *ctx;
}; };
......
...@@ -171,43 +171,6 @@ exynos_drm_framebuffer_init(struct drm_device *dev, ...@@ -171,43 +171,6 @@ exynos_drm_framebuffer_init(struct drm_device *dev,
return &exynos_fb->fb; return &exynos_fb->fb;
} }
static u32 exynos_drm_format_num_buffers(struct drm_mode_fb_cmd2 *mode_cmd)
{
unsigned int cnt = 0;
if (mode_cmd->pixel_format != DRM_FORMAT_NV12)
return drm_format_num_planes(mode_cmd->pixel_format);
while (cnt != MAX_FB_BUFFER) {
if (!mode_cmd->handles[cnt])
break;
cnt++;
}
/*
* check if NV12 or NV12M.
*
* NV12
* handles[0] = base1, offsets[0] = 0
* handles[1] = base1, offsets[1] = Y_size
*
* NV12M
* handles[0] = base1, offsets[0] = 0
* handles[1] = base2, offsets[1] = 0
*/
if (cnt == 2) {
/*
* in case of NV12 format, offsets[1] is not 0 and
* handles[0] is same as handles[1].
*/
if (mode_cmd->offsets[1] &&
mode_cmd->handles[0] == mode_cmd->handles[1])
cnt = 1;
}
return cnt;
}
static struct drm_framebuffer * static struct drm_framebuffer *
exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
struct drm_mode_fb_cmd2 *mode_cmd) struct drm_mode_fb_cmd2 *mode_cmd)
...@@ -230,7 +193,7 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, ...@@ -230,7 +193,7 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd); drm_helper_mode_fill_fb_struct(&exynos_fb->fb, mode_cmd);
exynos_fb->exynos_gem_obj[0] = to_exynos_gem_obj(obj); exynos_fb->exynos_gem_obj[0] = to_exynos_gem_obj(obj);
exynos_fb->buf_cnt = exynos_drm_format_num_buffers(mode_cmd); exynos_fb->buf_cnt = drm_format_num_planes(mode_cmd->pixel_format);
DRM_DEBUG_KMS("buf_cnt = %d\n", exynos_fb->buf_cnt); DRM_DEBUG_KMS("buf_cnt = %d\n", exynos_fb->buf_cnt);
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include "exynos_drm_crtc.h" #include "exynos_drm_crtc.h"
#include "exynos_drm_plane.h" #include "exynos_drm_plane.h"
#include "exynos_drm_iommu.h" #include "exynos_drm_iommu.h"
#include "exynos_drm_fimd.h"
/* /*
* FIMD stands for Fully Interactive Mobile Display and * FIMD stands for Fully Interactive Mobile Display and
...@@ -216,7 +215,7 @@ static void fimd_wait_for_vblank(struct exynos_drm_crtc *crtc) ...@@ -216,7 +215,7 @@ static void fimd_wait_for_vblank(struct exynos_drm_crtc *crtc)
DRM_DEBUG_KMS("vblank wait timed out.\n"); DRM_DEBUG_KMS("vblank wait timed out.\n");
} }
static void fimd_enable_video_output(struct fimd_context *ctx, int win, static void fimd_enable_video_output(struct fimd_context *ctx, unsigned int win,
bool enable) bool enable)
{ {
u32 val = readl(ctx->regs + WINCON(win)); u32 val = readl(ctx->regs + WINCON(win));
...@@ -229,7 +228,8 @@ static void fimd_enable_video_output(struct fimd_context *ctx, int win, ...@@ -229,7 +228,8 @@ static void fimd_enable_video_output(struct fimd_context *ctx, int win,
writel(val, ctx->regs + WINCON(win)); writel(val, ctx->regs + WINCON(win));
} }
static void fimd_enable_shadow_channel_path(struct fimd_context *ctx, int win, static void fimd_enable_shadow_channel_path(struct fimd_context *ctx,
unsigned int win,
bool enable) bool enable)
{ {
u32 val = readl(ctx->regs + SHADOWCON); u32 val = readl(ctx->regs + SHADOWCON);
...@@ -244,7 +244,7 @@ static void fimd_enable_shadow_channel_path(struct fimd_context *ctx, int win, ...@@ -244,7 +244,7 @@ static void fimd_enable_shadow_channel_path(struct fimd_context *ctx, int win,
static void fimd_clear_channel(struct fimd_context *ctx) static void fimd_clear_channel(struct fimd_context *ctx)
{ {
int win, ch_enabled = 0; unsigned int win, ch_enabled = 0;
DRM_DEBUG_KMS("%s\n", __FILE__); DRM_DEBUG_KMS("%s\n", __FILE__);
...@@ -946,7 +946,24 @@ static void fimd_te_handler(struct exynos_drm_crtc *crtc) ...@@ -946,7 +946,24 @@ static void fimd_te_handler(struct exynos_drm_crtc *crtc)
drm_handle_vblank(ctx->drm_dev, ctx->pipe); drm_handle_vblank(ctx->drm_dev, ctx->pipe);
} }
static struct exynos_drm_crtc_ops fimd_crtc_ops = { static void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable)
{
struct fimd_context *ctx = crtc->ctx;
u32 val;
/*
* Only Exynos 5250, 5260, 5410 and 542x requires enabling DP/MIE
* clock. On these SoCs the bootloader may enable it but any
* power domain off/on will reset it to disable state.
*/
if (ctx->driver_data != &exynos5_fimd_driver_data)
return;
val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE;
writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON);
}
static const struct exynos_drm_crtc_ops fimd_crtc_ops = {
.dpms = fimd_dpms, .dpms = fimd_dpms,
.mode_fixup = fimd_mode_fixup, .mode_fixup = fimd_mode_fixup,
.commit = fimd_commit, .commit = fimd_commit,
...@@ -956,6 +973,7 @@ static struct exynos_drm_crtc_ops fimd_crtc_ops = { ...@@ -956,6 +973,7 @@ static struct exynos_drm_crtc_ops fimd_crtc_ops = {
.win_commit = fimd_win_commit, .win_commit = fimd_win_commit,
.win_disable = fimd_win_disable, .win_disable = fimd_win_disable,
.te_handler = fimd_te_handler, .te_handler = fimd_te_handler,
.clock_enable = fimd_dp_clock_enable,
}; };
static irqreturn_t fimd_irq_handler(int irq, void *dev_id) static irqreturn_t fimd_irq_handler(int irq, void *dev_id)
...@@ -1025,12 +1043,7 @@ static int fimd_bind(struct device *dev, struct device *master, void *data) ...@@ -1025,12 +1043,7 @@ static int fimd_bind(struct device *dev, struct device *master, void *data)
if (ctx->display) if (ctx->display)
exynos_drm_create_enc_conn(drm_dev, ctx->display); exynos_drm_create_enc_conn(drm_dev, ctx->display);
ret = fimd_iommu_attach_devices(ctx, drm_dev); return fimd_iommu_attach_devices(ctx, drm_dev);
if (ret)
return ret;
return 0;
} }
static void fimd_unbind(struct device *dev, struct device *master, static void fimd_unbind(struct device *dev, struct device *master,
...@@ -1192,24 +1205,6 @@ static int fimd_remove(struct platform_device *pdev) ...@@ -1192,24 +1205,6 @@ static int fimd_remove(struct platform_device *pdev)
return 0; return 0;
} }
void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable)
{
struct fimd_context *ctx = crtc->ctx;
u32 val;
/*
* Only Exynos 5250, 5260, 5410 and 542x requires enabling DP/MIE
* clock. On these SoCs the bootloader may enable it but any
* power domain off/on will reset it to disable state.
*/
if (ctx->driver_data != &exynos5_fimd_driver_data)
return;
val = enable ? DP_MIE_CLK_DP_ENABLE : DP_MIE_CLK_DISABLE;
writel(DP_MIE_CLK_DP_ENABLE, ctx->regs + DP_MIE_CLKCON);
}
EXPORT_SYMBOL_GPL(fimd_dp_clock_enable);
struct platform_driver fimd_driver = { struct platform_driver fimd_driver = {
.probe = fimd_probe, .probe = fimd_probe,
.remove = fimd_remove, .remove = fimd_remove,
......
/*
* Copyright (c) 2015 Samsung Electronics Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*/
#ifndef _EXYNOS_DRM_FIMD_H_
#define _EXYNOS_DRM_FIMD_H_
extern void fimd_dp_clock_enable(struct exynos_drm_crtc *crtc, bool enable);
#endif /* _EXYNOS_DRM_FIMD_H_ */
...@@ -76,7 +76,7 @@ int exynos_check_plane(struct drm_plane *plane, struct drm_framebuffer *fb) ...@@ -76,7 +76,7 @@ int exynos_check_plane(struct drm_plane *plane, struct drm_framebuffer *fb)
return -EFAULT; return -EFAULT;
} }
exynos_plane->dma_addr[i] = buffer->dma_addr; exynos_plane->dma_addr[i] = buffer->dma_addr + fb->offsets[i];
DRM_DEBUG_KMS("buffer: %d, dma_addr = 0x%lx\n", DRM_DEBUG_KMS("buffer: %d, dma_addr = 0x%lx\n",
i, (unsigned long)exynos_plane->dma_addr[i]); i, (unsigned long)exynos_plane->dma_addr[i]);
......
...@@ -217,7 +217,7 @@ static int vidi_ctx_initialize(struct vidi_context *ctx, ...@@ -217,7 +217,7 @@ static int vidi_ctx_initialize(struct vidi_context *ctx,
return 0; return 0;
} }
static struct exynos_drm_crtc_ops vidi_crtc_ops = { static const struct exynos_drm_crtc_ops vidi_crtc_ops = {
.dpms = vidi_dpms, .dpms = vidi_dpms,
.enable_vblank = vidi_enable_vblank, .enable_vblank = vidi_enable_vblank,
.disable_vblank = vidi_disable_vblank, .disable_vblank = vidi_disable_vblank,
......
...@@ -44,6 +44,12 @@ ...@@ -44,6 +44,12 @@
#define MIXER_WIN_NR 3 #define MIXER_WIN_NR 3
#define MIXER_DEFAULT_WIN 0 #define MIXER_DEFAULT_WIN 0
/* The pixelformats that are natively supported by the mixer. */
#define MXR_FORMAT_RGB565 4
#define MXR_FORMAT_ARGB1555 5
#define MXR_FORMAT_ARGB4444 6
#define MXR_FORMAT_ARGB8888 7
struct mixer_resources { struct mixer_resources {
int irq; int irq;
void __iomem *mixer_regs; void __iomem *mixer_regs;
...@@ -327,7 +333,8 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height) ...@@ -327,7 +333,8 @@ static void mixer_cfg_rgb_fmt(struct mixer_context *ctx, unsigned int height)
mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK); mixer_reg_writemask(res, MXR_CFG, val, MXR_CFG_RGB_FMT_MASK);
} }
static void mixer_cfg_layer(struct mixer_context *ctx, int win, bool enable) static void mixer_cfg_layer(struct mixer_context *ctx, unsigned int win,
bool enable)
{ {
struct mixer_resources *res = &ctx->mixer_res; struct mixer_resources *res = &ctx->mixer_res;
u32 val = enable ? ~0 : 0; u32 val = enable ? ~0 : 0;
...@@ -359,8 +366,6 @@ static void mixer_run(struct mixer_context *ctx) ...@@ -359,8 +366,6 @@ static void mixer_run(struct mixer_context *ctx)
struct mixer_resources *res = &ctx->mixer_res; struct mixer_resources *res = &ctx->mixer_res;
mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN); mixer_reg_writemask(res, MXR_STATUS, ~0, MXR_STATUS_REG_RUN);
mixer_regs_dump(ctx);
} }
static void mixer_stop(struct mixer_context *ctx) static void mixer_stop(struct mixer_context *ctx)
...@@ -373,16 +378,13 @@ static void mixer_stop(struct mixer_context *ctx) ...@@ -373,16 +378,13 @@ static void mixer_stop(struct mixer_context *ctx)
while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) && while (!(mixer_reg_read(res, MXR_STATUS) & MXR_STATUS_REG_IDLE) &&
--timeout) --timeout)
usleep_range(10000, 12000); usleep_range(10000, 12000);
mixer_regs_dump(ctx);
} }
static void vp_video_buffer(struct mixer_context *ctx, int win) static void vp_video_buffer(struct mixer_context *ctx, unsigned int win)
{ {
struct mixer_resources *res = &ctx->mixer_res; struct mixer_resources *res = &ctx->mixer_res;
unsigned long flags; unsigned long flags;
struct exynos_drm_plane *plane; struct exynos_drm_plane *plane;
unsigned int buf_num = 1;
dma_addr_t luma_addr[2], chroma_addr[2]; dma_addr_t luma_addr[2], chroma_addr[2];
bool tiled_mode = false; bool tiled_mode = false;
bool crcb_mode = false; bool crcb_mode = false;
...@@ -393,27 +395,18 @@ static void vp_video_buffer(struct mixer_context *ctx, int win) ...@@ -393,27 +395,18 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
switch (plane->pixel_format) { switch (plane->pixel_format) {
case DRM_FORMAT_NV12: case DRM_FORMAT_NV12:
crcb_mode = false; crcb_mode = false;
buf_num = 2;
break; break;
/* TODO: single buffer format NV12, NV21 */ case DRM_FORMAT_NV21:
crcb_mode = true;
break;
default: default:
/* ignore pixel format at disable time */
if (!plane->dma_addr[0])
break;
DRM_ERROR("pixel format for vp is wrong [%d].\n", DRM_ERROR("pixel format for vp is wrong [%d].\n",
plane->pixel_format); plane->pixel_format);
return; return;
} }
if (buf_num == 2) { luma_addr[0] = plane->dma_addr[0];
luma_addr[0] = plane->dma_addr[0]; chroma_addr[0] = plane->dma_addr[1];
chroma_addr[0] = plane->dma_addr[1];
} else {
luma_addr[0] = plane->dma_addr[0];
chroma_addr[0] = plane->dma_addr[0]
+ (plane->pitch * plane->fb_height);
}
if (plane->scan_flag & DRM_MODE_FLAG_INTERLACE) { if (plane->scan_flag & DRM_MODE_FLAG_INTERLACE) {
ctx->interlace = true; ctx->interlace = true;
...@@ -484,6 +477,7 @@ static void vp_video_buffer(struct mixer_context *ctx, int win) ...@@ -484,6 +477,7 @@ static void vp_video_buffer(struct mixer_context *ctx, int win)
mixer_vsync_set_update(ctx, true); mixer_vsync_set_update(ctx, true);
spin_unlock_irqrestore(&res->reg_slock, flags); spin_unlock_irqrestore(&res->reg_slock, flags);
mixer_regs_dump(ctx);
vp_regs_dump(ctx); vp_regs_dump(ctx);
} }
...@@ -518,7 +512,7 @@ static int mixer_setup_scale(const struct exynos_drm_plane *plane, ...@@ -518,7 +512,7 @@ static int mixer_setup_scale(const struct exynos_drm_plane *plane,
return -ENOTSUPP; return -ENOTSUPP;
} }
static void mixer_graph_buffer(struct mixer_context *ctx, int win) static void mixer_graph_buffer(struct mixer_context *ctx, unsigned int win)
{ {
struct mixer_resources *res = &ctx->mixer_res; struct mixer_resources *res = &ctx->mixer_res;
unsigned long flags; unsigned long flags;
...@@ -531,20 +525,27 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win) ...@@ -531,20 +525,27 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win)
plane = &ctx->planes[win]; plane = &ctx->planes[win];
#define RGB565 4 switch (plane->pixel_format) {
#define ARGB1555 5 case DRM_FORMAT_XRGB4444:
#define ARGB4444 6 fmt = MXR_FORMAT_ARGB4444;
#define ARGB8888 7 break;
switch (plane->bpp) { case DRM_FORMAT_XRGB1555:
case 16: fmt = MXR_FORMAT_ARGB1555;
fmt = ARGB4444;
break; break;
case 32:
fmt = ARGB8888; case DRM_FORMAT_RGB565:
fmt = MXR_FORMAT_RGB565;
break;
case DRM_FORMAT_XRGB8888:
case DRM_FORMAT_ARGB8888:
fmt = MXR_FORMAT_ARGB8888;
break; break;
default: default:
fmt = ARGB8888; DRM_DEBUG_KMS("pixelformat unsupported by mixer\n");
return;
} }
/* check if mixer supports requested scaling setup */ /* check if mixer supports requested scaling setup */
...@@ -617,6 +618,8 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win) ...@@ -617,6 +618,8 @@ static void mixer_graph_buffer(struct mixer_context *ctx, int win)
mixer_vsync_set_update(ctx, true); mixer_vsync_set_update(ctx, true);
spin_unlock_irqrestore(&res->reg_slock, flags); spin_unlock_irqrestore(&res->reg_slock, flags);
mixer_regs_dump(ctx);
} }
static void vp_win_reset(struct mixer_context *ctx) static void vp_win_reset(struct mixer_context *ctx)
...@@ -1070,6 +1073,7 @@ static void mixer_poweroff(struct mixer_context *ctx) ...@@ -1070,6 +1073,7 @@ static void mixer_poweroff(struct mixer_context *ctx)
mutex_unlock(&ctx->mixer_mutex); mutex_unlock(&ctx->mixer_mutex);
mixer_stop(ctx); mixer_stop(ctx);
mixer_regs_dump(ctx);
mixer_window_suspend(ctx); mixer_window_suspend(ctx);
ctx->int_en = mixer_reg_read(res, MXR_INT_EN); ctx->int_en = mixer_reg_read(res, MXR_INT_EN);
...@@ -1126,7 +1130,7 @@ int mixer_check_mode(struct drm_display_mode *mode) ...@@ -1126,7 +1130,7 @@ int mixer_check_mode(struct drm_display_mode *mode)
return -EINVAL; return -EINVAL;
} }
static struct exynos_drm_crtc_ops mixer_crtc_ops = { static const struct exynos_drm_crtc_ops mixer_crtc_ops = {
.dpms = mixer_dpms, .dpms = mixer_dpms,
.enable_vblank = mixer_enable_vblank, .enable_vblank = mixer_enable_vblank,
.disable_vblank = mixer_disable_vblank, .disable_vblank = mixer_disable_vblank,
...@@ -1156,7 +1160,7 @@ static struct mixer_drv_data exynos4210_mxr_drv_data = { ...@@ -1156,7 +1160,7 @@ static struct mixer_drv_data exynos4210_mxr_drv_data = {
.has_sclk = 1, .has_sclk = 1,
}; };
static struct platform_device_id mixer_driver_types[] = { static const struct platform_device_id mixer_driver_types[] = {
{ {
.name = "s5p-mixer", .name = "s5p-mixer",
.driver_data = (unsigned long)&exynos4210_mxr_drv_data, .driver_data = (unsigned long)&exynos4210_mxr_drv_data,
......
...@@ -2045,22 +2045,20 @@ static void ilk_compute_wm_parameters(struct drm_crtc *crtc, ...@@ -2045,22 +2045,20 @@ static void ilk_compute_wm_parameters(struct drm_crtc *crtc,
p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal; p->pipe_htotal = intel_crtc->config->base.adjusted_mode.crtc_htotal;
p->pixel_rate = ilk_pipe_pixel_rate(dev, crtc); p->pixel_rate = ilk_pipe_pixel_rate(dev, crtc);
if (crtc->primary->state->fb) { if (crtc->primary->state->fb)
p->pri.enabled = true;
p->pri.bytes_per_pixel = p->pri.bytes_per_pixel =
crtc->primary->state->fb->bits_per_pixel / 8; crtc->primary->state->fb->bits_per_pixel / 8;
} else { else
p->pri.enabled = false; p->pri.bytes_per_pixel = 4;
p->pri.bytes_per_pixel = 0;
} p->cur.bytes_per_pixel = 4;
/*
* TODO: for now, assume primary and cursor planes are always enabled.
* Setting them to false makes the screen flicker.
*/
p->pri.enabled = true;
p->cur.enabled = true;
if (crtc->cursor->state->fb) {
p->cur.enabled = true;
p->cur.bytes_per_pixel = 4;
} else {
p->cur.enabled = false;
p->cur.bytes_per_pixel = 0;
}
p->pri.horiz_pixels = intel_crtc->config->pipe_src_w; p->pri.horiz_pixels = intel_crtc->config->pipe_src_w;
p->cur.horiz_pixels = intel_crtc->base.cursor->state->crtc_w; p->cur.horiz_pixels = intel_crtc->base.cursor->state->crtc_w;
......
...@@ -384,7 +384,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *gpu) ...@@ -384,7 +384,7 @@ void adreno_gpu_cleanup(struct adreno_gpu *gpu)
if (gpu->memptrs_bo) { if (gpu->memptrs_bo) {
if (gpu->memptrs_iova) if (gpu->memptrs_iova)
msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id); msm_gem_put_iova(gpu->memptrs_bo, gpu->base.id);
drm_gem_object_unreference(gpu->memptrs_bo); drm_gem_object_unreference_unlocked(gpu->memptrs_bo);
} }
release_firmware(gpu->pm4); release_firmware(gpu->pm4);
release_firmware(gpu->pfp); release_firmware(gpu->pfp);
......
...@@ -177,6 +177,11 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev, ...@@ -177,6 +177,11 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,
goto fail; goto fail;
} }
for (i = 0; i < MSM_DSI_ENCODER_NUM; i++) {
encoders[i]->bridge = msm_dsi->bridge;
msm_dsi->encoders[i] = encoders[i];
}
msm_dsi->connector = msm_dsi_manager_connector_init(msm_dsi->id); msm_dsi->connector = msm_dsi_manager_connector_init(msm_dsi->id);
if (IS_ERR(msm_dsi->connector)) { if (IS_ERR(msm_dsi->connector)) {
ret = PTR_ERR(msm_dsi->connector); ret = PTR_ERR(msm_dsi->connector);
...@@ -185,11 +190,6 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev, ...@@ -185,11 +190,6 @@ int msm_dsi_modeset_init(struct msm_dsi *msm_dsi, struct drm_device *dev,
goto fail; goto fail;
} }
for (i = 0; i < MSM_DSI_ENCODER_NUM; i++) {
encoders[i]->bridge = msm_dsi->bridge;
msm_dsi->encoders[i] = encoders[i];
}
priv->bridges[priv->num_bridges++] = msm_dsi->bridge; priv->bridges[priv->num_bridges++] = msm_dsi->bridge;
priv->connectors[priv->num_connectors++] = msm_dsi->connector; priv->connectors[priv->num_connectors++] = msm_dsi->connector;
......
...@@ -1023,7 +1023,7 @@ static int dsi_short_read1_resp(u8 *buf, const struct mipi_dsi_msg *msg) ...@@ -1023,7 +1023,7 @@ static int dsi_short_read1_resp(u8 *buf, const struct mipi_dsi_msg *msg)
*data = buf[1]; /* strip out dcs type */ *data = buf[1]; /* strip out dcs type */
return 1; return 1;
} else { } else {
pr_err("%s: read data does not match with rx_buf len %d\n", pr_err("%s: read data does not match with rx_buf len %zu\n",
__func__, msg->rx_len); __func__, msg->rx_len);
return -EINVAL; return -EINVAL;
} }
...@@ -1040,7 +1040,7 @@ static int dsi_short_read2_resp(u8 *buf, const struct mipi_dsi_msg *msg) ...@@ -1040,7 +1040,7 @@ static int dsi_short_read2_resp(u8 *buf, const struct mipi_dsi_msg *msg)
data[1] = buf[2]; data[1] = buf[2];
return 2; return 2;
} else { } else {
pr_err("%s: read data does not match with rx_buf len %d\n", pr_err("%s: read data does not match with rx_buf len %zu\n",
__func__, msg->rx_len); __func__, msg->rx_len);
return -EINVAL; return -EINVAL;
} }
...@@ -1093,7 +1093,6 @@ static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host, ...@@ -1093,7 +1093,6 @@ static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host,
{ {
u32 *lp, *temp, data; u32 *lp, *temp, data;
int i, j = 0, cnt; int i, j = 0, cnt;
bool ack_error = false;
u32 read_cnt; u32 read_cnt;
u8 reg[16]; u8 reg[16];
int repeated_bytes = 0; int repeated_bytes = 0;
...@@ -1105,15 +1104,10 @@ static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host, ...@@ -1105,15 +1104,10 @@ static int dsi_cmd_dma_rx(struct msm_dsi_host *msm_host,
if (cnt > 4) if (cnt > 4)
cnt = 4; /* 4 x 32 bits registers only */ cnt = 4; /* 4 x 32 bits registers only */
/* Calculate real read data count */ if (rx_byte == 4)
read_cnt = dsi_read(msm_host, 0x1d4) >> 16; read_cnt = 4;
else
ack_error = (rx_byte == 4) ? read_cnt = pkt_size + 6;
(read_cnt == 8) : /* short pkt + 4-byte error pkt */
(read_cnt == (pkt_size + 6 + 4)); /* long pkt+4-byte error pkt*/
if (ack_error)
read_cnt -= 4; /* Remove 4 byte error pkt */
/* /*
* In case of multiple reads from the panel, after the first read, there * In case of multiple reads from the panel, after the first read, there
...@@ -1215,7 +1209,7 @@ static void dsi_err_worker(struct work_struct *work) ...@@ -1215,7 +1209,7 @@ static void dsi_err_worker(struct work_struct *work)
container_of(work, struct msm_dsi_host, err_work); container_of(work, struct msm_dsi_host, err_work);
u32 status = msm_host->err_work_state; u32 status = msm_host->err_work_state;
pr_err("%s: status=%x\n", __func__, status); pr_err_ratelimited("%s: status=%x\n", __func__, status);
if (status & DSI_ERR_STATE_MDP_FIFO_UNDERFLOW) if (status & DSI_ERR_STATE_MDP_FIFO_UNDERFLOW)
dsi_sw_reset_restore(msm_host); dsi_sw_reset_restore(msm_host);
...@@ -1797,6 +1791,7 @@ int msm_dsi_host_cmd_rx(struct mipi_dsi_host *host, ...@@ -1797,6 +1791,7 @@ int msm_dsi_host_cmd_rx(struct mipi_dsi_host *host,
case MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT: case MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT:
pr_err("%s: rx ACK_ERR_PACLAGE\n", __func__); pr_err("%s: rx ACK_ERR_PACLAGE\n", __func__);
ret = 0; ret = 0;
break;
case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE: case MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE:
case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE: case MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE:
ret = dsi_short_read1_resp(buf, msg); ret = dsi_short_read1_resp(buf, msg);
......
...@@ -462,7 +462,7 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id) ...@@ -462,7 +462,7 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id);
struct drm_connector *connector = NULL; struct drm_connector *connector = NULL;
struct dsi_connector *dsi_connector; struct dsi_connector *dsi_connector;
int ret; int ret, i;
dsi_connector = devm_kzalloc(msm_dsi->dev->dev, dsi_connector = devm_kzalloc(msm_dsi->dev->dev,
sizeof(*dsi_connector), GFP_KERNEL); sizeof(*dsi_connector), GFP_KERNEL);
...@@ -495,6 +495,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id) ...@@ -495,6 +495,10 @@ struct drm_connector *msm_dsi_manager_connector_init(u8 id)
if (ret) if (ret)
goto fail; goto fail;
for (i = 0; i < MSM_DSI_ENCODER_NUM; i++)
drm_mode_connector_attach_encoder(connector,
msm_dsi->encoders[i]);
return connector; return connector;
fail: fail:
......
...@@ -132,7 +132,7 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg) ...@@ -132,7 +132,7 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg)
/* msg sanity check */ /* msg sanity check */
if ((native && (msg->size > AUX_CMD_NATIVE_MAX)) || if ((native && (msg->size > AUX_CMD_NATIVE_MAX)) ||
(msg->size > AUX_CMD_I2C_MAX)) { (msg->size > AUX_CMD_I2C_MAX)) {
pr_err("%s: invalid msg: size(%d), request(%x)\n", pr_err("%s: invalid msg: size(%zu), request(%x)\n",
__func__, msg->size, msg->request); __func__, msg->size, msg->request);
return -EINVAL; return -EINVAL;
} }
...@@ -155,7 +155,7 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg) ...@@ -155,7 +155,7 @@ ssize_t edp_aux_transfer(struct drm_dp_aux *drm_aux, struct drm_dp_aux_msg *msg)
*/ */
edp_write(aux->base + REG_EDP_AUX_TRANS_CTRL, 0); edp_write(aux->base + REG_EDP_AUX_TRANS_CTRL, 0);
msm_edp_aux_ctrl(aux, 1); msm_edp_aux_ctrl(aux, 1);
pr_err("%s: aux timeout, %d\n", __func__, ret); pr_err("%s: aux timeout, %zd\n", __func__, ret);
goto unlock_exit; goto unlock_exit;
} }
DBG("completion"); DBG("completion");
......
...@@ -151,6 +151,8 @@ struct drm_connector *msm_edp_connector_init(struct msm_edp *edp) ...@@ -151,6 +151,8 @@ struct drm_connector *msm_edp_connector_init(struct msm_edp *edp)
if (ret) if (ret)
goto fail; goto fail;
drm_mode_connector_attach_encoder(connector, edp->encoder);
return connector; return connector;
fail: fail:
......
...@@ -1149,12 +1149,13 @@ int msm_edp_ctrl_init(struct msm_edp *edp) ...@@ -1149,12 +1149,13 @@ int msm_edp_ctrl_init(struct msm_edp *edp)
ctrl->aux = msm_edp_aux_init(dev, ctrl->base, &ctrl->drm_aux); ctrl->aux = msm_edp_aux_init(dev, ctrl->base, &ctrl->drm_aux);
if (!ctrl->aux || !ctrl->drm_aux) { if (!ctrl->aux || !ctrl->drm_aux) {
pr_err("%s:failed to init aux\n", __func__); pr_err("%s:failed to init aux\n", __func__);
return ret; return -ENOMEM;
} }
ctrl->phy = msm_edp_phy_init(dev, ctrl->base); ctrl->phy = msm_edp_phy_init(dev, ctrl->base);
if (!ctrl->phy) { if (!ctrl->phy) {
pr_err("%s:failed to init phy\n", __func__); pr_err("%s:failed to init phy\n", __func__);
ret = -ENOMEM;
goto err_destory_aux; goto err_destory_aux;
} }
......
...@@ -72,14 +72,13 @@ const struct mdp5_cfg_hw msm8x74_config = { ...@@ -72,14 +72,13 @@ const struct mdp5_cfg_hw msm8x74_config = {
.base = { 0x12d00, 0x12e00, 0x12f00 }, .base = { 0x12d00, 0x12e00, 0x12f00 },
}, },
.intf = { .intf = {
.count = 4,
.base = { 0x12500, 0x12700, 0x12900, 0x12b00 }, .base = { 0x12500, 0x12700, 0x12900, 0x12b00 },
}, .connect = {
.intfs = { [0] = INTF_eDP,
[0] = INTF_eDP, [1] = INTF_DSI,
[1] = INTF_DSI, [2] = INTF_DSI,
[2] = INTF_DSI, [3] = INTF_HDMI,
[3] = INTF_HDMI, },
}, },
.max_clk = 200000000, .max_clk = 200000000,
}; };
...@@ -142,14 +141,13 @@ const struct mdp5_cfg_hw apq8084_config = { ...@@ -142,14 +141,13 @@ const struct mdp5_cfg_hw apq8084_config = {
.base = { 0x12f00, 0x13000, 0x13100, 0x13200 }, .base = { 0x12f00, 0x13000, 0x13100, 0x13200 },
}, },
.intf = { .intf = {
.count = 5,
.base = { 0x12500, 0x12700, 0x12900, 0x12b00, 0x12d00 }, .base = { 0x12500, 0x12700, 0x12900, 0x12b00, 0x12d00 },
}, .connect = {
.intfs = { [0] = INTF_eDP,
[0] = INTF_eDP, [1] = INTF_DSI,
[1] = INTF_DSI, [2] = INTF_DSI,
[2] = INTF_DSI, [3] = INTF_HDMI,
[3] = INTF_HDMI, },
}, },
.max_clk = 320000000, .max_clk = 320000000,
}; };
...@@ -196,10 +194,12 @@ const struct mdp5_cfg_hw msm8x16_config = { ...@@ -196,10 +194,12 @@ const struct mdp5_cfg_hw msm8x16_config = {
}, },
.intf = { .intf = {
.count = 1, /* INTF_1 */ .base = { 0x00000, 0x6b800 },
.base = { 0x6B800 }, .connect = {
[0] = INTF_DISABLED,
[1] = INTF_DSI,
},
}, },
/* TODO enable .intfs[] with [1] = INTF_DSI, once DSI is implemented */
.max_clk = 320000000, .max_clk = 320000000,
}; };
......
...@@ -59,6 +59,11 @@ struct mdp5_smp_block { ...@@ -59,6 +59,11 @@ struct mdp5_smp_block {
#define MDP5_INTF_NUM_MAX 5 #define MDP5_INTF_NUM_MAX 5
struct mdp5_intf_block {
uint32_t base[MAX_BASES];
u32 connect[MDP5_INTF_NUM_MAX]; /* array of enum mdp5_intf_type */
};
struct mdp5_cfg_hw { struct mdp5_cfg_hw {
char *name; char *name;
...@@ -72,9 +77,7 @@ struct mdp5_cfg_hw { ...@@ -72,9 +77,7 @@ struct mdp5_cfg_hw {
struct mdp5_sub_block dspp; struct mdp5_sub_block dspp;
struct mdp5_sub_block ad; struct mdp5_sub_block ad;
struct mdp5_sub_block pp; struct mdp5_sub_block pp;
struct mdp5_sub_block intf; struct mdp5_intf_block intf;
u32 intfs[MDP5_INTF_NUM_MAX]; /* array of enum mdp5_intf_type */
uint32_t max_clk; uint32_t max_clk;
}; };
......
...@@ -206,8 +206,8 @@ static struct drm_encoder *construct_encoder(struct mdp5_kms *mdp5_kms, ...@@ -206,8 +206,8 @@ static struct drm_encoder *construct_encoder(struct mdp5_kms *mdp5_kms,
static int get_dsi_id_from_intf(const struct mdp5_cfg_hw *hw_cfg, int intf_num) static int get_dsi_id_from_intf(const struct mdp5_cfg_hw *hw_cfg, int intf_num)
{ {
const int intf_cnt = hw_cfg->intf.count; const enum mdp5_intf_type *intfs = hw_cfg->intf.connect;
const u32 *intfs = hw_cfg->intfs; const int intf_cnt = ARRAY_SIZE(hw_cfg->intf.connect);
int id = 0, i; int id = 0, i;
for (i = 0; i < intf_cnt; i++) { for (i = 0; i < intf_cnt; i++) {
...@@ -228,7 +228,7 @@ static int modeset_init_intf(struct mdp5_kms *mdp5_kms, int intf_num) ...@@ -228,7 +228,7 @@ static int modeset_init_intf(struct mdp5_kms *mdp5_kms, int intf_num)
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
const struct mdp5_cfg_hw *hw_cfg = const struct mdp5_cfg_hw *hw_cfg =
mdp5_cfg_get_hw_config(mdp5_kms->cfg); mdp5_cfg_get_hw_config(mdp5_kms->cfg);
enum mdp5_intf_type intf_type = hw_cfg->intfs[intf_num]; enum mdp5_intf_type intf_type = hw_cfg->intf.connect[intf_num];
struct drm_encoder *encoder; struct drm_encoder *encoder;
int ret = 0; int ret = 0;
...@@ -365,7 +365,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms) ...@@ -365,7 +365,7 @@ static int modeset_init(struct mdp5_kms *mdp5_kms)
/* Construct encoders and modeset initialize connector devices /* Construct encoders and modeset initialize connector devices
* for each external display interface. * for each external display interface.
*/ */
for (i = 0; i < ARRAY_SIZE(hw_cfg->intfs); i++) { for (i = 0; i < ARRAY_SIZE(hw_cfg->intf.connect); i++) {
ret = modeset_init_intf(mdp5_kms, i); ret = modeset_init_intf(mdp5_kms, i);
if (ret) if (ret)
goto fail; goto fail;
...@@ -514,8 +514,8 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev) ...@@ -514,8 +514,8 @@ struct msm_kms *mdp5_kms_init(struct drm_device *dev)
*/ */
mdp5_enable(mdp5_kms); mdp5_enable(mdp5_kms);
for (i = 0; i < MDP5_INTF_NUM_MAX; i++) { for (i = 0; i < MDP5_INTF_NUM_MAX; i++) {
if (!config->hw->intf.base[i] || if (mdp5_cfg_intf_is_virtual(config->hw->intf.connect[i]) ||
mdp5_cfg_intf_is_virtual(config->hw->intfs[i])) !config->hw->intf.base[i])
continue; continue;
mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(i), 0); mdp5_write(mdp5_kms, REG_MDP5_INTF_TIMING_ENGINE_EN(i), 0);
} }
......
...@@ -273,7 +273,7 @@ static void set_scanout_locked(struct drm_plane *plane, ...@@ -273,7 +273,7 @@ static void set_scanout_locked(struct drm_plane *plane,
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe), mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC2_ADDR(pipe),
msm_framebuffer_iova(fb, mdp5_kms->id, 2)); msm_framebuffer_iova(fb, mdp5_kms->id, 2));
mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe), mdp5_write(mdp5_kms, REG_MDP5_PIPE_SRC3_ADDR(pipe),
msm_framebuffer_iova(fb, mdp5_kms->id, 4)); msm_framebuffer_iova(fb, mdp5_kms->id, 3));
plane->fb = fb; plane->fb = fb;
} }
......
...@@ -21,9 +21,11 @@ ...@@ -21,9 +21,11 @@
static void msm_fb_output_poll_changed(struct drm_device *dev) static void msm_fb_output_poll_changed(struct drm_device *dev)
{ {
#ifdef CONFIG_DRM_MSM_FBDEV
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
if (priv->fbdev) if (priv->fbdev)
drm_fb_helper_hotplug_event(priv->fbdev); drm_fb_helper_hotplug_event(priv->fbdev);
#endif
} }
static const struct drm_mode_config_funcs mode_config_funcs = { static const struct drm_mode_config_funcs mode_config_funcs = {
...@@ -94,7 +96,7 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name, ...@@ -94,7 +96,7 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,
} }
if (reglog) if (reglog)
printk(KERN_DEBUG "IO:region %s %08x %08lx\n", dbgname, (u32)ptr, size); printk(KERN_DEBUG "IO:region %s %p %08lx\n", dbgname, ptr, size);
return ptr; return ptr;
} }
...@@ -102,7 +104,7 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name, ...@@ -102,7 +104,7 @@ void __iomem *msm_ioremap(struct platform_device *pdev, const char *name,
void msm_writel(u32 data, void __iomem *addr) void msm_writel(u32 data, void __iomem *addr)
{ {
if (reglog) if (reglog)
printk(KERN_DEBUG "IO:W %08x %08x\n", (u32)addr, data); printk(KERN_DEBUG "IO:W %p %08x\n", addr, data);
writel(data, addr); writel(data, addr);
} }
...@@ -110,7 +112,7 @@ u32 msm_readl(const void __iomem *addr) ...@@ -110,7 +112,7 @@ u32 msm_readl(const void __iomem *addr)
{ {
u32 val = readl(addr); u32 val = readl(addr);
if (reglog) if (reglog)
printk(KERN_ERR "IO:R %08x %08x\n", (u32)addr, val); printk(KERN_ERR "IO:R %p %08x\n", addr, val);
return val; return val;
} }
...@@ -143,8 +145,8 @@ static int msm_unload(struct drm_device *dev) ...@@ -143,8 +145,8 @@ static int msm_unload(struct drm_device *dev)
if (gpu) { if (gpu) {
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
gpu->funcs->pm_suspend(gpu); gpu->funcs->pm_suspend(gpu);
gpu->funcs->destroy(gpu);
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
gpu->funcs->destroy(gpu);
} }
if (priv->vram.paddr) { if (priv->vram.paddr) {
...@@ -177,7 +179,7 @@ static int get_mdp_ver(struct platform_device *pdev) ...@@ -177,7 +179,7 @@ static int get_mdp_ver(struct platform_device *pdev)
const struct of_device_id *match; const struct of_device_id *match;
match = of_match_node(match_types, dev->of_node); match = of_match_node(match_types, dev->of_node);
if (match) if (match)
return (int)match->data; return (int)(unsigned long)match->data;
#endif #endif
return 4; return 4;
} }
...@@ -216,7 +218,7 @@ static int msm_init_vram(struct drm_device *dev) ...@@ -216,7 +218,7 @@ static int msm_init_vram(struct drm_device *dev)
if (ret) if (ret)
return ret; return ret;
size = r.end - r.start; size = r.end - r.start;
DRM_INFO("using VRAM carveout: %lx@%08x\n", size, r.start); DRM_INFO("using VRAM carveout: %lx@%pa\n", size, &r.start);
} else } else
#endif #endif
...@@ -283,10 +285,6 @@ static int msm_load(struct drm_device *dev, unsigned long flags) ...@@ -283,10 +285,6 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
drm_mode_config_init(dev); drm_mode_config_init(dev);
ret = msm_init_vram(dev);
if (ret)
goto fail;
platform_set_drvdata(pdev, dev); platform_set_drvdata(pdev, dev);
/* Bind all our sub-components: */ /* Bind all our sub-components: */
...@@ -294,6 +292,10 @@ static int msm_load(struct drm_device *dev, unsigned long flags) ...@@ -294,6 +292,10 @@ static int msm_load(struct drm_device *dev, unsigned long flags)
if (ret) if (ret)
return ret; return ret;
ret = msm_init_vram(dev);
if (ret)
goto fail;
switch (get_mdp_ver(pdev)) { switch (get_mdp_ver(pdev)) {
case 4: case 4:
kms = mdp4_kms_init(dev); kms = mdp4_kms_init(dev);
...@@ -419,9 +421,11 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file) ...@@ -419,9 +421,11 @@ static void msm_preclose(struct drm_device *dev, struct drm_file *file)
static void msm_lastclose(struct drm_device *dev) static void msm_lastclose(struct drm_device *dev)
{ {
#ifdef CONFIG_DRM_MSM_FBDEV
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
if (priv->fbdev) if (priv->fbdev)
drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev); drm_fb_helper_restore_fbdev_mode_unlocked(priv->fbdev);
#endif
} }
static irqreturn_t msm_irq(int irq, void *arg) static irqreturn_t msm_irq(int irq, void *arg)
......
...@@ -172,8 +172,8 @@ struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, ...@@ -172,8 +172,8 @@ struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
{ {
struct msm_drm_private *priv = dev->dev_private; struct msm_drm_private *priv = dev->dev_private;
struct msm_kms *kms = priv->kms; struct msm_kms *kms = priv->kms;
struct msm_framebuffer *msm_fb; struct msm_framebuffer *msm_fb = NULL;
struct drm_framebuffer *fb = NULL; struct drm_framebuffer *fb;
const struct msm_format *format; const struct msm_format *format;
int ret, i, n; int ret, i, n;
unsigned int hsub, vsub; unsigned int hsub, vsub;
...@@ -239,8 +239,7 @@ struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev, ...@@ -239,8 +239,7 @@ struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
return fb; return fb;
fail: fail:
if (fb) kfree(msm_fb);
msm_framebuffer_destroy(fb);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
...@@ -483,7 +483,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m) ...@@ -483,7 +483,7 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m)
uint64_t off = drm_vma_node_start(&obj->vma_node); uint64_t off = drm_vma_node_start(&obj->vma_node);
WARN_ON(!mutex_is_locked(&dev->struct_mutex)); WARN_ON(!mutex_is_locked(&dev->struct_mutex));
seq_printf(m, "%08x: %c(r=%u,w=%u) %2d (%2d) %08llx %p %d\n", seq_printf(m, "%08x: %c(r=%u,w=%u) %2d (%2d) %08llx %p %zu\n",
msm_obj->flags, is_active(msm_obj) ? 'A' : 'I', msm_obj->flags, is_active(msm_obj) ? 'A' : 'I',
msm_obj->read_fence, msm_obj->write_fence, msm_obj->read_fence, msm_obj->write_fence,
obj->name, obj->refcount.refcount.counter, obj->name, obj->refcount.refcount.counter,
......
...@@ -60,7 +60,7 @@ static int msm_iommu_map(struct msm_mmu *mmu, uint32_t iova, ...@@ -60,7 +60,7 @@ static int msm_iommu_map(struct msm_mmu *mmu, uint32_t iova,
u32 pa = sg_phys(sg) - sg->offset; u32 pa = sg_phys(sg) - sg->offset;
size_t bytes = sg->length + sg->offset; size_t bytes = sg->length + sg->offset;
VERB("map[%d]: %08x %08x(%x)", i, iova, pa, bytes); VERB("map[%d]: %08x %08x(%zx)", i, iova, pa, bytes);
ret = iommu_map(domain, da, pa, bytes, prot); ret = iommu_map(domain, da, pa, bytes, prot);
if (ret) if (ret)
...@@ -99,7 +99,7 @@ static int msm_iommu_unmap(struct msm_mmu *mmu, uint32_t iova, ...@@ -99,7 +99,7 @@ static int msm_iommu_unmap(struct msm_mmu *mmu, uint32_t iova,
if (unmapped < bytes) if (unmapped < bytes)
return unmapped; return unmapped;
VERB("unmap[%d]: %08x(%x)", i, iova, bytes); VERB("unmap[%d]: %08x(%zx)", i, iova, bytes);
BUG_ON(!PAGE_ALIGNED(bytes)); BUG_ON(!PAGE_ALIGNED(bytes));
......
...@@ -56,6 +56,6 @@ struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int size) ...@@ -56,6 +56,6 @@ struct msm_ringbuffer *msm_ringbuffer_new(struct msm_gpu *gpu, int size)
void msm_ringbuffer_destroy(struct msm_ringbuffer *ring) void msm_ringbuffer_destroy(struct msm_ringbuffer *ring)
{ {
if (ring->bo) if (ring->bo)
drm_gem_object_unreference(ring->bo); drm_gem_object_unreference_unlocked(ring->bo);
kfree(ring); kfree(ring);
} }
...@@ -421,19 +421,21 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector) ...@@ -421,19 +421,21 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector)
{ {
struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv; struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
u8 msg[DP_DPCD_SIZE]; u8 msg[DP_DPCD_SIZE];
int ret; int ret, i;
ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_DPCD_REV, msg, for (i = 0; i < 7; i++) {
DP_DPCD_SIZE); ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_DPCD_REV, msg,
if (ret > 0) { DP_DPCD_SIZE);
memcpy(dig_connector->dpcd, msg, DP_DPCD_SIZE); if (ret == DP_DPCD_SIZE) {
memcpy(dig_connector->dpcd, msg, DP_DPCD_SIZE);
DRM_DEBUG_KMS("DPCD: %*ph\n", (int)sizeof(dig_connector->dpcd), DRM_DEBUG_KMS("DPCD: %*ph\n", (int)sizeof(dig_connector->dpcd),
dig_connector->dpcd); dig_connector->dpcd);
radeon_dp_probe_oui(radeon_connector); radeon_dp_probe_oui(radeon_connector);
return true; return true;
}
} }
dig_connector->dpcd[0] = 0; dig_connector->dpcd[0] = 0;
return false; return false;
......
...@@ -30,8 +30,6 @@ ...@@ -30,8 +30,6 @@
AUX_SW_RX_HPD_DISCON | \ AUX_SW_RX_HPD_DISCON | \
AUX_SW_RX_PARTIAL_BYTE | \ AUX_SW_RX_PARTIAL_BYTE | \
AUX_SW_NON_AUX_MODE | \ AUX_SW_NON_AUX_MODE | \
AUX_SW_RX_MIN_COUNT_VIOL | \
AUX_SW_RX_INVALID_STOP | \
AUX_SW_RX_SYNC_INVALID_L | \ AUX_SW_RX_SYNC_INVALID_L | \
AUX_SW_RX_SYNC_INVALID_H | \ AUX_SW_RX_SYNC_INVALID_H | \
AUX_SW_RX_INVALID_START | \ AUX_SW_RX_INVALID_START | \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册