via_video.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. /*
  2. * Copyright 2005 Thomas Hellstrom. All Rights Reserved.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sub license,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the
  12. * next paragraph) shall be included in all copies or substantial portions
  13. * of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHOR(S), AND/OR THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
  19. * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  20. * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. *
  23. * Author: Thomas Hellstrom 2005.
  24. *
  25. * Video and XvMC related functions.
  26. */
  27. #include "drmP.h"
  28. #include "via_drm.h"
  29. #include "via_drv.h"
  30. void via_init_futex(drm_via_private_t * dev_priv)
  31. {
  32. unsigned int i;
  33. DRM_DEBUG("%s\n", __FUNCTION__);
  34. for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) {
  35. DRM_INIT_WAITQUEUE(&(dev_priv->decoder_queue[i]));
  36. XVMCLOCKPTR(dev_priv->sarea_priv, i)->lock = 0;
  37. }
  38. }
  39. void via_cleanup_futex(drm_via_private_t * dev_priv)
  40. {
  41. }
  42. void via_release_futex(drm_via_private_t * dev_priv, int context)
  43. {
  44. unsigned int i;
  45. volatile int *lock;
  46. for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) {
  47. lock = (int *)XVMCLOCKPTR(dev_priv->sarea_priv, i);
  48. if ((_DRM_LOCKING_CONTEXT(*lock) == context)) {
  49. if (_DRM_LOCK_IS_HELD(*lock)
  50. && (*lock & _DRM_LOCK_CONT)) {
  51. DRM_WAKEUP(&(dev_priv->decoder_queue[i]));
  52. }
  53. *lock = 0;
  54. }
  55. }
  56. }
  57. int via_decoder_futex(DRM_IOCTL_ARGS)
  58. {
  59. DRM_DEVICE;
  60. drm_via_futex_t fx;
  61. volatile int *lock;
  62. drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
  63. drm_via_sarea_t *sAPriv = dev_priv->sarea_priv;
  64. int ret = 0;
  65. DRM_DEBUG("%s\n", __FUNCTION__);
  66. DRM_COPY_FROM_USER_IOCTL(fx, (drm_via_futex_t __user *) data,
  67. sizeof(fx));
  68. if (fx.lock > VIA_NR_XVMC_LOCKS)
  69. return -EFAULT;
  70. lock = (int *)XVMCLOCKPTR(sAPriv, fx.lock);
  71. switch (fx.func) {
  72. case VIA_FUTEX_WAIT:
  73. DRM_WAIT_ON(ret, dev_priv->decoder_queue[fx.lock],
  74. (fx.ms / 10) * (DRM_HZ / 100), *lock != fx.val);
  75. return ret;
  76. case VIA_FUTEX_WAKE:
  77. DRM_WAKEUP(&(dev_priv->decoder_queue[fx.lock]));
  78. return 0;
  79. }
  80. return 0;
  81. }