]> Git Repo - linux.git/commitdiff
Merge tag 'drm-vc4-next-2016-07-15' of https://github.com/anholt/linux into drm-next
authorDave Airlie <[email protected]>
Sat, 16 Jul 2016 01:25:11 +0000 (11:25 +1000)
committerDave Airlie <[email protected]>
Sat, 16 Jul 2016 01:25:11 +0000 (11:25 +1000)
This pull request brings in vc4 shader validation for branching,
allowing GLSL shaders with non-unrolled loops.

* tag 'drm-vc4-next-2016-07-15' of https://github.com/anholt/linux:
  drm/vc4: Fix a "the the" typo in a comment.
  drm/vc4: Fix definition of QPU_R_MS_REV_FLAGS
  drm/vc4: Add a getparam to signal support for branches.
  drm/vc4: Add support for branching in shader validation.
  drm/vc4: Add a bitmap of branch targets during shader validation.
  drm/vc4: Move validation's current/max ip into the validation struct.
  drm/vc4: Add a getparam ioctl for getting the V3D identity regs.

1  2 
drivers/gpu/drm/vc4/vc4_drv.c
drivers/gpu/drm/vc4/vc4_drv.h

index 9bb98a3cdc4f32b145a96c42e186d72615fcdc48,9435894822d56f4f42bf0036e022b69865caf730..25ed00872dbeb608ae0f3e9155f0181e0c3a1736
@@@ -14,6 -14,7 +14,7 @@@
  #include <linux/module.h>
  #include <linux/of_platform.h>
  #include <linux/platform_device.h>
+ #include <linux/pm_runtime.h>
  #include "drm_fb_cma_helper.h"
  
  #include "uapi/drm/vc4_drm.h"
@@@ -43,6 -44,49 +44,49 @@@ void __iomem *vc4_ioremap_regs(struct p
        return map;
  }
  
+ static int vc4_get_param_ioctl(struct drm_device *dev, void *data,
+                              struct drm_file *file_priv)
+ {
+       struct vc4_dev *vc4 = to_vc4_dev(dev);
+       struct drm_vc4_get_param *args = data;
+       int ret;
+       if (args->pad != 0)
+               return -EINVAL;
+       switch (args->param) {
+       case DRM_VC4_PARAM_V3D_IDENT0:
+               ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
+               if (ret)
+                       return ret;
+               args->value = V3D_READ(V3D_IDENT0);
+               pm_runtime_put(&vc4->v3d->pdev->dev);
+               break;
+       case DRM_VC4_PARAM_V3D_IDENT1:
+               ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
+               if (ret)
+                       return ret;
+               args->value = V3D_READ(V3D_IDENT1);
+               pm_runtime_put(&vc4->v3d->pdev->dev);
+               break;
+       case DRM_VC4_PARAM_V3D_IDENT2:
+               ret = pm_runtime_get_sync(&vc4->v3d->pdev->dev);
+               if (ret)
+                       return ret;
+               args->value = V3D_READ(V3D_IDENT2);
+               pm_runtime_put(&vc4->v3d->pdev->dev);
+               break;
+       case DRM_VC4_PARAM_SUPPORTS_BRANCHES:
+               args->value = true;
+               break;
+       default:
+               DRM_DEBUG("Unknown parameter %d\n", args->param);
+               return -EINVAL;
+       }
+       return 0;
+ }
  static void vc4_lastclose(struct drm_device *dev)
  {
        struct vc4_dev *vc4 = to_vc4_dev(dev);
@@@ -74,6 -118,7 +118,7 @@@ static const struct drm_ioctl_desc vc4_
        DRM_IOCTL_DEF_DRV(VC4_CREATE_SHADER_BO, vc4_create_shader_bo_ioctl, DRM_RENDER_ALLOW),
        DRM_IOCTL_DEF_DRV(VC4_GET_HANG_STATE, vc4_get_hang_state_ioctl,
                          DRM_ROOT_ONLY),
+       DRM_IOCTL_DEF_DRV(VC4_GET_PARAM, vc4_get_param_ioctl, DRM_RENDER_ALLOW),
  };
  
  static struct drm_driver vc4_drm_driver = {
  #endif
  
        .gem_create_object = vc4_create_object,
 -      .gem_free_object = vc4_free_object,
 +      .gem_free_object_unlocked = vc4_free_object,
        .gem_vm_ops = &drm_gem_cma_vm_ops,
  
        .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
@@@ -178,6 -223,7 +223,6 @@@ static int vc4_drm_bind(struct device *
  {
        struct platform_device *pdev = to_platform_device(dev);
        struct drm_device *drm;
 -      struct drm_connector *connector;
        struct vc4_dev *vc4;
        int ret = 0;
  
        if (ret < 0)
                goto unbind_all;
  
 -      /* Connector registration has to occur after DRM device
 -       * registration, because it creates sysfs entries based on the
 -       * DRM device.
 -       */
 -      list_for_each_entry(connector, &drm->mode_config.connector_list, head) {
 -              ret = drm_connector_register(connector);
 -              if (ret)
 -                      goto unregister;
 -      }
 -
        vc4_kms_load(drm);
  
        return 0;
  
 -unregister:
 -      drm_dev_unregister(drm);
  unbind_all:
        component_unbind_all(dev, drm);
  gem_destroy:
index 8e3b84e758acd0c7b14793fbd1865ed4034eb5f0,0ced289d76966b9603a673548c15af36072000b0..489e3de0c050df0eb3022afa421c579449c3ebdf
@@@ -355,6 -355,9 +355,9 @@@ struct vc4_validated_shader_info 
        uint32_t uniforms_src_size;
        uint32_t num_texture_samples;
        struct vc4_texture_sample_info *texture_samples;
+       uint32_t num_uniform_addr_offsets;
+       uint32_t *uniform_addr_offsets;
  };
  
  /**
@@@ -476,7 -479,7 +479,7 @@@ int vc4_kms_load(struct drm_device *dev
  struct drm_plane *vc4_plane_init(struct drm_device *dev,
                                 enum drm_plane_type type);
  u32 vc4_plane_write_dlist(struct drm_plane *plane, u32 __iomem *dlist);
 -u32 vc4_plane_dlist_size(struct drm_plane_state *state);
 +u32 vc4_plane_dlist_size(const struct drm_plane_state *state);
  void vc4_plane_async_set_fb(struct drm_plane *plane,
                            struct drm_framebuffer *fb);
  
This page took 0.077049 seconds and 4 git commands to generate.