diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-08 12:52:16 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-04-08 12:52:16 -0400 |
| commit | e9f37d3a8d126e73f5737ef548cdf6f618e295e4 (patch) | |
| tree | 831eb4952637828a7bbafa361185e0ca57aa86ed /include | |
| parent | 5fb6b953bb7aa86a9c8ea760934982cedc45c52b (diff) | |
| parent | c39b06951f1dc2e384650288676c5b7dcc0ec92c (diff) | |
Merge branch 'drm-next' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie:
"Highlights:
- drm:
Generic display port aux features, primary plane support, drm
master management fixes, logging cleanups, enforced locking checks
(instead of docs), documentation improvements, minor number
handling cleanup, pseudofs for shared inodes.
- ttm:
add ability to allocate from both ends
- i915:
broadwell features, power domain and runtime pm, per-process
address space infrastructure (not enabled)
- msm:
power management, hdmi audio support
- nouveau:
ongoing GPU fault recovery, initial maxwell support, random fixes
- exynos:
refactored driver to clean up a lot of abstraction, DP support
moved into drm, LVDS bridge support added, parallel panel support
- gma500:
SGX MMU support, SGX irq handling, asle irq work fixes
- radeon:
video engine bringup, ring handling fixes, use dp aux helpers
- vmwgfx:
add rendernode support"
* 'drm-next' of git://people.freedesktop.org/~airlied/linux: (849 commits)
DRM: armada: fix corruption while loading cursors
drm/dp_helper: don't return EPROTO for defers (v2)
drm/bridge: export ptn3460_init function
drm/exynos: remove MODULE_DEVICE_TABLE definitions
ARM: dts: exynos4412-trats2: enable exynos/fimd node
ARM: dts: exynos4210-trats: enable exynos/fimd node
ARM: dts: exynos4412-trats2: add panel node
ARM: dts: exynos4210-trats: add panel node
ARM: dts: exynos4: add MIPI DSI Master node
drm/panel: add S6E8AA0 driver
ARM: dts: exynos4210-universal_c210: add proper panel node
drm/panel: add ld9040 driver
panel/ld9040: add DT bindings
panel/s6e8aa0: add DT bindings
drm/exynos: add DSIM driver
exynos/dsim: add DT bindings
drm/exynos: disallow fbdev initialization if no device is connected
drm/mipi_dsi: create dsi devices only for nodes with reg property
drm/mipi_dsi: add flags to DSI messages
Skip intel_crt_init for Dell XPS 8700
...
Diffstat (limited to 'include')
| -rw-r--r-- | include/drm/bridge/ptn3460.h | 37 | ||||
| -rw-r--r-- | include/drm/drmP.h | 243 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 225 | ||||
| -rw-r--r-- | include/drm/drm_crtc_helper.h | 6 | ||||
| -rw-r--r-- | include/drm/drm_dp_helper.h | 125 | ||||
| -rw-r--r-- | include/drm/drm_fb_helper.h | 6 | ||||
| -rw-r--r-- | include/drm/drm_gem_cma_helper.h | 2 | ||||
| -rw-r--r-- | include/drm/drm_mipi_dsi.h | 6 | ||||
| -rw-r--r-- | include/drm/drm_mm.h | 182 | ||||
| -rw-r--r-- | include/drm/drm_modes.h | 237 | ||||
| -rw-r--r-- | include/drm/drm_plane_helper.h | 49 | ||||
| -rw-r--r-- | include/drm/drm_vma_manager.h | 6 | ||||
| -rw-r--r-- | include/drm/gma_drm.h | 70 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_driver.h | 49 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_object.h | 4 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_placement.h | 3 | ||||
| -rw-r--r-- | include/linux/hdmi.h | 12 | ||||
| -rw-r--r-- | include/linux/host1x.h | 1 | ||||
| -rw-r--r-- | include/uapi/drm/drm.h | 17 | ||||
| -rw-r--r-- | include/uapi/drm/msm_drm.h | 12 | ||||
| -rw-r--r-- | include/uapi/drm/radeon_drm.h | 20 | ||||
| -rw-r--r-- | include/uapi/drm/tegra_drm.h | 24 | ||||
| -rw-r--r-- | include/uapi/drm/vmwgfx_drm.h | 12 |
23 files changed, 908 insertions, 440 deletions
diff --git a/include/drm/bridge/ptn3460.h b/include/drm/bridge/ptn3460.h new file mode 100644 index 000000000000..ff62344fec6c --- /dev/null +++ b/include/drm/bridge/ptn3460.h | |||
| @@ -0,0 +1,37 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2013 Google, Inc. | ||
| 3 | * | ||
| 4 | * This software is licensed under the terms of the GNU General Public | ||
| 5 | * License version 2, as published by the Free Software Foundation, and | ||
| 6 | * may be copied, distributed, and modified under those terms. | ||
| 7 | * | ||
| 8 | * This program is distributed in the hope that it will be useful, | ||
| 9 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 10 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 11 | * GNU General Public License for more details. | ||
| 12 | */ | ||
| 13 | |||
| 14 | #ifndef _DRM_BRIDGE_PTN3460_H_ | ||
| 15 | #define _DRM_BRIDGE_PTN3460_H_ | ||
| 16 | |||
| 17 | struct drm_device; | ||
| 18 | struct drm_encoder; | ||
| 19 | struct i2c_client; | ||
| 20 | struct device_node; | ||
| 21 | |||
| 22 | #if defined(CONFIG_DRM_PTN3460) || defined(CONFIG_DRM_PTN3460_MODULE) | ||
| 23 | |||
| 24 | int ptn3460_init(struct drm_device *dev, struct drm_encoder *encoder, | ||
| 25 | struct i2c_client *client, struct device_node *node); | ||
| 26 | #else | ||
| 27 | |||
| 28 | static inline int ptn3460_init(struct drm_device *dev, | ||
| 29 | struct drm_encoder *encoder, struct i2c_client *client, | ||
| 30 | struct device_node *node) | ||
| 31 | { | ||
| 32 | return 0; | ||
| 33 | } | ||
| 34 | |||
| 35 | #endif | ||
| 36 | |||
| 37 | #endif | ||
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 04a7f31301f8..a7c2a862b4f4 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <asm/current.h> | 43 | #include <asm/current.h> |
| 44 | #endif /* __alpha__ */ | 44 | #endif /* __alpha__ */ |
| 45 | #include <linux/kernel.h> | 45 | #include <linux/kernel.h> |
| 46 | #include <linux/kref.h> | ||
| 46 | #include <linux/miscdevice.h> | 47 | #include <linux/miscdevice.h> |
| 47 | #include <linux/fs.h> | 48 | #include <linux/fs.h> |
| 48 | #include <linux/init.h> | 49 | #include <linux/init.h> |
| @@ -87,46 +88,41 @@ struct videomode; | |||
| 87 | #include <drm/drm_hashtab.h> | 88 | #include <drm/drm_hashtab.h> |
| 88 | #include <drm/drm_mm.h> | 89 | #include <drm/drm_mm.h> |
| 89 | 90 | ||
| 90 | #define DRM_UT_CORE 0x01 | ||
| 91 | #define DRM_UT_DRIVER 0x02 | ||
| 92 | #define DRM_UT_KMS 0x04 | ||
| 93 | #define DRM_UT_PRIME 0x08 | ||
| 94 | /* | 91 | /* |
| 95 | * Three debug levels are defined. | 92 | * 4 debug categories are defined: |
| 96 | * drm_core, drm_driver, drm_kms | 93 | * |
| 97 | * drm_core level can be used in the generic drm code. For example: | 94 | * CORE: Used in the generic drm code: drm_ioctl.c, drm_mm.c, drm_memory.c, ... |
| 98 | * drm_ioctl, drm_mm, drm_memory | 95 | * This is the category used by the DRM_DEBUG() macro. |
| 99 | * The macro definition of DRM_DEBUG is used. | 96 | * |
| 100 | * DRM_DEBUG(fmt, args...) | 97 | * DRIVER: Used in the vendor specific part of the driver: i915, radeon, ... |
| 101 | * The debug info by using the DRM_DEBUG can be obtained by adding | 98 | * This is the category used by the DRM_DEBUG_DRIVER() macro. |
| 102 | * the boot option of "drm.debug=1". | 99 | * |
| 100 | * KMS: used in the modesetting code. | ||
| 101 | * This is the category used by the DRM_DEBUG_KMS() macro. | ||
| 102 | * | ||
| 103 | * PRIME: used in the prime code. | ||
| 104 | * This is the category used by the DRM_DEBUG_PRIME() macro. | ||
| 103 | * | 105 | * |
| 104 | * drm_driver level can be used in the specific drm driver. It is used | 106 | * Enabling verbose debug messages is done through the drm.debug parameter, |
| 105 | * to add the debug info related with the drm driver. For example: | 107 | * each category being enabled by a bit. |
| 106 | * i915_drv, i915_dma, i915_gem, radeon_drv, | ||
| 107 | * The macro definition of DRM_DEBUG_DRIVER can be used. | ||
| 108 | * DRM_DEBUG_DRIVER(fmt, args...) | ||
| 109 | * The debug info by using the DRM_DEBUG_DRIVER can be obtained by | ||
| 110 | * adding the boot option of "drm.debug=0x02" | ||
| 111 | * | 108 | * |
| 112 | * drm_kms level can be used in the KMS code related with specific drm driver. | 109 | * drm.debug=0x1 will enable CORE messages |
| 113 | * It is used to add the debug info related with KMS mode. For example: | 110 | * drm.debug=0x2 will enable DRIVER messages |
| 114 | * the connector/crtc , | 111 | * drm.debug=0x3 will enable CORE and DRIVER messages |
| 115 | * The macro definition of DRM_DEBUG_KMS can be used. | 112 | * ... |
| 116 | * DRM_DEBUG_KMS(fmt, args...) | 113 | * drm.debug=0xf will enable all messages |
| 117 | * The debug info by using the DRM_DEBUG_KMS can be obtained by | ||
| 118 | * adding the boot option of "drm.debug=0x04" | ||
| 119 | * | 114 | * |
| 120 | * If we add the boot option of "drm.debug=0x06", we can get the debug info by | 115 | * An interesting feature is that it's possible to enable verbose logging at |
| 121 | * using the DRM_DEBUG_KMS and DRM_DEBUG_DRIVER. | 116 | * run-time by echoing the debug value in its sysfs node: |
| 122 | * If we add the boot option of "drm.debug=0x05", we can get the debug info by | 117 | * # echo 0xf > /sys/module/drm/parameters/debug |
| 123 | * using the DRM_DEBUG_KMS and DRM_DEBUG. | ||
| 124 | */ | 118 | */ |
| 119 | #define DRM_UT_CORE 0x01 | ||
| 120 | #define DRM_UT_DRIVER 0x02 | ||
| 121 | #define DRM_UT_KMS 0x04 | ||
| 122 | #define DRM_UT_PRIME 0x08 | ||
| 125 | 123 | ||
| 126 | extern __printf(4, 5) | 124 | extern __printf(2, 3) |
| 127 | void drm_ut_debug_printk(unsigned int request_level, | 125 | void drm_ut_debug_printk(const char *function_name, |
| 128 | const char *prefix, | ||
| 129 | const char *function_name, | ||
| 130 | const char *format, ...); | 126 | const char *format, ...); |
| 131 | extern __printf(2, 3) | 127 | extern __printf(2, 3) |
| 132 | int drm_err(const char *func, const char *format, ...); | 128 | int drm_err(const char *func, const char *format, ...); |
| @@ -211,55 +207,30 @@ int drm_err(const char *func, const char *format, ...); | |||
| 211 | #if DRM_DEBUG_CODE | 207 | #if DRM_DEBUG_CODE |
| 212 | #define DRM_DEBUG(fmt, args...) \ | 208 | #define DRM_DEBUG(fmt, args...) \ |
| 213 | do { \ | 209 | do { \ |
| 214 | drm_ut_debug_printk(DRM_UT_CORE, DRM_NAME, \ | 210 | if (unlikely(drm_debug & DRM_UT_CORE)) \ |
| 215 | __func__, fmt, ##args); \ | 211 | drm_ut_debug_printk(__func__, fmt, ##args); \ |
| 216 | } while (0) | 212 | } while (0) |
| 217 | 213 | ||
| 218 | #define DRM_DEBUG_DRIVER(fmt, args...) \ | 214 | #define DRM_DEBUG_DRIVER(fmt, args...) \ |
| 219 | do { \ | 215 | do { \ |
| 220 | drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME, \ | 216 | if (unlikely(drm_debug & DRM_UT_DRIVER)) \ |
| 221 | __func__, fmt, ##args); \ | 217 | drm_ut_debug_printk(__func__, fmt, ##args); \ |
| 222 | } while (0) | 218 | } while (0) |
| 223 | #define DRM_DEBUG_KMS(fmt, args...) \ | 219 | #define DRM_DEBUG_KMS(fmt, args...) \ |
| 224 | do { \ | 220 | do { \ |
| 225 | drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, \ | 221 | if (unlikely(drm_debug & DRM_UT_KMS)) \ |
| 226 | __func__, fmt, ##args); \ | 222 | drm_ut_debug_printk(__func__, fmt, ##args); \ |
| 227 | } while (0) | 223 | } while (0) |
| 228 | #define DRM_DEBUG_PRIME(fmt, args...) \ | 224 | #define DRM_DEBUG_PRIME(fmt, args...) \ |
| 229 | do { \ | 225 | do { \ |
| 230 | drm_ut_debug_printk(DRM_UT_PRIME, DRM_NAME, \ | 226 | if (unlikely(drm_debug & DRM_UT_PRIME)) \ |
| 231 | __func__, fmt, ##args); \ | 227 | drm_ut_debug_printk(__func__, fmt, ##args); \ |
| 232 | } while (0) | ||
| 233 | #define DRM_LOG(fmt, args...) \ | ||
| 234 | do { \ | ||
| 235 | drm_ut_debug_printk(DRM_UT_CORE, NULL, \ | ||
| 236 | NULL, fmt, ##args); \ | ||
| 237 | } while (0) | ||
| 238 | #define DRM_LOG_KMS(fmt, args...) \ | ||
| 239 | do { \ | ||
| 240 | drm_ut_debug_printk(DRM_UT_KMS, NULL, \ | ||
| 241 | NULL, fmt, ##args); \ | ||
| 242 | } while (0) | ||
| 243 | #define DRM_LOG_MODE(fmt, args...) \ | ||
| 244 | do { \ | ||
| 245 | drm_ut_debug_printk(DRM_UT_MODE, NULL, \ | ||
| 246 | NULL, fmt, ##args); \ | ||
| 247 | } while (0) | ||
| 248 | #define DRM_LOG_DRIVER(fmt, args...) \ | ||
| 249 | do { \ | ||
| 250 | drm_ut_debug_printk(DRM_UT_DRIVER, NULL, \ | ||
| 251 | NULL, fmt, ##args); \ | ||
| 252 | } while (0) | 228 | } while (0) |
| 253 | #else | 229 | #else |
| 254 | #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0) | 230 | #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0) |
| 255 | #define DRM_DEBUG_KMS(fmt, args...) do { } while (0) | 231 | #define DRM_DEBUG_KMS(fmt, args...) do { } while (0) |
| 256 | #define DRM_DEBUG_PRIME(fmt, args...) do { } while (0) | 232 | #define DRM_DEBUG_PRIME(fmt, args...) do { } while (0) |
| 257 | #define DRM_DEBUG(fmt, arg...) do { } while (0) | 233 | #define DRM_DEBUG(fmt, arg...) do { } while (0) |
| 258 | #define DRM_LOG(fmt, arg...) do { } while (0) | ||
| 259 | #define DRM_LOG_KMS(fmt, args...) do { } while (0) | ||
| 260 | #define DRM_LOG_MODE(fmt, arg...) do { } while (0) | ||
| 261 | #define DRM_LOG_DRIVER(fmt, arg...) do { } while (0) | ||
| 262 | |||
| 263 | #endif | 234 | #endif |
| 264 | 235 | ||
| 265 | /*@}*/ | 236 | /*@}*/ |
| @@ -434,9 +405,15 @@ struct drm_prime_file_private { | |||
| 434 | struct drm_file { | 405 | struct drm_file { |
| 435 | unsigned always_authenticated :1; | 406 | unsigned always_authenticated :1; |
| 436 | unsigned authenticated :1; | 407 | unsigned authenticated :1; |
| 437 | unsigned is_master :1; /* this file private is a master for a minor */ | 408 | /* Whether we're master for a minor. Protected by master_mutex */ |
| 409 | unsigned is_master :1; | ||
| 438 | /* true when the client has asked us to expose stereo 3D mode flags */ | 410 | /* true when the client has asked us to expose stereo 3D mode flags */ |
| 439 | unsigned stereo_allowed :1; | 411 | unsigned stereo_allowed :1; |
| 412 | /* | ||
| 413 | * true if client understands CRTC primary planes and cursor planes | ||
| 414 | * in the plane list | ||
| 415 | */ | ||
| 416 | unsigned universal_planes:1; | ||
| 440 | 417 | ||
| 441 | struct pid *pid; | 418 | struct pid *pid; |
| 442 | kuid_t uid; | 419 | kuid_t uid; |
| @@ -713,29 +690,29 @@ struct drm_gem_object { | |||
| 713 | 690 | ||
| 714 | #include <drm/drm_crtc.h> | 691 | #include <drm/drm_crtc.h> |
| 715 | 692 | ||
| 716 | /* per-master structure */ | 693 | /** |
| 694 | * struct drm_master - drm master structure | ||
| 695 | * | ||
| 696 | * @refcount: Refcount for this master object. | ||
| 697 | * @minor: Link back to minor char device we are master for. Immutable. | ||
| 698 | * @unique: Unique identifier: e.g. busid. Protected by drm_global_mutex. | ||
| 699 | * @unique_len: Length of unique field. Protected by drm_global_mutex. | ||
| 700 | * @unique_size: Amount allocated. Protected by drm_global_mutex. | ||
| 701 | * @magiclist: Hash of used authentication tokens. Protected by struct_mutex. | ||
| 702 | * @magicfree: List of used authentication tokens. Protected by struct_mutex. | ||
| 703 | * @lock: DRI lock information. | ||
| 704 | * @driver_priv: Pointer to driver-private information. | ||
| 705 | */ | ||
| 717 | struct drm_master { | 706 | struct drm_master { |
| 718 | 707 | struct kref refcount; | |
| 719 | struct kref refcount; /* refcount for this master */ | 708 | struct drm_minor *minor; |
| 720 | 709 | char *unique; | |
| 721 | struct list_head head; /**< each minor contains a list of masters */ | 710 | int unique_len; |
| 722 | struct drm_minor *minor; /**< link back to minor we are a master for */ | 711 | int unique_size; |
| 723 | |||
| 724 | char *unique; /**< Unique identifier: e.g., busid */ | ||
| 725 | int unique_len; /**< Length of unique field */ | ||
| 726 | int unique_size; /**< amount allocated */ | ||
| 727 | |||
| 728 | int blocked; /**< Blocked due to VC switch? */ | ||
| 729 | |||
| 730 | /** \name Authentication */ | ||
| 731 | /*@{ */ | ||
| 732 | struct drm_open_hash magiclist; | 712 | struct drm_open_hash magiclist; |
| 733 | struct list_head magicfree; | 713 | struct list_head magicfree; |
| 734 | /*@} */ | 714 | struct drm_lock_data lock; |
| 735 | 715 | void *driver_priv; | |
| 736 | struct drm_lock_data lock; /**< Information on hardware lock */ | ||
| 737 | |||
| 738 | void *driver_priv; /**< Private structure for driver to use */ | ||
| 739 | }; | 716 | }; |
| 740 | 717 | ||
| 741 | /* Size of ringbuffer for vblank timestamps. Just double-buffer | 718 | /* Size of ringbuffer for vblank timestamps. Just double-buffer |
| @@ -1008,10 +985,12 @@ struct drm_driver { | |||
| 1008 | struct list_head legacy_dev_list; | 985 | struct list_head legacy_dev_list; |
| 1009 | }; | 986 | }; |
| 1010 | 987 | ||
| 1011 | #define DRM_MINOR_UNASSIGNED 0 | 988 | enum drm_minor_type { |
| 1012 | #define DRM_MINOR_LEGACY 1 | 989 | DRM_MINOR_LEGACY, |
| 1013 | #define DRM_MINOR_CONTROL 2 | 990 | DRM_MINOR_CONTROL, |
| 1014 | #define DRM_MINOR_RENDER 3 | 991 | DRM_MINOR_RENDER, |
| 992 | DRM_MINOR_CNT, | ||
| 993 | }; | ||
| 1015 | 994 | ||
| 1016 | /** | 995 | /** |
| 1017 | * Info file list entry. This structure represents a debugfs or proc file to | 996 | * Info file list entry. This structure represents a debugfs or proc file to |
| @@ -1040,7 +1019,6 @@ struct drm_info_node { | |||
| 1040 | struct drm_minor { | 1019 | struct drm_minor { |
| 1041 | int index; /**< Minor device number */ | 1020 | int index; /**< Minor device number */ |
| 1042 | int type; /**< Control or render */ | 1021 | int type; /**< Control or render */ |
| 1043 | dev_t device; /**< Device number for mknod */ | ||
| 1044 | struct device *kdev; /**< Linux device */ | 1022 | struct device *kdev; /**< Linux device */ |
| 1045 | struct drm_device *dev; | 1023 | struct drm_device *dev; |
| 1046 | 1024 | ||
| @@ -1049,26 +1027,11 @@ struct drm_minor { | |||
| 1049 | struct list_head debugfs_list; | 1027 | struct list_head debugfs_list; |
| 1050 | struct mutex debugfs_lock; /* Protects debugfs_list. */ | 1028 | struct mutex debugfs_lock; /* Protects debugfs_list. */ |
| 1051 | 1029 | ||
| 1052 | struct drm_master *master; /* currently active master for this node */ | 1030 | /* currently active master for this node. Protected by master_mutex */ |
| 1053 | struct list_head master_list; | 1031 | struct drm_master *master; |
| 1054 | struct drm_mode_group mode_group; | 1032 | struct drm_mode_group mode_group; |
| 1055 | }; | 1033 | }; |
| 1056 | 1034 | ||
| 1057 | /* mode specified on the command line */ | ||
| 1058 | struct drm_cmdline_mode { | ||
| 1059 | bool specified; | ||
| 1060 | bool refresh_specified; | ||
| 1061 | bool bpp_specified; | ||
| 1062 | int xres, yres; | ||
| 1063 | int bpp; | ||
| 1064 | int refresh; | ||
| 1065 | bool rb; | ||
| 1066 | bool interlace; | ||
| 1067 | bool cvt; | ||
| 1068 | bool margins; | ||
| 1069 | enum drm_connector_force force; | ||
| 1070 | }; | ||
| 1071 | |||
| 1072 | 1035 | ||
| 1073 | struct drm_pending_vblank_event { | 1036 | struct drm_pending_vblank_event { |
| 1074 | struct drm_pending_event base; | 1037 | struct drm_pending_event base; |
| @@ -1098,10 +1061,24 @@ struct drm_device { | |||
| 1098 | char *devname; /**< For /proc/interrupts */ | 1061 | char *devname; /**< For /proc/interrupts */ |
| 1099 | int if_version; /**< Highest interface version set */ | 1062 | int if_version; /**< Highest interface version set */ |
| 1100 | 1063 | ||
| 1064 | /** \name Lifetime Management */ | ||
| 1065 | /*@{ */ | ||
| 1066 | struct kref ref; /**< Object ref-count */ | ||
| 1067 | struct device *dev; /**< Device structure of bus-device */ | ||
| 1068 | struct drm_driver *driver; /**< DRM driver managing the device */ | ||
| 1069 | void *dev_private; /**< DRM driver private data */ | ||
| 1070 | struct drm_minor *control; /**< Control node */ | ||
| 1071 | struct drm_minor *primary; /**< Primary node */ | ||
| 1072 | struct drm_minor *render; /**< Render node */ | ||
| 1073 | atomic_t unplugged; /**< Flag whether dev is dead */ | ||
| 1074 | struct inode *anon_inode; /**< inode for private address-space */ | ||
| 1075 | /*@} */ | ||
| 1076 | |||
| 1101 | /** \name Locks */ | 1077 | /** \name Locks */ |
| 1102 | /*@{ */ | 1078 | /*@{ */ |
| 1103 | spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ | 1079 | spinlock_t count_lock; /**< For inuse, drm_device::open_count, drm_device::buf_use */ |
| 1104 | struct mutex struct_mutex; /**< For others */ | 1080 | struct mutex struct_mutex; /**< For others */ |
| 1081 | struct mutex master_mutex; /**< For drm_minor::master and drm_file::is_master */ | ||
| 1105 | /*@} */ | 1082 | /*@} */ |
| 1106 | 1083 | ||
| 1107 | /** \name Usage Counters */ | 1084 | /** \name Usage Counters */ |
| @@ -1171,7 +1148,6 @@ struct drm_device { | |||
| 1171 | 1148 | ||
| 1172 | struct drm_agp_head *agp; /**< AGP data */ | 1149 | struct drm_agp_head *agp; /**< AGP data */ |
| 1173 | 1150 | ||
| 1174 | struct device *dev; /**< Device structure */ | ||
| 1175 | struct pci_dev *pdev; /**< PCI device structure */ | 1151 | struct pci_dev *pdev; /**< PCI device structure */ |
| 1176 | #ifdef __alpha__ | 1152 | #ifdef __alpha__ |
| 1177 | struct pci_controller *hose; | 1153 | struct pci_controller *hose; |
| @@ -1182,17 +1158,11 @@ struct drm_device { | |||
| 1182 | 1158 | ||
| 1183 | struct drm_sg_mem *sg; /**< Scatter gather memory */ | 1159 | struct drm_sg_mem *sg; /**< Scatter gather memory */ |
| 1184 | unsigned int num_crtcs; /**< Number of CRTCs on this device */ | 1160 | unsigned int num_crtcs; /**< Number of CRTCs on this device */ |
| 1185 | void *dev_private; /**< device private data */ | ||
| 1186 | struct address_space *dev_mapping; | ||
| 1187 | struct drm_sigdata sigdata; /**< For block_all_signals */ | 1161 | struct drm_sigdata sigdata; /**< For block_all_signals */ |
| 1188 | sigset_t sigmask; | 1162 | sigset_t sigmask; |
| 1189 | 1163 | ||
| 1190 | struct drm_driver *driver; | ||
| 1191 | struct drm_local_map *agp_buffer_map; | 1164 | struct drm_local_map *agp_buffer_map; |
| 1192 | unsigned int agp_buffer_token; | 1165 | unsigned int agp_buffer_token; |
| 1193 | struct drm_minor *control; /**< Control node for card */ | ||
| 1194 | struct drm_minor *primary; /**< render type primary screen head */ | ||
| 1195 | struct drm_minor *render; /**< render node for card */ | ||
| 1196 | 1166 | ||
| 1197 | struct drm_mode_config mode_config; /**< Current mode config */ | 1167 | struct drm_mode_config mode_config; /**< Current mode config */ |
| 1198 | 1168 | ||
| @@ -1203,8 +1173,6 @@ struct drm_device { | |||
| 1203 | struct drm_vma_offset_manager *vma_offset_manager; | 1173 | struct drm_vma_offset_manager *vma_offset_manager; |
| 1204 | /*@} */ | 1174 | /*@} */ |
| 1205 | int switch_power_state; | 1175 | int switch_power_state; |
| 1206 | |||
| 1207 | atomic_t unplugged; /* device has been unplugged or gone away */ | ||
| 1208 | }; | 1176 | }; |
| 1209 | 1177 | ||
| 1210 | #define DRM_SWITCH_POWER_ON 0 | 1178 | #define DRM_SWITCH_POWER_ON 0 |
| @@ -1241,11 +1209,21 @@ static inline bool drm_modeset_is_locked(struct drm_device *dev) | |||
| 1241 | return mutex_is_locked(&dev->mode_config.mutex); | 1209 | return mutex_is_locked(&dev->mode_config.mutex); |
| 1242 | } | 1210 | } |
| 1243 | 1211 | ||
| 1244 | static inline bool drm_is_render_client(struct drm_file *file_priv) | 1212 | static inline bool drm_is_render_client(const struct drm_file *file_priv) |
| 1245 | { | 1213 | { |
| 1246 | return file_priv->minor->type == DRM_MINOR_RENDER; | 1214 | return file_priv->minor->type == DRM_MINOR_RENDER; |
| 1247 | } | 1215 | } |
| 1248 | 1216 | ||
| 1217 | static inline bool drm_is_control_client(const struct drm_file *file_priv) | ||
| 1218 | { | ||
| 1219 | return file_priv->minor->type == DRM_MINOR_CONTROL; | ||
| 1220 | } | ||
| 1221 | |||
| 1222 | static inline bool drm_is_primary_client(const struct drm_file *file_priv) | ||
| 1223 | { | ||
| 1224 | return file_priv->minor->type == DRM_MINOR_LEGACY; | ||
| 1225 | } | ||
| 1226 | |||
| 1249 | /******************************************************************/ | 1227 | /******************************************************************/ |
| 1250 | /** \name Internal function definitions */ | 1228 | /** \name Internal function definitions */ |
| 1251 | /*@{*/ | 1229 | /*@{*/ |
| @@ -1256,6 +1234,7 @@ extern long drm_ioctl(struct file *filp, | |||
| 1256 | extern long drm_compat_ioctl(struct file *filp, | 1234 | extern long drm_compat_ioctl(struct file *filp, |
| 1257 | unsigned int cmd, unsigned long arg); | 1235 | unsigned int cmd, unsigned long arg); |
| 1258 | extern int drm_lastclose(struct drm_device *dev); | 1236 | extern int drm_lastclose(struct drm_device *dev); |
| 1237 | extern bool drm_ioctl_flags(unsigned int nr, unsigned int *flags); | ||
| 1259 | 1238 | ||
| 1260 | /* Device support (drm_fops.h) */ | 1239 | /* Device support (drm_fops.h) */ |
| 1261 | extern struct mutex drm_global_mutex; | 1240 | extern struct mutex drm_global_mutex; |
| @@ -1411,20 +1390,6 @@ extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev, | |||
| 1411 | extern void drm_calc_timestamping_constants(struct drm_crtc *crtc, | 1390 | extern void drm_calc_timestamping_constants(struct drm_crtc *crtc, |
| 1412 | const struct drm_display_mode *mode); | 1391 | const struct drm_display_mode *mode); |
| 1413 | 1392 | ||
| 1414 | extern bool | ||
| 1415 | drm_mode_parse_command_line_for_connector(const char *mode_option, | ||
| 1416 | struct drm_connector *connector, | ||
| 1417 | struct drm_cmdline_mode *mode); | ||
| 1418 | |||
| 1419 | extern struct drm_display_mode * | ||
| 1420 | drm_mode_create_from_cmdline_mode(struct drm_device *dev, | ||
| 1421 | struct drm_cmdline_mode *cmd); | ||
| 1422 | |||
| 1423 | extern int drm_display_mode_from_videomode(const struct videomode *vm, | ||
| 1424 | struct drm_display_mode *dmode); | ||
| 1425 | extern int of_get_drm_display_mode(struct device_node *np, | ||
| 1426 | struct drm_display_mode *dmode, | ||
| 1427 | int index); | ||
| 1428 | 1393 | ||
| 1429 | /* Modesetting support */ | 1394 | /* Modesetting support */ |
| 1430 | extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); | 1395 | extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc); |
| @@ -1449,6 +1414,7 @@ extern void drm_put_dev(struct drm_device *dev); | |||
| 1449 | extern void drm_unplug_dev(struct drm_device *dev); | 1414 | extern void drm_unplug_dev(struct drm_device *dev); |
| 1450 | extern unsigned int drm_debug; | 1415 | extern unsigned int drm_debug; |
| 1451 | extern unsigned int drm_rnodes; | 1416 | extern unsigned int drm_rnodes; |
| 1417 | extern unsigned int drm_universal_planes; | ||
| 1452 | 1418 | ||
| 1453 | extern unsigned int drm_vblank_offdelay; | 1419 | extern unsigned int drm_vblank_offdelay; |
| 1454 | extern unsigned int drm_timestamp_precision; | 1420 | extern unsigned int drm_timestamp_precision; |
| @@ -1661,9 +1627,14 @@ static __inline__ void drm_core_dropmap(struct drm_local_map *map) | |||
| 1661 | 1627 | ||
| 1662 | struct drm_device *drm_dev_alloc(struct drm_driver *driver, | 1628 | struct drm_device *drm_dev_alloc(struct drm_driver *driver, |
| 1663 | struct device *parent); | 1629 | struct device *parent); |
| 1664 | void drm_dev_free(struct drm_device *dev); | 1630 | void drm_dev_ref(struct drm_device *dev); |
| 1631 | void drm_dev_unref(struct drm_device *dev); | ||
| 1665 | int drm_dev_register(struct drm_device *dev, unsigned long flags); | 1632 | int drm_dev_register(struct drm_device *dev, unsigned long flags); |
| 1666 | void drm_dev_unregister(struct drm_device *dev); | 1633 | void drm_dev_unregister(struct drm_device *dev); |
| 1634 | |||
| 1635 | struct drm_minor *drm_minor_acquire(unsigned int minor_id); | ||
| 1636 | void drm_minor_release(struct drm_minor *minor); | ||
| 1637 | |||
| 1667 | /*@}*/ | 1638 | /*@}*/ |
| 1668 | 1639 | ||
| 1669 | /* PCI section */ | 1640 | /* PCI section */ |
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 8f3dee097579..e55fccbe7c42 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
| @@ -32,7 +32,6 @@ | |||
| 32 | #include <linux/fb.h> | 32 | #include <linux/fb.h> |
| 33 | #include <linux/hdmi.h> | 33 | #include <linux/hdmi.h> |
| 34 | #include <drm/drm_mode.h> | 34 | #include <drm/drm_mode.h> |
| 35 | |||
| 36 | #include <drm/drm_fourcc.h> | 35 | #include <drm/drm_fourcc.h> |
| 37 | 36 | ||
| 38 | struct drm_device; | 37 | struct drm_device; |
| @@ -65,130 +64,14 @@ struct drm_object_properties { | |||
| 65 | uint64_t values[DRM_OBJECT_MAX_PROPERTY]; | 64 | uint64_t values[DRM_OBJECT_MAX_PROPERTY]; |
| 66 | }; | 65 | }; |
| 67 | 66 | ||
| 68 | /* | 67 | enum drm_connector_force { |
| 69 | * Note on terminology: here, for brevity and convenience, we refer to connector | 68 | DRM_FORCE_UNSPECIFIED, |
| 70 | * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, | 69 | DRM_FORCE_OFF, |
| 71 | * DVI, etc. And 'screen' refers to the whole of the visible display, which | 70 | DRM_FORCE_ON, /* force on analog part normally */ |
| 72 | * may span multiple monitors (and therefore multiple CRTC and connector | 71 | DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ |
| 73 | * structures). | ||
| 74 | */ | ||
| 75 | |||
| 76 | enum drm_mode_status { | ||
| 77 | MODE_OK = 0, /* Mode OK */ | ||
| 78 | MODE_HSYNC, /* hsync out of range */ | ||
| 79 | MODE_VSYNC, /* vsync out of range */ | ||
| 80 | MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 81 | MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 82 | MODE_BAD_WIDTH, /* requires an unsupported linepitch */ | ||
| 83 | MODE_NOMODE, /* no mode with a matching name */ | ||
| 84 | MODE_NO_INTERLACE, /* interlaced mode not supported */ | ||
| 85 | MODE_NO_DBLESCAN, /* doublescan mode not supported */ | ||
| 86 | MODE_NO_VSCAN, /* multiscan mode not supported */ | ||
| 87 | MODE_MEM, /* insufficient video memory */ | ||
| 88 | MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ | ||
| 89 | MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ | ||
| 90 | MODE_MEM_VIRT, /* insufficient video memory given virtual size */ | ||
| 91 | MODE_NOCLOCK, /* no fixed clock available */ | ||
| 92 | MODE_CLOCK_HIGH, /* clock required is too high */ | ||
| 93 | MODE_CLOCK_LOW, /* clock required is too low */ | ||
| 94 | MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ | ||
| 95 | MODE_BAD_HVALUE, /* horizontal timing was out of range */ | ||
| 96 | MODE_BAD_VVALUE, /* vertical timing was out of range */ | ||
| 97 | MODE_BAD_VSCAN, /* VScan value out of range */ | ||
| 98 | MODE_HSYNC_NARROW, /* horizontal sync too narrow */ | ||
| 99 | MODE_HSYNC_WIDE, /* horizontal sync too wide */ | ||
| 100 | MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ | ||
| 101 | MODE_HBLANK_WIDE, /* horizontal blanking too wide */ | ||
| 102 | MODE_VSYNC_NARROW, /* vertical sync too narrow */ | ||
| 103 | MODE_VSYNC_WIDE, /* vertical sync too wide */ | ||
| 104 | MODE_VBLANK_NARROW, /* vertical blanking too narrow */ | ||
| 105 | MODE_VBLANK_WIDE, /* vertical blanking too wide */ | ||
| 106 | MODE_PANEL, /* exceeds panel dimensions */ | ||
| 107 | MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ | ||
| 108 | MODE_ONE_WIDTH, /* only one width is supported */ | ||
| 109 | MODE_ONE_HEIGHT, /* only one height is supported */ | ||
| 110 | MODE_ONE_SIZE, /* only one resolution is supported */ | ||
| 111 | MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ | ||
| 112 | MODE_NO_STEREO, /* stereo modes not supported */ | ||
| 113 | MODE_UNVERIFIED = -3, /* mode needs to reverified */ | ||
| 114 | MODE_BAD = -2, /* unspecified reason */ | ||
| 115 | MODE_ERROR = -1 /* error condition */ | ||
| 116 | }; | ||
| 117 | |||
| 118 | #define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ | ||
| 119 | DRM_MODE_TYPE_CRTC_C) | ||
| 120 | |||
| 121 | #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ | ||
| 122 | .name = nm, .status = 0, .type = (t), .clock = (c), \ | ||
| 123 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | ||
| 124 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | ||
| 125 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | ||
| 126 | .vscan = (vs), .flags = (f), \ | ||
| 127 | .base.type = DRM_MODE_OBJECT_MODE | ||
| 128 | |||
| 129 | #define CRTC_INTERLACE_HALVE_V (1 << 0) /* halve V values for interlacing */ | ||
| 130 | #define CRTC_STEREO_DOUBLE (1 << 1) /* adjust timings for stereo modes */ | ||
| 131 | |||
| 132 | #define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF | ||
| 133 | |||
| 134 | struct drm_display_mode { | ||
| 135 | /* Header */ | ||
| 136 | struct list_head head; | ||
| 137 | struct drm_mode_object base; | ||
| 138 | |||
| 139 | char name[DRM_DISPLAY_MODE_LEN]; | ||
| 140 | |||
| 141 | enum drm_mode_status status; | ||
| 142 | unsigned int type; | ||
| 143 | |||
| 144 | /* Proposed mode values */ | ||
| 145 | int clock; /* in kHz */ | ||
| 146 | int hdisplay; | ||
| 147 | int hsync_start; | ||
| 148 | int hsync_end; | ||
| 149 | int htotal; | ||
| 150 | int hskew; | ||
| 151 | int vdisplay; | ||
| 152 | int vsync_start; | ||
| 153 | int vsync_end; | ||
| 154 | int vtotal; | ||
| 155 | int vscan; | ||
| 156 | unsigned int flags; | ||
| 157 | |||
| 158 | /* Addressable image size (may be 0 for projectors, etc.) */ | ||
| 159 | int width_mm; | ||
| 160 | int height_mm; | ||
| 161 | |||
| 162 | /* Actual mode we give to hw */ | ||
| 163 | int crtc_clock; /* in KHz */ | ||
| 164 | int crtc_hdisplay; | ||
| 165 | int crtc_hblank_start; | ||
| 166 | int crtc_hblank_end; | ||
| 167 | int crtc_hsync_start; | ||
| 168 | int crtc_hsync_end; | ||
| 169 | int crtc_htotal; | ||
| 170 | int crtc_hskew; | ||
| 171 | int crtc_vdisplay; | ||
| 172 | int crtc_vblank_start; | ||
| 173 | int crtc_vblank_end; | ||
| 174 | int crtc_vsync_start; | ||
| 175 | int crtc_vsync_end; | ||
| 176 | int crtc_vtotal; | ||
| 177 | |||
| 178 | /* Driver private mode info */ | ||
| 179 | int private_size; | ||
| 180 | int *private; | ||
| 181 | int private_flags; | ||
| 182 | |||
| 183 | int vrefresh; /* in Hz */ | ||
| 184 | int hsync; /* in kHz */ | ||
| 185 | enum hdmi_picture_aspect picture_aspect_ratio; | ||
| 186 | }; | 72 | }; |
| 187 | 73 | ||
| 188 | static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode) | 74 | #include <drm/drm_modes.h> |
| 189 | { | ||
| 190 | return mode->flags & DRM_MODE_FLAG_3D_MASK; | ||
| 191 | } | ||
| 192 | 75 | ||
| 193 | enum drm_connector_status { | 76 | enum drm_connector_status { |
| 194 | connector_status_connected = 1, | 77 | connector_status_connected = 1, |
| @@ -387,6 +270,8 @@ struct drm_crtc_funcs { | |||
| 387 | * @dev: parent DRM device | 270 | * @dev: parent DRM device |
| 388 | * @head: list management | 271 | * @head: list management |
| 389 | * @base: base KMS object for ID tracking etc. | 272 | * @base: base KMS object for ID tracking etc. |
| 273 | * @primary: primary plane for this CRTC | ||
| 274 | * @cursor: cursor plane for this CRTC | ||
| 390 | * @enabled: is this CRTC enabled? | 275 | * @enabled: is this CRTC enabled? |
| 391 | * @mode: current mode timings | 276 | * @mode: current mode timings |
| 392 | * @hwmode: mode timings as programmed to hw regs | 277 | * @hwmode: mode timings as programmed to hw regs |
| @@ -422,8 +307,9 @@ struct drm_crtc { | |||
| 422 | 307 | ||
| 423 | struct drm_mode_object base; | 308 | struct drm_mode_object base; |
| 424 | 309 | ||
| 425 | /* framebuffer the connector is currently bound to */ | 310 | /* primary and cursor planes for CRTC */ |
| 426 | struct drm_framebuffer *fb; | 311 | struct drm_plane *primary; |
| 312 | struct drm_plane *cursor; | ||
| 427 | 313 | ||
| 428 | /* Temporary tracking of the old fb while a modeset is ongoing. Used | 314 | /* Temporary tracking of the old fb while a modeset is ongoing. Used |
| 429 | * by drm_mode_set_config_internal to implement correct refcounting. */ | 315 | * by drm_mode_set_config_internal to implement correct refcounting. */ |
| @@ -540,13 +426,6 @@ struct drm_encoder { | |||
| 540 | void *helper_private; | 426 | void *helper_private; |
| 541 | }; | 427 | }; |
| 542 | 428 | ||
| 543 | enum drm_connector_force { | ||
| 544 | DRM_FORCE_UNSPECIFIED, | ||
| 545 | DRM_FORCE_OFF, | ||
| 546 | DRM_FORCE_ON, /* force on analog part normally */ | ||
| 547 | DRM_FORCE_ON_DIGITAL, /* for DVI-I use digital connector */ | ||
| 548 | }; | ||
| 549 | |||
| 550 | /* should we poll this connector for connects and disconnects */ | 429 | /* should we poll this connector for connects and disconnects */ |
| 551 | /* hot plug detectable */ | 430 | /* hot plug detectable */ |
| 552 | #define DRM_CONNECTOR_POLL_HPD (1 << 0) | 431 | #define DRM_CONNECTOR_POLL_HPD (1 << 0) |
| @@ -665,6 +544,12 @@ struct drm_plane_funcs { | |||
| 665 | struct drm_property *property, uint64_t val); | 544 | struct drm_property *property, uint64_t val); |
| 666 | }; | 545 | }; |
| 667 | 546 | ||
| 547 | enum drm_plane_type { | ||
| 548 | DRM_PLANE_TYPE_OVERLAY, | ||
| 549 | DRM_PLANE_TYPE_PRIMARY, | ||
| 550 | DRM_PLANE_TYPE_CURSOR, | ||
| 551 | }; | ||
| 552 | |||
| 668 | /** | 553 | /** |
| 669 | * drm_plane - central DRM plane control structure | 554 | * drm_plane - central DRM plane control structure |
| 670 | * @dev: DRM device this plane belongs to | 555 | * @dev: DRM device this plane belongs to |
| @@ -677,6 +562,7 @@ struct drm_plane_funcs { | |||
| 677 | * @fb: currently bound fb | 562 | * @fb: currently bound fb |
| 678 | * @funcs: helper functions | 563 | * @funcs: helper functions |
| 679 | * @properties: property tracking for this plane | 564 | * @properties: property tracking for this plane |
| 565 | * @type: type of plane (overlay, primary, cursor) | ||
| 680 | */ | 566 | */ |
| 681 | struct drm_plane { | 567 | struct drm_plane { |
| 682 | struct drm_device *dev; | 568 | struct drm_device *dev; |
| @@ -694,6 +580,8 @@ struct drm_plane { | |||
| 694 | const struct drm_plane_funcs *funcs; | 580 | const struct drm_plane_funcs *funcs; |
| 695 | 581 | ||
| 696 | struct drm_object_properties properties; | 582 | struct drm_object_properties properties; |
| 583 | |||
| 584 | enum drm_plane_type type; | ||
| 697 | }; | 585 | }; |
| 698 | 586 | ||
| 699 | /** | 587 | /** |
| @@ -856,7 +744,15 @@ struct drm_mode_config { | |||
| 856 | struct list_head bridge_list; | 744 | struct list_head bridge_list; |
| 857 | int num_encoder; | 745 | int num_encoder; |
| 858 | struct list_head encoder_list; | 746 | struct list_head encoder_list; |
| 859 | int num_plane; | 747 | |
| 748 | /* | ||
| 749 | * Track # of overlay planes separately from # of total planes. By | ||
| 750 | * default we only advertise overlay planes to userspace; if userspace | ||
| 751 | * sets the "universal plane" capability bit, we'll go ahead and | ||
| 752 | * expose all planes. | ||
| 753 | */ | ||
| 754 | int num_overlay_plane; | ||
| 755 | int num_total_plane; | ||
| 860 | struct list_head plane_list; | 756 | struct list_head plane_list; |
| 861 | 757 | ||
| 862 | int num_crtc; | 758 | int num_crtc; |
| @@ -878,6 +774,7 @@ struct drm_mode_config { | |||
| 878 | struct list_head property_blob_list; | 774 | struct list_head property_blob_list; |
| 879 | struct drm_property *edid_property; | 775 | struct drm_property *edid_property; |
| 880 | struct drm_property *dpms_property; | 776 | struct drm_property *dpms_property; |
| 777 | struct drm_property *plane_type_property; | ||
| 881 | 778 | ||
| 882 | /* DVI-I properties */ | 779 | /* DVI-I properties */ |
| 883 | struct drm_property *dvi_i_subconnector_property; | 780 | struct drm_property *dvi_i_subconnector_property; |
| @@ -930,6 +827,11 @@ extern void drm_modeset_lock_all(struct drm_device *dev); | |||
| 930 | extern void drm_modeset_unlock_all(struct drm_device *dev); | 827 | extern void drm_modeset_unlock_all(struct drm_device *dev); |
| 931 | extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev); | 828 | extern void drm_warn_on_modeset_not_all_locked(struct drm_device *dev); |
| 932 | 829 | ||
| 830 | extern int drm_crtc_init_with_planes(struct drm_device *dev, | ||
| 831 | struct drm_crtc *crtc, | ||
| 832 | struct drm_plane *primary, | ||
| 833 | void *cursor, | ||
| 834 | const struct drm_crtc_funcs *funcs); | ||
| 933 | extern int drm_crtc_init(struct drm_device *dev, | 835 | extern int drm_crtc_init(struct drm_device *dev, |
| 934 | struct drm_crtc *crtc, | 836 | struct drm_crtc *crtc, |
| 935 | const struct drm_crtc_funcs *funcs); | 837 | const struct drm_crtc_funcs *funcs); |
| @@ -981,19 +883,31 @@ static inline bool drm_encoder_crtc_ok(struct drm_encoder *encoder, | |||
| 981 | return !!(encoder->possible_crtcs & drm_crtc_mask(crtc)); | 883 | return !!(encoder->possible_crtcs & drm_crtc_mask(crtc)); |
| 982 | } | 884 | } |
| 983 | 885 | ||
| 886 | extern int drm_universal_plane_init(struct drm_device *dev, | ||
| 887 | struct drm_plane *plane, | ||
| 888 | unsigned long possible_crtcs, | ||
| 889 | const struct drm_plane_funcs *funcs, | ||
| 890 | const uint32_t *formats, | ||
| 891 | uint32_t format_count, | ||
| 892 | enum drm_plane_type type); | ||
| 984 | extern int drm_plane_init(struct drm_device *dev, | 893 | extern int drm_plane_init(struct drm_device *dev, |
| 985 | struct drm_plane *plane, | 894 | struct drm_plane *plane, |
| 986 | unsigned long possible_crtcs, | 895 | unsigned long possible_crtcs, |
| 987 | const struct drm_plane_funcs *funcs, | 896 | const struct drm_plane_funcs *funcs, |
| 988 | const uint32_t *formats, uint32_t format_count, | 897 | const uint32_t *formats, uint32_t format_count, |
| 989 | bool priv); | 898 | bool is_primary); |
| 990 | extern void drm_plane_cleanup(struct drm_plane *plane); | 899 | extern void drm_plane_cleanup(struct drm_plane *plane); |
| 991 | extern void drm_plane_force_disable(struct drm_plane *plane); | 900 | extern void drm_plane_force_disable(struct drm_plane *plane); |
| 901 | extern int drm_crtc_check_viewport(const struct drm_crtc *crtc, | ||
| 902 | int x, int y, | ||
| 903 | const struct drm_display_mode *mode, | ||
| 904 | const struct drm_framebuffer *fb); | ||
| 992 | 905 | ||
| 993 | extern void drm_encoder_cleanup(struct drm_encoder *encoder); | 906 | extern void drm_encoder_cleanup(struct drm_encoder *encoder); |
| 994 | 907 | ||
| 995 | extern const char *drm_get_connector_name(const struct drm_connector *connector); | 908 | extern const char *drm_get_connector_name(const struct drm_connector *connector); |
| 996 | extern const char *drm_get_connector_status_name(enum drm_connector_status status); | 909 | extern const char *drm_get_connector_status_name(enum drm_connector_status status); |
| 910 | extern const char *drm_get_subpixel_order_name(enum subpixel_order order); | ||
| 997 | extern const char *drm_get_dpms_name(int val); | 911 | extern const char *drm_get_dpms_name(int val); |
| 998 | extern const char *drm_get_dvi_i_subconnector_name(int val); | 912 | extern const char *drm_get_dvi_i_subconnector_name(int val); |
| 999 | extern const char *drm_get_dvi_i_select_name(int val); | 913 | extern const char *drm_get_dvi_i_select_name(int val); |
| @@ -1006,34 +920,10 @@ extern struct edid *drm_get_edid(struct drm_connector *connector, | |||
| 1006 | struct i2c_adapter *adapter); | 920 | struct i2c_adapter *adapter); |
| 1007 | extern struct edid *drm_edid_duplicate(const struct edid *edid); | 921 | extern struct edid *drm_edid_duplicate(const struct edid *edid); |
| 1008 | extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); | 922 | extern int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid); |
| 1009 | extern void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | ||
| 1010 | extern void drm_mode_copy(struct drm_display_mode *dst, const struct drm_display_mode *src); | ||
| 1011 | extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | ||
| 1012 | const struct drm_display_mode *mode); | ||
| 1013 | extern void drm_mode_debug_printmodeline(const struct drm_display_mode *mode); | ||
| 1014 | extern void drm_mode_config_init(struct drm_device *dev); | 923 | extern void drm_mode_config_init(struct drm_device *dev); |
| 1015 | extern void drm_mode_config_reset(struct drm_device *dev); | 924 | extern void drm_mode_config_reset(struct drm_device *dev); |
| 1016 | extern void drm_mode_config_cleanup(struct drm_device *dev); | 925 | extern void drm_mode_config_cleanup(struct drm_device *dev); |
| 1017 | extern void drm_mode_set_name(struct drm_display_mode *mode); | 926 | |
| 1018 | extern bool drm_mode_equal(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2); | ||
| 1019 | extern bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, const struct drm_display_mode *mode2); | ||
| 1020 | extern int drm_mode_width(const struct drm_display_mode *mode); | ||
| 1021 | extern int drm_mode_height(const struct drm_display_mode *mode); | ||
| 1022 | |||
| 1023 | /* for us by fb module */ | ||
| 1024 | extern struct drm_display_mode *drm_mode_create(struct drm_device *dev); | ||
| 1025 | extern void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); | ||
| 1026 | extern void drm_mode_validate_size(struct drm_device *dev, | ||
| 1027 | struct list_head *mode_list, | ||
| 1028 | int maxX, int maxY, int maxPitch); | ||
| 1029 | extern void drm_mode_prune_invalid(struct drm_device *dev, | ||
| 1030 | struct list_head *mode_list, bool verbose); | ||
| 1031 | extern void drm_mode_sort(struct list_head *mode_list); | ||
| 1032 | extern int drm_mode_hsync(const struct drm_display_mode *mode); | ||
| 1033 | extern int drm_mode_vrefresh(const struct drm_display_mode *mode); | ||
| 1034 | extern void drm_mode_set_crtcinfo(struct drm_display_mode *p, | ||
| 1035 | int adjust_flags); | ||
| 1036 | extern void drm_mode_connector_list_update(struct drm_connector *connector); | ||
| 1037 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, | 927 | extern int drm_mode_connector_update_edid_property(struct drm_connector *connector, |
| 1038 | struct edid *edid); | 928 | struct edid *edid); |
| 1039 | extern int drm_object_property_set_value(struct drm_mode_object *obj, | 929 | extern int drm_object_property_set_value(struct drm_mode_object *obj, |
| @@ -1081,8 +971,6 @@ extern const char *drm_get_encoder_name(const struct drm_encoder *encoder); | |||
| 1081 | 971 | ||
| 1082 | extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, | 972 | extern int drm_mode_connector_attach_encoder(struct drm_connector *connector, |
| 1083 | struct drm_encoder *encoder); | 973 | struct drm_encoder *encoder); |
| 1084 | extern void drm_mode_connector_detach_encoder(struct drm_connector *connector, | ||
| 1085 | struct drm_encoder *encoder); | ||
| 1086 | extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, | 974 | extern int drm_mode_crtc_set_gamma_size(struct drm_crtc *crtc, |
| 1087 | int gamma_size); | 975 | int gamma_size); |
| 1088 | extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, | 976 | extern struct drm_mode_object *drm_mode_object_find(struct drm_device *dev, |
| @@ -1137,16 +1025,6 @@ extern bool drm_detect_monitor_audio(struct edid *edid); | |||
| 1137 | extern bool drm_rgb_quant_range_selectable(struct edid *edid); | 1025 | extern bool drm_rgb_quant_range_selectable(struct edid *edid); |
| 1138 | extern int drm_mode_page_flip_ioctl(struct drm_device *dev, | 1026 | extern int drm_mode_page_flip_ioctl(struct drm_device *dev, |
| 1139 | void *data, struct drm_file *file_priv); | 1027 | void *data, struct drm_file *file_priv); |
| 1140 | extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | ||
| 1141 | int hdisplay, int vdisplay, int vrefresh, | ||
| 1142 | bool reduced, bool interlaced, bool margins); | ||
| 1143 | extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, | ||
| 1144 | int hdisplay, int vdisplay, int vrefresh, | ||
| 1145 | bool interlaced, int margins); | ||
| 1146 | extern struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, | ||
| 1147 | int hdisplay, int vdisplay, int vrefresh, | ||
| 1148 | bool interlaced, int margins, int GTF_M, | ||
| 1149 | int GTF_2C, int GTF_K, int GTF_2J); | ||
| 1150 | extern int drm_add_modes_noedid(struct drm_connector *connector, | 1028 | extern int drm_add_modes_noedid(struct drm_connector *connector, |
| 1151 | int hdisplay, int vdisplay); | 1029 | int hdisplay, int vdisplay); |
| 1152 | extern void drm_set_preferred_mode(struct drm_connector *connector, | 1030 | extern void drm_set_preferred_mode(struct drm_connector *connector, |
| @@ -1195,4 +1073,9 @@ static inline struct drm_encoder *drm_encoder_find(struct drm_device *dev, | |||
| 1195 | return mo ? obj_to_encoder(mo) : NULL; | 1073 | return mo ? obj_to_encoder(mo) : NULL; |
| 1196 | } | 1074 | } |
| 1197 | 1075 | ||
| 1076 | /* Plane list iterator for legacy (overlay only) planes. */ | ||
| 1077 | #define drm_for_each_legacy_plane(plane, planelist) \ | ||
| 1078 | list_for_each_entry(plane, planelist, head) \ | ||
| 1079 | if (plane->type == DRM_PLANE_TYPE_OVERLAY) | ||
| 1080 | |||
| 1198 | #endif /* __DRM_CRTC_H__ */ | 1081 | #endif /* __DRM_CRTC_H__ */ |
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index b1388b5fe7ac..0bb34ca2ad2b 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h | |||
| @@ -139,8 +139,8 @@ extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode) | |||
| 139 | 139 | ||
| 140 | extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); | 140 | extern void drm_helper_move_panel_connectors_to_head(struct drm_device *); |
| 141 | 141 | ||
| 142 | extern int drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, | 142 | extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb, |
| 143 | struct drm_mode_fb_cmd2 *mode_cmd); | 143 | struct drm_mode_fb_cmd2 *mode_cmd); |
| 144 | 144 | ||
| 145 | static inline void drm_crtc_helper_add(struct drm_crtc *crtc, | 145 | static inline void drm_crtc_helper_add(struct drm_crtc *crtc, |
| 146 | const struct drm_crtc_helper_funcs *funcs) | 146 | const struct drm_crtc_helper_funcs *funcs) |
| @@ -160,7 +160,7 @@ static inline void drm_connector_helper_add(struct drm_connector *connector, | |||
| 160 | connector->helper_private = (void *)funcs; | 160 | connector->helper_private = (void *)funcs; |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | extern int drm_helper_resume_force_mode(struct drm_device *dev); | 163 | extern void drm_helper_resume_force_mode(struct drm_device *dev); |
| 164 | extern void drm_kms_helper_poll_init(struct drm_device *dev); | 164 | extern void drm_kms_helper_poll_init(struct drm_device *dev); |
| 165 | extern void drm_kms_helper_poll_fini(struct drm_device *dev); | 165 | extern void drm_kms_helper_poll_fini(struct drm_device *dev); |
| 166 | extern bool drm_helper_hpd_irq_event(struct drm_device *dev); | 166 | extern bool drm_helper_hpd_irq_event(struct drm_device *dev); |
diff --git a/include/drm/drm_dp_helper.h b/include/drm/drm_dp_helper.h index 1d09050a8c00..b4f58914bf7d 100644 --- a/include/drm/drm_dp_helper.h +++ b/include/drm/drm_dp_helper.h | |||
| @@ -279,11 +279,21 @@ | |||
| 279 | 279 | ||
| 280 | #define DP_TEST_PATTERN 0x221 | 280 | #define DP_TEST_PATTERN 0x221 |
| 281 | 281 | ||
| 282 | #define DP_TEST_CRC_R_CR 0x240 | ||
| 283 | #define DP_TEST_CRC_G_Y 0x242 | ||
| 284 | #define DP_TEST_CRC_B_CB 0x244 | ||
| 285 | |||
| 286 | #define DP_TEST_SINK_MISC 0x246 | ||
| 287 | #define DP_TEST_CRC_SUPPORTED (1 << 5) | ||
| 288 | |||
| 282 | #define DP_TEST_RESPONSE 0x260 | 289 | #define DP_TEST_RESPONSE 0x260 |
| 283 | # define DP_TEST_ACK (1 << 0) | 290 | # define DP_TEST_ACK (1 << 0) |
| 284 | # define DP_TEST_NAK (1 << 1) | 291 | # define DP_TEST_NAK (1 << 1) |
| 285 | # define DP_TEST_EDID_CHECKSUM_WRITE (1 << 2) | 292 | # define DP_TEST_EDID_CHECKSUM_WRITE (1 << 2) |
| 286 | 293 | ||
| 294 | #define DP_TEST_SINK 0x270 | ||
| 295 | #define DP_TEST_SINK_START (1 << 0) | ||
| 296 | |||
| 287 | #define DP_SOURCE_OUI 0x300 | 297 | #define DP_SOURCE_OUI 0x300 |
| 288 | #define DP_SINK_OUI 0x400 | 298 | #define DP_SINK_OUI 0x400 |
| 289 | #define DP_BRANCH_OUI 0x500 | 299 | #define DP_BRANCH_OUI 0x500 |
| @@ -291,6 +301,7 @@ | |||
| 291 | #define DP_SET_POWER 0x600 | 301 | #define DP_SET_POWER 0x600 |
| 292 | # define DP_SET_POWER_D0 0x1 | 302 | # define DP_SET_POWER_D0 0x1 |
| 293 | # define DP_SET_POWER_D3 0x2 | 303 | # define DP_SET_POWER_D3 0x2 |
| 304 | # define DP_SET_POWER_MASK 0x3 | ||
| 294 | 305 | ||
| 295 | #define DP_PSR_ERROR_STATUS 0x2006 /* XXX 1.2? */ | 306 | #define DP_PSR_ERROR_STATUS 0x2006 /* XXX 1.2? */ |
| 296 | # define DP_PSR_LINK_CRC_ERROR (1 << 0) | 307 | # define DP_PSR_LINK_CRC_ERROR (1 << 0) |
| @@ -398,4 +409,118 @@ drm_dp_enhanced_frame_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE]) | |||
| 398 | (dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP); | 409 | (dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP); |
| 399 | } | 410 | } |
| 400 | 411 | ||
| 412 | /* | ||
| 413 | * DisplayPort AUX channel | ||
| 414 | */ | ||
| 415 | |||
| 416 | /** | ||
| 417 | * struct drm_dp_aux_msg - DisplayPort AUX channel transaction | ||
| 418 | * @address: address of the (first) register to access | ||
| 419 | * @request: contains the type of transaction (see DP_AUX_* macros) | ||
| 420 | * @reply: upon completion, contains the reply type of the transaction | ||
| 421 | * @buffer: pointer to a transmission or reception buffer | ||
| 422 | * @size: size of @buffer | ||
| 423 | */ | ||
| 424 | struct drm_dp_aux_msg { | ||
| 425 | unsigned int address; | ||
| 426 | u8 request; | ||
| 427 | u8 reply; | ||
| 428 | void *buffer; | ||
| 429 | size_t size; | ||
| 430 | }; | ||
| 431 | |||
| 432 | /** | ||
| 433 | * struct drm_dp_aux - DisplayPort AUX channel | ||
| 434 | * @ddc: I2C adapter that can be used for I2C-over-AUX communication | ||
| 435 | * @dev: pointer to struct device that is the parent for this AUX channel | ||
| 436 | * @transfer: transfers a message representing a single AUX transaction | ||
| 437 | * | ||
| 438 | * The .dev field should be set to a pointer to the device that implements | ||
| 439 | * the AUX channel. | ||
| 440 | * | ||
| 441 | * The .name field may be used to specify the name of the I2C adapter. If set to | ||
| 442 | * NULL, dev_name() of .dev will be used. | ||
| 443 | * | ||
| 444 | * Drivers provide a hardware-specific implementation of how transactions | ||
| 445 | * are executed via the .transfer() function. A pointer to a drm_dp_aux_msg | ||
| 446 | * structure describing the transaction is passed into this function. Upon | ||
| 447 | * success, the implementation should return the number of payload bytes | ||
| 448 | * that were transferred, or a negative error-code on failure. Helpers | ||
| 449 | * propagate errors from the .transfer() function, with the exception of | ||
| 450 | * the -EBUSY error, which causes a transaction to be retried. On a short, | ||
| 451 | * helpers will return -EPROTO to make it simpler to check for failure. | ||
| 452 | * | ||
| 453 | * An AUX channel can also be used to transport I2C messages to a sink. A | ||
| 454 | * typical application of that is to access an EDID that's present in the | ||
| 455 | * sink device. The .transfer() function can also be used to execute such | ||
| 456 | * transactions. The drm_dp_aux_register_i2c_bus() function registers an | ||
| 457 | * I2C adapter that can be passed to drm_probe_ddc(). Upon removal, drivers | ||
| 458 | * should call drm_dp_aux_unregister_i2c_bus() to remove the I2C adapter. | ||
| 459 | */ | ||
| 460 | struct drm_dp_aux { | ||
| 461 | const char *name; | ||
| 462 | struct i2c_adapter ddc; | ||
| 463 | struct device *dev; | ||
| 464 | |||
| 465 | ssize_t (*transfer)(struct drm_dp_aux *aux, | ||
| 466 | struct drm_dp_aux_msg *msg); | ||
| 467 | }; | ||
| 468 | |||
| 469 | ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset, | ||
| 470 | void *buffer, size_t size); | ||
| 471 | ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset, | ||
| 472 | void *buffer, size_t size); | ||
| 473 | |||
| 474 | /** | ||
| 475 | * drm_dp_dpcd_readb() - read a single byte from the DPCD | ||
| 476 | * @aux: DisplayPort AUX channel | ||
| 477 | * @offset: address of the register to read | ||
| 478 | * @valuep: location where the value of the register will be stored | ||
| 479 | * | ||
| 480 | * Returns the number of bytes transferred (1) on success, or a negative | ||
| 481 | * error code on failure. | ||
| 482 | */ | ||
| 483 | static inline ssize_t drm_dp_dpcd_readb(struct drm_dp_aux *aux, | ||
| 484 | unsigned int offset, u8 *valuep) | ||
| 485 | { | ||
| 486 | return drm_dp_dpcd_read(aux, offset, valuep, 1); | ||
| 487 | } | ||
| 488 | |||
| 489 | /** | ||
| 490 | * drm_dp_dpcd_writeb() - write a single byte to the DPCD | ||
| 491 | * @aux: DisplayPort AUX channel | ||
| 492 | * @offset: address of the register to write | ||
| 493 | * @value: value to write to the register | ||
| 494 | * | ||
| 495 | * Returns the number of bytes transferred (1) on success, or a negative | ||
| 496 | * error code on failure. | ||
| 497 | */ | ||
| 498 | static inline ssize_t drm_dp_dpcd_writeb(struct drm_dp_aux *aux, | ||
| 499 | unsigned int offset, u8 value) | ||
| 500 | { | ||
| 501 | return drm_dp_dpcd_write(aux, offset, &value, 1); | ||
| 502 | } | ||
| 503 | |||
| 504 | int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux, | ||
| 505 | u8 status[DP_LINK_STATUS_SIZE]); | ||
| 506 | |||
| 507 | /* | ||
| 508 | * DisplayPort link | ||
| 509 | */ | ||
| 510 | #define DP_LINK_CAP_ENHANCED_FRAMING (1 << 0) | ||
| 511 | |||
| 512 | struct drm_dp_link { | ||
| 513 | unsigned char revision; | ||
| 514 | unsigned int rate; | ||
| 515 | unsigned int num_lanes; | ||
| 516 | unsigned long capabilities; | ||
| 517 | }; | ||
| 518 | |||
| 519 | int drm_dp_link_probe(struct drm_dp_aux *aux, struct drm_dp_link *link); | ||
| 520 | int drm_dp_link_power_up(struct drm_dp_aux *aux, struct drm_dp_link *link); | ||
| 521 | int drm_dp_link_configure(struct drm_dp_aux *aux, struct drm_dp_link *link); | ||
| 522 | |||
| 523 | int drm_dp_aux_register_i2c_bus(struct drm_dp_aux *aux); | ||
| 524 | void drm_dp_aux_unregister_i2c_bus(struct drm_dp_aux *aux); | ||
| 525 | |||
| 401 | #endif /* _DRM_DP_HELPER_H_ */ | 526 | #endif /* _DRM_DP_HELPER_H_ */ |
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h index 0145b948b147..6e622f7d481d 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h | |||
| @@ -121,5 +121,11 @@ bool drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper, int bpp_sel); | |||
| 121 | int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); | 121 | int drm_fb_helper_single_add_all_connectors(struct drm_fb_helper *fb_helper); |
| 122 | int drm_fb_helper_debug_enter(struct fb_info *info); | 122 | int drm_fb_helper_debug_enter(struct fb_info *info); |
| 123 | int drm_fb_helper_debug_leave(struct fb_info *info); | 123 | int drm_fb_helper_debug_leave(struct fb_info *info); |
| 124 | struct drm_display_mode * | ||
| 125 | drm_has_preferred_mode(struct drm_fb_helper_connector *fb_connector, | ||
| 126 | int width, int height); | ||
| 127 | struct drm_display_mode * | ||
| 128 | drm_pick_cmdline_mode(struct drm_fb_helper_connector *fb_helper_conn, | ||
| 129 | int width, int height); | ||
| 124 | 130 | ||
| 125 | #endif | 131 | #endif |
diff --git a/include/drm/drm_gem_cma_helper.h b/include/drm/drm_gem_cma_helper.h index 89b4d7db1ebd..2a3cea91606d 100644 --- a/include/drm/drm_gem_cma_helper.h +++ b/include/drm/drm_gem_cma_helper.h | |||
| @@ -1,6 +1,8 @@ | |||
| 1 | #ifndef __DRM_GEM_CMA_HELPER_H__ | 1 | #ifndef __DRM_GEM_CMA_HELPER_H__ |
| 2 | #define __DRM_GEM_CMA_HELPER_H__ | 2 | #define __DRM_GEM_CMA_HELPER_H__ |
| 3 | 3 | ||
| 4 | #include <drm/drmP.h> | ||
| 5 | |||
| 4 | struct drm_gem_cma_object { | 6 | struct drm_gem_cma_object { |
| 5 | struct drm_gem_object base; | 7 | struct drm_gem_object base; |
| 6 | dma_addr_t paddr; | 8 | dma_addr_t paddr; |
diff --git a/include/drm/drm_mipi_dsi.h b/include/drm/drm_mipi_dsi.h index d32628acdd90..7209df15a3cd 100644 --- a/include/drm/drm_mipi_dsi.h +++ b/include/drm/drm_mipi_dsi.h | |||
| @@ -17,6 +17,11 @@ | |||
| 17 | struct mipi_dsi_host; | 17 | struct mipi_dsi_host; |
| 18 | struct mipi_dsi_device; | 18 | struct mipi_dsi_device; |
| 19 | 19 | ||
| 20 | /* request ACK from peripheral */ | ||
| 21 | #define MIPI_DSI_MSG_REQ_ACK BIT(0) | ||
| 22 | /* use Low Power Mode to transmit message */ | ||
| 23 | #define MIPI_DSI_MSG_USE_LPM BIT(1) | ||
| 24 | |||
| 20 | /** | 25 | /** |
| 21 | * struct mipi_dsi_msg - read/write DSI buffer | 26 | * struct mipi_dsi_msg - read/write DSI buffer |
| 22 | * @channel: virtual channel id | 27 | * @channel: virtual channel id |
| @@ -29,6 +34,7 @@ struct mipi_dsi_device; | |||
| 29 | struct mipi_dsi_msg { | 34 | struct mipi_dsi_msg { |
| 30 | u8 channel; | 35 | u8 channel; |
| 31 | u8 type; | 36 | u8 type; |
| 37 | u16 flags; | ||
| 32 | 38 | ||
| 33 | size_t tx_len; | 39 | size_t tx_len; |
| 34 | const void *tx_buf; | 40 | const void *tx_buf; |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index cba67865d18f..a24addfdfcec 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
| @@ -47,8 +47,17 @@ | |||
| 47 | enum drm_mm_search_flags { | 47 | enum drm_mm_search_flags { |
| 48 | DRM_MM_SEARCH_DEFAULT = 0, | 48 | DRM_MM_SEARCH_DEFAULT = 0, |
| 49 | DRM_MM_SEARCH_BEST = 1 << 0, | 49 | DRM_MM_SEARCH_BEST = 1 << 0, |
| 50 | DRM_MM_SEARCH_BELOW = 1 << 1, | ||
| 50 | }; | 51 | }; |
| 51 | 52 | ||
| 53 | enum drm_mm_allocator_flags { | ||
| 54 | DRM_MM_CREATE_DEFAULT = 0, | ||
| 55 | DRM_MM_CREATE_TOP = 1 << 0, | ||
| 56 | }; | ||
| 57 | |||
| 58 | #define DRM_MM_BOTTOMUP DRM_MM_SEARCH_DEFAULT, DRM_MM_CREATE_DEFAULT | ||
| 59 | #define DRM_MM_TOPDOWN DRM_MM_SEARCH_BELOW, DRM_MM_CREATE_TOP | ||
| 60 | |||
| 52 | struct drm_mm_node { | 61 | struct drm_mm_node { |
| 53 | struct list_head node_list; | 62 | struct list_head node_list; |
| 54 | struct list_head hole_stack; | 63 | struct list_head hole_stack; |
| @@ -85,11 +94,31 @@ struct drm_mm { | |||
| 85 | unsigned long *start, unsigned long *end); | 94 | unsigned long *start, unsigned long *end); |
| 86 | }; | 95 | }; |
| 87 | 96 | ||
| 97 | /** | ||
| 98 | * drm_mm_node_allocated - checks whether a node is allocated | ||
| 99 | * @node: drm_mm_node to check | ||
| 100 | * | ||
| 101 | * Drivers should use this helpers for proper encapusulation of drm_mm | ||
| 102 | * internals. | ||
| 103 | * | ||
| 104 | * Returns: | ||
| 105 | * True if the @node is allocated. | ||
| 106 | */ | ||
| 88 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) | 107 | static inline bool drm_mm_node_allocated(struct drm_mm_node *node) |
| 89 | { | 108 | { |
| 90 | return node->allocated; | 109 | return node->allocated; |
| 91 | } | 110 | } |
| 92 | 111 | ||
| 112 | /** | ||
| 113 | * drm_mm_initialized - checks whether an allocator is initialized | ||
| 114 | * @mm: drm_mm to check | ||
| 115 | * | ||
| 116 | * Drivers should use this helpers for proper encapusulation of drm_mm | ||
| 117 | * internals. | ||
| 118 | * | ||
| 119 | * Returns: | ||
| 120 | * True if the @mm is initialized. | ||
| 121 | */ | ||
| 93 | static inline bool drm_mm_initialized(struct drm_mm *mm) | 122 | static inline bool drm_mm_initialized(struct drm_mm *mm) |
| 94 | { | 123 | { |
| 95 | return mm->hole_stack.next; | 124 | return mm->hole_stack.next; |
| @@ -100,6 +129,17 @@ static inline unsigned long __drm_mm_hole_node_start(struct drm_mm_node *hole_no | |||
| 100 | return hole_node->start + hole_node->size; | 129 | return hole_node->start + hole_node->size; |
| 101 | } | 130 | } |
| 102 | 131 | ||
| 132 | /** | ||
| 133 | * drm_mm_hole_node_start - computes the start of the hole following @node | ||
| 134 | * @hole_node: drm_mm_node which implicitly tracks the following hole | ||
| 135 | * | ||
| 136 | * This is useful for driver-sepific debug dumpers. Otherwise drivers should not | ||
| 137 | * inspect holes themselves. Drivers must check first whether a hole indeed | ||
| 138 | * follows by looking at node->hole_follows. | ||
| 139 | * | ||
| 140 | * Returns: | ||
| 141 | * Start of the subsequent hole. | ||
| 142 | */ | ||
| 103 | static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) | 143 | static inline unsigned long drm_mm_hole_node_start(struct drm_mm_node *hole_node) |
| 104 | { | 144 | { |
| 105 | BUG_ON(!hole_node->hole_follows); | 145 | BUG_ON(!hole_node->hole_follows); |
| @@ -112,18 +152,52 @@ static inline unsigned long __drm_mm_hole_node_end(struct drm_mm_node *hole_node | |||
| 112 | struct drm_mm_node, node_list)->start; | 152 | struct drm_mm_node, node_list)->start; |
| 113 | } | 153 | } |
| 114 | 154 | ||
| 155 | /** | ||
| 156 | * drm_mm_hole_node_end - computes the end of the hole following @node | ||
| 157 | * @hole_node: drm_mm_node which implicitly tracks the following hole | ||
| 158 | * | ||
| 159 | * This is useful for driver-sepific debug dumpers. Otherwise drivers should not | ||
| 160 | * inspect holes themselves. Drivers must check first whether a hole indeed | ||
| 161 | * follows by looking at node->hole_follows. | ||
| 162 | * | ||
| 163 | * Returns: | ||
| 164 | * End of the subsequent hole. | ||
| 165 | */ | ||
| 115 | static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) | 166 | static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) |
| 116 | { | 167 | { |
| 117 | return __drm_mm_hole_node_end(hole_node); | 168 | return __drm_mm_hole_node_end(hole_node); |
| 118 | } | 169 | } |
| 119 | 170 | ||
| 171 | /** | ||
| 172 | * drm_mm_for_each_node - iterator to walk over all allocated nodes | ||
| 173 | * @entry: drm_mm_node structure to assign to in each iteration step | ||
| 174 | * @mm: drm_mm allocator to walk | ||
| 175 | * | ||
| 176 | * This iterator walks over all nodes in the range allocator. It is implemented | ||
| 177 | * with list_for_each, so not save against removal of elements. | ||
| 178 | */ | ||
| 120 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ | 179 | #define drm_mm_for_each_node(entry, mm) list_for_each_entry(entry, \ |
| 121 | &(mm)->head_node.node_list, \ | 180 | &(mm)->head_node.node_list, \ |
| 122 | node_list) | 181 | node_list) |
| 123 | 182 | ||
| 124 | /* Note that we need to unroll list_for_each_entry in order to inline | 183 | /** |
| 125 | * setting hole_start and hole_end on each iteration and keep the | 184 | * drm_mm_for_each_hole - iterator to walk over all holes |
| 126 | * macro sane. | 185 | * @entry: drm_mm_node used internally to track progress |
| 186 | * @mm: drm_mm allocator to walk | ||
| 187 | * @hole_start: ulong variable to assign the hole start to on each iteration | ||
| 188 | * @hole_end: ulong variable to assign the hole end to on each iteration | ||
| 189 | * | ||
| 190 | * This iterator walks over all holes in the range allocator. It is implemented | ||
| 191 | * with list_for_each, so not save against removal of elements. @entry is used | ||
| 192 | * internally and will not reflect a real drm_mm_node for the very first hole. | ||
| 193 | * Hence users of this iterator may not access it. | ||
| 194 | * | ||
| 195 | * Implementation Note: | ||
| 196 | * We need to inline list_for_each_entry in order to be able to set hole_start | ||
| 197 | * and hole_end on each iteration while keeping the macro sane. | ||
| 198 | * | ||
| 199 | * The __drm_mm_for_each_hole version is similar, but with added support for | ||
| 200 | * going backwards. | ||
| 127 | */ | 201 | */ |
| 128 | #define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ | 202 | #define drm_mm_for_each_hole(entry, mm, hole_start, hole_end) \ |
| 129 | for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ | 203 | for (entry = list_entry((mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ |
| @@ -133,34 +207,79 @@ static inline unsigned long drm_mm_hole_node_end(struct drm_mm_node *hole_node) | |||
| 133 | 1 : 0; \ | 207 | 1 : 0; \ |
| 134 | entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack)) | 208 | entry = list_entry(entry->hole_stack.next, struct drm_mm_node, hole_stack)) |
| 135 | 209 | ||
| 210 | #define __drm_mm_for_each_hole(entry, mm, hole_start, hole_end, backwards) \ | ||
| 211 | for (entry = list_entry((backwards) ? (mm)->hole_stack.prev : (mm)->hole_stack.next, struct drm_mm_node, hole_stack); \ | ||
| 212 | &entry->hole_stack != &(mm)->hole_stack ? \ | ||
| 213 | hole_start = drm_mm_hole_node_start(entry), \ | ||
| 214 | hole_end = drm_mm_hole_node_end(entry), \ | ||
| 215 | 1 : 0; \ | ||
| 216 | entry = list_entry((backwards) ? entry->hole_stack.prev : entry->hole_stack.next, struct drm_mm_node, hole_stack)) | ||
| 217 | |||
| 136 | /* | 218 | /* |
| 137 | * Basic range manager support (drm_mm.c) | 219 | * Basic range manager support (drm_mm.c) |
| 138 | */ | 220 | */ |
| 139 | extern int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); | 221 | int drm_mm_reserve_node(struct drm_mm *mm, struct drm_mm_node *node); |
| 140 | 222 | ||
| 141 | extern int drm_mm_insert_node_generic(struct drm_mm *mm, | 223 | int drm_mm_insert_node_generic(struct drm_mm *mm, |
| 142 | struct drm_mm_node *node, | 224 | struct drm_mm_node *node, |
| 143 | unsigned long size, | 225 | unsigned long size, |
| 144 | unsigned alignment, | 226 | unsigned alignment, |
| 145 | unsigned long color, | 227 | unsigned long color, |
| 146 | enum drm_mm_search_flags flags); | 228 | enum drm_mm_search_flags sflags, |
| 229 | enum drm_mm_allocator_flags aflags); | ||
| 230 | /** | ||
| 231 | * drm_mm_insert_node - search for space and insert @node | ||
| 232 | * @mm: drm_mm to allocate from | ||
| 233 | * @node: preallocate node to insert | ||
| 234 | * @size: size of the allocation | ||
| 235 | * @alignment: alignment of the allocation | ||
| 236 | * @flags: flags to fine-tune the allocation | ||
| 237 | * | ||
| 238 | * This is a simplified version of drm_mm_insert_node_generic() with @color set | ||
| 239 | * to 0. | ||
| 240 | * | ||
| 241 | * The preallocated node must be cleared to 0. | ||
| 242 | * | ||
| 243 | * Returns: | ||
| 244 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
| 245 | */ | ||
| 147 | static inline int drm_mm_insert_node(struct drm_mm *mm, | 246 | static inline int drm_mm_insert_node(struct drm_mm *mm, |
| 148 | struct drm_mm_node *node, | 247 | struct drm_mm_node *node, |
| 149 | unsigned long size, | 248 | unsigned long size, |
| 150 | unsigned alignment, | 249 | unsigned alignment, |
| 151 | enum drm_mm_search_flags flags) | 250 | enum drm_mm_search_flags flags) |
| 152 | { | 251 | { |
| 153 | return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags); | 252 | return drm_mm_insert_node_generic(mm, node, size, alignment, 0, flags, |
| 253 | DRM_MM_CREATE_DEFAULT); | ||
| 154 | } | 254 | } |
| 155 | 255 | ||
| 156 | extern int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, | 256 | int drm_mm_insert_node_in_range_generic(struct drm_mm *mm, |
| 157 | struct drm_mm_node *node, | 257 | struct drm_mm_node *node, |
| 158 | unsigned long size, | 258 | unsigned long size, |
| 159 | unsigned alignment, | 259 | unsigned alignment, |
| 160 | unsigned long color, | 260 | unsigned long color, |
| 161 | unsigned long start, | 261 | unsigned long start, |
| 162 | unsigned long end, | 262 | unsigned long end, |
| 163 | enum drm_mm_search_flags flags); | 263 | enum drm_mm_search_flags sflags, |
| 264 | enum drm_mm_allocator_flags aflags); | ||
| 265 | /** | ||
| 266 | * drm_mm_insert_node_in_range - ranged search for space and insert @node | ||
| 267 | * @mm: drm_mm to allocate from | ||
| 268 | * @node: preallocate node to insert | ||
| 269 | * @size: size of the allocation | ||
| 270 | * @alignment: alignment of the allocation | ||
| 271 | * @start: start of the allowed range for this node | ||
| 272 | * @end: end of the allowed range for this node | ||
| 273 | * @flags: flags to fine-tune the allocation | ||
| 274 | * | ||
| 275 | * This is a simplified version of drm_mm_insert_node_in_range_generic() with | ||
| 276 | * @color set to 0. | ||
| 277 | * | ||
| 278 | * The preallocated node must be cleared to 0. | ||
| 279 | * | ||
| 280 | * Returns: | ||
| 281 | * 0 on success, -ENOSPC if there's no suitable hole. | ||
| 282 | */ | ||
| 164 | static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, | 283 | static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, |
| 165 | struct drm_mm_node *node, | 284 | struct drm_mm_node *node, |
| 166 | unsigned long size, | 285 | unsigned long size, |
| @@ -170,16 +289,17 @@ static inline int drm_mm_insert_node_in_range(struct drm_mm *mm, | |||
| 170 | enum drm_mm_search_flags flags) | 289 | enum drm_mm_search_flags flags) |
| 171 | { | 290 | { |
| 172 | return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, | 291 | return drm_mm_insert_node_in_range_generic(mm, node, size, alignment, |
| 173 | 0, start, end, flags); | 292 | 0, start, end, flags, |
| 293 | DRM_MM_CREATE_DEFAULT); | ||
| 174 | } | 294 | } |
| 175 | 295 | ||
| 176 | extern void drm_mm_remove_node(struct drm_mm_node *node); | 296 | void drm_mm_remove_node(struct drm_mm_node *node); |
| 177 | extern void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); | 297 | void drm_mm_replace_node(struct drm_mm_node *old, struct drm_mm_node *new); |
| 178 | extern void drm_mm_init(struct drm_mm *mm, | 298 | void drm_mm_init(struct drm_mm *mm, |
| 179 | unsigned long start, | 299 | unsigned long start, |
| 180 | unsigned long size); | 300 | unsigned long size); |
| 181 | extern void drm_mm_takedown(struct drm_mm *mm); | 301 | void drm_mm_takedown(struct drm_mm *mm); |
| 182 | extern int drm_mm_clean(struct drm_mm *mm); | 302 | bool drm_mm_clean(struct drm_mm *mm); |
| 183 | 303 | ||
| 184 | void drm_mm_init_scan(struct drm_mm *mm, | 304 | void drm_mm_init_scan(struct drm_mm *mm, |
| 185 | unsigned long size, | 305 | unsigned long size, |
| @@ -191,10 +311,10 @@ void drm_mm_init_scan_with_range(struct drm_mm *mm, | |||
| 191 | unsigned long color, | 311 | unsigned long color, |
| 192 | unsigned long start, | 312 | unsigned long start, |
| 193 | unsigned long end); | 313 | unsigned long end); |
| 194 | int drm_mm_scan_add_block(struct drm_mm_node *node); | 314 | bool drm_mm_scan_add_block(struct drm_mm_node *node); |
| 195 | int drm_mm_scan_remove_block(struct drm_mm_node *node); | 315 | bool drm_mm_scan_remove_block(struct drm_mm_node *node); |
| 196 | 316 | ||
| 197 | extern void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); | 317 | void drm_mm_debug_table(struct drm_mm *mm, const char *prefix); |
| 198 | #ifdef CONFIG_DEBUG_FS | 318 | #ifdef CONFIG_DEBUG_FS |
| 199 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); | 319 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); |
| 200 | #endif | 320 | #endif |
diff --git a/include/drm/drm_modes.h b/include/drm/drm_modes.h new file mode 100644 index 000000000000..2dbbf9976669 --- /dev/null +++ b/include/drm/drm_modes.h | |||
| @@ -0,0 +1,237 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2006 Keith Packard | ||
| 3 | * Copyright © 2007-2008 Dave Airlie | ||
| 4 | * Copyright © 2007-2008 Intel Corporation | ||
| 5 | * Jesse Barnes <jesse.barnes@intel.com> | ||
| 6 | * Copyright © 2014 Intel Corporation | ||
| 7 | * Daniel Vetter <daniel.vetter@ffwll.ch> | ||
| 8 | * | ||
| 9 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 10 | * copy of this software and associated documentation files (the "Software"), | ||
| 11 | * to deal in the Software without restriction, including without limitation | ||
| 12 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 13 | * and/or sell copies of the Software, and to permit persons to whom the | ||
| 14 | * Software is furnished to do so, subject to the following conditions: | ||
| 15 | * | ||
| 16 | * The above copyright notice and this permission notice shall be included in | ||
| 17 | * all copies or substantial portions of the Software. | ||
| 18 | * | ||
| 19 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 20 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 21 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 22 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 23 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 24 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 25 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 26 | */ | ||
| 27 | #ifndef __DRM_MODES_H__ | ||
| 28 | #define __DRM_MODES_H__ | ||
| 29 | |||
| 30 | /* | ||
| 31 | * Note on terminology: here, for brevity and convenience, we refer to connector | ||
| 32 | * control chips as 'CRTCs'. They can control any type of connector, VGA, LVDS, | ||
| 33 | * DVI, etc. And 'screen' refers to the whole of the visible display, which | ||
| 34 | * may span multiple monitors (and therefore multiple CRTC and connector | ||
| 35 | * structures). | ||
| 36 | */ | ||
| 37 | |||
| 38 | enum drm_mode_status { | ||
| 39 | MODE_OK = 0, /* Mode OK */ | ||
| 40 | MODE_HSYNC, /* hsync out of range */ | ||
| 41 | MODE_VSYNC, /* vsync out of range */ | ||
| 42 | MODE_H_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 43 | MODE_V_ILLEGAL, /* mode has illegal horizontal timings */ | ||
| 44 | MODE_BAD_WIDTH, /* requires an unsupported linepitch */ | ||
| 45 | MODE_NOMODE, /* no mode with a matching name */ | ||
| 46 | MODE_NO_INTERLACE, /* interlaced mode not supported */ | ||
| 47 | MODE_NO_DBLESCAN, /* doublescan mode not supported */ | ||
| 48 | MODE_NO_VSCAN, /* multiscan mode not supported */ | ||
| 49 | MODE_MEM, /* insufficient video memory */ | ||
| 50 | MODE_VIRTUAL_X, /* mode width too large for specified virtual size */ | ||
| 51 | MODE_VIRTUAL_Y, /* mode height too large for specified virtual size */ | ||
| 52 | MODE_MEM_VIRT, /* insufficient video memory given virtual size */ | ||
| 53 | MODE_NOCLOCK, /* no fixed clock available */ | ||
| 54 | MODE_CLOCK_HIGH, /* clock required is too high */ | ||
| 55 | MODE_CLOCK_LOW, /* clock required is too low */ | ||
| 56 | MODE_CLOCK_RANGE, /* clock/mode isn't in a ClockRange */ | ||
| 57 | MODE_BAD_HVALUE, /* horizontal timing was out of range */ | ||
| 58 | MODE_BAD_VVALUE, /* vertical timing was out of range */ | ||
| 59 | MODE_BAD_VSCAN, /* VScan value out of range */ | ||
| 60 | MODE_HSYNC_NARROW, /* horizontal sync too narrow */ | ||
| 61 | MODE_HSYNC_WIDE, /* horizontal sync too wide */ | ||
| 62 | MODE_HBLANK_NARROW, /* horizontal blanking too narrow */ | ||
| 63 | MODE_HBLANK_WIDE, /* horizontal blanking too wide */ | ||
| 64 | MODE_VSYNC_NARROW, /* vertical sync too narrow */ | ||
| 65 | MODE_VSYNC_WIDE, /* vertical sync too wide */ | ||
| 66 | MODE_VBLANK_NARROW, /* vertical blanking too narrow */ | ||
| 67 | MODE_VBLANK_WIDE, /* vertical blanking too wide */ | ||
| 68 | MODE_PANEL, /* exceeds panel dimensions */ | ||
| 69 | MODE_INTERLACE_WIDTH, /* width too large for interlaced mode */ | ||
| 70 | MODE_ONE_WIDTH, /* only one width is supported */ | ||
| 71 | MODE_ONE_HEIGHT, /* only one height is supported */ | ||
| 72 | MODE_ONE_SIZE, /* only one resolution is supported */ | ||
| 73 | MODE_NO_REDUCED, /* monitor doesn't accept reduced blanking */ | ||
| 74 | MODE_NO_STEREO, /* stereo modes not supported */ | ||
| 75 | MODE_UNVERIFIED = -3, /* mode needs to reverified */ | ||
| 76 | MODE_BAD = -2, /* unspecified reason */ | ||
| 77 | MODE_ERROR = -1 /* error condition */ | ||
| 78 | }; | ||
| 79 | |||
| 80 | #define DRM_MODE_TYPE_CLOCK_CRTC_C (DRM_MODE_TYPE_CLOCK_C | \ | ||
| 81 | DRM_MODE_TYPE_CRTC_C) | ||
| 82 | |||
| 83 | #define DRM_MODE(nm, t, c, hd, hss, hse, ht, hsk, vd, vss, vse, vt, vs, f) \ | ||
| 84 | .name = nm, .status = 0, .type = (t), .clock = (c), \ | ||
| 85 | .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ | ||
| 86 | .htotal = (ht), .hskew = (hsk), .vdisplay = (vd), \ | ||
| 87 | .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ | ||
| 88 | .vscan = (vs), .flags = (f), \ | ||
| 89 | .base.type = DRM_MODE_OBJECT_MODE | ||
| 90 | |||
| 91 | #define CRTC_INTERLACE_HALVE_V (1 << 0) /* halve V values for interlacing */ | ||
| 92 | #define CRTC_STEREO_DOUBLE (1 << 1) /* adjust timings for stereo modes */ | ||
| 93 | |||
| 94 | #define DRM_MODE_FLAG_3D_MAX DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF | ||
| 95 | |||
| 96 | struct drm_display_mode { | ||
| 97 | /* Header */ | ||
| 98 | struct list_head head; | ||
| 99 | struct drm_mode_object base; | ||
| 100 | |||
| 101 | char name[DRM_DISPLAY_MODE_LEN]; | ||
| 102 | |||
| 103 | enum drm_mode_status status; | ||
| 104 | unsigned int type; | ||
| 105 | |||
| 106 | /* Proposed mode values */ | ||
| 107 | int clock; /* in kHz */ | ||
| 108 | int hdisplay; | ||
| 109 | int hsync_start; | ||
| 110 | int hsync_end; | ||
| 111 | int htotal; | ||
| 112 | int hskew; | ||
| 113 | int vdisplay; | ||
| 114 | int vsync_start; | ||
| 115 | int vsync_end; | ||
| 116 | int vtotal; | ||
| 117 | int vscan; | ||
| 118 | unsigned int flags; | ||
| 119 | |||
| 120 | /* Addressable image size (may be 0 for projectors, etc.) */ | ||
| 121 | int width_mm; | ||
| 122 | int height_mm; | ||
| 123 | |||
| 124 | /* Actual mode we give to hw */ | ||
| 125 | int crtc_clock; /* in KHz */ | ||
| 126 | int crtc_hdisplay; | ||
| 127 | int crtc_hblank_start; | ||
| 128 | int crtc_hblank_end; | ||
| 129 | int crtc_hsync_start; | ||
| 130 | int crtc_hsync_end; | ||
| 131 | int crtc_htotal; | ||
| 132 | int crtc_hskew; | ||
| 133 | int crtc_vdisplay; | ||
| 134 | int crtc_vblank_start; | ||
| 135 | int crtc_vblank_end; | ||
| 136 | int crtc_vsync_start; | ||
| 137 | int crtc_vsync_end; | ||
| 138 | int crtc_vtotal; | ||
| 139 | |||
| 140 | /* Driver private mode info */ | ||
| 141 | int *private; | ||
| 142 | int private_flags; | ||
| 143 | |||
| 144 | int vrefresh; /* in Hz */ | ||
| 145 | int hsync; /* in kHz */ | ||
| 146 | enum hdmi_picture_aspect picture_aspect_ratio; | ||
| 147 | }; | ||
| 148 | |||
| 149 | /* mode specified on the command line */ | ||
| 150 | struct drm_cmdline_mode { | ||
| 151 | bool specified; | ||
| 152 | bool refresh_specified; | ||
| 153 | bool bpp_specified; | ||
| 154 | int xres, yres; | ||
| 155 | int bpp; | ||
| 156 | int refresh; | ||
| 157 | bool rb; | ||
| 158 | bool interlace; | ||
| 159 | bool cvt; | ||
| 160 | bool margins; | ||
| 161 | enum drm_connector_force force; | ||
| 162 | }; | ||
| 163 | |||
| 164 | /** | ||
| 165 | * drm_mode_is_stereo - check for stereo mode flags | ||
| 166 | * @mode: drm_display_mode to check | ||
| 167 | * | ||
| 168 | * Returns: | ||
| 169 | * True if the mode is one of the stereo modes (like side-by-side), false if | ||
| 170 | * not. | ||
| 171 | */ | ||
| 172 | static inline bool drm_mode_is_stereo(const struct drm_display_mode *mode) | ||
| 173 | { | ||
| 174 | return mode->flags & DRM_MODE_FLAG_3D_MASK; | ||
| 175 | } | ||
| 176 | |||
| 177 | struct drm_connector; | ||
| 178 | struct drm_cmdline_mode; | ||
| 179 | |||
| 180 | struct drm_display_mode *drm_mode_create(struct drm_device *dev); | ||
| 181 | void drm_mode_destroy(struct drm_device *dev, struct drm_display_mode *mode); | ||
| 182 | void drm_mode_probed_add(struct drm_connector *connector, struct drm_display_mode *mode); | ||
| 183 | void drm_mode_debug_printmodeline(const struct drm_display_mode *mode); | ||
| 184 | |||
| 185 | struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | ||
| 186 | int hdisplay, int vdisplay, int vrefresh, | ||
| 187 | bool reduced, bool interlaced, | ||
| 188 | bool margins); | ||
| 189 | struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, | ||
| 190 | int hdisplay, int vdisplay, int vrefresh, | ||
| 191 | bool interlaced, int margins); | ||
| 192 | struct drm_display_mode *drm_gtf_mode_complex(struct drm_device *dev, | ||
| 193 | int hdisplay, int vdisplay, | ||
| 194 | int vrefresh, bool interlaced, | ||
| 195 | int margins, | ||
| 196 | int GTF_M, int GTF_2C, | ||
| 197 | int GTF_K, int GTF_2J); | ||
| 198 | void drm_display_mode_from_videomode(const struct videomode *vm, | ||
| 199 | struct drm_display_mode *dmode); | ||
| 200 | int of_get_drm_display_mode(struct device_node *np, | ||
| 201 | struct drm_display_mode *dmode, | ||
| 202 | int index); | ||
| 203 | |||
| 204 | void drm_mode_set_name(struct drm_display_mode *mode); | ||
| 205 | int drm_mode_hsync(const struct drm_display_mode *mode); | ||
| 206 | int drm_mode_vrefresh(const struct drm_display_mode *mode); | ||
| 207 | |||
| 208 | void drm_mode_set_crtcinfo(struct drm_display_mode *p, | ||
| 209 | int adjust_flags); | ||
| 210 | void drm_mode_copy(struct drm_display_mode *dst, | ||
| 211 | const struct drm_display_mode *src); | ||
| 212 | struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, | ||
| 213 | const struct drm_display_mode *mode); | ||
| 214 | bool drm_mode_equal(const struct drm_display_mode *mode1, | ||
| 215 | const struct drm_display_mode *mode2); | ||
| 216 | bool drm_mode_equal_no_clocks_no_stereo(const struct drm_display_mode *mode1, | ||
| 217 | const struct drm_display_mode *mode2); | ||
| 218 | |||
| 219 | /* for use by the crtc helper probe functions */ | ||
| 220 | void drm_mode_validate_size(struct drm_device *dev, | ||
| 221 | struct list_head *mode_list, | ||
| 222 | int maxX, int maxY); | ||
| 223 | void drm_mode_prune_invalid(struct drm_device *dev, | ||
| 224 | struct list_head *mode_list, bool verbose); | ||
| 225 | void drm_mode_sort(struct list_head *mode_list); | ||
| 226 | void drm_mode_connector_list_update(struct drm_connector *connector); | ||
| 227 | |||
| 228 | /* parsing cmdline modes */ | ||
| 229 | bool | ||
| 230 | drm_mode_parse_command_line_for_connector(const char *mode_option, | ||
| 231 | struct drm_connector *connector, | ||
| 232 | struct drm_cmdline_mode *mode); | ||
| 233 | struct drm_display_mode * | ||
| 234 | drm_mode_create_from_cmdline_mode(struct drm_device *dev, | ||
| 235 | struct drm_cmdline_mode *cmd); | ||
| 236 | |||
| 237 | #endif /* __DRM_MODES_H__ */ | ||
diff --git a/include/drm/drm_plane_helper.h b/include/drm/drm_plane_helper.h new file mode 100644 index 000000000000..09824becee3e --- /dev/null +++ b/include/drm/drm_plane_helper.h | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2011-2013 Intel Corporation | ||
| 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, sublicense, | ||
| 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 next | ||
| 12 | * paragraph) shall be included in all copies or substantial portions of the | ||
| 13 | * 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 NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 18 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||
| 19 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||
| 20 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||
| 21 | * SOFTWARE. | ||
| 22 | */ | ||
| 23 | |||
| 24 | #ifndef DRM_PLANE_HELPER_H | ||
| 25 | #define DRM_PLANE_HELPER_H | ||
| 26 | |||
| 27 | /** | ||
| 28 | * DOC: plane helpers | ||
| 29 | * | ||
| 30 | * Helper functions to assist with creation and handling of CRTC primary | ||
| 31 | * planes. | ||
| 32 | */ | ||
| 33 | |||
| 34 | extern int drm_primary_helper_update(struct drm_plane *plane, | ||
| 35 | struct drm_crtc *crtc, | ||
| 36 | struct drm_framebuffer *fb, | ||
| 37 | int crtc_x, int crtc_y, | ||
| 38 | unsigned int crtc_w, unsigned int crtc_h, | ||
| 39 | uint32_t src_x, uint32_t src_y, | ||
| 40 | uint32_t src_w, uint32_t src_h); | ||
| 41 | extern int drm_primary_helper_disable(struct drm_plane *plane); | ||
| 42 | extern void drm_primary_helper_destroy(struct drm_plane *plane); | ||
| 43 | extern const struct drm_plane_funcs drm_primary_helper_funcs; | ||
| 44 | extern struct drm_plane *drm_primary_helper_create_plane(struct drm_device *dev, | ||
| 45 | uint32_t *formats, | ||
| 46 | int num_formats); | ||
| 47 | |||
| 48 | |||
| 49 | #endif | ||
diff --git a/include/drm/drm_vma_manager.h b/include/drm/drm_vma_manager.h index c18a593d1744..8cd402c73a5f 100644 --- a/include/drm/drm_vma_manager.h +++ b/include/drm/drm_vma_manager.h | |||
| @@ -221,8 +221,8 @@ static inline __u64 drm_vma_node_offset_addr(struct drm_vma_offset_node *node) | |||
| 221 | * @file_mapping: Address space to unmap @node from | 221 | * @file_mapping: Address space to unmap @node from |
| 222 | * | 222 | * |
| 223 | * Unmap all userspace mappings for a given offset node. The mappings must be | 223 | * Unmap all userspace mappings for a given offset node. The mappings must be |
| 224 | * associated with the @file_mapping address-space. If no offset exists or | 224 | * associated with the @file_mapping address-space. If no offset exists |
| 225 | * the address-space is invalid, nothing is done. | 225 | * nothing is done. |
| 226 | * | 226 | * |
| 227 | * This call is unlocked. The caller must guarantee that drm_vma_offset_remove() | 227 | * This call is unlocked. The caller must guarantee that drm_vma_offset_remove() |
| 228 | * is not called on this node concurrently. | 228 | * is not called on this node concurrently. |
| @@ -230,7 +230,7 @@ static inline __u64 drm_vma_node_offset_addr(struct drm_vma_offset_node *node) | |||
| 230 | static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node, | 230 | static inline void drm_vma_node_unmap(struct drm_vma_offset_node *node, |
| 231 | struct address_space *file_mapping) | 231 | struct address_space *file_mapping) |
| 232 | { | 232 | { |
| 233 | if (file_mapping && drm_vma_node_has_offset(node)) | 233 | if (drm_vma_node_has_offset(node)) |
| 234 | unmap_mapping_range(file_mapping, | 234 | unmap_mapping_range(file_mapping, |
| 235 | drm_vma_node_offset_addr(node), | 235 | drm_vma_node_offset_addr(node), |
| 236 | drm_vma_node_size(node) << PAGE_SHIFT, 1); | 236 | drm_vma_node_size(node) << PAGE_SHIFT, 1); |
diff --git a/include/drm/gma_drm.h b/include/drm/gma_drm.h index 884613ee00ad..87ac5e6ca551 100644 --- a/include/drm/gma_drm.h +++ b/include/drm/gma_drm.h | |||
| @@ -19,73 +19,7 @@ | |||
| 19 | * | 19 | * |
| 20 | **************************************************************************/ | 20 | **************************************************************************/ |
| 21 | 21 | ||
| 22 | #ifndef _PSB_DRM_H_ | 22 | #ifndef _GMA_DRM_H_ |
| 23 | #define _PSB_DRM_H_ | 23 | #define _GMA_DRM_H_ |
| 24 | |||
| 25 | /* | ||
| 26 | * Manage the LUT for an output | ||
| 27 | */ | ||
| 28 | struct drm_psb_dpst_lut_arg { | ||
| 29 | uint8_t lut[256]; | ||
| 30 | int output_id; | ||
| 31 | }; | ||
| 32 | |||
| 33 | /* | ||
| 34 | * Validate modes | ||
| 35 | */ | ||
| 36 | struct drm_psb_mode_operation_arg { | ||
| 37 | u32 obj_id; | ||
| 38 | u16 operation; | ||
| 39 | struct drm_mode_modeinfo mode; | ||
| 40 | u64 data; | ||
| 41 | }; | ||
| 42 | |||
| 43 | /* | ||
| 44 | * Query the stolen memory for smarter management of | ||
| 45 | * memory by the server | ||
| 46 | */ | ||
| 47 | struct drm_psb_stolen_memory_arg { | ||
| 48 | u32 base; | ||
| 49 | u32 size; | ||
| 50 | }; | ||
| 51 | |||
| 52 | struct drm_psb_get_pipe_from_crtc_id_arg { | ||
| 53 | /** ID of CRTC being requested **/ | ||
| 54 | u32 crtc_id; | ||
| 55 | /** pipe of requested CRTC **/ | ||
| 56 | u32 pipe; | ||
| 57 | }; | ||
| 58 | |||
| 59 | struct drm_psb_gem_create { | ||
| 60 | __u64 size; | ||
| 61 | __u32 handle; | ||
| 62 | __u32 flags; | ||
| 63 | #define GMA_GEM_CREATE_STOLEN 1 /* Stolen memory can be used */ | ||
| 64 | }; | ||
| 65 | |||
| 66 | struct drm_psb_gem_mmap { | ||
| 67 | __u32 handle; | ||
| 68 | __u32 pad; | ||
| 69 | /** | ||
| 70 | * Fake offset to use for subsequent mmap call | ||
| 71 | * | ||
| 72 | * This is a fixed-size type for 32/64 compatibility. | ||
| 73 | */ | ||
| 74 | __u64 offset; | ||
| 75 | }; | ||
| 76 | |||
| 77 | /* Controlling the kernel modesetting buffers */ | ||
| 78 | |||
| 79 | #define DRM_GMA_GEM_CREATE 0x00 /* Create a GEM object */ | ||
| 80 | #define DRM_GMA_GEM_MMAP 0x01 /* Map GEM memory */ | ||
| 81 | #define DRM_GMA_STOLEN_MEMORY 0x02 /* Report stolen memory */ | ||
| 82 | #define DRM_GMA_2D_OP 0x03 /* Will be merged later */ | ||
| 83 | #define DRM_GMA_GAMMA 0x04 /* Set gamma table */ | ||
| 84 | #define DRM_GMA_ADB 0x05 /* Get backlight */ | ||
| 85 | #define DRM_GMA_DPST_BL 0x06 /* Set backlight */ | ||
| 86 | #define DRM_GMA_MODE_OPERATION 0x07 /* Mode validation/DC set */ | ||
| 87 | #define PSB_MODE_OPERATION_MODE_VALID 0x01 | ||
| 88 | #define DRM_GMA_GET_PIPE_FROM_CRTC_ID 0x08 /* CRTC to physical pipe# */ | ||
| 89 | |||
| 90 | 24 | ||
| 91 | #endif | 25 | #endif |
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index 32d34ebf0706..a5183da3ef92 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h | |||
| @@ -747,6 +747,7 @@ extern int ttm_bo_device_release(struct ttm_bo_device *bdev); | |||
| 747 | * @bdev: A pointer to a struct ttm_bo_device to initialize. | 747 | * @bdev: A pointer to a struct ttm_bo_device to initialize. |
| 748 | * @glob: A pointer to an initialized struct ttm_bo_global. | 748 | * @glob: A pointer to an initialized struct ttm_bo_global. |
| 749 | * @driver: A pointer to a struct ttm_bo_driver set up by the caller. | 749 | * @driver: A pointer to a struct ttm_bo_driver set up by the caller. |
| 750 | * @mapping: The address space to use for this bo. | ||
| 750 | * @file_page_offset: Offset into the device address space that is available | 751 | * @file_page_offset: Offset into the device address space that is available |
| 751 | * for buffer data. This ensures compatibility with other users of the | 752 | * for buffer data. This ensures compatibility with other users of the |
| 752 | * address space. | 753 | * address space. |
| @@ -758,6 +759,7 @@ extern int ttm_bo_device_release(struct ttm_bo_device *bdev); | |||
| 758 | extern int ttm_bo_device_init(struct ttm_bo_device *bdev, | 759 | extern int ttm_bo_device_init(struct ttm_bo_device *bdev, |
| 759 | struct ttm_bo_global *glob, | 760 | struct ttm_bo_global *glob, |
| 760 | struct ttm_bo_driver *driver, | 761 | struct ttm_bo_driver *driver, |
| 762 | struct address_space *mapping, | ||
| 761 | uint64_t file_page_offset, bool need_dma32); | 763 | uint64_t file_page_offset, bool need_dma32); |
| 762 | 764 | ||
| 763 | /** | 765 | /** |
| @@ -786,7 +788,7 @@ extern void ttm_bo_del_sub_from_lru(struct ttm_buffer_object *bo); | |||
| 786 | extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo); | 788 | extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo); |
| 787 | 789 | ||
| 788 | /** | 790 | /** |
| 789 | * ttm_bo_reserve_nolru: | 791 | * __ttm_bo_reserve: |
| 790 | * | 792 | * |
| 791 | * @bo: A pointer to a struct ttm_buffer_object. | 793 | * @bo: A pointer to a struct ttm_buffer_object. |
| 792 | * @interruptible: Sleep interruptible if waiting. | 794 | * @interruptible: Sleep interruptible if waiting. |
| @@ -807,10 +809,10 @@ extern void ttm_bo_add_to_lru(struct ttm_buffer_object *bo); | |||
| 807 | * -EALREADY: Bo already reserved using @ticket. This error code will only | 809 | * -EALREADY: Bo already reserved using @ticket. This error code will only |
| 808 | * be returned if @use_ticket is set to true. | 810 | * be returned if @use_ticket is set to true. |
| 809 | */ | 811 | */ |
| 810 | static inline int ttm_bo_reserve_nolru(struct ttm_buffer_object *bo, | 812 | static inline int __ttm_bo_reserve(struct ttm_buffer_object *bo, |
| 811 | bool interruptible, | 813 | bool interruptible, |
| 812 | bool no_wait, bool use_ticket, | 814 | bool no_wait, bool use_ticket, |
| 813 | struct ww_acquire_ctx *ticket) | 815 | struct ww_acquire_ctx *ticket) |
| 814 | { | 816 | { |
| 815 | int ret = 0; | 817 | int ret = 0; |
| 816 | 818 | ||
| @@ -886,8 +888,7 @@ static inline int ttm_bo_reserve(struct ttm_buffer_object *bo, | |||
| 886 | 888 | ||
| 887 | WARN_ON(!atomic_read(&bo->kref.refcount)); | 889 | WARN_ON(!atomic_read(&bo->kref.refcount)); |
| 888 | 890 | ||
| 889 | ret = ttm_bo_reserve_nolru(bo, interruptible, no_wait, use_ticket, | 891 | ret = __ttm_bo_reserve(bo, interruptible, no_wait, use_ticket, ticket); |
| 890 | ticket); | ||
| 891 | if (likely(ret == 0)) | 892 | if (likely(ret == 0)) |
| 892 | ttm_bo_del_sub_from_lru(bo); | 893 | ttm_bo_del_sub_from_lru(bo); |
| 893 | 894 | ||
| @@ -927,20 +928,14 @@ static inline int ttm_bo_reserve_slowpath(struct ttm_buffer_object *bo, | |||
| 927 | } | 928 | } |
| 928 | 929 | ||
| 929 | /** | 930 | /** |
| 930 | * ttm_bo_unreserve_ticket | 931 | * __ttm_bo_unreserve |
| 931 | * @bo: A pointer to a struct ttm_buffer_object. | 932 | * @bo: A pointer to a struct ttm_buffer_object. |
| 932 | * @ticket: ww_acquire_ctx used for reserving | ||
| 933 | * | 933 | * |
| 934 | * Unreserve a previous reservation of @bo made with @ticket. | 934 | * Unreserve a previous reservation of @bo where the buffer object is |
| 935 | * already on lru lists. | ||
| 935 | */ | 936 | */ |
| 936 | static inline void ttm_bo_unreserve_ticket(struct ttm_buffer_object *bo, | 937 | static inline void __ttm_bo_unreserve(struct ttm_buffer_object *bo) |
| 937 | struct ww_acquire_ctx *t) | ||
| 938 | { | 938 | { |
| 939 | if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) { | ||
| 940 | spin_lock(&bo->glob->lru_lock); | ||
| 941 | ttm_bo_add_to_lru(bo); | ||
| 942 | spin_unlock(&bo->glob->lru_lock); | ||
| 943 | } | ||
| 944 | ww_mutex_unlock(&bo->resv->lock); | 939 | ww_mutex_unlock(&bo->resv->lock); |
| 945 | } | 940 | } |
| 946 | 941 | ||
| @@ -953,7 +948,25 @@ static inline void ttm_bo_unreserve_ticket(struct ttm_buffer_object *bo, | |||
| 953 | */ | 948 | */ |
| 954 | static inline void ttm_bo_unreserve(struct ttm_buffer_object *bo) | 949 | static inline void ttm_bo_unreserve(struct ttm_buffer_object *bo) |
| 955 | { | 950 | { |
| 956 | ttm_bo_unreserve_ticket(bo, NULL); | 951 | if (!(bo->mem.placement & TTM_PL_FLAG_NO_EVICT)) { |
| 952 | spin_lock(&bo->glob->lru_lock); | ||
| 953 | ttm_bo_add_to_lru(bo); | ||
| 954 | spin_unlock(&bo->glob->lru_lock); | ||
| 955 | } | ||
| 956 | __ttm_bo_unreserve(bo); | ||
| 957 | } | ||
| 958 | |||
| 959 | /** | ||
| 960 | * ttm_bo_unreserve_ticket | ||
| 961 | * @bo: A pointer to a struct ttm_buffer_object. | ||
| 962 | * @ticket: ww_acquire_ctx used for reserving | ||
| 963 | * | ||
| 964 | * Unreserve a previous reservation of @bo made with @ticket. | ||
| 965 | */ | ||
| 966 | static inline void ttm_bo_unreserve_ticket(struct ttm_buffer_object *bo, | ||
| 967 | struct ww_acquire_ctx *t) | ||
| 968 | { | ||
| 969 | ttm_bo_unreserve(bo); | ||
| 957 | } | 970 | } |
| 958 | 971 | ||
| 959 | /* | 972 | /* |
diff --git a/include/drm/ttm/ttm_object.h b/include/drm/ttm/ttm_object.h index 0097cc03034e..ed953f98f0e1 100644 --- a/include/drm/ttm/ttm_object.h +++ b/include/drm/ttm/ttm_object.h | |||
| @@ -244,6 +244,10 @@ extern void ttm_base_object_unref(struct ttm_base_object **p_base); | |||
| 244 | extern int ttm_ref_object_add(struct ttm_object_file *tfile, | 244 | extern int ttm_ref_object_add(struct ttm_object_file *tfile, |
| 245 | struct ttm_base_object *base, | 245 | struct ttm_base_object *base, |
| 246 | enum ttm_ref_type ref_type, bool *existed); | 246 | enum ttm_ref_type ref_type, bool *existed); |
| 247 | |||
| 248 | extern bool ttm_ref_object_exists(struct ttm_object_file *tfile, | ||
| 249 | struct ttm_base_object *base); | ||
| 250 | |||
| 247 | /** | 251 | /** |
| 248 | * ttm_ref_object_base_unref | 252 | * ttm_ref_object_base_unref |
| 249 | * | 253 | * |
diff --git a/include/drm/ttm/ttm_placement.h b/include/drm/ttm/ttm_placement.h index c84ff153a564..8ed44f9bbdfb 100644 --- a/include/drm/ttm/ttm_placement.h +++ b/include/drm/ttm/ttm_placement.h | |||
| @@ -65,6 +65,8 @@ | |||
| 65 | * reference the buffer. | 65 | * reference the buffer. |
| 66 | * TTM_PL_FLAG_NO_EVICT means that the buffer may never | 66 | * TTM_PL_FLAG_NO_EVICT means that the buffer may never |
| 67 | * be evicted to make room for other buffers. | 67 | * be evicted to make room for other buffers. |
| 68 | * TTM_PL_FLAG_TOPDOWN requests to be placed from the | ||
| 69 | * top of the memory area, instead of the bottom. | ||
| 68 | */ | 70 | */ |
| 69 | 71 | ||
| 70 | #define TTM_PL_FLAG_CACHED (1 << 16) | 72 | #define TTM_PL_FLAG_CACHED (1 << 16) |
| @@ -72,6 +74,7 @@ | |||
| 72 | #define TTM_PL_FLAG_WC (1 << 18) | 74 | #define TTM_PL_FLAG_WC (1 << 18) |
| 73 | #define TTM_PL_FLAG_SHARED (1 << 20) | 75 | #define TTM_PL_FLAG_SHARED (1 << 20) |
| 74 | #define TTM_PL_FLAG_NO_EVICT (1 << 21) | 76 | #define TTM_PL_FLAG_NO_EVICT (1 << 21) |
| 77 | #define TTM_PL_FLAG_TOPDOWN (1 << 22) | ||
| 75 | 78 | ||
| 76 | #define TTM_PL_MASK_CACHING (TTM_PL_FLAG_CACHED | \ | 79 | #define TTM_PL_MASK_CACHING (TTM_PL_FLAG_CACHED | \ |
| 77 | TTM_PL_FLAG_UNCACHED | \ | 80 | TTM_PL_FLAG_UNCACHED | \ |
diff --git a/include/linux/hdmi.h b/include/linux/hdmi.h index 9231be9e90a2..11c0182a153b 100644 --- a/include/linux/hdmi.h +++ b/include/linux/hdmi.h | |||
| @@ -262,6 +262,18 @@ union hdmi_vendor_any_infoframe { | |||
| 262 | struct hdmi_vendor_infoframe hdmi; | 262 | struct hdmi_vendor_infoframe hdmi; |
| 263 | }; | 263 | }; |
| 264 | 264 | ||
| 265 | /** | ||
| 266 | * union hdmi_infoframe - overall union of all abstract infoframe representations | ||
| 267 | * @any: generic infoframe | ||
| 268 | * @avi: avi infoframe | ||
| 269 | * @spd: spd infoframe | ||
| 270 | * @vendor: union of all vendor infoframes | ||
| 271 | * @audio: audio infoframe | ||
| 272 | * | ||
| 273 | * This is used by the generic pack function. This works since all infoframes | ||
| 274 | * have the same header which also indicates which type of infoframe should be | ||
| 275 | * packed. | ||
| 276 | */ | ||
| 265 | union hdmi_infoframe { | 277 | union hdmi_infoframe { |
| 266 | struct hdmi_any_infoframe any; | 278 | struct hdmi_any_infoframe any; |
| 267 | struct hdmi_avi_infoframe avi; | 279 | struct hdmi_avi_infoframe avi; |
diff --git a/include/linux/host1x.h b/include/linux/host1x.h index 3af847273277..d2b52999e771 100644 --- a/include/linux/host1x.h +++ b/include/linux/host1x.h | |||
| @@ -136,6 +136,7 @@ u32 host1x_syncpt_id(struct host1x_syncpt *sp); | |||
| 136 | u32 host1x_syncpt_read_min(struct host1x_syncpt *sp); | 136 | u32 host1x_syncpt_read_min(struct host1x_syncpt *sp); |
| 137 | u32 host1x_syncpt_read_max(struct host1x_syncpt *sp); | 137 | u32 host1x_syncpt_read_max(struct host1x_syncpt *sp); |
| 138 | int host1x_syncpt_incr(struct host1x_syncpt *sp); | 138 | int host1x_syncpt_incr(struct host1x_syncpt *sp); |
| 139 | u32 host1x_syncpt_incr_max(struct host1x_syncpt *sp, u32 incrs); | ||
| 139 | int host1x_syncpt_wait(struct host1x_syncpt *sp, u32 thresh, long timeout, | 140 | int host1x_syncpt_wait(struct host1x_syncpt *sp, u32 thresh, long timeout, |
| 140 | u32 *value); | 141 | u32 *value); |
| 141 | struct host1x_syncpt *host1x_syncpt_request(struct device *dev, | 142 | struct host1x_syncpt *host1x_syncpt_request(struct device *dev, |
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h index b06c8ed68707..9abbeb924cbb 100644 --- a/include/uapi/drm/drm.h +++ b/include/uapi/drm/drm.h | |||
| @@ -619,6 +619,15 @@ struct drm_gem_open { | |||
| 619 | #define DRM_PRIME_CAP_EXPORT 0x2 | 619 | #define DRM_PRIME_CAP_EXPORT 0x2 |
| 620 | #define DRM_CAP_TIMESTAMP_MONOTONIC 0x6 | 620 | #define DRM_CAP_TIMESTAMP_MONOTONIC 0x6 |
| 621 | #define DRM_CAP_ASYNC_PAGE_FLIP 0x7 | 621 | #define DRM_CAP_ASYNC_PAGE_FLIP 0x7 |
| 622 | /* | ||
| 623 | * The CURSOR_WIDTH and CURSOR_HEIGHT capabilities return a valid widthxheight | ||
| 624 | * combination for the hardware cursor. The intention is that a hardware | ||
| 625 | * agnostic userspace can query a cursor plane size to use. | ||
| 626 | * | ||
| 627 | * Note that the cross-driver contract is to merely return a valid size; | ||
| 628 | * drivers are free to attach another meaning on top, eg. i915 returns the | ||
| 629 | * maximum plane size. | ||
| 630 | */ | ||
| 622 | #define DRM_CAP_CURSOR_WIDTH 0x8 | 631 | #define DRM_CAP_CURSOR_WIDTH 0x8 |
| 623 | #define DRM_CAP_CURSOR_HEIGHT 0x9 | 632 | #define DRM_CAP_CURSOR_HEIGHT 0x9 |
| 624 | 633 | ||
| @@ -637,6 +646,14 @@ struct drm_get_cap { | |||
| 637 | */ | 646 | */ |
| 638 | #define DRM_CLIENT_CAP_STEREO_3D 1 | 647 | #define DRM_CLIENT_CAP_STEREO_3D 1 |
| 639 | 648 | ||
| 649 | /** | ||
| 650 | * DRM_CLIENT_CAP_UNIVERSAL_PLANES | ||
| 651 | * | ||
| 652 | * If set to 1, the DRM core will expose all planes (overlay, primary, and | ||
| 653 | * cursor) to userspace. | ||
| 654 | */ | ||
| 655 | #define DRM_CLIENT_CAP_UNIVERSAL_PLANES 2 | ||
| 656 | |||
| 640 | /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ | 657 | /** DRM_IOCTL_SET_CLIENT_CAP ioctl argument type */ |
| 641 | struct drm_set_client_cap { | 658 | struct drm_set_client_cap { |
| 642 | __u64 capability; | 659 | __u64 capability; |
diff --git a/include/uapi/drm/msm_drm.h b/include/uapi/drm/msm_drm.h index d3c62074016d..0664c31f010c 100644 --- a/include/uapi/drm/msm_drm.h +++ b/include/uapi/drm/msm_drm.h | |||
| @@ -50,6 +50,7 @@ struct drm_msm_timespec { | |||
| 50 | 50 | ||
| 51 | #define MSM_PARAM_GPU_ID 0x01 | 51 | #define MSM_PARAM_GPU_ID 0x01 |
| 52 | #define MSM_PARAM_GMEM_SIZE 0x02 | 52 | #define MSM_PARAM_GMEM_SIZE 0x02 |
| 53 | #define MSM_PARAM_CHIP_ID 0x03 | ||
| 53 | 54 | ||
| 54 | struct drm_msm_param { | 55 | struct drm_msm_param { |
| 55 | uint32_t pipe; /* in, MSM_PIPE_x */ | 56 | uint32_t pipe; /* in, MSM_PIPE_x */ |
| @@ -69,6 +70,12 @@ struct drm_msm_param { | |||
| 69 | #define MSM_BO_WC 0x00020000 | 70 | #define MSM_BO_WC 0x00020000 |
| 70 | #define MSM_BO_UNCACHED 0x00040000 | 71 | #define MSM_BO_UNCACHED 0x00040000 |
| 71 | 72 | ||
| 73 | #define MSM_BO_FLAGS (MSM_BO_SCANOUT | \ | ||
| 74 | MSM_BO_GPU_READONLY | \ | ||
| 75 | MSM_BO_CACHED | \ | ||
| 76 | MSM_BO_WC | \ | ||
| 77 | MSM_BO_UNCACHED) | ||
| 78 | |||
| 72 | struct drm_msm_gem_new { | 79 | struct drm_msm_gem_new { |
| 73 | uint64_t size; /* in */ | 80 | uint64_t size; /* in */ |
| 74 | uint32_t flags; /* in, mask of MSM_BO_x */ | 81 | uint32_t flags; /* in, mask of MSM_BO_x */ |
| @@ -85,6 +92,8 @@ struct drm_msm_gem_info { | |||
| 85 | #define MSM_PREP_WRITE 0x02 | 92 | #define MSM_PREP_WRITE 0x02 |
| 86 | #define MSM_PREP_NOSYNC 0x04 | 93 | #define MSM_PREP_NOSYNC 0x04 |
| 87 | 94 | ||
| 95 | #define MSM_PREP_FLAGS (MSM_PREP_READ | MSM_PREP_WRITE | MSM_PREP_NOSYNC) | ||
| 96 | |||
| 88 | struct drm_msm_gem_cpu_prep { | 97 | struct drm_msm_gem_cpu_prep { |
| 89 | uint32_t handle; /* in */ | 98 | uint32_t handle; /* in */ |
| 90 | uint32_t op; /* in, mask of MSM_PREP_x */ | 99 | uint32_t op; /* in, mask of MSM_PREP_x */ |
| @@ -152,6 +161,9 @@ struct drm_msm_gem_submit_cmd { | |||
| 152 | */ | 161 | */ |
| 153 | #define MSM_SUBMIT_BO_READ 0x0001 | 162 | #define MSM_SUBMIT_BO_READ 0x0001 |
| 154 | #define MSM_SUBMIT_BO_WRITE 0x0002 | 163 | #define MSM_SUBMIT_BO_WRITE 0x0002 |
| 164 | |||
| 165 | #define MSM_SUBMIT_BO_FLAGS (MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE) | ||
| 166 | |||
| 155 | struct drm_msm_gem_submit_bo { | 167 | struct drm_msm_gem_submit_bo { |
| 156 | uint32_t flags; /* in, mask of MSM_SUBMIT_BO_x */ | 168 | uint32_t flags; /* in, mask of MSM_SUBMIT_BO_x */ |
| 157 | uint32_t handle; /* in, GEM handle */ | 169 | uint32_t handle; /* in, GEM handle */ |
diff --git a/include/uapi/drm/radeon_drm.h b/include/uapi/drm/radeon_drm.h index d9ea3a73afe2..aefa2f6afa3b 100644 --- a/include/uapi/drm/radeon_drm.h +++ b/include/uapi/drm/radeon_drm.h | |||
| @@ -510,6 +510,7 @@ typedef struct { | |||
| 510 | #define DRM_RADEON_GEM_GET_TILING 0x29 | 510 | #define DRM_RADEON_GEM_GET_TILING 0x29 |
| 511 | #define DRM_RADEON_GEM_BUSY 0x2a | 511 | #define DRM_RADEON_GEM_BUSY 0x2a |
| 512 | #define DRM_RADEON_GEM_VA 0x2b | 512 | #define DRM_RADEON_GEM_VA 0x2b |
| 513 | #define DRM_RADEON_GEM_OP 0x2c | ||
| 513 | 514 | ||
| 514 | #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) | 515 | #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t) |
| 515 | #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) | 516 | #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START) |
| @@ -552,6 +553,7 @@ typedef struct { | |||
| 552 | #define DRM_IOCTL_RADEON_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) | 553 | #define DRM_IOCTL_RADEON_GEM_GET_TILING DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_GET_TILING, struct drm_radeon_gem_get_tiling) |
| 553 | #define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy) | 554 | #define DRM_IOCTL_RADEON_GEM_BUSY DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_BUSY, struct drm_radeon_gem_busy) |
| 554 | #define DRM_IOCTL_RADEON_GEM_VA DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_VA, struct drm_radeon_gem_va) | 555 | #define DRM_IOCTL_RADEON_GEM_VA DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_VA, struct drm_radeon_gem_va) |
| 556 | #define DRM_IOCTL_RADEON_GEM_OP DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_OP, struct drm_radeon_gem_op) | ||
| 555 | 557 | ||
| 556 | typedef struct drm_radeon_init { | 558 | typedef struct drm_radeon_init { |
| 557 | enum { | 559 | enum { |
| @@ -884,6 +886,16 @@ struct drm_radeon_gem_pwrite { | |||
| 884 | uint64_t data_ptr; | 886 | uint64_t data_ptr; |
| 885 | }; | 887 | }; |
| 886 | 888 | ||
| 889 | /* Sets or returns a value associated with a buffer. */ | ||
| 890 | struct drm_radeon_gem_op { | ||
| 891 | uint32_t handle; /* buffer */ | ||
| 892 | uint32_t op; /* RADEON_GEM_OP_* */ | ||
| 893 | uint64_t value; /* input or return value */ | ||
| 894 | }; | ||
| 895 | |||
| 896 | #define RADEON_GEM_OP_GET_INITIAL_DOMAIN 0 | ||
| 897 | #define RADEON_GEM_OP_SET_INITIAL_DOMAIN 1 | ||
| 898 | |||
| 887 | #define RADEON_VA_MAP 1 | 899 | #define RADEON_VA_MAP 1 |
| 888 | #define RADEON_VA_UNMAP 2 | 900 | #define RADEON_VA_UNMAP 2 |
| 889 | 901 | ||
| @@ -919,6 +931,7 @@ struct drm_radeon_gem_va { | |||
| 919 | #define RADEON_CS_RING_COMPUTE 1 | 931 | #define RADEON_CS_RING_COMPUTE 1 |
| 920 | #define RADEON_CS_RING_DMA 2 | 932 | #define RADEON_CS_RING_DMA 2 |
| 921 | #define RADEON_CS_RING_UVD 3 | 933 | #define RADEON_CS_RING_UVD 3 |
| 934 | #define RADEON_CS_RING_VCE 4 | ||
| 922 | /* The third dword of RADEON_CHUNK_ID_FLAGS is a sint32 that sets the priority */ | 935 | /* The third dword of RADEON_CHUNK_ID_FLAGS is a sint32 that sets the priority */ |
| 923 | /* 0 = normal, + = higher priority, - = lower priority */ | 936 | /* 0 = normal, + = higher priority, - = lower priority */ |
| 924 | 937 | ||
| @@ -987,6 +1000,13 @@ struct drm_radeon_cs { | |||
| 987 | #define RADEON_INFO_SI_BACKEND_ENABLED_MASK 0x19 | 1000 | #define RADEON_INFO_SI_BACKEND_ENABLED_MASK 0x19 |
| 988 | /* max engine clock - needed for OpenCL */ | 1001 | /* max engine clock - needed for OpenCL */ |
| 989 | #define RADEON_INFO_MAX_SCLK 0x1a | 1002 | #define RADEON_INFO_MAX_SCLK 0x1a |
| 1003 | /* version of VCE firmware */ | ||
| 1004 | #define RADEON_INFO_VCE_FW_VERSION 0x1b | ||
| 1005 | /* version of VCE feedback */ | ||
| 1006 | #define RADEON_INFO_VCE_FB_VERSION 0x1c | ||
| 1007 | #define RADEON_INFO_NUM_BYTES_MOVED 0x1d | ||
| 1008 | #define RADEON_INFO_VRAM_USAGE 0x1e | ||
| 1009 | #define RADEON_INFO_GTT_USAGE 0x1f | ||
| 990 | 1010 | ||
| 991 | 1011 | ||
| 992 | struct drm_radeon_info { | 1012 | struct drm_radeon_info { |
diff --git a/include/uapi/drm/tegra_drm.h b/include/uapi/drm/tegra_drm.h index 5e1ab552cbed..b042b48495d9 100644 --- a/include/uapi/drm/tegra_drm.h +++ b/include/uapi/drm/tegra_drm.h | |||
| @@ -1,17 +1,23 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved. | 2 | * Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved. |
| 3 | * | 3 | * |
| 4 | * This program is free software; you can redistribute it and/or modify it | 4 | * Permission is hereby granted, free of charge, to any person obtaining a |
| 5 | * under the terms and conditions of the GNU General Public License, | 5 | * copy of this software and associated documentation files (the "Software"), |
| 6 | * version 2, as published by the Free Software Foundation. | 6 | * to deal in the Software without restriction, including without limitation |
| 7 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, | ||
| 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: | ||
| 7 | * | 10 | * |
| 8 | * This program is distributed in the hope it will be useful, but WITHOUT | 11 | * The above copyright notice and this permission notice shall be included in |
| 9 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | 12 | * all copies or substantial portions of the Software. |
| 10 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for | ||
| 11 | * more details. | ||
| 12 | * | 13 | * |
| 13 | * You should have received a copy of the GNU General Public License | 14 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 14 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | 15 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 16 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL | ||
| 17 | * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR | ||
| 18 | * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, | ||
| 19 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
| 20 | * OTHER DEALINGS IN THE SOFTWARE. | ||
| 15 | */ | 21 | */ |
| 16 | 22 | ||
| 17 | #ifndef _UAPI_TEGRA_DRM_H_ | 23 | #ifndef _UAPI_TEGRA_DRM_H_ |
diff --git a/include/uapi/drm/vmwgfx_drm.h b/include/uapi/drm/vmwgfx_drm.h index 87792a5fee3b..4fc66f6b12ce 100644 --- a/include/uapi/drm/vmwgfx_drm.h +++ b/include/uapi/drm/vmwgfx_drm.h | |||
| @@ -90,6 +90,15 @@ | |||
| 90 | #define DRM_VMW_PARAM_MAX_MOB_SIZE 10 | 90 | #define DRM_VMW_PARAM_MAX_MOB_SIZE 10 |
| 91 | 91 | ||
| 92 | /** | 92 | /** |
| 93 | * enum drm_vmw_handle_type - handle type for ref ioctls | ||
| 94 | * | ||
| 95 | */ | ||
| 96 | enum drm_vmw_handle_type { | ||
| 97 | DRM_VMW_HANDLE_LEGACY = 0, | ||
| 98 | DRM_VMW_HANDLE_PRIME = 1 | ||
| 99 | }; | ||
| 100 | |||
| 101 | /** | ||
| 93 | * struct drm_vmw_getparam_arg | 102 | * struct drm_vmw_getparam_arg |
| 94 | * | 103 | * |
| 95 | * @value: Returned value. //Out | 104 | * @value: Returned value. //Out |
| @@ -177,6 +186,7 @@ struct drm_vmw_surface_create_req { | |||
| 177 | * struct drm_wmv_surface_arg | 186 | * struct drm_wmv_surface_arg |
| 178 | * | 187 | * |
| 179 | * @sid: Surface id of created surface or surface to destroy or reference. | 188 | * @sid: Surface id of created surface or surface to destroy or reference. |
| 189 | * @handle_type: Handle type for DRM_VMW_REF_SURFACE Ioctl. | ||
| 180 | * | 190 | * |
| 181 | * Output data from the DRM_VMW_CREATE_SURFACE Ioctl. | 191 | * Output data from the DRM_VMW_CREATE_SURFACE Ioctl. |
| 182 | * Input argument to the DRM_VMW_UNREF_SURFACE Ioctl. | 192 | * Input argument to the DRM_VMW_UNREF_SURFACE Ioctl. |
| @@ -185,7 +195,7 @@ struct drm_vmw_surface_create_req { | |||
| 185 | 195 | ||
| 186 | struct drm_vmw_surface_arg { | 196 | struct drm_vmw_surface_arg { |
| 187 | int32_t sid; | 197 | int32_t sid; |
| 188 | uint32_t pad64; | 198 | enum drm_vmw_handle_type handle_type; |
| 189 | }; | 199 | }; |
| 190 | 200 | ||
| 191 | /** | 201 | /** |
