diff options
Diffstat (limited to 'drivers/gpu')
47 files changed, 255 insertions, 116 deletions
diff --git a/drivers/gpu/drm/ast/ast_drv.c b/drivers/gpu/drm/ast/ast_drv.c index d0c4574ef49c..36164806b9d4 100644 --- a/drivers/gpu/drm/ast/ast_drv.c +++ b/drivers/gpu/drm/ast/ast_drv.c | |||
| @@ -193,6 +193,9 @@ static const struct file_operations ast_fops = { | |||
| 193 | .mmap = ast_mmap, | 193 | .mmap = ast_mmap, |
| 194 | .poll = drm_poll, | 194 | .poll = drm_poll, |
| 195 | .fasync = drm_fasync, | 195 | .fasync = drm_fasync, |
| 196 | #ifdef CONFIG_COMPAT | ||
| 197 | .compat_ioctl = drm_compat_ioctl, | ||
| 198 | #endif | ||
| 196 | .read = drm_read, | 199 | .read = drm_read, |
| 197 | }; | 200 | }; |
| 198 | 201 | ||
diff --git a/drivers/gpu/drm/ast/ast_mode.c b/drivers/gpu/drm/ast/ast_mode.c index 7282c081fb53..a712cafcfa1d 100644 --- a/drivers/gpu/drm/ast/ast_mode.c +++ b/drivers/gpu/drm/ast/ast_mode.c | |||
| @@ -841,7 +841,7 @@ int ast_cursor_init(struct drm_device *dev) | |||
| 841 | 841 | ||
| 842 | ast->cursor_cache = obj; | 842 | ast->cursor_cache = obj; |
| 843 | ast->cursor_cache_gpu_addr = gpu_addr; | 843 | ast->cursor_cache_gpu_addr = gpu_addr; |
| 844 | DRM_ERROR("pinned cursor cache at %llx\n", ast->cursor_cache_gpu_addr); | 844 | DRM_DEBUG_KMS("pinned cursor cache at %llx\n", ast->cursor_cache_gpu_addr); |
| 845 | return 0; | 845 | return 0; |
| 846 | fail: | 846 | fail: |
| 847 | return ret; | 847 | return ret; |
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c index 7053140c6596..b83a2d7ddd1a 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.c +++ b/drivers/gpu/drm/cirrus/cirrus_drv.c | |||
| @@ -74,6 +74,9 @@ static const struct file_operations cirrus_driver_fops = { | |||
| 74 | .unlocked_ioctl = drm_ioctl, | 74 | .unlocked_ioctl = drm_ioctl, |
| 75 | .mmap = cirrus_mmap, | 75 | .mmap = cirrus_mmap, |
| 76 | .poll = drm_poll, | 76 | .poll = drm_poll, |
| 77 | #ifdef CONFIG_COMPAT | ||
| 78 | .compat_ioctl = drm_compat_ioctl, | ||
| 79 | #endif | ||
| 77 | .fasync = drm_fasync, | 80 | .fasync = drm_fasync, |
| 78 | }; | 81 | }; |
| 79 | static struct drm_driver driver = { | 82 | static struct drm_driver driver = { |
diff --git a/drivers/gpu/drm/exynos/Kconfig b/drivers/gpu/drm/exynos/Kconfig index 7f5096763b7d..59a26e577b57 100644 --- a/drivers/gpu/drm/exynos/Kconfig +++ b/drivers/gpu/drm/exynos/Kconfig | |||
| @@ -36,6 +36,6 @@ config DRM_EXYNOS_VIDI | |||
| 36 | 36 | ||
| 37 | config DRM_EXYNOS_G2D | 37 | config DRM_EXYNOS_G2D |
| 38 | bool "Exynos DRM G2D" | 38 | bool "Exynos DRM G2D" |
| 39 | depends on DRM_EXYNOS | 39 | depends on DRM_EXYNOS && !VIDEO_SAMSUNG_S5P_G2D |
| 40 | help | 40 | help |
| 41 | Choose this option if you want to use Exynos G2D for DRM. | 41 | Choose this option if you want to use Exynos G2D for DRM. |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 613bf8a5d9b2..ae13febe0eaa 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | |||
| @@ -163,6 +163,12 @@ static void exynos_gem_dmabuf_kunmap(struct dma_buf *dma_buf, | |||
| 163 | /* TODO */ | 163 | /* TODO */ |
| 164 | } | 164 | } |
| 165 | 165 | ||
| 166 | static int exynos_gem_dmabuf_mmap(struct dma_buf *dma_buf, | ||
| 167 | struct vm_area_struct *vma) | ||
| 168 | { | ||
| 169 | return -ENOTTY; | ||
| 170 | } | ||
| 171 | |||
| 166 | static struct dma_buf_ops exynos_dmabuf_ops = { | 172 | static struct dma_buf_ops exynos_dmabuf_ops = { |
| 167 | .map_dma_buf = exynos_gem_map_dma_buf, | 173 | .map_dma_buf = exynos_gem_map_dma_buf, |
| 168 | .unmap_dma_buf = exynos_gem_unmap_dma_buf, | 174 | .unmap_dma_buf = exynos_gem_unmap_dma_buf, |
| @@ -170,6 +176,7 @@ static struct dma_buf_ops exynos_dmabuf_ops = { | |||
| 170 | .kmap_atomic = exynos_gem_dmabuf_kmap_atomic, | 176 | .kmap_atomic = exynos_gem_dmabuf_kmap_atomic, |
| 171 | .kunmap = exynos_gem_dmabuf_kunmap, | 177 | .kunmap = exynos_gem_dmabuf_kunmap, |
| 172 | .kunmap_atomic = exynos_gem_dmabuf_kunmap_atomic, | 178 | .kunmap_atomic = exynos_gem_dmabuf_kunmap_atomic, |
| 179 | .mmap = exynos_gem_dmabuf_mmap, | ||
| 173 | .release = exynos_dmabuf_release, | 180 | .release = exynos_dmabuf_release, |
| 174 | }; | 181 | }; |
| 175 | 182 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index ebacec6f1e48..d07071937453 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
| @@ -160,7 +160,6 @@ static int exynos_drm_open(struct drm_device *dev, struct drm_file *file) | |||
| 160 | if (!file_priv) | 160 | if (!file_priv) |
| 161 | return -ENOMEM; | 161 | return -ENOMEM; |
| 162 | 162 | ||
| 163 | drm_prime_init_file_private(&file->prime); | ||
| 164 | file->driver_priv = file_priv; | 163 | file->driver_priv = file_priv; |
| 165 | 164 | ||
| 166 | return exynos_drm_subdrv_open(dev, file); | 165 | return exynos_drm_subdrv_open(dev, file); |
| @@ -184,7 +183,6 @@ static void exynos_drm_preclose(struct drm_device *dev, | |||
| 184 | e->base.destroy(&e->base); | 183 | e->base.destroy(&e->base); |
| 185 | } | 184 | } |
| 186 | } | 185 | } |
| 187 | drm_prime_destroy_file_private(&file->prime); | ||
| 188 | spin_unlock_irqrestore(&dev->event_lock, flags); | 186 | spin_unlock_irqrestore(&dev->event_lock, flags); |
| 189 | 187 | ||
| 190 | exynos_drm_subdrv_close(dev, file); | 188 | exynos_drm_subdrv_close(dev, file); |
| @@ -241,6 +239,9 @@ static const struct file_operations exynos_drm_driver_fops = { | |||
| 241 | .poll = drm_poll, | 239 | .poll = drm_poll, |
| 242 | .read = drm_read, | 240 | .read = drm_read, |
| 243 | .unlocked_ioctl = drm_ioctl, | 241 | .unlocked_ioctl = drm_ioctl, |
| 242 | #ifdef CONFIG_COMPAT | ||
| 243 | .compat_ioctl = drm_compat_ioctl, | ||
| 244 | #endif | ||
| 244 | .release = drm_release, | 245 | .release = drm_release, |
| 245 | }; | 246 | }; |
| 246 | 247 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fimd.c b/drivers/gpu/drm/exynos/exynos_drm_fimd.c index a68d2b313f03..b19cd93e7047 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fimd.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fimd.c | |||
| @@ -831,11 +831,6 @@ static int __devinit fimd_probe(struct platform_device *pdev) | |||
| 831 | } | 831 | } |
| 832 | 832 | ||
| 833 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 833 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 834 | if (!res) { | ||
| 835 | dev_err(dev, "failed to find registers\n"); | ||
| 836 | ret = -ENOENT; | ||
| 837 | goto err_clk; | ||
| 838 | } | ||
| 839 | 834 | ||
| 840 | ctx->regs = devm_request_and_ioremap(&pdev->dev, res); | 835 | ctx->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 841 | if (!ctx->regs) { | 836 | if (!ctx->regs) { |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_g2d.c b/drivers/gpu/drm/exynos/exynos_drm_g2d.c index d2d88f22a037..1065e90d0919 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_g2d.c +++ b/drivers/gpu/drm/exynos/exynos_drm_g2d.c | |||
| @@ -129,7 +129,6 @@ struct g2d_runqueue_node { | |||
| 129 | struct g2d_data { | 129 | struct g2d_data { |
| 130 | struct device *dev; | 130 | struct device *dev; |
| 131 | struct clk *gate_clk; | 131 | struct clk *gate_clk; |
| 132 | struct resource *regs_res; | ||
| 133 | void __iomem *regs; | 132 | void __iomem *regs; |
| 134 | int irq; | 133 | int irq; |
| 135 | struct workqueue_struct *g2d_workq; | 134 | struct workqueue_struct *g2d_workq; |
| @@ -751,7 +750,7 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 751 | struct exynos_drm_subdrv *subdrv; | 750 | struct exynos_drm_subdrv *subdrv; |
| 752 | int ret; | 751 | int ret; |
| 753 | 752 | ||
| 754 | g2d = kzalloc(sizeof(*g2d), GFP_KERNEL); | 753 | g2d = devm_kzalloc(&pdev->dev, sizeof(*g2d), GFP_KERNEL); |
| 755 | if (!g2d) { | 754 | if (!g2d) { |
| 756 | dev_err(dev, "failed to allocate driver data\n"); | 755 | dev_err(dev, "failed to allocate driver data\n"); |
| 757 | return -ENOMEM; | 756 | return -ENOMEM; |
| @@ -759,10 +758,8 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 759 | 758 | ||
| 760 | g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", | 759 | g2d->runqueue_slab = kmem_cache_create("g2d_runqueue_slab", |
| 761 | sizeof(struct g2d_runqueue_node), 0, 0, NULL); | 760 | sizeof(struct g2d_runqueue_node), 0, 0, NULL); |
| 762 | if (!g2d->runqueue_slab) { | 761 | if (!g2d->runqueue_slab) |
| 763 | ret = -ENOMEM; | 762 | return -ENOMEM; |
| 764 | goto err_free_mem; | ||
| 765 | } | ||
| 766 | 763 | ||
| 767 | g2d->dev = dev; | 764 | g2d->dev = dev; |
| 768 | 765 | ||
| @@ -794,38 +791,26 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 794 | pm_runtime_enable(dev); | 791 | pm_runtime_enable(dev); |
| 795 | 792 | ||
| 796 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 793 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 797 | if (!res) { | ||
| 798 | dev_err(dev, "failed to get I/O memory\n"); | ||
| 799 | ret = -ENOENT; | ||
| 800 | goto err_put_clk; | ||
| 801 | } | ||
| 802 | 794 | ||
| 803 | g2d->regs_res = request_mem_region(res->start, resource_size(res), | 795 | g2d->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 804 | dev_name(dev)); | ||
| 805 | if (!g2d->regs_res) { | ||
| 806 | dev_err(dev, "failed to request I/O memory\n"); | ||
| 807 | ret = -ENOENT; | ||
| 808 | goto err_put_clk; | ||
| 809 | } | ||
| 810 | |||
| 811 | g2d->regs = ioremap(res->start, resource_size(res)); | ||
| 812 | if (!g2d->regs) { | 796 | if (!g2d->regs) { |
| 813 | dev_err(dev, "failed to remap I/O memory\n"); | 797 | dev_err(dev, "failed to remap I/O memory\n"); |
| 814 | ret = -ENXIO; | 798 | ret = -ENXIO; |
| 815 | goto err_release_res; | 799 | goto err_put_clk; |
| 816 | } | 800 | } |
| 817 | 801 | ||
| 818 | g2d->irq = platform_get_irq(pdev, 0); | 802 | g2d->irq = platform_get_irq(pdev, 0); |
| 819 | if (g2d->irq < 0) { | 803 | if (g2d->irq < 0) { |
| 820 | dev_err(dev, "failed to get irq\n"); | 804 | dev_err(dev, "failed to get irq\n"); |
| 821 | ret = g2d->irq; | 805 | ret = g2d->irq; |
| 822 | goto err_unmap_base; | 806 | goto err_put_clk; |
| 823 | } | 807 | } |
| 824 | 808 | ||
| 825 | ret = request_irq(g2d->irq, g2d_irq_handler, 0, "drm_g2d", g2d); | 809 | ret = devm_request_irq(&pdev->dev, g2d->irq, g2d_irq_handler, 0, |
| 810 | "drm_g2d", g2d); | ||
| 826 | if (ret < 0) { | 811 | if (ret < 0) { |
| 827 | dev_err(dev, "irq request failed\n"); | 812 | dev_err(dev, "irq request failed\n"); |
| 828 | goto err_unmap_base; | 813 | goto err_put_clk; |
| 829 | } | 814 | } |
| 830 | 815 | ||
| 831 | platform_set_drvdata(pdev, g2d); | 816 | platform_set_drvdata(pdev, g2d); |
| @@ -838,7 +823,7 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 838 | ret = exynos_drm_subdrv_register(subdrv); | 823 | ret = exynos_drm_subdrv_register(subdrv); |
| 839 | if (ret < 0) { | 824 | if (ret < 0) { |
| 840 | dev_err(dev, "failed to register drm g2d device\n"); | 825 | dev_err(dev, "failed to register drm g2d device\n"); |
| 841 | goto err_free_irq; | 826 | goto err_put_clk; |
| 842 | } | 827 | } |
| 843 | 828 | ||
| 844 | dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", | 829 | dev_info(dev, "The exynos g2d(ver %d.%d) successfully probed\n", |
| @@ -846,13 +831,6 @@ static int __devinit g2d_probe(struct platform_device *pdev) | |||
| 846 | 831 | ||
| 847 | return 0; | 832 | return 0; |
| 848 | 833 | ||
| 849 | err_free_irq: | ||
| 850 | free_irq(g2d->irq, g2d); | ||
| 851 | err_unmap_base: | ||
| 852 | iounmap(g2d->regs); | ||
| 853 | err_release_res: | ||
| 854 | release_resource(g2d->regs_res); | ||
| 855 | kfree(g2d->regs_res); | ||
| 856 | err_put_clk: | 834 | err_put_clk: |
| 857 | pm_runtime_disable(dev); | 835 | pm_runtime_disable(dev); |
| 858 | clk_put(g2d->gate_clk); | 836 | clk_put(g2d->gate_clk); |
| @@ -862,8 +840,6 @@ err_destroy_workqueue: | |||
| 862 | destroy_workqueue(g2d->g2d_workq); | 840 | destroy_workqueue(g2d->g2d_workq); |
| 863 | err_destroy_slab: | 841 | err_destroy_slab: |
| 864 | kmem_cache_destroy(g2d->runqueue_slab); | 842 | kmem_cache_destroy(g2d->runqueue_slab); |
| 865 | err_free_mem: | ||
| 866 | kfree(g2d); | ||
| 867 | return ret; | 843 | return ret; |
| 868 | } | 844 | } |
| 869 | 845 | ||
| @@ -873,24 +849,18 @@ static int __devexit g2d_remove(struct platform_device *pdev) | |||
| 873 | 849 | ||
| 874 | cancel_work_sync(&g2d->runqueue_work); | 850 | cancel_work_sync(&g2d->runqueue_work); |
| 875 | exynos_drm_subdrv_unregister(&g2d->subdrv); | 851 | exynos_drm_subdrv_unregister(&g2d->subdrv); |
| 876 | free_irq(g2d->irq, g2d); | ||
| 877 | 852 | ||
| 878 | while (g2d->runqueue_node) { | 853 | while (g2d->runqueue_node) { |
| 879 | g2d_free_runqueue_node(g2d, g2d->runqueue_node); | 854 | g2d_free_runqueue_node(g2d, g2d->runqueue_node); |
| 880 | g2d->runqueue_node = g2d_get_runqueue_node(g2d); | 855 | g2d->runqueue_node = g2d_get_runqueue_node(g2d); |
| 881 | } | 856 | } |
| 882 | 857 | ||
| 883 | iounmap(g2d->regs); | ||
| 884 | release_resource(g2d->regs_res); | ||
| 885 | kfree(g2d->regs_res); | ||
| 886 | |||
| 887 | pm_runtime_disable(&pdev->dev); | 858 | pm_runtime_disable(&pdev->dev); |
| 888 | clk_put(g2d->gate_clk); | 859 | clk_put(g2d->gate_clk); |
| 889 | 860 | ||
| 890 | g2d_fini_cmdlist(g2d); | 861 | g2d_fini_cmdlist(g2d); |
| 891 | destroy_workqueue(g2d->g2d_workq); | 862 | destroy_workqueue(g2d->g2d_workq); |
| 892 | kmem_cache_destroy(g2d->runqueue_slab); | 863 | kmem_cache_destroy(g2d->runqueue_slab); |
| 893 | kfree(g2d); | ||
| 894 | 864 | ||
| 895 | return 0; | 865 | return 0; |
| 896 | } | 866 | } |
| @@ -924,7 +894,7 @@ static int g2d_resume(struct device *dev) | |||
| 924 | } | 894 | } |
| 925 | #endif | 895 | #endif |
| 926 | 896 | ||
| 927 | SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume); | 897 | static SIMPLE_DEV_PM_OPS(g2d_pm_ops, g2d_suspend, g2d_resume); |
| 928 | 898 | ||
| 929 | struct platform_driver g2d_driver = { | 899 | struct platform_driver g2d_driver = { |
| 930 | .probe = g2d_probe, | 900 | .probe = g2d_probe, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index f9efde40c097..a38051c95ec4 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
| @@ -122,7 +122,7 @@ fail: | |||
| 122 | __free_page(pages[i]); | 122 | __free_page(pages[i]); |
| 123 | 123 | ||
| 124 | drm_free_large(pages); | 124 | drm_free_large(pages); |
| 125 | return ERR_PTR(PTR_ERR(p)); | 125 | return ERR_CAST(p); |
| 126 | } | 126 | } |
| 127 | 127 | ||
| 128 | static void exynos_gem_put_pages(struct drm_gem_object *obj, | 128 | static void exynos_gem_put_pages(struct drm_gem_object *obj, |
| @@ -662,7 +662,7 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv, | |||
| 662 | */ | 662 | */ |
| 663 | 663 | ||
| 664 | args->pitch = args->width * ((args->bpp + 7) / 8); | 664 | args->pitch = args->width * ((args->bpp + 7) / 8); |
| 665 | args->size = PAGE_ALIGN(args->pitch * args->height); | 665 | args->size = args->pitch * args->height; |
| 666 | 666 | ||
| 667 | exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size); | 667 | exynos_gem_obj = exynos_drm_gem_create(dev, args->flags, args->size); |
| 668 | if (IS_ERR(exynos_gem_obj)) | 668 | if (IS_ERR(exynos_gem_obj)) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c index 8ffcdf8b9e22..3fdf0b65f47e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_hdmi.c | |||
| @@ -345,7 +345,7 @@ static int __devinit exynos_drm_hdmi_probe(struct platform_device *pdev) | |||
| 345 | 345 | ||
| 346 | DRM_DEBUG_KMS("%s\n", __FILE__); | 346 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 347 | 347 | ||
| 348 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 348 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
| 349 | if (!ctx) { | 349 | if (!ctx) { |
| 350 | DRM_LOG_KMS("failed to alloc common hdmi context.\n"); | 350 | DRM_LOG_KMS("failed to alloc common hdmi context.\n"); |
| 351 | return -ENOMEM; | 351 | return -ENOMEM; |
| @@ -371,7 +371,6 @@ static int __devexit exynos_drm_hdmi_remove(struct platform_device *pdev) | |||
| 371 | DRM_DEBUG_KMS("%s\n", __FILE__); | 371 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 372 | 372 | ||
| 373 | exynos_drm_subdrv_unregister(&ctx->subdrv); | 373 | exynos_drm_subdrv_unregister(&ctx->subdrv); |
| 374 | kfree(ctx); | ||
| 375 | 374 | ||
| 376 | return 0; | 375 | return 0; |
| 377 | } | 376 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c index b89829e5043a..e1f94b746bd7 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c | |||
| @@ -29,7 +29,6 @@ static const uint32_t formats[] = { | |||
| 29 | DRM_FORMAT_XRGB8888, | 29 | DRM_FORMAT_XRGB8888, |
| 30 | DRM_FORMAT_ARGB8888, | 30 | DRM_FORMAT_ARGB8888, |
| 31 | DRM_FORMAT_NV12, | 31 | DRM_FORMAT_NV12, |
| 32 | DRM_FORMAT_NV12M, | ||
| 33 | DRM_FORMAT_NV12MT, | 32 | DRM_FORMAT_NV12MT, |
| 34 | }; | 33 | }; |
| 35 | 34 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_vidi.c b/drivers/gpu/drm/exynos/exynos_drm_vidi.c index bb1550c4dd57..537027a74fd5 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_vidi.c +++ b/drivers/gpu/drm/exynos/exynos_drm_vidi.c | |||
| @@ -633,7 +633,7 @@ static int __devinit vidi_probe(struct platform_device *pdev) | |||
| 633 | 633 | ||
| 634 | DRM_DEBUG_KMS("%s\n", __FILE__); | 634 | DRM_DEBUG_KMS("%s\n", __FILE__); |
| 635 | 635 | ||
| 636 | ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); | 636 | ctx = devm_kzalloc(&pdev->dev, sizeof(*ctx), GFP_KERNEL); |
| 637 | if (!ctx) | 637 | if (!ctx) |
| 638 | return -ENOMEM; | 638 | return -ENOMEM; |
| 639 | 639 | ||
| @@ -673,8 +673,6 @@ static int __devexit vidi_remove(struct platform_device *pdev) | |||
| 673 | ctx->raw_edid = NULL; | 673 | ctx->raw_edid = NULL; |
| 674 | } | 674 | } |
| 675 | 675 | ||
| 676 | kfree(ctx); | ||
| 677 | |||
| 678 | return 0; | 676 | return 0; |
| 679 | } | 677 | } |
| 680 | 678 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c index 409e2ec1207c..a6aea6f3ea1a 100644 --- a/drivers/gpu/drm/exynos/exynos_hdmi.c +++ b/drivers/gpu/drm/exynos/exynos_hdmi.c | |||
| @@ -2172,7 +2172,7 @@ static int __devinit hdmi_resources_init(struct hdmi_context *hdata) | |||
| 2172 | 2172 | ||
| 2173 | DRM_DEBUG_KMS("HDMI resource init\n"); | 2173 | DRM_DEBUG_KMS("HDMI resource init\n"); |
| 2174 | 2174 | ||
| 2175 | memset(res, 0, sizeof *res); | 2175 | memset(res, 0, sizeof(*res)); |
| 2176 | 2176 | ||
| 2177 | /* get clocks, power */ | 2177 | /* get clocks, power */ |
| 2178 | res->hdmi = clk_get(dev, "hdmi"); | 2178 | res->hdmi = clk_get(dev, "hdmi"); |
| @@ -2204,7 +2204,7 @@ static int __devinit hdmi_resources_init(struct hdmi_context *hdata) | |||
| 2204 | clk_set_parent(res->sclk_hdmi, res->sclk_pixel); | 2204 | clk_set_parent(res->sclk_hdmi, res->sclk_pixel); |
| 2205 | 2205 | ||
| 2206 | res->regul_bulk = kzalloc(ARRAY_SIZE(supply) * | 2206 | res->regul_bulk = kzalloc(ARRAY_SIZE(supply) * |
| 2207 | sizeof res->regul_bulk[0], GFP_KERNEL); | 2207 | sizeof(res->regul_bulk[0]), GFP_KERNEL); |
| 2208 | if (!res->regul_bulk) { | 2208 | if (!res->regul_bulk) { |
| 2209 | DRM_ERROR("failed to get memory for regulators\n"); | 2209 | DRM_ERROR("failed to get memory for regulators\n"); |
| 2210 | goto fail; | 2210 | goto fail; |
| @@ -2243,7 +2243,7 @@ static int hdmi_resources_cleanup(struct hdmi_context *hdata) | |||
| 2243 | clk_put(res->sclk_hdmi); | 2243 | clk_put(res->sclk_hdmi); |
| 2244 | if (!IS_ERR_OR_NULL(res->hdmi)) | 2244 | if (!IS_ERR_OR_NULL(res->hdmi)) |
| 2245 | clk_put(res->hdmi); | 2245 | clk_put(res->hdmi); |
| 2246 | memset(res, 0, sizeof *res); | 2246 | memset(res, 0, sizeof(*res)); |
| 2247 | 2247 | ||
| 2248 | return 0; | 2248 | return 0; |
| 2249 | } | 2249 | } |
| @@ -2312,11 +2312,6 @@ static int __devinit hdmi_probe(struct platform_device *pdev) | |||
| 2312 | } | 2312 | } |
| 2313 | 2313 | ||
| 2314 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 2314 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 2315 | if (!res) { | ||
| 2316 | DRM_ERROR("failed to find registers\n"); | ||
| 2317 | ret = -ENOENT; | ||
| 2318 | goto err_resource; | ||
| 2319 | } | ||
| 2320 | 2315 | ||
| 2321 | hdata->regs = devm_request_and_ioremap(&pdev->dev, res); | 2316 | hdata->regs = devm_request_and_ioremap(&pdev->dev, res); |
| 2322 | if (!hdata->regs) { | 2317 | if (!hdata->regs) { |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 30fcc12f81dd..25b97d5e5fcb 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
| @@ -236,11 +236,11 @@ static inline void vp_filter_set(struct mixer_resources *res, | |||
| 236 | static void vp_default_filter(struct mixer_resources *res) | 236 | static void vp_default_filter(struct mixer_resources *res) |
| 237 | { | 237 | { |
| 238 | vp_filter_set(res, VP_POLY8_Y0_LL, | 238 | vp_filter_set(res, VP_POLY8_Y0_LL, |
| 239 | filter_y_horiz_tap8, sizeof filter_y_horiz_tap8); | 239 | filter_y_horiz_tap8, sizeof(filter_y_horiz_tap8)); |
| 240 | vp_filter_set(res, VP_POLY4_Y0_LL, | 240 | vp_filter_set(res, VP_POLY4_Y0_LL, |
| 241 | filter_y_vert_tap4, sizeof filter_y_vert_tap4); | 241 | filter_y_vert_tap4, sizeof(filter_y_vert_tap4)); |
| 242 | vp_filter_set(res, VP_POLY4_C0_LL, | 242 | vp_filter_set(res, VP_POLY4_C0_LL, |
| 243 | filter_cr_horiz_tap4, sizeof filter_cr_horiz_tap4); | 243 | filter_cr_horiz_tap4, sizeof(filter_cr_horiz_tap4)); |
| 244 | } | 244 | } |
| 245 | 245 | ||
| 246 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) | 246 | static void mixer_vsync_set_update(struct mixer_context *ctx, bool enable) |
diff --git a/drivers/gpu/drm/gma500/oaktrail_device.c b/drivers/gpu/drm/gma500/oaktrail_device.c index 0f9b7db80f6b..cf49ba5a54bf 100644 --- a/drivers/gpu/drm/gma500/oaktrail_device.c +++ b/drivers/gpu/drm/gma500/oaktrail_device.c | |||
| @@ -476,6 +476,7 @@ static const struct psb_offset oaktrail_regmap[2] = { | |||
| 476 | .pos = DSPAPOS, | 476 | .pos = DSPAPOS, |
| 477 | .surf = DSPASURF, | 477 | .surf = DSPASURF, |
| 478 | .addr = MRST_DSPABASE, | 478 | .addr = MRST_DSPABASE, |
| 479 | .base = MRST_DSPABASE, | ||
| 479 | .status = PIPEASTAT, | 480 | .status = PIPEASTAT, |
| 480 | .linoff = DSPALINOFF, | 481 | .linoff = DSPALINOFF, |
| 481 | .tileoff = DSPATILEOFF, | 482 | .tileoff = DSPATILEOFF, |
| @@ -499,6 +500,7 @@ static const struct psb_offset oaktrail_regmap[2] = { | |||
| 499 | .pos = DSPBPOS, | 500 | .pos = DSPBPOS, |
| 500 | .surf = DSPBSURF, | 501 | .surf = DSPBSURF, |
| 501 | .addr = DSPBBASE, | 502 | .addr = DSPBBASE, |
| 503 | .base = DSPBBASE, | ||
| 502 | .status = PIPEBSTAT, | 504 | .status = PIPEBSTAT, |
| 503 | .linoff = DSPBLINOFF, | 505 | .linoff = DSPBLINOFF, |
| 504 | .tileoff = DSPBTILEOFF, | 506 | .tileoff = DSPBTILEOFF, |
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index 57d892eaaa6e..463ec6871fe9 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
| @@ -115,6 +115,9 @@ static const struct file_operations i810_buffer_fops = { | |||
| 115 | .unlocked_ioctl = drm_ioctl, | 115 | .unlocked_ioctl = drm_ioctl, |
| 116 | .mmap = i810_mmap_buffers, | 116 | .mmap = i810_mmap_buffers, |
| 117 | .fasync = drm_fasync, | 117 | .fasync = drm_fasync, |
| 118 | #ifdef CONFIG_COMPAT | ||
| 119 | .compat_ioctl = drm_compat_ioctl, | ||
| 120 | #endif | ||
| 118 | .llseek = noop_llseek, | 121 | .llseek = noop_llseek, |
| 119 | }; | 122 | }; |
| 120 | 123 | ||
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c index f9924ad04d09..48cfcca2b350 100644 --- a/drivers/gpu/drm/i810/i810_drv.c +++ b/drivers/gpu/drm/i810/i810_drv.c | |||
| @@ -51,6 +51,9 @@ static const struct file_operations i810_driver_fops = { | |||
| 51 | .mmap = drm_mmap, | 51 | .mmap = drm_mmap, |
| 52 | .poll = drm_poll, | 52 | .poll = drm_poll, |
| 53 | .fasync = drm_fasync, | 53 | .fasync = drm_fasync, |
| 54 | #ifdef CONFIG_COMPAT | ||
| 55 | .compat_ioctl = drm_compat_ioctl, | ||
| 56 | #endif | ||
| 54 | .llseek = noop_llseek, | 57 | .llseek = noop_llseek, |
| 55 | }; | 58 | }; |
| 56 | 59 | ||
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index 9cf7dfe022b9..914c0dfabe60 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -1587,6 +1587,7 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags) | |||
| 1587 | spin_lock_init(&dev_priv->irq_lock); | 1587 | spin_lock_init(&dev_priv->irq_lock); |
| 1588 | spin_lock_init(&dev_priv->error_lock); | 1588 | spin_lock_init(&dev_priv->error_lock); |
| 1589 | spin_lock_init(&dev_priv->rps_lock); | 1589 | spin_lock_init(&dev_priv->rps_lock); |
| 1590 | spin_lock_init(&dev_priv->dpio_lock); | ||
| 1590 | 1591 | ||
| 1591 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) | 1592 | if (IS_IVYBRIDGE(dev) || IS_HASWELL(dev)) |
| 1592 | dev_priv->num_pipe = 3; | 1593 | dev_priv->num_pipe = 3; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 489e2b162b27..274d25de521e 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -3242,7 +3242,8 @@ i915_gem_object_pin(struct drm_i915_gem_object *obj, | |||
| 3242 | { | 3242 | { |
| 3243 | int ret; | 3243 | int ret; |
| 3244 | 3244 | ||
| 3245 | BUG_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT); | 3245 | if (WARN_ON(obj->pin_count == DRM_I915_GEM_OBJECT_MAX_PIN_COUNT)) |
| 3246 | return -EBUSY; | ||
| 3246 | 3247 | ||
| 3247 | if (obj->gtt_space != NULL) { | 3248 | if (obj->gtt_space != NULL) { |
| 3248 | if ((alignment && obj->gtt_offset & (alignment - 1)) || | 3249 | if ((alignment && obj->gtt_offset & (alignment - 1)) || |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 8a3828528b9d..5249640cce13 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
| @@ -2700,9 +2700,6 @@ void intel_irq_init(struct drm_device *dev) | |||
| 2700 | dev->driver->irq_handler = i8xx_irq_handler; | 2700 | dev->driver->irq_handler = i8xx_irq_handler; |
| 2701 | dev->driver->irq_uninstall = i8xx_irq_uninstall; | 2701 | dev->driver->irq_uninstall = i8xx_irq_uninstall; |
| 2702 | } else if (INTEL_INFO(dev)->gen == 3) { | 2702 | } else if (INTEL_INFO(dev)->gen == 3) { |
| 2703 | /* IIR "flip pending" means done if this bit is set */ | ||
| 2704 | I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); | ||
| 2705 | |||
| 2706 | dev->driver->irq_preinstall = i915_irq_preinstall; | 2703 | dev->driver->irq_preinstall = i915_irq_preinstall; |
| 2707 | dev->driver->irq_postinstall = i915_irq_postinstall; | 2704 | dev->driver->irq_postinstall = i915_irq_postinstall; |
| 2708 | dev->driver->irq_uninstall = i915_irq_uninstall; | 2705 | dev->driver->irq_uninstall = i915_irq_uninstall; |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 2dfa6cf4886b..c040aee1341c 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
| @@ -1376,7 +1376,8 @@ static void assert_pch_dp_disabled(struct drm_i915_private *dev_priv, | |||
| 1376 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", | 1376 | "PCH DP (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1377 | reg, pipe_name(pipe)); | 1377 | reg, pipe_name(pipe)); |
| 1378 | 1378 | ||
| 1379 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT), | 1379 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & DP_PORT_EN) == 0 |
| 1380 | && (val & DP_PIPEB_SELECT), | ||
| 1380 | "IBX PCH dp port still using transcoder B\n"); | 1381 | "IBX PCH dp port still using transcoder B\n"); |
| 1381 | } | 1382 | } |
| 1382 | 1383 | ||
| @@ -1388,7 +1389,8 @@ static void assert_pch_hdmi_disabled(struct drm_i915_private *dev_priv, | |||
| 1388 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", | 1389 | "PCH HDMI (0x%08x) enabled on transcoder %c, should be disabled\n", |
| 1389 | reg, pipe_name(pipe)); | 1390 | reg, pipe_name(pipe)); |
| 1390 | 1391 | ||
| 1391 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & SDVO_PIPE_B_SELECT), | 1392 | WARN(HAS_PCH_IBX(dev_priv->dev) && (val & PORT_ENABLE) == 0 |
| 1393 | && (val & SDVO_PIPE_B_SELECT), | ||
| 1392 | "IBX PCH hdmi port still using transcoder B\n"); | 1394 | "IBX PCH hdmi port still using transcoder B\n"); |
| 1393 | } | 1395 | } |
| 1394 | 1396 | ||
| @@ -4189,12 +4191,6 @@ static void i8xx_update_pll(struct drm_crtc *crtc, | |||
| 4189 | POSTING_READ(DPLL(pipe)); | 4191 | POSTING_READ(DPLL(pipe)); |
| 4190 | udelay(150); | 4192 | udelay(150); |
| 4191 | 4193 | ||
| 4192 | I915_WRITE(DPLL(pipe), dpll); | ||
| 4193 | |||
| 4194 | /* Wait for the clocks to stabilize. */ | ||
| 4195 | POSTING_READ(DPLL(pipe)); | ||
| 4196 | udelay(150); | ||
| 4197 | |||
| 4198 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. | 4194 | /* The LVDS pin pair needs to be on before the DPLLs are enabled. |
| 4199 | * This is an exception to the general rule that mode_set doesn't turn | 4195 | * This is an exception to the general rule that mode_set doesn't turn |
| 4200 | * things on. | 4196 | * things on. |
| @@ -4202,6 +4198,12 @@ static void i8xx_update_pll(struct drm_crtc *crtc, | |||
| 4202 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) | 4198 | if (intel_pipe_has_type(crtc, INTEL_OUTPUT_LVDS)) |
| 4203 | intel_update_lvds(crtc, clock, adjusted_mode); | 4199 | intel_update_lvds(crtc, clock, adjusted_mode); |
| 4204 | 4200 | ||
| 4201 | I915_WRITE(DPLL(pipe), dpll); | ||
| 4202 | |||
| 4203 | /* Wait for the clocks to stabilize. */ | ||
| 4204 | POSTING_READ(DPLL(pipe)); | ||
| 4205 | udelay(150); | ||
| 4206 | |||
| 4205 | /* The pixel multiplier can only be updated once the | 4207 | /* The pixel multiplier can only be updated once the |
| 4206 | * DPLL is enabled and the clocks are stable. | 4208 | * DPLL is enabled and the clocks are stable. |
| 4207 | * | 4209 | * |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index a6c426afaa7a..ace757af9133 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
| @@ -2533,14 +2533,10 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 2533 | break; | 2533 | break; |
| 2534 | } | 2534 | } |
| 2535 | 2535 | ||
| 2536 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
| 2537 | |||
| 2538 | /* Cache some DPCD data in the eDP case */ | 2536 | /* Cache some DPCD data in the eDP case */ |
| 2539 | if (is_edp(intel_dp)) { | 2537 | if (is_edp(intel_dp)) { |
| 2540 | bool ret; | ||
| 2541 | struct edp_power_seq cur, vbt; | 2538 | struct edp_power_seq cur, vbt; |
| 2542 | u32 pp_on, pp_off, pp_div; | 2539 | u32 pp_on, pp_off, pp_div; |
| 2543 | struct edid *edid; | ||
| 2544 | 2540 | ||
| 2545 | pp_on = I915_READ(PCH_PP_ON_DELAYS); | 2541 | pp_on = I915_READ(PCH_PP_ON_DELAYS); |
| 2546 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); | 2542 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); |
| @@ -2591,6 +2587,13 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
| 2591 | 2587 | ||
| 2592 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", | 2588 | DRM_DEBUG_KMS("backlight on delay %d, off delay %d\n", |
| 2593 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); | 2589 | intel_dp->backlight_on_delay, intel_dp->backlight_off_delay); |
| 2590 | } | ||
| 2591 | |||
| 2592 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
| 2593 | |||
| 2594 | if (is_edp(intel_dp)) { | ||
| 2595 | bool ret; | ||
| 2596 | struct edid *edid; | ||
| 2594 | 2597 | ||
| 2595 | ironlake_edp_panel_vdd_on(intel_dp); | 2598 | ironlake_edp_panel_vdd_on(intel_dp); |
| 2596 | ret = intel_dp_get_dpcd(intel_dp); | 2599 | ret = intel_dp_get_dpcd(intel_dp); |
diff --git a/drivers/gpu/drm/i915/intel_hdmi.c b/drivers/gpu/drm/i915/intel_hdmi.c index 98f602427eb8..12dc3308ab8c 100644 --- a/drivers/gpu/drm/i915/intel_hdmi.c +++ b/drivers/gpu/drm/i915/intel_hdmi.c | |||
| @@ -609,7 +609,7 @@ static void intel_hdmi_dpms(struct drm_encoder *encoder, int mode) | |||
| 609 | u32 temp; | 609 | u32 temp; |
| 610 | u32 enable_bits = SDVO_ENABLE; | 610 | u32 enable_bits = SDVO_ENABLE; |
| 611 | 611 | ||
| 612 | if (intel_hdmi->has_audio) | 612 | if (intel_hdmi->has_audio || mode != DRM_MODE_DPMS_ON) |
| 613 | enable_bits |= SDVO_AUDIO_ENABLE; | 613 | enable_bits |= SDVO_AUDIO_ENABLE; |
| 614 | 614 | ||
| 615 | temp = I915_READ(intel_hdmi->sdvox_reg); | 615 | temp = I915_READ(intel_hdmi->sdvox_reg); |
diff --git a/drivers/gpu/drm/i915/intel_panel.c b/drivers/gpu/drm/i915/intel_panel.c index 3df4f5fa892a..e019b2369861 100644 --- a/drivers/gpu/drm/i915/intel_panel.c +++ b/drivers/gpu/drm/i915/intel_panel.c | |||
| @@ -162,19 +162,12 @@ static u32 i915_read_blc_pwm_ctl(struct drm_i915_private *dev_priv) | |||
| 162 | return val; | 162 | return val; |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | 165 | static u32 _intel_panel_get_max_backlight(struct drm_device *dev) |
| 166 | { | 166 | { |
| 167 | struct drm_i915_private *dev_priv = dev->dev_private; | 167 | struct drm_i915_private *dev_priv = dev->dev_private; |
| 168 | u32 max; | 168 | u32 max; |
| 169 | 169 | ||
| 170 | max = i915_read_blc_pwm_ctl(dev_priv); | 170 | max = i915_read_blc_pwm_ctl(dev_priv); |
| 171 | if (max == 0) { | ||
| 172 | /* XXX add code here to query mode clock or hardware clock | ||
| 173 | * and program max PWM appropriately. | ||
| 174 | */ | ||
| 175 | pr_warn_once("fixme: max PWM is zero\n"); | ||
| 176 | return 1; | ||
| 177 | } | ||
| 178 | 171 | ||
| 179 | if (HAS_PCH_SPLIT(dev)) { | 172 | if (HAS_PCH_SPLIT(dev)) { |
| 180 | max >>= 16; | 173 | max >>= 16; |
| @@ -188,6 +181,22 @@ u32 intel_panel_get_max_backlight(struct drm_device *dev) | |||
| 188 | max *= 0xff; | 181 | max *= 0xff; |
| 189 | } | 182 | } |
| 190 | 183 | ||
| 184 | return max; | ||
| 185 | } | ||
| 186 | |||
| 187 | u32 intel_panel_get_max_backlight(struct drm_device *dev) | ||
| 188 | { | ||
| 189 | u32 max; | ||
| 190 | |||
| 191 | max = _intel_panel_get_max_backlight(dev); | ||
| 192 | if (max == 0) { | ||
| 193 | /* XXX add code here to query mode clock or hardware clock | ||
| 194 | * and program max PWM appropriately. | ||
| 195 | */ | ||
| 196 | pr_warn_once("fixme: max PWM is zero\n"); | ||
| 197 | return 1; | ||
| 198 | } | ||
| 199 | |||
| 191 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); | 200 | DRM_DEBUG_DRIVER("max backlight PWM = %d\n", max); |
| 192 | return max; | 201 | return max; |
| 193 | } | 202 | } |
| @@ -424,7 +433,11 @@ int intel_panel_setup_backlight(struct drm_device *dev) | |||
| 424 | 433 | ||
| 425 | memset(&props, 0, sizeof(props)); | 434 | memset(&props, 0, sizeof(props)); |
| 426 | props.type = BACKLIGHT_RAW; | 435 | props.type = BACKLIGHT_RAW; |
| 427 | props.max_brightness = intel_panel_get_max_backlight(dev); | 436 | props.max_brightness = _intel_panel_get_max_backlight(dev); |
| 437 | if (props.max_brightness == 0) { | ||
| 438 | DRM_ERROR("Failed to get maximum backlight value\n"); | ||
| 439 | return -ENODEV; | ||
| 440 | } | ||
| 428 | dev_priv->backlight = | 441 | dev_priv->backlight = |
| 429 | backlight_device_register("intel_backlight", | 442 | backlight_device_register("intel_backlight", |
| 430 | &connector->kdev, dev, | 443 | &connector->kdev, dev, |
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c index 1881c8c83f0e..ba8a27b1757a 100644 --- a/drivers/gpu/drm/i915/intel_pm.c +++ b/drivers/gpu/drm/i915/intel_pm.c | |||
| @@ -3672,6 +3672,9 @@ static void gen3_init_clock_gating(struct drm_device *dev) | |||
| 3672 | 3672 | ||
| 3673 | if (IS_PINEVIEW(dev)) | 3673 | if (IS_PINEVIEW(dev)) |
| 3674 | I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); | 3674 | I915_WRITE(ECOSKPD, _MASKED_BIT_ENABLE(ECO_GATING_CX_ONLY)); |
| 3675 | |||
| 3676 | /* IIR "flip pending" means done if this bit is set */ | ||
| 3677 | I915_WRITE(ECOSKPD, _MASKED_BIT_DISABLE(ECO_FLIP_DONE)); | ||
| 3675 | } | 3678 | } |
| 3676 | 3679 | ||
| 3677 | static void i85x_init_clock_gating(struct drm_device *dev) | 3680 | static void i85x_init_clock_gating(struct drm_device *dev) |
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c index d81bb0bf2885..123afd357611 100644 --- a/drivers/gpu/drm/i915/intel_sdvo.c +++ b/drivers/gpu/drm/i915/intel_sdvo.c | |||
| @@ -2573,7 +2573,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2573 | hotplug_mask = intel_sdvo->is_sdvob ? | 2573 | hotplug_mask = intel_sdvo->is_sdvob ? |
| 2574 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; | 2574 | SDVOB_HOTPLUG_INT_STATUS_I915 : SDVOC_HOTPLUG_INT_STATUS_I915; |
| 2575 | } | 2575 | } |
| 2576 | dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
| 2577 | 2576 | ||
| 2578 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); | 2577 | drm_encoder_helper_add(&intel_encoder->base, &intel_sdvo_helper_funcs); |
| 2579 | 2578 | ||
| @@ -2581,14 +2580,6 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2581 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) | 2580 | if (!intel_sdvo_get_capabilities(intel_sdvo, &intel_sdvo->caps)) |
| 2582 | goto err; | 2581 | goto err; |
| 2583 | 2582 | ||
| 2584 | /* Set up hotplug command - note paranoia about contents of reply. | ||
| 2585 | * We assume that the hardware is in a sane state, and only touch | ||
| 2586 | * the bits we think we understand. | ||
| 2587 | */ | ||
| 2588 | intel_sdvo_get_value(intel_sdvo, SDVO_CMD_GET_ACTIVE_HOT_PLUG, | ||
| 2589 | &intel_sdvo->hotplug_active, 2); | ||
| 2590 | intel_sdvo->hotplug_active[0] &= ~0x3; | ||
| 2591 | |||
| 2592 | if (intel_sdvo_output_setup(intel_sdvo, | 2583 | if (intel_sdvo_output_setup(intel_sdvo, |
| 2593 | intel_sdvo->caps.output_flags) != true) { | 2584 | intel_sdvo->caps.output_flags) != true) { |
| 2594 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", | 2585 | DRM_DEBUG_KMS("SDVO output failed to setup on %s\n", |
| @@ -2596,6 +2587,12 @@ bool intel_sdvo_init(struct drm_device *dev, uint32_t sdvo_reg, bool is_sdvob) | |||
| 2596 | goto err; | 2587 | goto err; |
| 2597 | } | 2588 | } |
| 2598 | 2589 | ||
| 2590 | /* Only enable the hotplug irq if we need it, to work around noisy | ||
| 2591 | * hotplug lines. | ||
| 2592 | */ | ||
| 2593 | if (intel_sdvo->hotplug_active[0]) | ||
| 2594 | dev_priv->hotplug_supported_mask |= hotplug_mask; | ||
| 2595 | |||
| 2599 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); | 2596 | intel_sdvo_select_ddc_bus(dev_priv, intel_sdvo, sdvo_reg); |
| 2600 | 2597 | ||
| 2601 | /* Set the input timing to the screen. Assume always input 0. */ | 2598 | /* Set the input timing to the screen. Assume always input 0. */ |
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c index ea1024d79974..e5f145d2cb3b 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.c +++ b/drivers/gpu/drm/mgag200/mgag200_drv.c | |||
| @@ -84,6 +84,9 @@ static const struct file_operations mgag200_driver_fops = { | |||
| 84 | .mmap = mgag200_mmap, | 84 | .mmap = mgag200_mmap, |
| 85 | .poll = drm_poll, | 85 | .poll = drm_poll, |
| 86 | .fasync = drm_fasync, | 86 | .fasync = drm_fasync, |
| 87 | #ifdef CONFIG_COMPAT | ||
| 88 | .compat_ioctl = drm_compat_ioctl, | ||
| 89 | #endif | ||
| 87 | .read = drm_read, | 90 | .read = drm_read, |
| 88 | }; | 91 | }; |
| 89 | 92 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_abi16.c b/drivers/gpu/drm/nouveau/nouveau_abi16.c index ff23d88880e5..3ca240b4413d 100644 --- a/drivers/gpu/drm/nouveau/nouveau_abi16.c +++ b/drivers/gpu/drm/nouveau/nouveau_abi16.c | |||
| @@ -179,7 +179,7 @@ nouveau_abi16_ioctl_grobj_alloc(ABI16_IOCTL_ARGS) | |||
| 179 | return 0; | 179 | return 0; |
| 180 | } else | 180 | } else |
| 181 | if (init->class == 0x906e) { | 181 | if (init->class == 0x906e) { |
| 182 | NV_ERROR(dev, "906e not supported yet\n"); | 182 | NV_DEBUG(dev, "906e not supported yet\n"); |
| 183 | return -EINVAL; | 183 | return -EINVAL; |
| 184 | } | 184 | } |
| 185 | 185 | ||
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c index 69688ef5cf46..7e16dc5e6467 100644 --- a/drivers/gpu/drm/nouveau/nouveau_display.c +++ b/drivers/gpu/drm/nouveau/nouveau_display.c | |||
| @@ -598,7 +598,7 @@ nouveau_display_dumb_create(struct drm_file *file_priv, struct drm_device *dev, | |||
| 598 | args->size = args->pitch * args->height; | 598 | args->size = args->pitch * args->height; |
| 599 | args->size = roundup(args->size, PAGE_SIZE); | 599 | args->size = roundup(args->size, PAGE_SIZE); |
| 600 | 600 | ||
| 601 | ret = nouveau_gem_new(dev, args->size, 0, TTM_PL_FLAG_VRAM, 0, 0, &bo); | 601 | ret = nouveau_gem_new(dev, args->size, 0, NOUVEAU_GEM_DOMAIN_VRAM, 0, 0, &bo); |
| 602 | if (ret) | 602 | if (ret) |
| 603 | return ret; | 603 | return ret; |
| 604 | 604 | ||
diff --git a/drivers/gpu/drm/nouveau/nv50_gpio.c b/drivers/gpu/drm/nouveau/nv50_gpio.c index f429e6a8ca7a..c399d510b27a 100644 --- a/drivers/gpu/drm/nouveau/nv50_gpio.c +++ b/drivers/gpu/drm/nouveau/nv50_gpio.c | |||
| @@ -22,6 +22,7 @@ | |||
| 22 | * Authors: Ben Skeggs | 22 | * Authors: Ben Skeggs |
| 23 | */ | 23 | */ |
| 24 | 24 | ||
| 25 | #include <linux/dmi.h> | ||
| 25 | #include "drmP.h" | 26 | #include "drmP.h" |
| 26 | #include "nouveau_drv.h" | 27 | #include "nouveau_drv.h" |
| 27 | #include "nouveau_hw.h" | 28 | #include "nouveau_hw.h" |
| @@ -110,11 +111,26 @@ nv50_gpio_isr(struct drm_device *dev) | |||
| 110 | nv_wr32(dev, 0xe074, intr1); | 111 | nv_wr32(dev, 0xe074, intr1); |
| 111 | } | 112 | } |
| 112 | 113 | ||
| 114 | static struct dmi_system_id gpio_reset_ids[] = { | ||
| 115 | { | ||
| 116 | .ident = "Apple Macbook 10,1", | ||
| 117 | .matches = { | ||
| 118 | DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."), | ||
| 119 | DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro10,1"), | ||
| 120 | } | ||
| 121 | }, | ||
| 122 | { } | ||
| 123 | }; | ||
| 124 | |||
| 113 | int | 125 | int |
| 114 | nv50_gpio_init(struct drm_device *dev) | 126 | nv50_gpio_init(struct drm_device *dev) |
| 115 | { | 127 | { |
| 116 | struct drm_nouveau_private *dev_priv = dev->dev_private; | 128 | struct drm_nouveau_private *dev_priv = dev->dev_private; |
| 117 | 129 | ||
| 130 | /* initialise gpios and routing to vbios defaults */ | ||
| 131 | if (dmi_check_system(gpio_reset_ids)) | ||
| 132 | nouveau_gpio_reset(dev); | ||
| 133 | |||
| 118 | /* disable, and ack any pending gpio interrupts */ | 134 | /* disable, and ack any pending gpio interrupts */ |
| 119 | nv_wr32(dev, 0xe050, 0x00000000); | 135 | nv_wr32(dev, 0xe050, 0x00000000); |
| 120 | nv_wr32(dev, 0xe054, 0xffffffff); | 136 | nv_wr32(dev, 0xe054, 0xffffffff); |
diff --git a/drivers/gpu/drm/nouveau/nvc0_fb.c b/drivers/gpu/drm/nouveau/nvc0_fb.c index f704e942372e..f376c39310df 100644 --- a/drivers/gpu/drm/nouveau/nvc0_fb.c +++ b/drivers/gpu/drm/nouveau/nvc0_fb.c | |||
| @@ -124,6 +124,7 @@ nvc0_fb_init(struct drm_device *dev) | |||
| 124 | priv = dev_priv->engine.fb.priv; | 124 | priv = dev_priv->engine.fb.priv; |
| 125 | 125 | ||
| 126 | nv_wr32(dev, 0x100c10, priv->r100c10 >> 8); | 126 | nv_wr32(dev, 0x100c10, priv->r100c10 >> 8); |
| 127 | nv_mask(dev, 0x17e820, 0x00100000, 0x00000000); /* NV_PLTCG_INTR_EN */ | ||
| 127 | return 0; | 128 | return 0; |
| 128 | } | 129 | } |
| 129 | 130 | ||
diff --git a/drivers/gpu/drm/nouveau/nvc0_fifo.c b/drivers/gpu/drm/nouveau/nvc0_fifo.c index 7d85553d518c..cd39eb99f5b1 100644 --- a/drivers/gpu/drm/nouveau/nvc0_fifo.c +++ b/drivers/gpu/drm/nouveau/nvc0_fifo.c | |||
| @@ -373,7 +373,8 @@ nvc0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit) | |||
| 373 | static void | 373 | static void |
| 374 | nvc0_fifo_isr(struct drm_device *dev) | 374 | nvc0_fifo_isr(struct drm_device *dev) |
| 375 | { | 375 | { |
| 376 | u32 stat = nv_rd32(dev, 0x002100); | 376 | u32 mask = nv_rd32(dev, 0x002140); |
| 377 | u32 stat = nv_rd32(dev, 0x002100) & mask; | ||
| 377 | 378 | ||
| 378 | if (stat & 0x00000100) { | 379 | if (stat & 0x00000100) { |
| 379 | NV_INFO(dev, "PFIFO: unknown status 0x00000100\n"); | 380 | NV_INFO(dev, "PFIFO: unknown status 0x00000100\n"); |
diff --git a/drivers/gpu/drm/nouveau/nvd0_display.c b/drivers/gpu/drm/nouveau/nvd0_display.c index dac525b2994e..8a2fc89b7763 100644 --- a/drivers/gpu/drm/nouveau/nvd0_display.c +++ b/drivers/gpu/drm/nouveau/nvd0_display.c | |||
| @@ -1510,10 +1510,10 @@ nvd0_sor_mode_set(struct drm_encoder *encoder, struct drm_display_mode *umode, | |||
| 1510 | case OUTPUT_DP: | 1510 | case OUTPUT_DP: |
| 1511 | if (nv_connector->base.display_info.bpc == 6) { | 1511 | if (nv_connector->base.display_info.bpc == 6) { |
| 1512 | nv_encoder->dp.datarate = mode->clock * 18 / 8; | 1512 | nv_encoder->dp.datarate = mode->clock * 18 / 8; |
| 1513 | syncs |= 0x00000140; | 1513 | syncs |= 0x00000002 << 6; |
| 1514 | } else { | 1514 | } else { |
| 1515 | nv_encoder->dp.datarate = mode->clock * 24 / 8; | 1515 | nv_encoder->dp.datarate = mode->clock * 24 / 8; |
| 1516 | syncs |= 0x00000180; | 1516 | syncs |= 0x00000005 << 6; |
| 1517 | } | 1517 | } |
| 1518 | 1518 | ||
| 1519 | if (nv_encoder->dcb->sorconf.link & 1) | 1519 | if (nv_encoder->dcb->sorconf.link & 1) |
diff --git a/drivers/gpu/drm/nouveau/nve0_fifo.c b/drivers/gpu/drm/nouveau/nve0_fifo.c index e98d144e6eb9..281bece751b6 100644 --- a/drivers/gpu/drm/nouveau/nve0_fifo.c +++ b/drivers/gpu/drm/nouveau/nve0_fifo.c | |||
| @@ -345,7 +345,8 @@ nve0_fifo_isr_subfifo_intr(struct drm_device *dev, int unit) | |||
| 345 | static void | 345 | static void |
| 346 | nve0_fifo_isr(struct drm_device *dev) | 346 | nve0_fifo_isr(struct drm_device *dev) |
| 347 | { | 347 | { |
| 348 | u32 stat = nv_rd32(dev, 0x002100); | 348 | u32 mask = nv_rd32(dev, 0x002140); |
| 349 | u32 stat = nv_rd32(dev, 0x002100) & mask; | ||
| 349 | 350 | ||
| 350 | if (stat & 0x00000100) { | 351 | if (stat & 0x00000100) { |
| 351 | NV_INFO(dev, "PFIFO: unknown status 0x00000100\n"); | 352 | NV_INFO(dev, "PFIFO: unknown status 0x00000100\n"); |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 8acb34fd3fd5..8d7e33a0b243 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -1182,7 +1182,8 @@ int r100_cp_init(struct radeon_device *rdev, unsigned ring_size) | |||
| 1182 | ring->ready = true; | 1182 | ring->ready = true; |
| 1183 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); | 1183 | radeon_ttm_set_active_vram_size(rdev, rdev->mc.real_vram_size); |
| 1184 | 1184 | ||
| 1185 | if (radeon_ring_supports_scratch_reg(rdev, ring)) { | 1185 | if (!ring->rptr_save_reg /* not resuming from suspend */ |
| 1186 | && radeon_ring_supports_scratch_reg(rdev, ring)) { | ||
| 1186 | r = radeon_scratch_get(rdev, &ring->rptr_save_reg); | 1187 | r = radeon_scratch_get(rdev, &ring->rptr_save_reg); |
| 1187 | if (r) { | 1188 | if (r) { |
| 1188 | DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r); | 1189 | DRM_ERROR("failed to get scratch reg for rptr save (%d).\n", r); |
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 7b737b9339ad..2a59375dbe52 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
| @@ -131,7 +131,7 @@ int radeon_fence_emit(struct radeon_device *rdev, | |||
| 131 | */ | 131 | */ |
| 132 | void radeon_fence_process(struct radeon_device *rdev, int ring) | 132 | void radeon_fence_process(struct radeon_device *rdev, int ring) |
| 133 | { | 133 | { |
| 134 | uint64_t seq, last_seq; | 134 | uint64_t seq, last_seq, last_emitted; |
| 135 | unsigned count_loop = 0; | 135 | unsigned count_loop = 0; |
| 136 | bool wake = false; | 136 | bool wake = false; |
| 137 | 137 | ||
| @@ -158,13 +158,15 @@ void radeon_fence_process(struct radeon_device *rdev, int ring) | |||
| 158 | */ | 158 | */ |
| 159 | last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq); | 159 | last_seq = atomic64_read(&rdev->fence_drv[ring].last_seq); |
| 160 | do { | 160 | do { |
| 161 | last_emitted = rdev->fence_drv[ring].sync_seq[ring]; | ||
| 161 | seq = radeon_fence_read(rdev, ring); | 162 | seq = radeon_fence_read(rdev, ring); |
| 162 | seq |= last_seq & 0xffffffff00000000LL; | 163 | seq |= last_seq & 0xffffffff00000000LL; |
| 163 | if (seq < last_seq) { | 164 | if (seq < last_seq) { |
| 164 | seq += 0x100000000LL; | 165 | seq &= 0xffffffff; |
| 166 | seq |= last_emitted & 0xffffffff00000000LL; | ||
| 165 | } | 167 | } |
| 166 | 168 | ||
| 167 | if (seq == last_seq) { | 169 | if (seq <= last_seq || seq > last_emitted) { |
| 168 | break; | 170 | break; |
| 169 | } | 171 | } |
| 170 | /* If we loop over we don't want to return without | 172 | /* If we loop over we don't want to return without |
diff --git a/drivers/gpu/drm/savage/savage_drv.c b/drivers/gpu/drm/savage/savage_drv.c index d31d4cca9a4c..c5a164337bd5 100644 --- a/drivers/gpu/drm/savage/savage_drv.c +++ b/drivers/gpu/drm/savage/savage_drv.c | |||
| @@ -43,6 +43,9 @@ static const struct file_operations savage_driver_fops = { | |||
| 43 | .mmap = drm_mmap, | 43 | .mmap = drm_mmap, |
| 44 | .poll = drm_poll, | 44 | .poll = drm_poll, |
| 45 | .fasync = drm_fasync, | 45 | .fasync = drm_fasync, |
| 46 | #ifdef CONFIG_COMPAT | ||
| 47 | .compat_ioctl = drm_compat_ioctl, | ||
| 48 | #endif | ||
| 46 | .llseek = noop_llseek, | 49 | .llseek = noop_llseek, |
| 47 | }; | 50 | }; |
| 48 | 51 | ||
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c index 7f119870147c..867dc03000e6 100644 --- a/drivers/gpu/drm/sis/sis_drv.c +++ b/drivers/gpu/drm/sis/sis_drv.c | |||
| @@ -74,6 +74,9 @@ static const struct file_operations sis_driver_fops = { | |||
| 74 | .mmap = drm_mmap, | 74 | .mmap = drm_mmap, |
| 75 | .poll = drm_poll, | 75 | .poll = drm_poll, |
| 76 | .fasync = drm_fasync, | 76 | .fasync = drm_fasync, |
| 77 | #ifdef CONFIG_COMPAT | ||
| 78 | .compat_ioctl = drm_compat_ioctl, | ||
| 79 | #endif | ||
| 77 | .llseek = noop_llseek, | 80 | .llseek = noop_llseek, |
| 78 | }; | 81 | }; |
| 79 | 82 | ||
diff --git a/drivers/gpu/drm/tdfx/tdfx_drv.c b/drivers/gpu/drm/tdfx/tdfx_drv.c index 90f6b13acfac..a7f4d6bd1330 100644 --- a/drivers/gpu/drm/tdfx/tdfx_drv.c +++ b/drivers/gpu/drm/tdfx/tdfx_drv.c | |||
| @@ -49,6 +49,9 @@ static const struct file_operations tdfx_driver_fops = { | |||
| 49 | .mmap = drm_mmap, | 49 | .mmap = drm_mmap, |
| 50 | .poll = drm_poll, | 50 | .poll = drm_poll, |
| 51 | .fasync = drm_fasync, | 51 | .fasync = drm_fasync, |
| 52 | #ifdef CONFIG_COMPAT | ||
| 53 | .compat_ioctl = drm_compat_ioctl, | ||
| 54 | #endif | ||
| 52 | .llseek = noop_llseek, | 55 | .llseek = noop_llseek, |
| 53 | }; | 56 | }; |
| 54 | 57 | ||
diff --git a/drivers/gpu/drm/udl/udl_connector.c b/drivers/gpu/drm/udl/udl_connector.c index ba055e9ca007..8d9dc44f1f94 100644 --- a/drivers/gpu/drm/udl/udl_connector.c +++ b/drivers/gpu/drm/udl/udl_connector.c | |||
| @@ -69,6 +69,13 @@ static int udl_get_modes(struct drm_connector *connector) | |||
| 69 | static int udl_mode_valid(struct drm_connector *connector, | 69 | static int udl_mode_valid(struct drm_connector *connector, |
| 70 | struct drm_display_mode *mode) | 70 | struct drm_display_mode *mode) |
| 71 | { | 71 | { |
| 72 | struct udl_device *udl = connector->dev->dev_private; | ||
| 73 | if (!udl->sku_pixel_limit) | ||
| 74 | return 0; | ||
| 75 | |||
| 76 | if (mode->vdisplay * mode->hdisplay > udl->sku_pixel_limit) | ||
| 77 | return MODE_VIRTUAL_Y; | ||
| 78 | |||
| 72 | return 0; | 79 | return 0; |
| 73 | } | 80 | } |
| 74 | 81 | ||
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index 6e52069894b3..9f84128505bb 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c | |||
| @@ -66,6 +66,9 @@ static const struct file_operations udl_driver_fops = { | |||
| 66 | .unlocked_ioctl = drm_ioctl, | 66 | .unlocked_ioctl = drm_ioctl, |
| 67 | .release = drm_release, | 67 | .release = drm_release, |
| 68 | .fasync = drm_fasync, | 68 | .fasync = drm_fasync, |
| 69 | #ifdef CONFIG_COMPAT | ||
| 70 | .compat_ioctl = drm_compat_ioctl, | ||
| 71 | #endif | ||
| 69 | .llseek = noop_llseek, | 72 | .llseek = noop_llseek, |
| 70 | }; | 73 | }; |
| 71 | 74 | ||
diff --git a/drivers/gpu/drm/via/via_drv.c b/drivers/gpu/drm/via/via_drv.c index e927b4c052f5..af1b914b17e3 100644 --- a/drivers/gpu/drm/via/via_drv.c +++ b/drivers/gpu/drm/via/via_drv.c | |||
| @@ -65,6 +65,9 @@ static const struct file_operations via_driver_fops = { | |||
| 65 | .mmap = drm_mmap, | 65 | .mmap = drm_mmap, |
| 66 | .poll = drm_poll, | 66 | .poll = drm_poll, |
| 67 | .fasync = drm_fasync, | 67 | .fasync = drm_fasync, |
| 68 | #ifdef CONFIG_COMPAT | ||
| 69 | .compat_ioctl = drm_compat_ioctl, | ||
| 70 | #endif | ||
| 68 | .llseek = noop_llseek, | 71 | .llseek = noop_llseek, |
| 69 | }; | 72 | }; |
| 70 | 73 | ||
diff --git a/drivers/gpu/drm/vmwgfx/Kconfig b/drivers/gpu/drm/vmwgfx/Kconfig index 794ff67c5701..b71bcd0bfbbf 100644 --- a/drivers/gpu/drm/vmwgfx/Kconfig +++ b/drivers/gpu/drm/vmwgfx/Kconfig | |||
| @@ -12,3 +12,11 @@ config DRM_VMWGFX | |||
| 12 | This is a KMS enabled DRM driver for the VMware SVGA2 | 12 | This is a KMS enabled DRM driver for the VMware SVGA2 |
| 13 | virtual hardware. | 13 | virtual hardware. |
| 14 | The compiled module will be called "vmwgfx.ko". | 14 | The compiled module will be called "vmwgfx.ko". |
| 15 | |||
| 16 | config DRM_VMWGFX_FBCON | ||
| 17 | depends on DRM_VMWGFX | ||
| 18 | bool "Enable framebuffer console under vmwgfx by default" | ||
| 19 | help | ||
| 20 | Choose this option if you are shipping a new vmwgfx | ||
| 21 | userspace driver that supports using the kernel driver. | ||
| 22 | |||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c index 4d9edead01ac..ba2c35dbf10e 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | |||
| @@ -182,8 +182,9 @@ static struct pci_device_id vmw_pci_id_list[] = { | |||
| 182 | {0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII}, | 182 | {0x15ad, 0x0405, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VMWGFX_CHIP_SVGAII}, |
| 183 | {0, 0, 0} | 183 | {0, 0, 0} |
| 184 | }; | 184 | }; |
| 185 | MODULE_DEVICE_TABLE(pci, vmw_pci_id_list); | ||
| 185 | 186 | ||
| 186 | static int enable_fbdev; | 187 | static int enable_fbdev = IS_ENABLED(CONFIG_DRM_VMWGFX_FBCON); |
| 187 | 188 | ||
| 188 | static int vmw_probe(struct pci_dev *, const struct pci_device_id *); | 189 | static int vmw_probe(struct pci_dev *, const struct pci_device_id *); |
| 189 | static void vmw_master_init(struct vmw_master *); | 190 | static void vmw_master_init(struct vmw_master *); |
| @@ -1154,6 +1155,11 @@ static struct drm_driver driver = { | |||
| 1154 | .open = vmw_driver_open, | 1155 | .open = vmw_driver_open, |
| 1155 | .preclose = vmw_preclose, | 1156 | .preclose = vmw_preclose, |
| 1156 | .postclose = vmw_postclose, | 1157 | .postclose = vmw_postclose, |
| 1158 | |||
| 1159 | .dumb_create = vmw_dumb_create, | ||
| 1160 | .dumb_map_offset = vmw_dumb_map_offset, | ||
| 1161 | .dumb_destroy = vmw_dumb_destroy, | ||
| 1162 | |||
| 1157 | .fops = &vmwgfx_driver_fops, | 1163 | .fops = &vmwgfx_driver_fops, |
| 1158 | .name = VMWGFX_DRIVER_NAME, | 1164 | .name = VMWGFX_DRIVER_NAME, |
| 1159 | .desc = VMWGFX_DRIVER_DESC, | 1165 | .desc = VMWGFX_DRIVER_DESC, |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h index d0f2c079ee27..29c984ff7f23 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | |||
| @@ -645,6 +645,16 @@ int vmw_kms_readback(struct vmw_private *dev_priv, | |||
| 645 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, | 645 | int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, |
| 646 | struct drm_file *file_priv); | 646 | struct drm_file *file_priv); |
| 647 | 647 | ||
| 648 | int vmw_dumb_create(struct drm_file *file_priv, | ||
| 649 | struct drm_device *dev, | ||
| 650 | struct drm_mode_create_dumb *args); | ||
| 651 | |||
| 652 | int vmw_dumb_map_offset(struct drm_file *file_priv, | ||
| 653 | struct drm_device *dev, uint32_t handle, | ||
| 654 | uint64_t *offset); | ||
| 655 | int vmw_dumb_destroy(struct drm_file *file_priv, | ||
| 656 | struct drm_device *dev, | ||
| 657 | uint32_t handle); | ||
| 648 | /** | 658 | /** |
| 649 | * Overlay control - vmwgfx_overlay.c | 659 | * Overlay control - vmwgfx_overlay.c |
| 650 | */ | 660 | */ |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c index f2fb8f15e2f1..7e0743358dff 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fence.c | |||
| @@ -1018,7 +1018,7 @@ int vmw_event_fence_action_create(struct drm_file *file_priv, | |||
| 1018 | } | 1018 | } |
| 1019 | 1019 | ||
| 1020 | 1020 | ||
| 1021 | event = kzalloc(sizeof(event->event), GFP_KERNEL); | 1021 | event = kzalloc(sizeof(*event), GFP_KERNEL); |
| 1022 | if (unlikely(event == NULL)) { | 1022 | if (unlikely(event == NULL)) { |
| 1023 | DRM_ERROR("Failed to allocate an event.\n"); | 1023 | DRM_ERROR("Failed to allocate an event.\n"); |
| 1024 | ret = -ENOMEM; | 1024 | ret = -ENOMEM; |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c index 22bf9a21ec71..2c6ffe0e2c07 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_resource.c | |||
| @@ -1917,3 +1917,76 @@ err_ref: | |||
| 1917 | vmw_resource_unreference(&res); | 1917 | vmw_resource_unreference(&res); |
| 1918 | return ret; | 1918 | return ret; |
| 1919 | } | 1919 | } |
| 1920 | |||
| 1921 | |||
| 1922 | int vmw_dumb_create(struct drm_file *file_priv, | ||
| 1923 | struct drm_device *dev, | ||
| 1924 | struct drm_mode_create_dumb *args) | ||
| 1925 | { | ||
| 1926 | struct vmw_private *dev_priv = vmw_priv(dev); | ||
| 1927 | struct vmw_master *vmaster = vmw_master(file_priv->master); | ||
| 1928 | struct vmw_user_dma_buffer *vmw_user_bo; | ||
| 1929 | struct ttm_buffer_object *tmp; | ||
| 1930 | int ret; | ||
| 1931 | |||
| 1932 | args->pitch = args->width * ((args->bpp + 7) / 8); | ||
| 1933 | args->size = args->pitch * args->height; | ||
| 1934 | |||
| 1935 | vmw_user_bo = kzalloc(sizeof(*vmw_user_bo), GFP_KERNEL); | ||
| 1936 | if (vmw_user_bo == NULL) | ||
| 1937 | return -ENOMEM; | ||
| 1938 | |||
| 1939 | ret = ttm_read_lock(&vmaster->lock, true); | ||
| 1940 | if (ret != 0) { | ||
| 1941 | kfree(vmw_user_bo); | ||
| 1942 | return ret; | ||
| 1943 | } | ||
| 1944 | |||
| 1945 | ret = vmw_dmabuf_init(dev_priv, &vmw_user_bo->dma, args->size, | ||
| 1946 | &vmw_vram_sys_placement, true, | ||
| 1947 | &vmw_user_dmabuf_destroy); | ||
| 1948 | if (ret != 0) | ||
| 1949 | goto out_no_dmabuf; | ||
| 1950 | |||
| 1951 | tmp = ttm_bo_reference(&vmw_user_bo->dma.base); | ||
| 1952 | ret = ttm_base_object_init(vmw_fpriv(file_priv)->tfile, | ||
| 1953 | &vmw_user_bo->base, | ||
| 1954 | false, | ||
| 1955 | ttm_buffer_type, | ||
| 1956 | &vmw_user_dmabuf_release, NULL); | ||
| 1957 | if (unlikely(ret != 0)) | ||
| 1958 | goto out_no_base_object; | ||
| 1959 | |||
| 1960 | args->handle = vmw_user_bo->base.hash.key; | ||
| 1961 | |||
| 1962 | out_no_base_object: | ||
| 1963 | ttm_bo_unref(&tmp); | ||
| 1964 | out_no_dmabuf: | ||
| 1965 | ttm_read_unlock(&vmaster->lock); | ||
| 1966 | return ret; | ||
| 1967 | } | ||
| 1968 | |||
| 1969 | int vmw_dumb_map_offset(struct drm_file *file_priv, | ||
| 1970 | struct drm_device *dev, uint32_t handle, | ||
| 1971 | uint64_t *offset) | ||
| 1972 | { | ||
| 1973 | struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile; | ||
| 1974 | struct vmw_dma_buffer *out_buf; | ||
| 1975 | int ret; | ||
| 1976 | |||
| 1977 | ret = vmw_user_dmabuf_lookup(tfile, handle, &out_buf); | ||
| 1978 | if (ret != 0) | ||
| 1979 | return -EINVAL; | ||
| 1980 | |||
| 1981 | *offset = out_buf->base.addr_space_offset; | ||
| 1982 | vmw_dmabuf_unreference(&out_buf); | ||
| 1983 | return 0; | ||
| 1984 | } | ||
| 1985 | |||
| 1986 | int vmw_dumb_destroy(struct drm_file *file_priv, | ||
| 1987 | struct drm_device *dev, | ||
| 1988 | uint32_t handle) | ||
| 1989 | { | ||
| 1990 | return ttm_ref_object_base_unref(vmw_fpriv(file_priv)->tfile, | ||
| 1991 | handle, TTM_REF_USAGE); | ||
| 1992 | } | ||
