Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm tree changes from Dave Airlie: "This is the main drm pull request, I have some overlap with sound and arm-soc, the sound patch is acked and may conflict based on -next reports but should be a trivial fixup, which I'll leave to you! Highlights: - new drivers: MSM driver from Rob Clark - non-drm: switcheroo and hdmi audio driver support for secondary GPU poweroff, so drivers can use runtime PM to poweroff the GPUs. This can save 5 or 6W on some optimus laptops. - drm core: combined GEM and TTM VMA manager per-filp mmap permission tracking initial rendernode support (via a runtime enable for now, until we get api stable), remove old proc support, lots of cleanups of legacy code hdmi vendor infoframes and 4k modes lots of gem/prime locking and races fixes async pageflip scaffolding drm bridge objects - i915: Haswell PC8+ support and eLLC support, HDMI 4K support, initial per-process VMA pieces, watermark reworks, convert to generic hdmi infoframes, encoder reworking, fastboot support, - radeon: CIK PM support, remove 3d blit code in favour of DMA engines, Berlin GPU support, HDMI audio fixes - nouveau: secondary GPU power down support for optimus laptops, lots of fixes, use MSI, VP3 engine support - exynos: runtime pm support for g2d, DT support, remove non-DT, - tda998x i2c driver: lots of fixes for sync issues - gma500: lots of cleanups - rcar: add LVDS support, fbdev emulation, - tegra: just minor fixes" * 'drm-next' of git://people.freedesktop.org/~airlied/linux: (684 commits) drm/exynos: Fix build error with exynos_drm_connector.c drm/exynos: Remove non-DT support in exynos_drm_fimd drm/exynos: Remove non-DT support in exynos_hdmi drm/exynos: Remove non-DT support in exynos_drm_g2d drm/exynos: Remove non-DT support in exynos_hdmiphy drm/exynos: Remove non-DT support in exynos_ddc drm/exynos: Make Exynos DRM drivers depend on OF drm/exynos: Consider fallback option to allocation fail drm/exynos: fimd: move platform data parsing to separate function drm/exynos: fimd: get signal polarities from device tree drm/exynos: fimd: replace struct fb_videomode with videomode drm/exynos: check a pixel format to a particular window layer drm/exynos: fix fimd pixel format setting drm/exynos: Add NULL pointer check drm/exynos: Remove redundant error messages drm/exynos: Add missing of.h header include drm/exynos: Remove redundant NULL check in exynos_drm_buf drm/exynos: add device tree support for rotator drm/exynos: Add missing includes drm/exynos: add runtime pm interfaces to g2d driver ...
This commit is contained in:
@@ -43,7 +43,7 @@ void host1x_set_drm_data(struct device *dev, void *data)
|
||||
void *host1x_get_drm_data(struct device *dev)
|
||||
{
|
||||
struct host1x *host1x = dev_get_drvdata(dev);
|
||||
return host1x->drm_data;
|
||||
return host1x ? host1x->drm_data : NULL;
|
||||
}
|
||||
|
||||
void host1x_sync_writel(struct host1x *host1x, u32 v, u32 r)
|
||||
|
@@ -301,8 +301,8 @@ static inline void host1x_hw_show_mlocks(struct host1x *host, struct output *o)
|
||||
host->debug_op->show_mlocks(host, o);
|
||||
}
|
||||
|
||||
extern struct platform_driver tegra_hdmi_driver;
|
||||
extern struct platform_driver tegra_dc_driver;
|
||||
extern struct platform_driver tegra_hdmi_driver;
|
||||
extern struct platform_driver tegra_gr2d_driver;
|
||||
|
||||
#endif
|
||||
|
@@ -235,7 +235,7 @@ void tegra_dc_cancel_page_flip(struct drm_crtc *crtc, struct drm_file *file)
|
||||
}
|
||||
|
||||
static int tegra_dc_page_flip(struct drm_crtc *crtc, struct drm_framebuffer *fb,
|
||||
struct drm_pending_vblank_event *event)
|
||||
struct drm_pending_vblank_event *event, uint32_t page_flip_flags)
|
||||
{
|
||||
struct tegra_dc *dc = to_tegra_dc(crtc);
|
||||
struct drm_device *drm = crtc->dev;
|
||||
|
@@ -356,7 +356,7 @@ static int tegra_gem_mmap(struct drm_device *drm, void *data,
|
||||
|
||||
bo = to_tegra_bo(gem);
|
||||
|
||||
args->offset = tegra_bo_get_mmap_offset(bo);
|
||||
args->offset = drm_vma_node_offset_addr(&bo->gem.vma_node);
|
||||
|
||||
drm_gem_object_unreference(gem);
|
||||
|
||||
@@ -487,7 +487,7 @@ static int tegra_submit(struct drm_device *drm, void *data,
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct drm_ioctl_desc tegra_drm_ioctls[] = {
|
||||
static const struct drm_ioctl_desc tegra_drm_ioctls[] = {
|
||||
#ifdef CONFIG_DRM_TEGRA_STAGING
|
||||
DRM_IOCTL_DEF_DRV(TEGRA_GEM_CREATE, tegra_gem_create, DRM_UNLOCKED | DRM_AUTH),
|
||||
DRM_IOCTL_DEF_DRV(TEGRA_GEM_MMAP, tegra_gem_mmap, DRM_UNLOCKED),
|
||||
@@ -508,7 +508,6 @@ static const struct file_operations tegra_drm_fops = {
|
||||
.unlocked_ioctl = drm_ioctl,
|
||||
.mmap = tegra_drm_mmap,
|
||||
.poll = drm_poll,
|
||||
.fasync = drm_fasync,
|
||||
.read = drm_read,
|
||||
#ifdef CONFIG_COMPAT
|
||||
.compat_ioctl = drm_compat_ioctl,
|
||||
@@ -633,7 +632,7 @@ struct drm_driver tegra_drm_driver = {
|
||||
.gem_vm_ops = &tegra_bo_vm_ops,
|
||||
.dumb_create = tegra_bo_dumb_create,
|
||||
.dumb_map_offset = tegra_bo_dumb_map_offset,
|
||||
.dumb_destroy = tegra_bo_dumb_destroy,
|
||||
.dumb_destroy = drm_gem_dumb_destroy,
|
||||
|
||||
.ioctls = tegra_drm_ioctls,
|
||||
.num_ioctls = ARRAY_SIZE(tegra_drm_ioctls),
|
||||
|
@@ -106,11 +106,6 @@ static void tegra_bo_destroy(struct drm_device *drm, struct tegra_bo *bo)
|
||||
dma_free_writecombine(drm->dev, bo->gem.size, bo->vaddr, bo->paddr);
|
||||
}
|
||||
|
||||
unsigned int tegra_bo_get_mmap_offset(struct tegra_bo *bo)
|
||||
{
|
||||
return (unsigned int)bo->gem.map_list.hash.key << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
struct tegra_bo *tegra_bo_create(struct drm_device *drm, unsigned int size)
|
||||
{
|
||||
struct tegra_bo *bo;
|
||||
@@ -182,8 +177,7 @@ void tegra_bo_free_object(struct drm_gem_object *gem)
|
||||
{
|
||||
struct tegra_bo *bo = to_tegra_bo(gem);
|
||||
|
||||
if (gem->map_list.map)
|
||||
drm_gem_free_mmap_offset(gem);
|
||||
drm_gem_free_mmap_offset(gem);
|
||||
|
||||
drm_gem_object_release(gem);
|
||||
tegra_bo_destroy(gem->dev, bo);
|
||||
@@ -228,7 +222,7 @@ int tegra_bo_dumb_map_offset(struct drm_file *file, struct drm_device *drm,
|
||||
|
||||
bo = to_tegra_bo(gem);
|
||||
|
||||
*offset = tegra_bo_get_mmap_offset(bo);
|
||||
*offset = drm_vma_node_offset_addr(&bo->gem.vma_node);
|
||||
|
||||
drm_gem_object_unreference(gem);
|
||||
|
||||
@@ -262,9 +256,3 @@ int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma)
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int tegra_bo_dumb_destroy(struct drm_file *file, struct drm_device *drm,
|
||||
unsigned int handle)
|
||||
{
|
||||
return drm_gem_handle_delete(file, handle);
|
||||
}
|
||||
|
@@ -44,13 +44,10 @@ struct tegra_bo *tegra_bo_create_with_handle(struct drm_file *file,
|
||||
unsigned int size,
|
||||
unsigned int *handle);
|
||||
void tegra_bo_free_object(struct drm_gem_object *gem);
|
||||
unsigned int tegra_bo_get_mmap_offset(struct tegra_bo *bo);
|
||||
int tegra_bo_dumb_create(struct drm_file *file, struct drm_device *drm,
|
||||
struct drm_mode_create_dumb *args);
|
||||
int tegra_bo_dumb_map_offset(struct drm_file *file, struct drm_device *drm,
|
||||
uint32_t handle, uint64_t *offset);
|
||||
int tegra_bo_dumb_destroy(struct drm_file *file, struct drm_device *drm,
|
||||
unsigned int handle);
|
||||
|
||||
int tegra_drm_mmap(struct file *file, struct vm_area_struct *vma);
|
||||
|
||||
|
@@ -551,24 +551,8 @@ static void tegra_hdmi_setup_stereo_infoframe(struct tegra_hdmi *hdmi)
|
||||
return;
|
||||
}
|
||||
|
||||
memset(&frame, 0, sizeof(frame));
|
||||
|
||||
frame.type = HDMI_INFOFRAME_TYPE_VENDOR;
|
||||
frame.version = 0x01;
|
||||
frame.length = 6;
|
||||
|
||||
frame.data[0] = 0x03; /* regid0 */
|
||||
frame.data[1] = 0x0c; /* regid1 */
|
||||
frame.data[2] = 0x00; /* regid2 */
|
||||
frame.data[3] = 0x02 << 5; /* video format */
|
||||
|
||||
/* TODO: 74 MHz limit? */
|
||||
if (1) {
|
||||
frame.data[4] = 0x00 << 4; /* 3D structure */
|
||||
} else {
|
||||
frame.data[4] = 0x08 << 4; /* 3D structure */
|
||||
frame.data[5] = 0x00 << 4; /* 3D ext. data */
|
||||
}
|
||||
hdmi_vendor_infoframe_init(&frame);
|
||||
frame.s3d_struct = HDMI_3D_STRUCTURE_FRAME_PACKING;
|
||||
|
||||
err = hdmi_vendor_infoframe_pack(&frame, buffer, sizeof(buffer));
|
||||
if (err < 0) {
|
||||
@@ -904,6 +888,11 @@ static int tegra_hdmi_show_regs(struct seq_file *s, void *data)
|
||||
{
|
||||
struct drm_info_node *node = s->private;
|
||||
struct tegra_hdmi *hdmi = node->info_ent->data;
|
||||
int err;
|
||||
|
||||
err = clk_enable(hdmi->clk);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
#define DUMP_REG(name) \
|
||||
seq_printf(s, "%-56s %#05x %08lx\n", #name, name, \
|
||||
@@ -1069,6 +1058,8 @@ static int tegra_hdmi_show_regs(struct seq_file *s, void *data)
|
||||
|
||||
#undef DUMP_REG
|
||||
|
||||
clk_disable(hdmi->clk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -147,6 +147,13 @@ int tegra_dc_rgb_probe(struct tegra_dc *dc)
|
||||
if (!rgb)
|
||||
return -ENOMEM;
|
||||
|
||||
rgb->output.dev = dc->dev;
|
||||
rgb->output.of_node = np;
|
||||
|
||||
err = tegra_output_parse_dt(&rgb->output);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
rgb->clk = devm_clk_get(dc->dev, NULL);
|
||||
if (IS_ERR(rgb->clk)) {
|
||||
dev_err(dc->dev, "failed to get clock\n");
|
||||
@@ -165,13 +172,6 @@ int tegra_dc_rgb_probe(struct tegra_dc *dc)
|
||||
return err;
|
||||
}
|
||||
|
||||
rgb->output.dev = dc->dev;
|
||||
rgb->output.of_node = np;
|
||||
|
||||
err = tegra_output_parse_dt(&rgb->output);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
dc->rgb = &rgb->output;
|
||||
|
||||
return 0;
|
||||
|
@@ -42,12 +42,12 @@ struct host1x_job *host1x_job_alloc(struct host1x_channel *ch,
|
||||
|
||||
/* Check that we're not going to overflow */
|
||||
total = sizeof(struct host1x_job) +
|
||||
num_relocs * sizeof(struct host1x_reloc) +
|
||||
num_unpins * sizeof(struct host1x_job_unpin_data) +
|
||||
num_waitchks * sizeof(struct host1x_waitchk) +
|
||||
num_cmdbufs * sizeof(struct host1x_job_gather) +
|
||||
num_unpins * sizeof(dma_addr_t) +
|
||||
num_unpins * sizeof(u32 *);
|
||||
(u64)num_relocs * sizeof(struct host1x_reloc) +
|
||||
(u64)num_unpins * sizeof(struct host1x_job_unpin_data) +
|
||||
(u64)num_waitchks * sizeof(struct host1x_waitchk) +
|
||||
(u64)num_cmdbufs * sizeof(struct host1x_job_gather) +
|
||||
(u64)num_unpins * sizeof(dma_addr_t) +
|
||||
(u64)num_unpins * sizeof(u32 *);
|
||||
if (total > ULONG_MAX)
|
||||
return NULL;
|
||||
|
||||
@@ -466,9 +466,8 @@ static inline int copy_gathers(struct host1x_job *job, struct device *dev)
|
||||
&job->gather_copy,
|
||||
GFP_KERNEL);
|
||||
if (!job->gather_copy_mapped) {
|
||||
int err = PTR_ERR(job->gather_copy_mapped);
|
||||
job->gather_copy_mapped = NULL;
|
||||
return err;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
job->gather_copy_size = size;
|
||||
|
Reference in New Issue
Block a user