Commit cf3627fb authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2019-08-22' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

Fixes for v5.3-rc6:
- dma fix for omap.
- Make output polling work on komeda.
- Fix bpp computing for AFBC formats in komeda.
- Support the memory-region property in komeda.
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/5f1fdfe3-814e-fad1-663c-7279217fc085@linux.intel.com
parents dd89c112 63daf4e1
...@@ -8,6 +8,7 @@ ...@@ -8,6 +8,7 @@
#include <linux/iommu.h> #include <linux/iommu.h>
#include <linux/of_device.h> #include <linux/of_device.h>
#include <linux/of_graph.h> #include <linux/of_graph.h>
#include <linux/of_reserved_mem.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS
...@@ -143,6 +144,12 @@ static int komeda_parse_dt(struct device *dev, struct komeda_dev *mdev) ...@@ -143,6 +144,12 @@ static int komeda_parse_dt(struct device *dev, struct komeda_dev *mdev)
return mdev->irq; return mdev->irq;
} }
/* Get the optional framebuffer memory resource */
ret = of_reserved_mem_device_init(dev);
if (ret && ret != -ENODEV)
return ret;
ret = 0;
for_each_available_child_of_node(np, child) { for_each_available_child_of_node(np, child) {
if (of_node_cmp(child->name, "pipeline") == 0) { if (of_node_cmp(child->name, "pipeline") == 0) {
ret = komeda_parse_pipe_dt(mdev, child); ret = komeda_parse_pipe_dt(mdev, child);
...@@ -289,6 +296,8 @@ void komeda_dev_destroy(struct komeda_dev *mdev) ...@@ -289,6 +296,8 @@ void komeda_dev_destroy(struct komeda_dev *mdev)
mdev->n_pipelines = 0; mdev->n_pipelines = 0;
of_reserved_mem_device_release(dev);
if (funcs && funcs->cleanup) if (funcs && funcs->cleanup)
funcs->cleanup(mdev); funcs->cleanup(mdev);
......
...@@ -35,6 +35,25 @@ komeda_get_format_caps(struct komeda_format_caps_table *table, ...@@ -35,6 +35,25 @@ komeda_get_format_caps(struct komeda_format_caps_table *table,
return NULL; return NULL;
} }
u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info, u64 modifier)
{
u32 bpp;
switch (info->format) {
case DRM_FORMAT_YUV420_8BIT:
bpp = 12;
break;
case DRM_FORMAT_YUV420_10BIT:
bpp = 15;
break;
default:
bpp = info->cpp[0] * 8;
break;
}
return bpp;
}
/* Two assumptions /* Two assumptions
* 1. RGB always has YTR * 1. RGB always has YTR
* 2. Tiled RGB always has SC * 2. Tiled RGB always has SC
......
...@@ -97,6 +97,9 @@ const struct komeda_format_caps * ...@@ -97,6 +97,9 @@ const struct komeda_format_caps *
komeda_get_format_caps(struct komeda_format_caps_table *table, komeda_get_format_caps(struct komeda_format_caps_table *table,
u32 fourcc, u64 modifier); u32 fourcc, u64 modifier);
u32 komeda_get_afbc_format_bpp(const struct drm_format_info *info,
u64 modifier);
u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table, u32 *komeda_get_layer_fourcc_list(struct komeda_format_caps_table *table,
u32 layer_type, u32 *n_fmts); u32 layer_type, u32 *n_fmts);
......
...@@ -43,7 +43,7 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file, ...@@ -43,7 +43,7 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file,
struct drm_framebuffer *fb = &kfb->base; struct drm_framebuffer *fb = &kfb->base;
const struct drm_format_info *info = fb->format; const struct drm_format_info *info = fb->format;
struct drm_gem_object *obj; struct drm_gem_object *obj;
u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks; u32 alignment_w = 0, alignment_h = 0, alignment_header, n_blocks, bpp;
u64 min_size; u64 min_size;
obj = drm_gem_object_lookup(file, mode_cmd->handles[0]); obj = drm_gem_object_lookup(file, mode_cmd->handles[0]);
...@@ -88,8 +88,9 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file, ...@@ -88,8 +88,9 @@ komeda_fb_afbc_size_check(struct komeda_fb *kfb, struct drm_file *file,
kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE, kfb->offset_payload = ALIGN(n_blocks * AFBC_HEADER_SIZE,
alignment_header); alignment_header);
bpp = komeda_get_afbc_format_bpp(info, fb->modifier);
kfb->afbc_size = kfb->offset_payload + n_blocks * kfb->afbc_size = kfb->offset_payload + n_blocks *
ALIGN(info->cpp[0] * AFBC_SUPERBLK_PIXELS, ALIGN(bpp * AFBC_SUPERBLK_PIXELS / 8,
AFBC_SUPERBLK_ALIGNMENT); AFBC_SUPERBLK_ALIGNMENT);
min_size = kfb->afbc_size + fb->offsets[0]; min_size = kfb->afbc_size + fb->offsets[0];
if (min_size > obj->size) { if (min_size > obj->size) {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <drm/drm_gem_framebuffer_helper.h> #include <drm/drm_gem_framebuffer_helper.h>
#include <drm/drm_irq.h> #include <drm/drm_irq.h>
#include <drm/drm_vblank.h> #include <drm/drm_vblank.h>
#include <drm/drm_probe_helper.h>
#include "komeda_dev.h" #include "komeda_dev.h"
#include "komeda_framebuffer.h" #include "komeda_framebuffer.h"
...@@ -315,6 +316,8 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev) ...@@ -315,6 +316,8 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev)
drm->irq_enabled = true; drm->irq_enabled = true;
drm_kms_helper_poll_init(drm);
err = drm_dev_register(drm, 0); err = drm_dev_register(drm, 0);
if (err) if (err)
goto cleanup_mode_config; goto cleanup_mode_config;
...@@ -322,6 +325,7 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev) ...@@ -322,6 +325,7 @@ struct komeda_kms_dev *komeda_kms_attach(struct komeda_dev *mdev)
return kms; return kms;
cleanup_mode_config: cleanup_mode_config:
drm_kms_helper_poll_fini(drm);
drm->irq_enabled = false; drm->irq_enabled = false;
drm_mode_config_cleanup(drm); drm_mode_config_cleanup(drm);
komeda_kms_cleanup_private_objs(kms); komeda_kms_cleanup_private_objs(kms);
...@@ -338,6 +342,7 @@ void komeda_kms_detach(struct komeda_kms_dev *kms) ...@@ -338,6 +342,7 @@ void komeda_kms_detach(struct komeda_kms_dev *kms)
drm->irq_enabled = false; drm->irq_enabled = false;
mdev->funcs->disable_irq(mdev); mdev->funcs->disable_irq(mdev);
drm_dev_unregister(drm); drm_dev_unregister(drm);
drm_kms_helper_poll_fini(drm);
component_unbind_all(mdev->dev, drm); component_unbind_all(mdev->dev, drm);
komeda_kms_cleanup_private_objs(kms); komeda_kms_cleanup_private_objs(kms);
drm_mode_config_cleanup(drm); drm_mode_config_cleanup(drm);
......
...@@ -669,7 +669,7 @@ static int pdev_probe(struct platform_device *pdev) ...@@ -669,7 +669,7 @@ static int pdev_probe(struct platform_device *pdev)
if (omapdss_is_initialized() == false) if (omapdss_is_initialized() == false)
return -EPROBE_DEFER; return -EPROBE_DEFER;
ret = dma_set_coherent_mask(&pdev->dev, DMA_BIT_MASK(32)); ret = dma_coerce_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
if (ret) { if (ret) {
dev_err(&pdev->dev, "Failed to set the DMA mask\n"); dev_err(&pdev->dev, "Failed to set the DMA mask\n");
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment