mirror of
https://github.com/torvalds/linux.git
synced 2024-12-28 13:51:44 +00:00
Merge branch 'drm-rockchip-next-fixes-2016-01-22' of https://github.com/markyzq/kernel-drm-rockchip into drm-fixes
Here are some fixes for drm/rockchip, these fixes base on drm-next. These fixes works on my popmetal(rk3288) board. About patch: drm/atomic-helper: Export framebuffer_changed() Daniel Vetter ack for merging it through rockchip git trees, so framebuffer_changed() can be reused by drm/rockchip. All others looks good, so I'd like you can land them. * 'drm-rockchip-next-fixes-2016-01-22' of https://github.com/markyzq/kernel-drm-rockchip: drm/rockchip: respect CONFIG_DRM_FBDEV_EMULATION drm/rockchip: fix wrong pitch/size using on gem drm/rockchip: explain why we can't wait_for_vblanks drm/rockchip: don't wait for vblank if fb hasn't changed drm/atomic-helper: Export framebuffer_changed() drm/rockchip/dsi: fix handling mipi_dsi_pixel_format_to_bpp result drm/rockchip: vop: fix mask when updating interrupts drm/rockchip: cleanup unnecessary export symbol drm/rockchip: Don't build rockchip_drm_vop as modules
This commit is contained in:
commit
d8b8eb829d
@ -946,7 +946,21 @@ static void wait_for_fences(struct drm_device *dev,
|
||||
}
|
||||
}
|
||||
|
||||
static bool framebuffer_changed(struct drm_device *dev,
|
||||
/**
|
||||
* drm_atomic_helper_framebuffer_changed - check if framebuffer has changed
|
||||
* @dev: DRM device
|
||||
* @old_state: atomic state object with old state structures
|
||||
* @crtc: DRM crtc
|
||||
*
|
||||
* Checks whether the framebuffer used for this CRTC changes as a result of
|
||||
* the atomic update. This is useful for drivers which cannot use
|
||||
* drm_atomic_helper_wait_for_vblanks() and need to reimplement its
|
||||
* functionality.
|
||||
*
|
||||
* Returns:
|
||||
* true if the framebuffer changed.
|
||||
*/
|
||||
bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state,
|
||||
struct drm_crtc *crtc)
|
||||
{
|
||||
@ -965,6 +979,7 @@ static bool framebuffer_changed(struct drm_device *dev,
|
||||
|
||||
return false;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_atomic_helper_framebuffer_changed);
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_wait_for_vblanks - wait for vblank on crtcs
|
||||
@ -999,7 +1014,8 @@ drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
|
||||
if (old_state->legacy_cursor_update)
|
||||
continue;
|
||||
|
||||
if (!framebuffer_changed(dev, old_state, crtc))
|
||||
if (!drm_atomic_helper_framebuffer_changed(dev,
|
||||
old_state, crtc))
|
||||
continue;
|
||||
|
||||
ret = drm_crtc_vblank_get(crtc);
|
||||
|
@ -2,11 +2,11 @@
|
||||
# Makefile for the drm device driver. This driver provides support for the
|
||||
# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
|
||||
|
||||
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o rockchip_drm_fbdev.o \
|
||||
rockchip_drm_gem.o
|
||||
rockchipdrm-y := rockchip_drm_drv.o rockchip_drm_fb.o \
|
||||
rockchip_drm_gem.o rockchip_drm_vop.o
|
||||
rockchipdrm-$(CONFIG_DRM_FBDEV_EMULATION) += rockchip_drm_fbdev.o
|
||||
|
||||
obj-$(CONFIG_ROCKCHIP_DW_HDMI) += dw_hdmi-rockchip.o
|
||||
obj-$(CONFIG_ROCKCHIP_DW_MIPI_DSI) += dw-mipi-dsi.o
|
||||
|
||||
obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o rockchip_drm_vop.o \
|
||||
rockchip_vop_reg.o
|
||||
obj-$(CONFIG_DRM_ROCKCHIP) += rockchipdrm.o rockchip_vop_reg.o
|
||||
|
@ -461,10 +461,11 @@ static int dw_mipi_dsi_phy_init(struct dw_mipi_dsi *dsi)
|
||||
|
||||
static int dw_mipi_dsi_get_lane_bps(struct dw_mipi_dsi *dsi)
|
||||
{
|
||||
unsigned int bpp, i, pre;
|
||||
unsigned int i, pre;
|
||||
unsigned long mpclk, pllref, tmp;
|
||||
unsigned int m = 1, n = 1, target_mbps = 1000;
|
||||
unsigned int max_mbps = dptdin_map[ARRAY_SIZE(dptdin_map) - 1].max_mbps;
|
||||
int bpp;
|
||||
|
||||
bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
|
||||
if (bpp < 0) {
|
||||
|
@ -55,14 +55,12 @@ int rockchip_drm_dma_attach_device(struct drm_device *drm_dev,
|
||||
|
||||
return arm_iommu_attach_device(dev, mapping);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_drm_dma_attach_device);
|
||||
|
||||
void rockchip_drm_dma_detach_device(struct drm_device *drm_dev,
|
||||
struct device *dev)
|
||||
{
|
||||
arm_iommu_detach_device(dev);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_drm_dma_detach_device);
|
||||
|
||||
int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
|
||||
const struct rockchip_crtc_funcs *crtc_funcs)
|
||||
@ -77,7 +75,6 @@ int rockchip_register_crtc_funcs(struct drm_crtc *crtc,
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_register_crtc_funcs);
|
||||
|
||||
void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc)
|
||||
{
|
||||
@ -89,7 +86,6 @@ void rockchip_unregister_crtc_funcs(struct drm_crtc *crtc)
|
||||
|
||||
priv->crtc_funcs[pipe] = NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_unregister_crtc_funcs);
|
||||
|
||||
static struct drm_crtc *rockchip_crtc_from_pipe(struct drm_device *drm,
|
||||
int pipe)
|
||||
|
@ -39,7 +39,6 @@ struct drm_gem_object *rockchip_fb_get_gem_obj(struct drm_framebuffer *fb,
|
||||
|
||||
return rk_fb->obj[plane];
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(rockchip_fb_get_gem_obj);
|
||||
|
||||
static void rockchip_drm_fb_destroy(struct drm_framebuffer *fb)
|
||||
{
|
||||
@ -177,8 +176,23 @@ static void rockchip_crtc_wait_for_update(struct drm_crtc *crtc)
|
||||
crtc_funcs->wait_for_update(crtc);
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't use drm_atomic_helper_wait_for_vblanks() because rk3288 and rk3066
|
||||
* have hardware counters for neither vblanks nor scanlines, which results in
|
||||
* a race where:
|
||||
* | <-- HW vsync irq and reg take effect
|
||||
* plane_commit --> |
|
||||
* get_vblank and wait --> |
|
||||
* | <-- handle_vblank, vblank->count + 1
|
||||
* cleanup_fb --> |
|
||||
* iommu crash --> |
|
||||
* | <-- HW vsync irq and reg take effect
|
||||
*
|
||||
* This function is equivalent but uses rockchip_crtc_wait_for_update() instead
|
||||
* of waiting for vblank_count to change.
|
||||
*/
|
||||
static void
|
||||
rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state)
|
||||
rockchip_atomic_wait_for_complete(struct drm_device *dev, struct drm_atomic_state *old_state)
|
||||
{
|
||||
struct drm_crtc_state *old_crtc_state;
|
||||
struct drm_crtc *crtc;
|
||||
@ -194,6 +208,10 @@ rockchip_atomic_wait_for_complete(struct drm_atomic_state *old_state)
|
||||
if (!crtc->state->active)
|
||||
continue;
|
||||
|
||||
if (!drm_atomic_helper_framebuffer_changed(dev,
|
||||
old_state, crtc))
|
||||
continue;
|
||||
|
||||
ret = drm_crtc_vblank_get(crtc);
|
||||
if (ret != 0)
|
||||
continue;
|
||||
@ -241,7 +259,7 @@ rockchip_atomic_commit_complete(struct rockchip_atomic_commit *commit)
|
||||
|
||||
drm_atomic_helper_commit_planes(dev, state, true);
|
||||
|
||||
rockchip_atomic_wait_for_complete(state);
|
||||
rockchip_atomic_wait_for_complete(dev, state);
|
||||
|
||||
drm_atomic_helper_cleanup_planes(dev, state);
|
||||
|
||||
|
@ -15,7 +15,18 @@
|
||||
#ifndef _ROCKCHIP_DRM_FBDEV_H
|
||||
#define _ROCKCHIP_DRM_FBDEV_H
|
||||
|
||||
#ifdef CONFIG_DRM_FBDEV_EMULATION
|
||||
int rockchip_drm_fbdev_init(struct drm_device *dev);
|
||||
void rockchip_drm_fbdev_fini(struct drm_device *dev);
|
||||
#else
|
||||
static inline int rockchip_drm_fbdev_init(struct drm_device *dev)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void rockchip_drm_fbdev_fini(struct drm_device *dev)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _ROCKCHIP_DRM_FBDEV_H */
|
||||
|
@ -234,12 +234,7 @@ int rockchip_gem_dumb_create(struct drm_file *file_priv,
|
||||
/*
|
||||
* align to 64 bytes since Mali requires it.
|
||||
*/
|
||||
min_pitch = ALIGN(min_pitch, 64);
|
||||
|
||||
if (args->pitch < min_pitch)
|
||||
args->pitch = min_pitch;
|
||||
|
||||
if (args->size < args->pitch * args->height)
|
||||
args->pitch = ALIGN(min_pitch, 64);
|
||||
args->size = args->pitch * args->height;
|
||||
|
||||
rk_obj = rockchip_gem_create_with_handle(file_priv, dev, args->size,
|
||||
|
@ -43,8 +43,8 @@
|
||||
|
||||
#define REG_SET(x, base, reg, v, mode) \
|
||||
__REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v)
|
||||
#define REG_SET_MASK(x, base, reg, v, mode) \
|
||||
__REG_SET_##mode(x, base + reg.offset, reg.mask, reg.shift, v)
|
||||
#define REG_SET_MASK(x, base, reg, mask, v, mode) \
|
||||
__REG_SET_##mode(x, base + reg.offset, mask, reg.shift, v)
|
||||
|
||||
#define VOP_WIN_SET(x, win, name, v) \
|
||||
REG_SET(x, win->base, win->phy->name, v, RELAXED)
|
||||
@ -58,16 +58,18 @@
|
||||
#define VOP_INTR_GET(vop, name) \
|
||||
vop_read_reg(vop, 0, &vop->data->ctrl->name)
|
||||
|
||||
#define VOP_INTR_SET(vop, name, v) \
|
||||
REG_SET(vop, 0, vop->data->intr->name, v, NORMAL)
|
||||
#define VOP_INTR_SET(vop, name, mask, v) \
|
||||
REG_SET_MASK(vop, 0, vop->data->intr->name, mask, v, NORMAL)
|
||||
#define VOP_INTR_SET_TYPE(vop, name, type, v) \
|
||||
do { \
|
||||
int i, reg = 0; \
|
||||
int i, reg = 0, mask = 0; \
|
||||
for (i = 0; i < vop->data->intr->nintrs; i++) { \
|
||||
if (vop->data->intr->intrs[i] & type) \
|
||||
if (vop->data->intr->intrs[i] & type) { \
|
||||
reg |= (v) << i; \
|
||||
mask |= 1 << i; \
|
||||
} \
|
||||
VOP_INTR_SET(vop, name, reg); \
|
||||
} \
|
||||
VOP_INTR_SET(vop, name, mask, reg); \
|
||||
} while (0)
|
||||
#define VOP_INTR_GET_TYPE(vop, name, type) \
|
||||
vop_get_intr_type(vop, &vop->data->intr->name, type)
|
||||
|
@ -42,6 +42,10 @@ int drm_atomic_helper_commit(struct drm_device *dev,
|
||||
struct drm_atomic_state *state,
|
||||
bool async);
|
||||
|
||||
bool drm_atomic_helper_framebuffer_changed(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state,
|
||||
struct drm_crtc *crtc);
|
||||
|
||||
void drm_atomic_helper_wait_for_vblanks(struct drm_device *dev,
|
||||
struct drm_atomic_state *old_state);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user