diff options
| author | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-24 16:22:33 -0400 |
|---|---|---|
| committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2009-09-24 16:22:33 -0400 |
| commit | baea7b946f00a291b166ccae7fcfed6c01530cc6 (patch) | |
| tree | 4aa275fbdbec9c7b9b4629e8bee2bbecd3c6a6af /include/drm | |
| parent | ae19ffbadc1b2100285a5b5b3d0a4e0a11390904 (diff) | |
| parent | 94e0fb086fc5663c38bbc0fe86d698be8314f82f (diff) | |
Merge branch 'origin' into for-linus
Conflicts:
MAINTAINERS
Diffstat (limited to 'include/drm')
| -rw-r--r-- | include/drm/drmP.h | 57 | ||||
| -rw-r--r-- | include/drm/drm_cache.h | 38 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 16 | ||||
| -rw-r--r-- | include/drm/drm_crtc_helper.h | 3 | ||||
| -rw-r--r-- | include/drm/drm_encoder_slave.h | 162 | ||||
| -rw-r--r-- | include/drm/drm_fb_helper.h | 82 | ||||
| -rw-r--r-- | include/drm/drm_memory.h | 2 | ||||
| -rw-r--r-- | include/drm/drm_mm.h | 7 | ||||
| -rw-r--r-- | include/drm/drm_mode.h | 11 | ||||
| -rw-r--r-- | include/drm/drm_pciids.h | 1 | ||||
| -rw-r--r-- | include/drm/drm_sysfs.h | 12 | ||||
| -rw-r--r-- | include/drm/i915_drm.h | 19 | ||||
| -rw-r--r-- | include/drm/radeon_drm.h | 12 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_api.h | 13 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_bo_driver.h | 94 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_memory.h | 43 | ||||
| -rw-r--r-- | include/drm/ttm/ttm_module.h | 2 |
17 files changed, 497 insertions, 77 deletions
diff --git a/include/drm/drmP.h b/include/drm/drmP.h index 45b67d9c39c1..c8e64bbadbcf 100644 --- a/include/drm/drmP.h +++ b/include/drm/drmP.h | |||
| @@ -88,7 +88,37 @@ struct drm_device; | |||
| 88 | #define DRM_UT_CORE 0x01 | 88 | #define DRM_UT_CORE 0x01 |
| 89 | #define DRM_UT_DRIVER 0x02 | 89 | #define DRM_UT_DRIVER 0x02 |
| 90 | #define DRM_UT_KMS 0x04 | 90 | #define DRM_UT_KMS 0x04 |
| 91 | #define DRM_UT_MODE 0x08 | 91 | /* |
| 92 | * Three debug levels are defined. | ||
| 93 | * drm_core, drm_driver, drm_kms | ||
| 94 | * drm_core level can be used in the generic drm code. For example: | ||
| 95 | * drm_ioctl, drm_mm, drm_memory | ||
| 96 | * The macro definiton of DRM_DEBUG is used. | ||
| 97 | * DRM_DEBUG(fmt, args...) | ||
| 98 | * The debug info by using the DRM_DEBUG can be obtained by adding | ||
| 99 | * the boot option of "drm.debug=1". | ||
| 100 | * | ||
| 101 | * drm_driver level can be used in the specific drm driver. It is used | ||
| 102 | * to add the debug info related with the drm driver. For example: | ||
| 103 | * i915_drv, i915_dma, i915_gem, radeon_drv, | ||
| 104 | * The macro definition of DRM_DEBUG_DRIVER can be used. | ||
| 105 | * DRM_DEBUG_DRIVER(fmt, args...) | ||
| 106 | * The debug info by using the DRM_DEBUG_DRIVER can be obtained by | ||
| 107 | * adding the boot option of "drm.debug=0x02" | ||
| 108 | * | ||
| 109 | * drm_kms level can be used in the KMS code related with specific drm driver. | ||
| 110 | * It is used to add the debug info related with KMS mode. For example: | ||
| 111 | * the connector/crtc , | ||
| 112 | * The macro definition of DRM_DEBUG_KMS can be used. | ||
| 113 | * DRM_DEBUG_KMS(fmt, args...) | ||
| 114 | * The debug info by using the DRM_DEBUG_KMS can be obtained by | ||
| 115 | * adding the boot option of "drm.debug=0x04" | ||
| 116 | * | ||
| 117 | * If we add the boot option of "drm.debug=0x06", we can get the debug info by | ||
| 118 | * using the DRM_DEBUG_KMS and DRM_DEBUG_DRIVER. | ||
| 119 | * If we add the boot option of "drm.debug=0x05", we can get the debug info by | ||
| 120 | * using the DRM_DEBUG_KMS and DRM_DEBUG. | ||
| 121 | */ | ||
| 92 | 122 | ||
| 93 | extern void drm_ut_debug_printk(unsigned int request_level, | 123 | extern void drm_ut_debug_printk(unsigned int request_level, |
| 94 | const char *prefix, | 124 | const char *prefix, |
| @@ -174,19 +204,14 @@ extern void drm_ut_debug_printk(unsigned int request_level, | |||
| 174 | __func__, fmt, ##args); \ | 204 | __func__, fmt, ##args); \ |
| 175 | } while (0) | 205 | } while (0) |
| 176 | 206 | ||
| 177 | #define DRM_DEBUG_DRIVER(prefix, fmt, args...) \ | 207 | #define DRM_DEBUG_DRIVER(fmt, args...) \ |
| 178 | do { \ | 208 | do { \ |
| 179 | drm_ut_debug_printk(DRM_UT_DRIVER, prefix, \ | 209 | drm_ut_debug_printk(DRM_UT_DRIVER, DRM_NAME, \ |
| 180 | __func__, fmt, ##args); \ | 210 | __func__, fmt, ##args); \ |
| 181 | } while (0) | 211 | } while (0) |
| 182 | #define DRM_DEBUG_KMS(prefix, fmt, args...) \ | 212 | #define DRM_DEBUG_KMS(fmt, args...) \ |
| 183 | do { \ | 213 | do { \ |
| 184 | drm_ut_debug_printk(DRM_UT_KMS, prefix, \ | 214 | drm_ut_debug_printk(DRM_UT_KMS, DRM_NAME, \ |
| 185 | __func__, fmt, ##args); \ | ||
| 186 | } while (0) | ||
| 187 | #define DRM_DEBUG_MODE(prefix, fmt, args...) \ | ||
| 188 | do { \ | ||
| 189 | drm_ut_debug_printk(DRM_UT_MODE, prefix, \ | ||
| 190 | __func__, fmt, ##args); \ | 215 | __func__, fmt, ##args); \ |
| 191 | } while (0) | 216 | } while (0) |
| 192 | #define DRM_LOG(fmt, args...) \ | 217 | #define DRM_LOG(fmt, args...) \ |
| @@ -210,9 +235,8 @@ extern void drm_ut_debug_printk(unsigned int request_level, | |||
| 210 | NULL, fmt, ##args); \ | 235 | NULL, fmt, ##args); \ |
| 211 | } while (0) | 236 | } while (0) |
| 212 | #else | 237 | #else |
| 213 | #define DRM_DEBUG_DRIVER(prefix, fmt, args...) do { } while (0) | 238 | #define DRM_DEBUG_DRIVER(fmt, args...) do { } while (0) |
| 214 | #define DRM_DEBUG_KMS(prefix, fmt, args...) do { } while (0) | 239 | #define DRM_DEBUG_KMS(fmt, args...) do { } while (0) |
| 215 | #define DRM_DEBUG_MODE(prefix, fmt, args...) do { } while (0) | ||
| 216 | #define DRM_DEBUG(fmt, arg...) do { } while (0) | 240 | #define DRM_DEBUG(fmt, arg...) do { } while (0) |
| 217 | #define DRM_LOG(fmt, arg...) do { } while (0) | 241 | #define DRM_LOG(fmt, arg...) do { } while (0) |
| 218 | #define DRM_LOG_KMS(fmt, args...) do { } while (0) | 242 | #define DRM_LOG_KMS(fmt, args...) do { } while (0) |
| @@ -786,6 +810,9 @@ struct drm_driver { | |||
| 786 | int (*gem_init_object) (struct drm_gem_object *obj); | 810 | int (*gem_init_object) (struct drm_gem_object *obj); |
| 787 | void (*gem_free_object) (struct drm_gem_object *obj); | 811 | void (*gem_free_object) (struct drm_gem_object *obj); |
| 788 | 812 | ||
| 813 | /* vga arb irq handler */ | ||
| 814 | void (*vgaarb_irq)(struct drm_device *dev, bool state); | ||
| 815 | |||
| 789 | /* Driver private ops for this object */ | 816 | /* Driver private ops for this object */ |
| 790 | struct vm_operations_struct *gem_vm_ops; | 817 | struct vm_operations_struct *gem_vm_ops; |
| 791 | 818 | ||
| @@ -1417,7 +1444,7 @@ drm_gem_object_unreference(struct drm_gem_object *obj) | |||
| 1417 | 1444 | ||
| 1418 | int drm_gem_handle_create(struct drm_file *file_priv, | 1445 | int drm_gem_handle_create(struct drm_file *file_priv, |
| 1419 | struct drm_gem_object *obj, | 1446 | struct drm_gem_object *obj, |
| 1420 | int *handlep); | 1447 | u32 *handlep); |
| 1421 | 1448 | ||
| 1422 | static inline void | 1449 | static inline void |
| 1423 | drm_gem_object_handle_reference(struct drm_gem_object *obj) | 1450 | drm_gem_object_handle_reference(struct drm_gem_object *obj) |
| @@ -1443,7 +1470,7 @@ drm_gem_object_handle_unreference(struct drm_gem_object *obj) | |||
| 1443 | 1470 | ||
| 1444 | struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev, | 1471 | struct drm_gem_object *drm_gem_object_lookup(struct drm_device *dev, |
| 1445 | struct drm_file *filp, | 1472 | struct drm_file *filp, |
| 1446 | int handle); | 1473 | u32 handle); |
| 1447 | int drm_gem_close_ioctl(struct drm_device *dev, void *data, | 1474 | int drm_gem_close_ioctl(struct drm_device *dev, void *data, |
| 1448 | struct drm_file *file_priv); | 1475 | struct drm_file *file_priv); |
| 1449 | int drm_gem_flink_ioctl(struct drm_device *dev, void *data, | 1476 | int drm_gem_flink_ioctl(struct drm_device *dev, void *data, |
diff --git a/include/drm/drm_cache.h b/include/drm/drm_cache.h new file mode 100644 index 000000000000..7bfb063029d8 --- /dev/null +++ b/include/drm/drm_cache.h | |||
| @@ -0,0 +1,38 @@ | |||
| 1 | /************************************************************************** | ||
| 2 | * | ||
| 3 | * Copyright 2009 Red Hat Inc. | ||
| 4 | * All Rights Reserved. | ||
| 5 | * | ||
| 6 | * Permission is hereby granted, free of charge, to any person obtaining a | ||
| 7 | * copy of this software and associated documentation files (the | ||
| 8 | * "Software"), to deal in the Software without restriction, including | ||
| 9 | * without limitation the rights to use, copy, modify, merge, publish, | ||
| 10 | * distribute, sub license, and/or sell copies of the Software, and to | ||
| 11 | * permit persons to whom the Software is furnished to do so, subject to | ||
| 12 | * the following conditions: | ||
| 13 | * | ||
| 14 | * The above copyright notice and this permission notice (including the | ||
| 15 | * next paragraph) shall be included in all copies or substantial portions | ||
| 16 | * of the Software. | ||
| 17 | * | ||
| 18 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||
| 19 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||
| 20 | * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL | ||
| 21 | * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, | ||
| 22 | * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR | ||
| 23 | * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE | ||
| 24 | * USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 25 | * | ||
| 26 | * | ||
| 27 | **************************************************************************/ | ||
| 28 | /* | ||
| 29 | * Authors: | ||
| 30 | * Dave Airlie <airlied@redhat.com> | ||
| 31 | */ | ||
| 32 | |||
| 33 | #ifndef _DRM_CACHE_H_ | ||
| 34 | #define _DRM_CACHE_H_ | ||
| 35 | |||
| 36 | void drm_clflush_pages(struct page *pages[], unsigned long num_pages); | ||
| 37 | |||
| 38 | #endif | ||
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 7300fb866767..ae1e9e166959 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
| @@ -259,6 +259,8 @@ struct drm_framebuffer { | |||
| 259 | void *fbdev; | 259 | void *fbdev; |
| 260 | u32 pseudo_palette[17]; | 260 | u32 pseudo_palette[17]; |
| 261 | struct list_head filp_head; | 261 | struct list_head filp_head; |
| 262 | /* if you are using the helper */ | ||
| 263 | void *helper_private; | ||
| 262 | }; | 264 | }; |
| 263 | 265 | ||
| 264 | struct drm_property_blob { | 266 | struct drm_property_blob { |
| @@ -572,6 +574,12 @@ struct drm_mode_config { | |||
| 572 | struct drm_property *tv_right_margin_property; | 574 | struct drm_property *tv_right_margin_property; |
| 573 | struct drm_property *tv_top_margin_property; | 575 | struct drm_property *tv_top_margin_property; |
| 574 | struct drm_property *tv_bottom_margin_property; | 576 | struct drm_property *tv_bottom_margin_property; |
| 577 | struct drm_property *tv_brightness_property; | ||
| 578 | struct drm_property *tv_contrast_property; | ||
| 579 | struct drm_property *tv_flicker_reduction_property; | ||
| 580 | struct drm_property *tv_overscan_property; | ||
| 581 | struct drm_property *tv_saturation_property; | ||
| 582 | struct drm_property *tv_hue_property; | ||
| 575 | 583 | ||
| 576 | /* Optional properties */ | 584 | /* Optional properties */ |
| 577 | struct drm_property *scaling_mode_property; | 585 | struct drm_property *scaling_mode_property; |
| @@ -736,4 +744,12 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device *dev, | |||
| 736 | extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, | 744 | extern int drm_mode_gamma_set_ioctl(struct drm_device *dev, |
| 737 | void *data, struct drm_file *file_priv); | 745 | void *data, struct drm_file *file_priv); |
| 738 | extern bool drm_detect_hdmi_monitor(struct edid *edid); | 746 | extern bool drm_detect_hdmi_monitor(struct edid *edid); |
| 747 | extern struct drm_display_mode *drm_cvt_mode(struct drm_device *dev, | ||
| 748 | int hdisplay, int vdisplay, int vrefresh, | ||
| 749 | bool reduced, bool interlaced); | ||
| 750 | extern struct drm_display_mode *drm_gtf_mode(struct drm_device *dev, | ||
| 751 | int hdisplay, int vdisplay, int vrefresh, | ||
| 752 | bool interlaced, int margins); | ||
| 753 | extern int drm_add_modes_noedid(struct drm_connector *connector, | ||
| 754 | int hdisplay, int vdisplay); | ||
| 739 | #endif /* __DRM_CRTC_H__ */ | 755 | #endif /* __DRM_CRTC_H__ */ |
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h index 6769ff6c1bc0..4c8dacaf4f58 100644 --- a/include/drm/drm_crtc_helper.h +++ b/include/drm/drm_crtc_helper.h | |||
| @@ -79,6 +79,8 @@ struct drm_encoder_helper_funcs { | |||
| 79 | /* detect for DAC style encoders */ | 79 | /* detect for DAC style encoders */ |
| 80 | enum drm_connector_status (*detect)(struct drm_encoder *encoder, | 80 | enum drm_connector_status (*detect)(struct drm_encoder *encoder, |
| 81 | struct drm_connector *connector); | 81 | struct drm_connector *connector); |
| 82 | /* disable encoder when not in use - more explicit than dpms off */ | ||
| 83 | void (*disable)(struct drm_encoder *encoder); | ||
| 82 | }; | 84 | }; |
| 83 | 85 | ||
| 84 | struct drm_connector_helper_funcs { | 86 | struct drm_connector_helper_funcs { |
| @@ -98,6 +100,7 @@ extern bool drm_crtc_helper_set_mode(struct drm_crtc *crtc, | |||
| 98 | int x, int y, | 100 | int x, int y, |
| 99 | struct drm_framebuffer *old_fb); | 101 | struct drm_framebuffer *old_fb); |
| 100 | extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); | 102 | extern bool drm_helper_crtc_in_use(struct drm_crtc *crtc); |
| 103 | extern bool drm_helper_encoder_in_use(struct drm_encoder *encoder); | ||
| 101 | 104 | ||
| 102 | extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); | 105 | extern void drm_helper_connector_dpms(struct drm_connector *connector, int mode); |
| 103 | 106 | ||
diff --git a/include/drm/drm_encoder_slave.h b/include/drm/drm_encoder_slave.h new file mode 100644 index 000000000000..2f65633d28a7 --- /dev/null +++ b/include/drm/drm_encoder_slave.h | |||
| @@ -0,0 +1,162 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2009 Francisco Jerez. | ||
| 3 | * All Rights Reserved. | ||
| 4 | * | ||
| 5 | * Permission is hereby granted, free of charge, to any person obtaining | ||
| 6 | * a copy of this software and associated documentation files (the | ||
| 7 | * "Software"), to deal in the Software without restriction, including | ||
| 8 | * without limitation the rights to use, copy, modify, merge, publish, | ||
| 9 | * distribute, sublicense, and/or sell copies of the Software, and to | ||
| 10 | * permit persons to whom the Software is furnished to do so, subject to | ||
| 11 | * the following conditions: | ||
| 12 | * | ||
| 13 | * The above copyright notice and this permission notice (including the | ||
| 14 | * next paragraph) shall be included in all copies or substantial | ||
| 15 | * portions of the Software. | ||
| 16 | * | ||
| 17 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
| 18 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | ||
| 19 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. | ||
| 20 | * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE | ||
| 21 | * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION | ||
| 22 | * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION | ||
| 23 | * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
| 24 | * | ||
| 25 | */ | ||
| 26 | |||
| 27 | #ifndef __DRM_ENCODER_SLAVE_H__ | ||
| 28 | #define __DRM_ENCODER_SLAVE_H__ | ||
| 29 | |||
| 30 | #include "drmP.h" | ||
| 31 | #include "drm_crtc.h" | ||
| 32 | |||
| 33 | /** | ||
| 34 | * struct drm_encoder_slave_funcs - Entry points exposed by a slave encoder driver | ||
| 35 | * @set_config: Initialize any encoder-specific modesetting parameters. | ||
| 36 | * The meaning of the @params parameter is implementation | ||
| 37 | * dependent. It will usually be a structure with DVO port | ||
| 38 | * data format settings or timings. It's not required for | ||
| 39 | * the new parameters to take effect until the next mode | ||
| 40 | * is set. | ||
| 41 | * | ||
| 42 | * Most of its members are analogous to the function pointers in | ||
| 43 | * &drm_encoder_helper_funcs and they can optionally be used to | ||
| 44 | * initialize the latter. Connector-like methods (e.g. @get_modes and | ||
| 45 | * @set_property) will typically be wrapped around and only be called | ||
| 46 | * if the encoder is the currently selected one for the connector. | ||
| 47 | */ | ||
| 48 | struct drm_encoder_slave_funcs { | ||
| 49 | void (*set_config)(struct drm_encoder *encoder, | ||
| 50 | void *params); | ||
| 51 | |||
| 52 | void (*destroy)(struct drm_encoder *encoder); | ||
| 53 | void (*dpms)(struct drm_encoder *encoder, int mode); | ||
| 54 | void (*save)(struct drm_encoder *encoder); | ||
| 55 | void (*restore)(struct drm_encoder *encoder); | ||
| 56 | bool (*mode_fixup)(struct drm_encoder *encoder, | ||
| 57 | struct drm_display_mode *mode, | ||
| 58 | struct drm_display_mode *adjusted_mode); | ||
| 59 | int (*mode_valid)(struct drm_encoder *encoder, | ||
| 60 | struct drm_display_mode *mode); | ||
| 61 | void (*mode_set)(struct drm_encoder *encoder, | ||
| 62 | struct drm_display_mode *mode, | ||
| 63 | struct drm_display_mode *adjusted_mode); | ||
| 64 | |||
| 65 | enum drm_connector_status (*detect)(struct drm_encoder *encoder, | ||
| 66 | struct drm_connector *connector); | ||
| 67 | int (*get_modes)(struct drm_encoder *encoder, | ||
| 68 | struct drm_connector *connector); | ||
| 69 | int (*create_resources)(struct drm_encoder *encoder, | ||
| 70 | struct drm_connector *connector); | ||
| 71 | int (*set_property)(struct drm_encoder *encoder, | ||
| 72 | struct drm_connector *connector, | ||
| 73 | struct drm_property *property, | ||
| 74 | uint64_t val); | ||
| 75 | |||
| 76 | }; | ||
| 77 | |||
| 78 | /** | ||
| 79 | * struct drm_encoder_slave - Slave encoder struct | ||
| 80 | * @base: DRM encoder object. | ||
| 81 | * @slave_funcs: Slave encoder callbacks. | ||
| 82 | * @slave_priv: Slave encoder private data. | ||
| 83 | * @bus_priv: Bus specific data. | ||
| 84 | * | ||
| 85 | * A &drm_encoder_slave has two sets of callbacks, @slave_funcs and the | ||
| 86 | * ones in @base. The former are never actually called by the common | ||
| 87 | * CRTC code, it's just a convenience for splitting the encoder | ||
| 88 | * functions in an upper, GPU-specific layer and a (hopefully) | ||
| 89 | * GPU-agnostic lower layer: It's the GPU driver responsibility to | ||
| 90 | * call the slave methods when appropriate. | ||
| 91 | * | ||
| 92 | * drm_i2c_encoder_init() provides a way to get an implementation of | ||
| 93 | * this. | ||
| 94 | */ | ||
| 95 | struct drm_encoder_slave { | ||
| 96 | struct drm_encoder base; | ||
| 97 | |||
| 98 | struct drm_encoder_slave_funcs *slave_funcs; | ||
| 99 | void *slave_priv; | ||
| 100 | void *bus_priv; | ||
| 101 | }; | ||
| 102 | #define to_encoder_slave(x) container_of((x), struct drm_encoder_slave, base) | ||
| 103 | |||
| 104 | int drm_i2c_encoder_init(struct drm_device *dev, | ||
| 105 | struct drm_encoder_slave *encoder, | ||
| 106 | struct i2c_adapter *adap, | ||
| 107 | const struct i2c_board_info *info); | ||
| 108 | |||
| 109 | |||
| 110 | /** | ||
| 111 | * struct drm_i2c_encoder_driver | ||
| 112 | * | ||
| 113 | * Describes a device driver for an encoder connected to the GPU | ||
| 114 | * through an I2C bus. In addition to the entry points in @i2c_driver | ||
| 115 | * an @encoder_init function should be provided. It will be called to | ||
| 116 | * give the driver an opportunity to allocate any per-encoder data | ||
| 117 | * structures and to initialize the @slave_funcs and (optionally) | ||
| 118 | * @slave_priv members of @encoder. | ||
| 119 | */ | ||
| 120 | struct drm_i2c_encoder_driver { | ||
| 121 | struct i2c_driver i2c_driver; | ||
| 122 | |||
| 123 | int (*encoder_init)(struct i2c_client *client, | ||
| 124 | struct drm_device *dev, | ||
| 125 | struct drm_encoder_slave *encoder); | ||
| 126 | |||
| 127 | }; | ||
| 128 | #define to_drm_i2c_encoder_driver(x) container_of((x), \ | ||
| 129 | struct drm_i2c_encoder_driver, \ | ||
| 130 | i2c_driver) | ||
| 131 | |||
| 132 | /** | ||
| 133 | * drm_i2c_encoder_get_client - Get the I2C client corresponding to an encoder | ||
| 134 | */ | ||
| 135 | static inline struct i2c_client *drm_i2c_encoder_get_client(struct drm_encoder *encoder) | ||
| 136 | { | ||
| 137 | return (struct i2c_client *)to_encoder_slave(encoder)->bus_priv; | ||
| 138 | } | ||
| 139 | |||
| 140 | /** | ||
| 141 | * drm_i2c_encoder_register - Register an I2C encoder driver | ||
| 142 | * @owner: Module containing the driver. | ||
| 143 | * @driver: Driver to be registered. | ||
| 144 | */ | ||
| 145 | static inline int drm_i2c_encoder_register(struct module *owner, | ||
| 146 | struct drm_i2c_encoder_driver *driver) | ||
| 147 | { | ||
| 148 | return i2c_register_driver(owner, &driver->i2c_driver); | ||
| 149 | } | ||
| 150 | |||
| 151 | /** | ||
| 152 | * drm_i2c_encoder_unregister - Unregister an I2C encoder driver | ||
| 153 | * @driver: Driver to be unregistered. | ||
| 154 | */ | ||
| 155 | static inline void drm_i2c_encoder_unregister(struct drm_i2c_encoder_driver *driver) | ||
| 156 | { | ||
| 157 | i2c_del_driver(&driver->i2c_driver); | ||
| 158 | } | ||
| 159 | |||
| 160 | void drm_i2c_encoder_destroy(struct drm_encoder *encoder); | ||
| 161 | |||
| 162 | #endif | ||
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h new file mode 100644 index 000000000000..88fffbdfa26f --- /dev/null +++ b/include/drm/drm_fb_helper.h | |||
| @@ -0,0 +1,82 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2006-2009 Red Hat Inc. | ||
| 3 | * Copyright (c) 2006-2008 Intel Corporation | ||
| 4 | * Copyright (c) 2007 Dave Airlie <airlied@linux.ie> | ||
| 5 | * | ||
| 6 | * DRM framebuffer helper functions | ||
| 7 | * | ||
| 8 | * Permission to use, copy, modify, distribute, and sell this software and its | ||
| 9 | * documentation for any purpose is hereby granted without fee, provided that | ||
| 10 | * the above copyright notice appear in all copies and that both that copyright | ||
| 11 | * notice and this permission notice appear in supporting documentation, and | ||
| 12 | * that the name of the copyright holders not be used in advertising or | ||
| 13 | * publicity pertaining to distribution of the software without specific, | ||
| 14 | * written prior permission. The copyright holders make no representations | ||
| 15 | * about the suitability of this software for any purpose. It is provided "as | ||
| 16 | * is" without express or implied warranty. | ||
| 17 | * | ||
| 18 | * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, | ||
| 19 | * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO | ||
| 20 | * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR | ||
| 21 | * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, | ||
| 22 | * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER | ||
| 23 | * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE | ||
| 24 | * OF THIS SOFTWARE. | ||
| 25 | * | ||
| 26 | * Authors: | ||
| 27 | * Dave Airlie <airlied@linux.ie> | ||
| 28 | * Jesse Barnes <jesse.barnes@intel.com> | ||
| 29 | */ | ||
| 30 | #ifndef DRM_FB_HELPER_H | ||
| 31 | #define DRM_FB_HELPER_H | ||
| 32 | |||
| 33 | struct drm_fb_helper_crtc { | ||
| 34 | uint32_t crtc_id; | ||
| 35 | struct drm_mode_set mode_set; | ||
| 36 | }; | ||
| 37 | |||
| 38 | struct drm_fb_helper_funcs { | ||
| 39 | void (*gamma_set)(struct drm_crtc *crtc, u16 red, u16 green, | ||
| 40 | u16 blue, int regno); | ||
| 41 | }; | ||
| 42 | |||
| 43 | struct drm_fb_helper { | ||
| 44 | struct drm_framebuffer *fb; | ||
| 45 | struct drm_device *dev; | ||
| 46 | struct drm_display_mode *mode; | ||
| 47 | int crtc_count; | ||
| 48 | struct drm_fb_helper_crtc *crtc_info; | ||
| 49 | struct drm_fb_helper_funcs *funcs; | ||
| 50 | int conn_limit; | ||
| 51 | struct list_head kernel_fb_list; | ||
| 52 | }; | ||
| 53 | |||
| 54 | int drm_fb_helper_single_fb_probe(struct drm_device *dev, | ||
| 55 | int (*fb_create)(struct drm_device *dev, | ||
| 56 | uint32_t fb_width, | ||
| 57 | uint32_t fb_height, | ||
| 58 | uint32_t surface_width, | ||
| 59 | uint32_t surface_height, | ||
| 60 | struct drm_framebuffer **fb_ptr)); | ||
| 61 | int drm_fb_helper_init_crtc_count(struct drm_fb_helper *helper, int crtc_count, | ||
| 62 | int max_conn); | ||
| 63 | void drm_fb_helper_free(struct drm_fb_helper *helper); | ||
| 64 | int drm_fb_helper_blank(int blank, struct fb_info *info); | ||
| 65 | int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, | ||
| 66 | struct fb_info *info); | ||
| 67 | int drm_fb_helper_set_par(struct fb_info *info); | ||
| 68 | int drm_fb_helper_check_var(struct fb_var_screeninfo *var, | ||
| 69 | struct fb_info *info); | ||
| 70 | int drm_fb_helper_setcolreg(unsigned regno, | ||
| 71 | unsigned red, | ||
| 72 | unsigned green, | ||
| 73 | unsigned blue, | ||
| 74 | unsigned transp, | ||
| 75 | struct fb_info *info); | ||
| 76 | |||
| 77 | void drm_fb_helper_restore(void); | ||
| 78 | void drm_fb_helper_fill_var(struct fb_info *info, struct drm_framebuffer *fb, | ||
| 79 | uint32_t fb_width, uint32_t fb_height); | ||
| 80 | void drm_fb_helper_fill_fix(struct fb_info *info, uint32_t pitch); | ||
| 81 | |||
| 82 | #endif | ||
diff --git a/include/drm/drm_memory.h b/include/drm/drm_memory.h index 63e425b5ea82..15af9b32ae42 100644 --- a/include/drm/drm_memory.h +++ b/include/drm/drm_memory.h | |||
| @@ -44,8 +44,6 @@ | |||
| 44 | 44 | ||
| 45 | #if __OS_HAS_AGP | 45 | #if __OS_HAS_AGP |
| 46 | 46 | ||
| 47 | #include <linux/vmalloc.h> | ||
| 48 | |||
| 49 | #ifdef HAVE_PAGE_AGP | 47 | #ifdef HAVE_PAGE_AGP |
| 50 | #include <asm/agp.h> | 48 | #include <asm/agp.h> |
| 51 | #else | 49 | #else |
diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index f8332073d277..62329f9a42cb 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h | |||
| @@ -37,6 +37,9 @@ | |||
| 37 | * Generic range manager structs | 37 | * Generic range manager structs |
| 38 | */ | 38 | */ |
| 39 | #include <linux/list.h> | 39 | #include <linux/list.h> |
| 40 | #ifdef CONFIG_DEBUG_FS | ||
| 41 | #include <linux/seq_file.h> | ||
| 42 | #endif | ||
| 40 | 43 | ||
| 41 | struct drm_mm_node { | 44 | struct drm_mm_node { |
| 42 | struct list_head fl_entry; | 45 | struct list_head fl_entry; |
| @@ -96,4 +99,8 @@ static inline struct drm_mm *drm_get_mm(struct drm_mm_node *block) | |||
| 96 | return block->mm; | 99 | return block->mm; |
| 97 | } | 100 | } |
| 98 | 101 | ||
| 102 | #ifdef CONFIG_DEBUG_FS | ||
| 103 | int drm_mm_dump_table(struct seq_file *m, struct drm_mm *mm); | ||
| 104 | #endif | ||
| 105 | |||
| 99 | #endif | 106 | #endif |
diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h index ae304cc73c90..1f908416aedb 100644 --- a/include/drm/drm_mode.h +++ b/include/drm/drm_mode.h | |||
| @@ -68,10 +68,11 @@ | |||
| 68 | #define DRM_MODE_DPMS_OFF 3 | 68 | #define DRM_MODE_DPMS_OFF 3 |
| 69 | 69 | ||
| 70 | /* Scaling mode options */ | 70 | /* Scaling mode options */ |
| 71 | #define DRM_MODE_SCALE_NON_GPU 0 | 71 | #define DRM_MODE_SCALE_NONE 0 /* Unmodified timing (display or |
| 72 | #define DRM_MODE_SCALE_FULLSCREEN 1 | 72 | software can still scale) */ |
| 73 | #define DRM_MODE_SCALE_NO_SCALE 2 | 73 | #define DRM_MODE_SCALE_FULLSCREEN 1 /* Full screen, ignore aspect */ |
| 74 | #define DRM_MODE_SCALE_ASPECT 3 | 74 | #define DRM_MODE_SCALE_CENTER 2 /* Centered, no scaling */ |
| 75 | #define DRM_MODE_SCALE_ASPECT 3 /* Full screen, preserve aspect */ | ||
| 75 | 76 | ||
| 76 | /* Dithering mode options */ | 77 | /* Dithering mode options */ |
| 77 | #define DRM_MODE_DITHERING_OFF 0 | 78 | #define DRM_MODE_DITHERING_OFF 0 |
| @@ -141,6 +142,7 @@ struct drm_mode_get_encoder { | |||
| 141 | #define DRM_MODE_SUBCONNECTOR_Composite 5 | 142 | #define DRM_MODE_SUBCONNECTOR_Composite 5 |
| 142 | #define DRM_MODE_SUBCONNECTOR_SVIDEO 6 | 143 | #define DRM_MODE_SUBCONNECTOR_SVIDEO 6 |
| 143 | #define DRM_MODE_SUBCONNECTOR_Component 8 | 144 | #define DRM_MODE_SUBCONNECTOR_Component 8 |
| 145 | #define DRM_MODE_SUBCONNECTOR_SCART 9 | ||
| 144 | 146 | ||
| 145 | #define DRM_MODE_CONNECTOR_Unknown 0 | 147 | #define DRM_MODE_CONNECTOR_Unknown 0 |
| 146 | #define DRM_MODE_CONNECTOR_VGA 1 | 148 | #define DRM_MODE_CONNECTOR_VGA 1 |
| @@ -155,6 +157,7 @@ struct drm_mode_get_encoder { | |||
| 155 | #define DRM_MODE_CONNECTOR_DisplayPort 10 | 157 | #define DRM_MODE_CONNECTOR_DisplayPort 10 |
| 156 | #define DRM_MODE_CONNECTOR_HDMIA 11 | 158 | #define DRM_MODE_CONNECTOR_HDMIA 11 |
| 157 | #define DRM_MODE_CONNECTOR_HDMIB 12 | 159 | #define DRM_MODE_CONNECTOR_HDMIB 12 |
| 160 | #define DRM_MODE_CONNECTOR_TV 13 | ||
| 158 | 161 | ||
| 159 | struct drm_mode_get_connector { | 162 | struct drm_mode_get_connector { |
| 160 | 163 | ||
diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h index 853508499d20..3f6e545609be 100644 --- a/include/drm/drm_pciids.h +++ b/include/drm/drm_pciids.h | |||
| @@ -552,6 +552,7 @@ | |||
| 552 | {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | 552 | {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ |
| 553 | {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | 553 | {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ |
| 554 | {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | 554 | {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ |
| 555 | {0x8086, 0x2e42, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | ||
| 555 | {0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | 556 | {0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ |
| 556 | {0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | 557 | {0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ |
| 557 | {0x8086, 0x35e8, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ | 558 | {0x8086, 0x35e8, PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_DISPLAY_VGA << 8, 0xffff00, 0}, \ |
diff --git a/include/drm/drm_sysfs.h b/include/drm/drm_sysfs.h new file mode 100644 index 000000000000..1d8e033fde67 --- /dev/null +++ b/include/drm/drm_sysfs.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | #ifndef _DRM_SYSFS_H_ | ||
| 2 | #define _DRM_SYSFS_H_ | ||
| 3 | |||
| 4 | /** | ||
| 5 | * This minimalistic include file is intended for users (read TTM) that | ||
| 6 | * don't want to include the full drmP.h file. | ||
| 7 | */ | ||
| 8 | |||
| 9 | extern int drm_class_device_register(struct device *dev); | ||
| 10 | extern void drm_class_device_unregister(struct device *dev); | ||
| 11 | |||
| 12 | #endif | ||
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index 8e1e92583fbc..7e0cb1da92e6 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h | |||
| @@ -185,6 +185,7 @@ typedef struct _drm_i915_sarea { | |||
| 185 | #define DRM_I915_GEM_GET_APERTURE 0x23 | 185 | #define DRM_I915_GEM_GET_APERTURE 0x23 |
| 186 | #define DRM_I915_GEM_MMAP_GTT 0x24 | 186 | #define DRM_I915_GEM_MMAP_GTT 0x24 |
| 187 | #define DRM_I915_GET_PIPE_FROM_CRTC_ID 0x25 | 187 | #define DRM_I915_GET_PIPE_FROM_CRTC_ID 0x25 |
| 188 | #define DRM_I915_GEM_MADVISE 0x26 | ||
| 188 | 189 | ||
| 189 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) | 190 | #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) |
| 190 | #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) | 191 | #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) |
| @@ -221,6 +222,7 @@ typedef struct _drm_i915_sarea { | |||
| 221 | #define DRM_IOCTL_I915_GEM_GET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling) | 222 | #define DRM_IOCTL_I915_GEM_GET_TILING DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_TILING, struct drm_i915_gem_get_tiling) |
| 222 | #define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) | 223 | #define DRM_IOCTL_I915_GEM_GET_APERTURE DRM_IOR (DRM_COMMAND_BASE + DRM_I915_GEM_GET_APERTURE, struct drm_i915_gem_get_aperture) |
| 223 | #define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_intel_get_pipe_from_crtc_id) | 224 | #define DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GET_PIPE_FROM_CRTC_ID, struct drm_intel_get_pipe_from_crtc_id) |
| 225 | #define DRM_IOCTL_I915_GEM_MADVISE DRM_IOWR(DRM_COMMAND_BASE + DRM_I915_GEM_MADVISE, struct drm_i915_gem_madvise) | ||
| 224 | 226 | ||
| 225 | /* Allow drivers to submit batchbuffers directly to hardware, relying | 227 | /* Allow drivers to submit batchbuffers directly to hardware, relying |
| 226 | * on the security mechanisms provided by hardware. | 228 | * on the security mechanisms provided by hardware. |
| @@ -667,4 +669,21 @@ struct drm_i915_get_pipe_from_crtc_id { | |||
| 667 | __u32 pipe; | 669 | __u32 pipe; |
| 668 | }; | 670 | }; |
| 669 | 671 | ||
| 672 | #define I915_MADV_WILLNEED 0 | ||
| 673 | #define I915_MADV_DONTNEED 1 | ||
| 674 | #define __I915_MADV_PURGED 2 /* internal state */ | ||
| 675 | |||
| 676 | struct drm_i915_gem_madvise { | ||
| 677 | /** Handle of the buffer to change the backing store advice */ | ||
| 678 | __u32 handle; | ||
| 679 | |||
| 680 | /* Advice: either the buffer will be needed again in the near future, | ||
| 681 | * or wont be and could be discarded under memory pressure. | ||
| 682 | */ | ||
| 683 | __u32 madv; | ||
| 684 | |||
| 685 | /** Whether the backing store still exists. */ | ||
| 686 | __u32 retained; | ||
| 687 | }; | ||
| 688 | |||
| 670 | #endif /* _I915_DRM_H_ */ | 689 | #endif /* _I915_DRM_H_ */ |
diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h index 2ba61e18fc8b..3b9932ab1756 100644 --- a/include/drm/radeon_drm.h +++ b/include/drm/radeon_drm.h | |||
| @@ -802,11 +802,12 @@ struct drm_radeon_gem_create { | |||
| 802 | uint32_t flags; | 802 | uint32_t flags; |
| 803 | }; | 803 | }; |
| 804 | 804 | ||
| 805 | #define RADEON_TILING_MACRO 0x1 | 805 | #define RADEON_TILING_MACRO 0x1 |
| 806 | #define RADEON_TILING_MICRO 0x2 | 806 | #define RADEON_TILING_MICRO 0x2 |
| 807 | #define RADEON_TILING_SWAP 0x4 | 807 | #define RADEON_TILING_SWAP_16BIT 0x4 |
| 808 | #define RADEON_TILING_SURFACE 0x8 /* this object requires a surface | 808 | #define RADEON_TILING_SWAP_32BIT 0x8 |
| 809 | * when mapped - i.e. front buffer */ | 809 | #define RADEON_TILING_SURFACE 0x10 /* this object requires a surface |
| 810 | * when mapped - i.e. front buffer */ | ||
| 810 | 811 | ||
| 811 | struct drm_radeon_gem_set_tiling { | 812 | struct drm_radeon_gem_set_tiling { |
| 812 | uint32_t handle; | 813 | uint32_t handle; |
| @@ -899,6 +900,7 @@ struct drm_radeon_cs { | |||
| 899 | #define RADEON_INFO_DEVICE_ID 0x00 | 900 | #define RADEON_INFO_DEVICE_ID 0x00 |
| 900 | #define RADEON_INFO_NUM_GB_PIPES 0x01 | 901 | #define RADEON_INFO_NUM_GB_PIPES 0x01 |
| 901 | #define RADEON_INFO_NUM_Z_PIPES 0x02 | 902 | #define RADEON_INFO_NUM_Z_PIPES 0x02 |
| 903 | #define RADEON_INFO_ACCEL_WORKING 0x03 | ||
| 902 | 904 | ||
| 903 | struct drm_radeon_info { | 905 | struct drm_radeon_info { |
| 904 | uint32_t request; | 906 | uint32_t request; |
diff --git a/include/drm/ttm/ttm_bo_api.h b/include/drm/ttm/ttm_bo_api.h index cd22ab4b495c..491146170522 100644 --- a/include/drm/ttm/ttm_bo_api.h +++ b/include/drm/ttm/ttm_bo_api.h | |||
| @@ -155,6 +155,7 @@ struct ttm_buffer_object { | |||
| 155 | * Members constant at init. | 155 | * Members constant at init. |
| 156 | */ | 156 | */ |
| 157 | 157 | ||
| 158 | struct ttm_bo_global *glob; | ||
| 158 | struct ttm_bo_device *bdev; | 159 | struct ttm_bo_device *bdev; |
| 159 | unsigned long buffer_start; | 160 | unsigned long buffer_start; |
| 160 | enum ttm_bo_type type; | 161 | enum ttm_bo_type type; |
| @@ -245,14 +246,15 @@ struct ttm_buffer_object { | |||
| 245 | * premapped region. | 246 | * premapped region. |
| 246 | */ | 247 | */ |
| 247 | 248 | ||
| 249 | #define TTM_BO_MAP_IOMEM_MASK 0x80 | ||
| 248 | struct ttm_bo_kmap_obj { | 250 | struct ttm_bo_kmap_obj { |
| 249 | void *virtual; | 251 | void *virtual; |
| 250 | struct page *page; | 252 | struct page *page; |
| 251 | enum { | 253 | enum { |
| 252 | ttm_bo_map_iomap, | 254 | ttm_bo_map_iomap = 1 | TTM_BO_MAP_IOMEM_MASK, |
| 253 | ttm_bo_map_vmap, | 255 | ttm_bo_map_vmap = 2, |
| 254 | ttm_bo_map_kmap, | 256 | ttm_bo_map_kmap = 3, |
| 255 | ttm_bo_map_premapped, | 257 | ttm_bo_map_premapped = 4 | TTM_BO_MAP_IOMEM_MASK, |
| 256 | } bo_kmap_type; | 258 | } bo_kmap_type; |
| 257 | }; | 259 | }; |
| 258 | 260 | ||
| @@ -522,8 +524,7 @@ extern int ttm_bo_evict_mm(struct ttm_bo_device *bdev, unsigned mem_type); | |||
| 522 | static inline void *ttm_kmap_obj_virtual(struct ttm_bo_kmap_obj *map, | 524 | static inline void *ttm_kmap_obj_virtual(struct ttm_bo_kmap_obj *map, |
| 523 | bool *is_iomem) | 525 | bool *is_iomem) |
| 524 | { | 526 | { |
| 525 | *is_iomem = (map->bo_kmap_type == ttm_bo_map_iomap || | 527 | *is_iomem = !!(map->bo_kmap_type & TTM_BO_MAP_IOMEM_MASK); |
| 526 | map->bo_kmap_type == ttm_bo_map_premapped); | ||
| 527 | return map->virtual; | 528 | return map->virtual; |
| 528 | } | 529 | } |
| 529 | 530 | ||
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h index a68829db381a..e8cd6d20aed2 100644 --- a/include/drm/ttm/ttm_bo_driver.h +++ b/include/drm/ttm/ttm_bo_driver.h | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | 32 | ||
| 33 | #include "ttm/ttm_bo_api.h" | 33 | #include "ttm/ttm_bo_api.h" |
| 34 | #include "ttm/ttm_memory.h" | 34 | #include "ttm/ttm_memory.h" |
| 35 | #include "ttm/ttm_module.h" | ||
| 35 | #include "drm_mm.h" | 36 | #include "drm_mm.h" |
| 36 | #include "linux/workqueue.h" | 37 | #include "linux/workqueue.h" |
| 37 | #include "linux/fs.h" | 38 | #include "linux/fs.h" |
| @@ -161,7 +162,7 @@ struct ttm_tt { | |||
| 161 | long last_lomem_page; | 162 | long last_lomem_page; |
| 162 | uint32_t page_flags; | 163 | uint32_t page_flags; |
| 163 | unsigned long num_pages; | 164 | unsigned long num_pages; |
| 164 | struct ttm_bo_device *bdev; | 165 | struct ttm_bo_global *glob; |
| 165 | struct ttm_backend *be; | 166 | struct ttm_backend *be; |
| 166 | struct task_struct *tsk; | 167 | struct task_struct *tsk; |
| 167 | unsigned long start; | 168 | unsigned long start; |
| @@ -364,24 +365,73 @@ struct ttm_bo_driver { | |||
| 364 | void (*fault_reserve_notify)(struct ttm_buffer_object *bo); | 365 | void (*fault_reserve_notify)(struct ttm_buffer_object *bo); |
| 365 | }; | 366 | }; |
| 366 | 367 | ||
| 367 | #define TTM_NUM_MEM_TYPES 8 | 368 | /** |
| 369 | * struct ttm_bo_global_ref - Argument to initialize a struct ttm_bo_global. | ||
| 370 | */ | ||
| 371 | |||
| 372 | struct ttm_bo_global_ref { | ||
| 373 | struct ttm_global_reference ref; | ||
| 374 | struct ttm_mem_global *mem_glob; | ||
| 375 | }; | ||
| 368 | 376 | ||
| 369 | #define TTM_BO_PRIV_FLAG_MOVING 0 /* Buffer object is moving and needs | ||
| 370 | idling before CPU mapping */ | ||
| 371 | #define TTM_BO_PRIV_FLAG_MAX 1 | ||
| 372 | /** | 377 | /** |
| 373 | * struct ttm_bo_device - Buffer object driver device-specific data. | 378 | * struct ttm_bo_global - Buffer object driver global data. |
| 374 | * | 379 | * |
| 375 | * @mem_glob: Pointer to a struct ttm_mem_global object for accounting. | 380 | * @mem_glob: Pointer to a struct ttm_mem_global object for accounting. |
| 376 | * @driver: Pointer to a struct ttm_bo_driver struct setup by the driver. | ||
| 377 | * @count: Current number of buffer object. | ||
| 378 | * @pages: Current number of pinned pages. | ||
| 379 | * @dummy_read_page: Pointer to a dummy page used for mapping requests | 381 | * @dummy_read_page: Pointer to a dummy page used for mapping requests |
| 380 | * of unpopulated pages. | 382 | * of unpopulated pages. |
| 381 | * @shrink: A shrink callback object used for buffre object swap. | 383 | * @shrink: A shrink callback object used for buffer object swap. |
| 382 | * @ttm_bo_extra_size: Extra size (sizeof(struct ttm_buffer_object) excluded) | 384 | * @ttm_bo_extra_size: Extra size (sizeof(struct ttm_buffer_object) excluded) |
| 383 | * used by a buffer object. This is excluding page arrays and backing pages. | 385 | * used by a buffer object. This is excluding page arrays and backing pages. |
| 384 | * @ttm_bo_size: This is @ttm_bo_extra_size + sizeof(struct ttm_buffer_object). | 386 | * @ttm_bo_size: This is @ttm_bo_extra_size + sizeof(struct ttm_buffer_object). |
| 387 | * @device_list_mutex: Mutex protecting the device list. | ||
| 388 | * This mutex is held while traversing the device list for pm options. | ||
| 389 | * @lru_lock: Spinlock protecting the bo subsystem lru lists. | ||
| 390 | * @device_list: List of buffer object devices. | ||
| 391 | * @swap_lru: Lru list of buffer objects used for swapping. | ||
| 392 | */ | ||
| 393 | |||
| 394 | struct ttm_bo_global { | ||
| 395 | |||
| 396 | /** | ||
| 397 | * Constant after init. | ||
| 398 | */ | ||
| 399 | |||
| 400 | struct kobject kobj; | ||
| 401 | struct ttm_mem_global *mem_glob; | ||
| 402 | struct page *dummy_read_page; | ||
| 403 | struct ttm_mem_shrink shrink; | ||
| 404 | size_t ttm_bo_extra_size; | ||
| 405 | size_t ttm_bo_size; | ||
| 406 | struct mutex device_list_mutex; | ||
| 407 | spinlock_t lru_lock; | ||
| 408 | |||
| 409 | /** | ||
| 410 | * Protected by device_list_mutex. | ||
| 411 | */ | ||
| 412 | struct list_head device_list; | ||
| 413 | |||
| 414 | /** | ||
| 415 | * Protected by the lru_lock. | ||
| 416 | */ | ||
| 417 | struct list_head swap_lru; | ||
| 418 | |||
| 419 | /** | ||
| 420 | * Internal protection. | ||
| 421 | */ | ||
| 422 | atomic_t bo_count; | ||
| 423 | }; | ||
| 424 | |||
| 425 | |||
| 426 | #define TTM_NUM_MEM_TYPES 8 | ||
| 427 | |||
| 428 | #define TTM_BO_PRIV_FLAG_MOVING 0 /* Buffer object is moving and needs | ||
| 429 | idling before CPU mapping */ | ||
| 430 | #define TTM_BO_PRIV_FLAG_MAX 1 | ||
| 431 | /** | ||
| 432 | * struct ttm_bo_device - Buffer object driver device-specific data. | ||
| 433 | * | ||
| 434 | * @driver: Pointer to a struct ttm_bo_driver struct setup by the driver. | ||
| 385 | * @man: An array of mem_type_managers. | 435 | * @man: An array of mem_type_managers. |
| 386 | * @addr_space_mm: Range manager for the device address space. | 436 | * @addr_space_mm: Range manager for the device address space. |
| 387 | * lru_lock: Spinlock that protects the buffer+device lru lists and | 437 | * lru_lock: Spinlock that protects the buffer+device lru lists and |
| @@ -399,32 +449,21 @@ struct ttm_bo_device { | |||
| 399 | /* | 449 | /* |
| 400 | * Constant after bo device init / atomic. | 450 | * Constant after bo device init / atomic. |
| 401 | */ | 451 | */ |
| 402 | 452 | struct list_head device_list; | |
| 403 | struct ttm_mem_global *mem_glob; | 453 | struct ttm_bo_global *glob; |
| 404 | struct ttm_bo_driver *driver; | 454 | struct ttm_bo_driver *driver; |
| 405 | struct page *dummy_read_page; | ||
| 406 | struct ttm_mem_shrink shrink; | ||
| 407 | |||
| 408 | size_t ttm_bo_extra_size; | ||
| 409 | size_t ttm_bo_size; | ||
| 410 | |||
| 411 | rwlock_t vm_lock; | 455 | rwlock_t vm_lock; |
| 456 | struct ttm_mem_type_manager man[TTM_NUM_MEM_TYPES]; | ||
| 412 | /* | 457 | /* |
| 413 | * Protected by the vm lock. | 458 | * Protected by the vm lock. |
| 414 | */ | 459 | */ |
| 415 | struct ttm_mem_type_manager man[TTM_NUM_MEM_TYPES]; | ||
| 416 | struct rb_root addr_space_rb; | 460 | struct rb_root addr_space_rb; |
| 417 | struct drm_mm addr_space_mm; | 461 | struct drm_mm addr_space_mm; |
| 418 | 462 | ||
| 419 | /* | 463 | /* |
| 420 | * Might want to change this to one lock per manager. | 464 | * Protected by the global:lru lock. |
| 421 | */ | ||
| 422 | spinlock_t lru_lock; | ||
| 423 | /* | ||
| 424 | * Protected by the lru lock. | ||
| 425 | */ | 465 | */ |
| 426 | struct list_head ddestroy; | 466 | struct list_head ddestroy; |
| 427 | struct list_head swap_lru; | ||
| 428 | 467 | ||
| 429 | /* | 468 | /* |
| 430 | * Protected by load / firstopen / lastclose /unload sync. | 469 | * Protected by load / firstopen / lastclose /unload sync. |
| @@ -640,6 +679,9 @@ extern int ttm_bo_pci_offset(struct ttm_bo_device *bdev, | |||
| 640 | unsigned long *bus_offset, | 679 | unsigned long *bus_offset, |
| 641 | unsigned long *bus_size); | 680 | unsigned long *bus_size); |
| 642 | 681 | ||
| 682 | extern void ttm_bo_global_release(struct ttm_global_reference *ref); | ||
| 683 | extern int ttm_bo_global_init(struct ttm_global_reference *ref); | ||
| 684 | |||
| 643 | extern int ttm_bo_device_release(struct ttm_bo_device *bdev); | 685 | extern int ttm_bo_device_release(struct ttm_bo_device *bdev); |
| 644 | 686 | ||
| 645 | /** | 687 | /** |
| @@ -657,7 +699,7 @@ extern int ttm_bo_device_release(struct ttm_bo_device *bdev); | |||
| 657 | * !0: Failure. | 699 | * !0: Failure. |
| 658 | */ | 700 | */ |
| 659 | extern int ttm_bo_device_init(struct ttm_bo_device *bdev, | 701 | extern int ttm_bo_device_init(struct ttm_bo_device *bdev, |
| 660 | struct ttm_mem_global *mem_glob, | 702 | struct ttm_bo_global *glob, |
| 661 | struct ttm_bo_driver *driver, | 703 | struct ttm_bo_driver *driver, |
| 662 | uint64_t file_page_offset, bool need_dma32); | 704 | uint64_t file_page_offset, bool need_dma32); |
| 663 | 705 | ||
diff --git a/include/drm/ttm/ttm_memory.h b/include/drm/ttm/ttm_memory.h index d8b8f042c4f1..6983a7cf4da4 100644 --- a/include/drm/ttm/ttm_memory.h +++ b/include/drm/ttm/ttm_memory.h | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #include <linux/spinlock.h> | 32 | #include <linux/spinlock.h> |
| 33 | #include <linux/wait.h> | 33 | #include <linux/wait.h> |
| 34 | #include <linux/errno.h> | 34 | #include <linux/errno.h> |
| 35 | #include <linux/kobject.h> | ||
| 35 | 36 | ||
| 36 | /** | 37 | /** |
| 37 | * struct ttm_mem_shrink - callback to shrink TTM memory usage. | 38 | * struct ttm_mem_shrink - callback to shrink TTM memory usage. |
| @@ -60,34 +61,33 @@ struct ttm_mem_shrink { | |||
| 60 | * @queue: Wait queue for processes suspended waiting for memory. | 61 | * @queue: Wait queue for processes suspended waiting for memory. |
| 61 | * @lock: Lock to protect the @shrink - and the memory accounting members, | 62 | * @lock: Lock to protect the @shrink - and the memory accounting members, |
| 62 | * that is, essentially the whole structure with some exceptions. | 63 | * that is, essentially the whole structure with some exceptions. |
| 63 | * @emer_memory: Lowmem memory limit available for root. | 64 | * @zones: Array of pointers to accounting zones. |
| 64 | * @max_memory: Lowmem memory limit available for non-root. | 65 | * @num_zones: Number of populated entries in the @zones array. |
| 65 | * @swap_limit: Lowmem memory limit where the shrink workqueue kicks in. | 66 | * @zone_kernel: Pointer to the kernel zone. |
| 66 | * @used_memory: Currently used lowmem memory. | 67 | * @zone_highmem: Pointer to the highmem zone if there is one. |
| 67 | * @used_total_memory: Currently used total (lowmem + highmem) memory. | 68 | * @zone_dma32: Pointer to the dma32 zone if there is one. |
| 68 | * @total_memory_swap_limit: Total memory limit where the shrink workqueue | ||
| 69 | * kicks in. | ||
| 70 | * @max_total_memory: Total memory available to non-root processes. | ||
| 71 | * @emer_total_memory: Total memory available to root processes. | ||
| 72 | * | 69 | * |
| 73 | * Note that this structure is not per device. It should be global for all | 70 | * Note that this structure is not per device. It should be global for all |
| 74 | * graphics devices. | 71 | * graphics devices. |
| 75 | */ | 72 | */ |
| 76 | 73 | ||
| 74 | #define TTM_MEM_MAX_ZONES 2 | ||
| 75 | struct ttm_mem_zone; | ||
| 77 | struct ttm_mem_global { | 76 | struct ttm_mem_global { |
| 77 | struct kobject kobj; | ||
| 78 | struct ttm_mem_shrink *shrink; | 78 | struct ttm_mem_shrink *shrink; |
| 79 | struct workqueue_struct *swap_queue; | 79 | struct workqueue_struct *swap_queue; |
| 80 | struct work_struct work; | 80 | struct work_struct work; |
| 81 | wait_queue_head_t queue; | 81 | wait_queue_head_t queue; |
| 82 | spinlock_t lock; | 82 | spinlock_t lock; |
| 83 | uint64_t emer_memory; | 83 | struct ttm_mem_zone *zones[TTM_MEM_MAX_ZONES]; |
| 84 | uint64_t max_memory; | 84 | unsigned int num_zones; |
| 85 | uint64_t swap_limit; | 85 | struct ttm_mem_zone *zone_kernel; |
| 86 | uint64_t used_memory; | 86 | #ifdef CONFIG_HIGHMEM |
| 87 | uint64_t used_total_memory; | 87 | struct ttm_mem_zone *zone_highmem; |
| 88 | uint64_t total_memory_swap_limit; | 88 | #else |
| 89 | uint64_t max_total_memory; | 89 | struct ttm_mem_zone *zone_dma32; |
| 90 | uint64_t emer_total_memory; | 90 | #endif |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | /** | 93 | /** |
| @@ -146,8 +146,13 @@ static inline void ttm_mem_unregister_shrink(struct ttm_mem_global *glob, | |||
| 146 | extern int ttm_mem_global_init(struct ttm_mem_global *glob); | 146 | extern int ttm_mem_global_init(struct ttm_mem_global *glob); |
| 147 | extern void ttm_mem_global_release(struct ttm_mem_global *glob); | 147 | extern void ttm_mem_global_release(struct ttm_mem_global *glob); |
| 148 | extern int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory, | 148 | extern int ttm_mem_global_alloc(struct ttm_mem_global *glob, uint64_t memory, |
| 149 | bool no_wait, bool interruptible, bool himem); | 149 | bool no_wait, bool interruptible); |
| 150 | extern void ttm_mem_global_free(struct ttm_mem_global *glob, | 150 | extern void ttm_mem_global_free(struct ttm_mem_global *glob, |
| 151 | uint64_t amount, bool himem); | 151 | uint64_t amount); |
| 152 | extern int ttm_mem_global_alloc_page(struct ttm_mem_global *glob, | ||
| 153 | struct page *page, | ||
| 154 | bool no_wait, bool interruptible); | ||
| 155 | extern void ttm_mem_global_free_page(struct ttm_mem_global *glob, | ||
| 156 | struct page *page); | ||
| 152 | extern size_t ttm_round_pot(size_t size); | 157 | extern size_t ttm_round_pot(size_t size); |
| 153 | #endif | 158 | #endif |
diff --git a/include/drm/ttm/ttm_module.h b/include/drm/ttm/ttm_module.h index d1d433834e4f..cf416aee19af 100644 --- a/include/drm/ttm/ttm_module.h +++ b/include/drm/ttm/ttm_module.h | |||
| @@ -32,6 +32,7 @@ | |||
| 32 | #define _TTM_MODULE_H_ | 32 | #define _TTM_MODULE_H_ |
| 33 | 33 | ||
| 34 | #include <linux/kernel.h> | 34 | #include <linux/kernel.h> |
| 35 | struct kobject; | ||
| 35 | 36 | ||
| 36 | #define TTM_PFX "[TTM] " | 37 | #define TTM_PFX "[TTM] " |
| 37 | 38 | ||
| @@ -54,5 +55,6 @@ extern void ttm_global_init(void); | |||
| 54 | extern void ttm_global_release(void); | 55 | extern void ttm_global_release(void); |
| 55 | extern int ttm_global_item_ref(struct ttm_global_reference *ref); | 56 | extern int ttm_global_item_ref(struct ttm_global_reference *ref); |
| 56 | extern void ttm_global_item_unref(struct ttm_global_reference *ref); | 57 | extern void ttm_global_item_unref(struct ttm_global_reference *ref); |
| 58 | extern struct kobject *ttm_get_kobj(void); | ||
| 57 | 59 | ||
| 58 | #endif /* _TTM_MODULE_H_ */ | 60 | #endif /* _TTM_MODULE_H_ */ |
