Rev 4560 | Rev 5128 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4560 | Rev 5060 | ||
---|---|---|---|
Line 61... | Line 61... | ||
61 | * |
61 | * |
62 | * In that case, we don't need to do it when GEM is initialized as nobody else |
62 | * In that case, we don't need to do it when GEM is initialized as nobody else |
63 | * has access to the ring. |
63 | * has access to the ring. |
64 | */ |
64 | */ |
65 | #define RING_LOCK_TEST_WITH_RETURN(dev, file) do { \ |
65 | #define RING_LOCK_TEST_WITH_RETURN(dev, file) do { \ |
66 | if (LP_RING(dev->dev_private)->obj == NULL) \ |
66 | if (LP_RING(dev->dev_private)->buffer->obj == NULL) \ |
67 | LOCK_TEST_WITH_RETURN(dev, file); \ |
67 | LOCK_TEST_WITH_RETURN(dev, file); \ |
68 | } while (0) |
68 | } while (0) |
Line 69... | Line 69... | ||
69 | 69 | ||
70 | static inline u32 |
70 | static inline u32 |
Line 80... | Line 80... | ||
80 | #define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) |
80 | #define READ_BREADCRUMB(dev_priv) READ_HWSP(dev_priv, I915_BREADCRUMB_INDEX) |
81 | #define I915_BREADCRUMB_INDEX 0x21 |
81 | #define I915_BREADCRUMB_INDEX 0x21 |
Line 82... | Line 82... | ||
82 | 82 | ||
83 | void i915_update_dri1_breadcrumb(struct drm_device *dev) |
83 | void i915_update_dri1_breadcrumb(struct drm_device *dev) |
84 | { |
84 | { |
85 | drm_i915_private_t *dev_priv = dev->dev_private; |
85 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 86... | Line 86... | ||
86 | struct drm_i915_master_private *master_priv; |
86 | struct drm_i915_master_private *master_priv; |
87 | 87 | ||
88 | /* |
88 | /* |
Line 101... | Line 101... | ||
101 | } |
101 | } |
102 | } |
102 | } |
Line 103... | Line 103... | ||
103 | 103 | ||
104 | static void i915_write_hws_pga(struct drm_device *dev) |
104 | static void i915_write_hws_pga(struct drm_device *dev) |
105 | { |
105 | { |
106 | drm_i915_private_t *dev_priv = dev->dev_private; |
106 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 107... | Line 107... | ||
107 | u32 addr; |
107 | u32 addr; |
108 | 108 | ||
109 | addr = dev_priv->status_page_dmah->busaddr; |
109 | addr = dev_priv->status_page_dmah->busaddr; |
Line 116... | Line 116... | ||
116 | * Frees the hardware status page, whether it's a physical address or a virtual |
116 | * Frees the hardware status page, whether it's a physical address or a virtual |
117 | * address set up by the X Server. |
117 | * address set up by the X Server. |
118 | */ |
118 | */ |
119 | static void i915_free_hws(struct drm_device *dev) |
119 | static void i915_free_hws(struct drm_device *dev) |
120 | { |
120 | { |
121 | drm_i915_private_t *dev_priv = dev->dev_private; |
121 | struct drm_i915_private *dev_priv = dev->dev_private; |
122 | struct intel_ring_buffer *ring = LP_RING(dev_priv); |
122 | struct intel_engine_cs *ring = LP_RING(dev_priv); |
Line 123... | Line 123... | ||
123 | 123 | ||
124 | if (dev_priv->status_page_dmah) { |
124 | if (dev_priv->status_page_dmah) { |
125 | drm_pci_free(dev, dev_priv->status_page_dmah); |
125 | drm_pci_free(dev, dev_priv->status_page_dmah); |
126 | dev_priv->status_page_dmah = NULL; |
126 | dev_priv->status_page_dmah = NULL; |
Line 137... | Line 137... | ||
137 | 137 | ||
Line 138... | Line 138... | ||
138 | #if 0 |
138 | #if 0 |
139 | 139 | ||
140 | void i915_kernel_lost_context(struct drm_device * dev) |
140 | void i915_kernel_lost_context(struct drm_device * dev) |
141 | { |
141 | { |
142 | drm_i915_private_t *dev_priv = dev->dev_private; |
142 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | 143 | struct drm_i915_master_private *master_priv; |
|
Line 143... | Line 144... | ||
143 | struct drm_i915_master_private *master_priv; |
144 | struct intel_engine_cs *ring = LP_RING(dev_priv); |
144 | struct intel_ring_buffer *ring = LP_RING(dev_priv); |
145 | struct intel_ringbuffer *ringbuf = ring->buffer; |
145 | 146 | ||
146 | /* |
147 | /* |
147 | * We should never lose context on the ring with modesetting |
148 | * We should never lose context on the ring with modesetting |
148 | * as we don't expose it to userspace |
149 | * as we don't expose it to userspace |
Line 149... | Line 150... | ||
149 | */ |
150 | */ |
150 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
151 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
151 | return; |
152 | return; |
152 | 153 | ||
153 | ring->head = I915_READ_HEAD(ring) & HEAD_ADDR; |
154 | ringbuf->head = I915_READ_HEAD(ring) & HEAD_ADDR; |
Line 154... | Line 155... | ||
154 | ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; |
155 | ringbuf->tail = I915_READ_TAIL(ring) & TAIL_ADDR; |
155 | ring->space = ring->head - (ring->tail + I915_RING_FREE_SPACE); |
156 | ringbuf->space = ringbuf->head - (ringbuf->tail + I915_RING_FREE_SPACE); |
Line 156... | Line 157... | ||
156 | if (ring->space < 0) |
157 | if (ringbuf->space < 0) |
157 | ring->space += ring->size; |
158 | ringbuf->space += ringbuf->size; |
158 | 159 | ||
159 | if (!dev->primary->master) |
160 | if (!dev->primary->master) |
Line 160... | Line 161... | ||
160 | return; |
161 | return; |
161 | 162 | ||
162 | master_priv = dev->primary->master->driver_priv; |
163 | master_priv = dev->primary->master->driver_priv; |
163 | if (ring->head == ring->tail && master_priv->sarea_priv) |
164 | if (ringbuf->head == ringbuf->tail && master_priv->sarea_priv) |
Line 164... | Line 165... | ||
164 | master_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY; |
165 | master_priv->sarea_priv->perf_boxes |= I915_BOX_RING_EMPTY; |
165 | } |
166 | } |
166 | 167 | ||
Line 188... | Line 189... | ||
188 | return 0; |
189 | return 0; |
189 | } |
190 | } |
Line 190... | Line 191... | ||
190 | 191 | ||
191 | static int i915_initialize(struct drm_device * dev, drm_i915_init_t * init) |
192 | static int i915_initialize(struct drm_device *dev, drm_i915_init_t *init) |
192 | { |
193 | { |
193 | drm_i915_private_t *dev_priv = dev->dev_private; |
194 | struct drm_i915_private *dev_priv = dev->dev_private; |
194 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
195 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
Line 195... | Line 196... | ||
195 | int ret; |
196 | int ret; |
196 | 197 | ||
Line 201... | Line 202... | ||
201 | } else { |
202 | } else { |
202 | DRM_DEBUG_DRIVER("sarea not found assuming DRI2 userspace\n"); |
203 | DRM_DEBUG_DRIVER("sarea not found assuming DRI2 userspace\n"); |
203 | } |
204 | } |
Line 204... | Line 205... | ||
204 | 205 | ||
205 | if (init->ring_size != 0) { |
206 | if (init->ring_size != 0) { |
206 | if (LP_RING(dev_priv)->obj != NULL) { |
207 | if (LP_RING(dev_priv)->buffer->obj != NULL) { |
207 | i915_dma_cleanup(dev); |
208 | i915_dma_cleanup(dev); |
208 | DRM_ERROR("Client tried to initialize ringbuffer in " |
209 | DRM_ERROR("Client tried to initialize ringbuffer in " |
209 | "GEM mode\n"); |
210 | "GEM mode\n"); |
210 | return -EINVAL; |
211 | return -EINVAL; |
Line 233... | Line 234... | ||
233 | return 0; |
234 | return 0; |
234 | } |
235 | } |
Line 235... | Line 236... | ||
235 | 236 | ||
236 | static int i915_dma_resume(struct drm_device * dev) |
237 | static int i915_dma_resume(struct drm_device *dev) |
237 | { |
238 | { |
238 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
239 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 239... | Line 240... | ||
239 | struct intel_ring_buffer *ring = LP_RING(dev_priv); |
240 | struct intel_engine_cs *ring = LP_RING(dev_priv); |
Line 240... | Line 241... | ||
240 | 241 | ||
241 | DRM_DEBUG_DRIVER("%s\n", __func__); |
242 | DRM_DEBUG_DRIVER("%s\n", __func__); |
242 | 243 | ||
243 | if (ring->virtual_start == NULL) { |
244 | if (ring->buffer->virtual_start == NULL) { |
244 | DRM_ERROR("can not ioremap virtual address for" |
245 | DRM_ERROR("can not ioremap virtual address for" |
Line 357... | Line 358... | ||
357 | return 0; |
358 | return 0; |
358 | } |
359 | } |
Line 359... | Line 360... | ||
359 | 360 | ||
360 | static int i915_emit_cmds(struct drm_device * dev, int *buffer, int dwords) |
361 | static int i915_emit_cmds(struct drm_device *dev, int *buffer, int dwords) |
361 | { |
362 | { |
362 | drm_i915_private_t *dev_priv = dev->dev_private; |
363 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 363... | Line 364... | ||
363 | int i, ret; |
364 | int i, ret; |
364 | 365 | ||
Line 365... | Line 366... | ||
365 | if ((dwords+1) * sizeof(int) >= LP_RING(dev_priv)->size - 8) |
366 | if ((dwords+1) * sizeof(int) >= LP_RING(dev_priv)->buffer->size - 8) |
366 | return -EINVAL; |
367 | return -EINVAL; |
- | 368 | ||
367 | 369 | for (i = 0; i < dwords;) { |
|
368 | for (i = 0; i < dwords;) { |
370 | int sz = validate_cmd(buffer[i]); |
369 | int sz = validate_cmd(buffer[i]); |
371 | |
370 | if (sz == 0 || i + sz > dwords) |
372 | if (sz == 0 || i + sz > dwords) |
Line 433... | Line 435... | ||
433 | * emit. For now, do it in both places: |
435 | * emit. For now, do it in both places: |
434 | */ |
436 | */ |
Line 435... | Line 437... | ||
435 | 437 | ||
436 | static void i915_emit_breadcrumb(struct drm_device *dev) |
438 | static void i915_emit_breadcrumb(struct drm_device *dev) |
437 | { |
439 | { |
438 | drm_i915_private_t *dev_priv = dev->dev_private; |
440 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 439... | Line 441... | ||
439 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
441 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
440 | 442 | ||
441 | dev_priv->dri1.counter++; |
443 | dev_priv->dri1.counter++; |
Line 549... | Line 551... | ||
549 | return 0; |
551 | return 0; |
550 | } |
552 | } |
Line 551... | Line 553... | ||
551 | 553 | ||
552 | static int i915_dispatch_flip(struct drm_device * dev) |
554 | static int i915_dispatch_flip(struct drm_device *dev) |
553 | { |
555 | { |
554 | drm_i915_private_t *dev_priv = dev->dev_private; |
556 | struct drm_i915_private *dev_priv = dev->dev_private; |
555 | struct drm_i915_master_private *master_priv = |
557 | struct drm_i915_master_private *master_priv = |
556 | dev->primary->master->driver_priv; |
558 | dev->primary->master->driver_priv; |
Line 557... | Line 559... | ||
557 | int ret; |
559 | int ret; |
Line 627... | Line 629... | ||
627 | } |
629 | } |
Line 628... | Line 630... | ||
628 | 630 | ||
629 | static int i915_batchbuffer(struct drm_device *dev, void *data, |
631 | static int i915_batchbuffer(struct drm_device *dev, void *data, |
630 | struct drm_file *file_priv) |
632 | struct drm_file *file_priv) |
631 | { |
633 | { |
632 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
634 | struct drm_i915_private *dev_priv = dev->dev_private; |
633 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
635 | struct drm_i915_master_private *master_priv; |
634 | drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *) |
- | |
635 | master_priv->sarea_priv; |
636 | drm_i915_sarea_t *sarea_priv; |
636 | drm_i915_batchbuffer_t *batch = data; |
637 | drm_i915_batchbuffer_t *batch = data; |
637 | int ret; |
638 | int ret; |
Line 638... | Line 639... | ||
638 | struct drm_clip_rect *cliprects = NULL; |
639 | struct drm_clip_rect *cliprects = NULL; |
639 | 640 | ||
Line -... | Line 641... | ||
- | 641 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
|
- | 642 | return -ENODEV; |
|
- | 643 | ||
640 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
644 | master_priv = dev->primary->master->driver_priv; |
641 | return -ENODEV; |
645 | sarea_priv = (drm_i915_sarea_t *) master_priv->sarea_priv; |
642 | 646 | ||
643 | if (!dev_priv->dri1.allow_batchbuffer) { |
647 | if (!dev_priv->dri1.allow_batchbuffer) { |
Line 683... | Line 687... | ||
683 | } |
687 | } |
Line 684... | Line 688... | ||
684 | 688 | ||
685 | static int i915_cmdbuffer(struct drm_device *dev, void *data, |
689 | static int i915_cmdbuffer(struct drm_device *dev, void *data, |
686 | struct drm_file *file_priv) |
690 | struct drm_file *file_priv) |
687 | { |
691 | { |
688 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
692 | struct drm_i915_private *dev_priv = dev->dev_private; |
689 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
693 | struct drm_i915_master_private *master_priv; |
690 | drm_i915_sarea_t *sarea_priv = (drm_i915_sarea_t *) |
- | |
691 | master_priv->sarea_priv; |
694 | drm_i915_sarea_t *sarea_priv; |
692 | drm_i915_cmdbuffer_t *cmdbuf = data; |
695 | drm_i915_cmdbuffer_t *cmdbuf = data; |
693 | struct drm_clip_rect *cliprects = NULL; |
696 | struct drm_clip_rect *cliprects = NULL; |
694 | void *batch_data; |
697 | void *batch_data; |
Line 698... | Line 701... | ||
698 | cmdbuf->buf, cmdbuf->sz, cmdbuf->num_cliprects); |
701 | cmdbuf->buf, cmdbuf->sz, cmdbuf->num_cliprects); |
Line 699... | Line 702... | ||
699 | 702 | ||
700 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
703 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
Line -... | Line 704... | ||
- | 704 | return -ENODEV; |
|
- | 705 | ||
- | 706 | master_priv = dev->primary->master->driver_priv; |
|
701 | return -ENODEV; |
707 | sarea_priv = (drm_i915_sarea_t *) master_priv->sarea_priv; |
Line 702... | Line 708... | ||
702 | 708 | ||
703 | RING_LOCK_TEST_WITH_RETURN(dev, file_priv); |
709 | RING_LOCK_TEST_WITH_RETURN(dev, file_priv); |
Line 751... | Line 757... | ||
751 | return ret; |
757 | return ret; |
752 | } |
758 | } |
Line 753... | Line 759... | ||
753 | 759 | ||
754 | static int i915_emit_irq(struct drm_device * dev) |
760 | static int i915_emit_irq(struct drm_device *dev) |
755 | { |
761 | { |
756 | drm_i915_private_t *dev_priv = dev->dev_private; |
762 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 757... | Line 763... | ||
757 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
763 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
Line 758... | Line 764... | ||
758 | 764 | ||
Line 777... | Line 783... | ||
777 | return dev_priv->dri1.counter; |
783 | return dev_priv->dri1.counter; |
778 | } |
784 | } |
Line 779... | Line 785... | ||
779 | 785 | ||
780 | static int i915_wait_irq(struct drm_device * dev, int irq_nr) |
786 | static int i915_wait_irq(struct drm_device *dev, int irq_nr) |
781 | { |
787 | { |
782 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
788 | struct drm_i915_private *dev_priv = dev->dev_private; |
783 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
789 | struct drm_i915_master_private *master_priv = dev->primary->master->driver_priv; |
784 | int ret = 0; |
790 | int ret = 0; |
Line 785... | Line 791... | ||
785 | struct intel_ring_buffer *ring = LP_RING(dev_priv); |
791 | struct intel_engine_cs *ring = LP_RING(dev_priv); |
786 | 792 | ||
Line 787... | Line 793... | ||
787 | DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr, |
793 | DRM_DEBUG_DRIVER("irq_nr=%d breadcrumb=%d\n", irq_nr, |
Line 814... | Line 820... | ||
814 | /* Needs the lock as it touches the ring. |
820 | /* Needs the lock as it touches the ring. |
815 | */ |
821 | */ |
816 | static int i915_irq_emit(struct drm_device *dev, void *data, |
822 | static int i915_irq_emit(struct drm_device *dev, void *data, |
817 | struct drm_file *file_priv) |
823 | struct drm_file *file_priv) |
818 | { |
824 | { |
819 | drm_i915_private_t *dev_priv = dev->dev_private; |
825 | struct drm_i915_private *dev_priv = dev->dev_private; |
820 | drm_i915_irq_emit_t *emit = data; |
826 | drm_i915_irq_emit_t *emit = data; |
821 | int result; |
827 | int result; |
Line 822... | Line 828... | ||
822 | 828 | ||
823 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
829 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
Line 824... | Line 830... | ||
824 | return -ENODEV; |
830 | return -ENODEV; |
825 | 831 | ||
826 | if (!dev_priv || !LP_RING(dev_priv)->virtual_start) { |
832 | if (!dev_priv || !LP_RING(dev_priv)->buffer->virtual_start) { |
827 | DRM_ERROR("called with no initialization\n"); |
833 | DRM_ERROR("called with no initialization\n"); |
Line 828... | Line 834... | ||
828 | return -EINVAL; |
834 | return -EINVAL; |
Line 845... | Line 851... | ||
845 | /* Doesn't need the hardware lock. |
851 | /* Doesn't need the hardware lock. |
846 | */ |
852 | */ |
847 | static int i915_irq_wait(struct drm_device *dev, void *data, |
853 | static int i915_irq_wait(struct drm_device *dev, void *data, |
848 | struct drm_file *file_priv) |
854 | struct drm_file *file_priv) |
849 | { |
855 | { |
850 | drm_i915_private_t *dev_priv = dev->dev_private; |
856 | struct drm_i915_private *dev_priv = dev->dev_private; |
851 | drm_i915_irq_wait_t *irqwait = data; |
857 | drm_i915_irq_wait_t *irqwait = data; |
Line 852... | Line 858... | ||
852 | 858 | ||
853 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
859 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
Line 862... | Line 868... | ||
862 | } |
868 | } |
Line 863... | Line 869... | ||
863 | 869 | ||
864 | static int i915_vblank_pipe_get(struct drm_device *dev, void *data, |
870 | static int i915_vblank_pipe_get(struct drm_device *dev, void *data, |
865 | struct drm_file *file_priv) |
871 | struct drm_file *file_priv) |
866 | { |
872 | { |
867 | drm_i915_private_t *dev_priv = dev->dev_private; |
873 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 868... | Line 874... | ||
868 | drm_i915_vblank_pipe_t *pipe = data; |
874 | drm_i915_vblank_pipe_t *pipe = data; |
869 | 875 | ||
Line 924... | Line 930... | ||
924 | #endif |
930 | #endif |
Line 925... | Line 931... | ||
925 | 931 | ||
926 | int i915_getparam(struct drm_device *dev, void *data, |
932 | int i915_getparam(struct drm_device *dev, void *data, |
927 | struct drm_file *file_priv) |
933 | struct drm_file *file_priv) |
928 | { |
934 | { |
929 | drm_i915_private_t *dev_priv = dev->dev_private; |
935 | struct drm_i915_private *dev_priv = dev->dev_private; |
930 | drm_i915_getparam_t *param = data; |
936 | drm_i915_getparam_t *param = data; |
Line 931... | Line 937... | ||
931 | int value; |
937 | int value; |
932 | 938 | ||
Line 944... | Line 950... | ||
944 | break; |
950 | break; |
945 | case I915_PARAM_LAST_DISPATCH: |
951 | case I915_PARAM_LAST_DISPATCH: |
946 | value = READ_BREADCRUMB(dev_priv); |
952 | value = READ_BREADCRUMB(dev_priv); |
947 | break; |
953 | break; |
948 | case I915_PARAM_CHIPSET_ID: |
954 | case I915_PARAM_CHIPSET_ID: |
949 | value = dev->pci_device; |
955 | value = dev->pdev->device; |
950 | break; |
956 | break; |
951 | case I915_PARAM_HAS_GEM: |
957 | case I915_PARAM_HAS_GEM: |
952 | value = 1; |
958 | value = 1; |
953 | break; |
959 | break; |
954 | case I915_PARAM_NUM_FENCES_AVAIL: |
960 | case I915_PARAM_NUM_FENCES_AVAIL: |
Line 993... | Line 999... | ||
993 | break; |
999 | break; |
994 | case I915_PARAM_HAS_WT: |
1000 | case I915_PARAM_HAS_WT: |
995 | value = HAS_WT(dev); |
1001 | value = HAS_WT(dev); |
996 | break; |
1002 | break; |
997 | case I915_PARAM_HAS_ALIASING_PPGTT: |
1003 | case I915_PARAM_HAS_ALIASING_PPGTT: |
998 | value = dev_priv->mm.aliasing_ppgtt ? 1 : 0; |
1004 | value = dev_priv->mm.aliasing_ppgtt || USES_FULL_PPGTT(dev); |
999 | break; |
1005 | break; |
1000 | case I915_PARAM_HAS_WAIT_TIMEOUT: |
1006 | case I915_PARAM_HAS_WAIT_TIMEOUT: |
1001 | value = 1; |
1007 | value = 1; |
1002 | break; |
1008 | break; |
1003 | case I915_PARAM_HAS_SEMAPHORES: |
1009 | case I915_PARAM_HAS_SEMAPHORES: |
Line 1016... | Line 1022... | ||
1016 | value = 1; |
1022 | value = 1; |
1017 | break; |
1023 | break; |
1018 | case I915_PARAM_HAS_EXEC_HANDLE_LUT: |
1024 | case I915_PARAM_HAS_EXEC_HANDLE_LUT: |
1019 | value = 1; |
1025 | value = 1; |
1020 | break; |
1026 | break; |
- | 1027 | case I915_PARAM_CMD_PARSER_VERSION: |
|
- | 1028 | value = i915_cmd_parser_get_version(); |
|
- | 1029 | break; |
|
1021 | default: |
1030 | default: |
1022 | DRM_DEBUG("Unknown parameter %d\n", param->param); |
1031 | DRM_DEBUG("Unknown parameter %d\n", param->param); |
1023 | return -EINVAL; |
1032 | return -EINVAL; |
1024 | } |
1033 | } |
Line 1030... | Line 1039... | ||
1030 | 1039 | ||
1031 | #if 0 |
1040 | #if 0 |
1032 | static int i915_setparam(struct drm_device *dev, void *data, |
1041 | static int i915_setparam(struct drm_device *dev, void *data, |
1033 | struct drm_file *file_priv) |
1042 | struct drm_file *file_priv) |
1034 | { |
1043 | { |
1035 | drm_i915_private_t *dev_priv = dev->dev_private; |
1044 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 1036... | Line 1045... | ||
1036 | drm_i915_setparam_t *param = data; |
1045 | drm_i915_setparam_t *param = data; |
1037 | 1046 | ||
1038 | if (!dev_priv) { |
1047 | if (!dev_priv) { |
Line 1091... | Line 1100... | ||
1091 | 1100 | ||
1092 | /* Setup MCHBAR if possible, return true if we should disable it again */ |
1101 | /* Setup MCHBAR if possible, return true if we should disable it again */ |
1093 | static void |
1102 | static void |
1094 | intel_setup_mchbar(struct drm_device *dev) |
1103 | intel_setup_mchbar(struct drm_device *dev) |
1095 | { |
1104 | { |
1096 | drm_i915_private_t *dev_priv = dev->dev_private; |
1105 | struct drm_i915_private *dev_priv = dev->dev_private; |
1097 | int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915; |
1106 | int mchbar_reg = INTEL_INFO(dev)->gen >= 4 ? MCHBAR_I965 : MCHBAR_I915; |
1098 | u32 temp; |
1107 | u32 temp; |
Line -... | Line 1108... | ||
- | 1108 | bool enabled; |
|
- | 1109 | ||
- | 1110 | if (IS_VALLEYVIEW(dev)) |
|
1099 | bool enabled; |
1111 | return; |
Line 1100... | Line 1112... | ||
1100 | 1112 | ||
1101 | dev_priv->mchbar_need_disable = false; |
1113 | dev_priv->mchbar_need_disable = false; |
1102 | 1114 | ||
Line 1157... | Line 1169... | ||
1157 | 1169 | ||
1158 | ret = intel_parse_bios(dev); |
1170 | ret = intel_parse_bios(dev); |
1159 | if (ret) |
1171 | if (ret) |
Line 1160... | Line -... | ||
1160 | DRM_INFO("failed to find VBIOS tables\n"); |
- | |
- | 1172 | DRM_INFO("failed to find VBIOS tables\n"); |
|
Line 1161... | Line 1173... | ||
1161 | 1173 | ||
1162 | main_fb_obj = kos_gem_fb_object_create(dev,0,16*1024*1024); |
1174 | |
1163 | 1175 | ||
1164 | /* Initialise stolen first so that we may reserve preallocated |
1176 | /* Initialise stolen first so that we may reserve preallocated |
1165 | * objects for the BIOS to KMS transition. |
1177 | * objects for the BIOS to KMS transition. |
1166 | */ |
1178 | */ |
Line -... | Line 1179... | ||
- | 1179 | ret = i915_gem_init_stolen(dev); |
|
- | 1180 | if (ret) |
|
1167 | ret = i915_gem_init_stolen(dev); |
1181 | goto cleanup_vga_switcheroo; |
1168 | if (ret) |
1182 | |
1169 | goto cleanup_vga_switcheroo; |
1183 | intel_power_domains_init_hw(dev_priv); |
Line 1170... | Line 1184... | ||
1170 | 1184 | ||
Line 1171... | Line 1185... | ||
1171 | ret = drm_irq_install(dev); |
1185 | ret = drm_irq_install(dev, dev->pdev->irq); |
1172 | if (ret) |
1186 | if (ret) |
1173 | goto cleanup_gem_stolen; |
1187 | goto cleanup_gem_stolen; |
Line 1174... | Line 1188... | ||
1174 | 1188 | ||
1175 | intel_power_domains_init_hw(dev); |
1189 | dev_priv->pm._irqs_disabled = false; |
1176 | 1190 | ||
Line 1177... | Line 1191... | ||
1177 | /* Important: The output setup functions called by modeset_init need |
1191 | /* Important: The output setup functions called by modeset_init need |
Line 1178... | Line 1192... | ||
1178 | * working irqs for e.g. gmbus and dp aux transfers. */ |
1192 | * working irqs for e.g. gmbus and dp aux transfers. */ |
1179 | intel_modeset_init(dev); |
1193 | intel_modeset_init(dev); |
1180 | 1194 | ||
1181 | ret = i915_gem_init(dev); |
1195 | ret = i915_gem_init(dev); |
1182 | if (ret) |
- | |
1183 | goto cleanup_power; |
1196 | if (ret) |
1184 | - | ||
Line 1185... | Line 1197... | ||
1185 | 1197 | goto cleanup_irq; |
|
1186 | intel_modeset_gem_init(dev); |
1198 | |
1187 | 1199 | ||
Line 1210... | Line 1222... | ||
1210 | * scanning against hotplug events. Hence do this first and ignore the |
1222 | * scanning against hotplug events. Hence do this first and ignore the |
1211 | * tiny window where we will loose hotplug notifactions. |
1223 | * tiny window where we will loose hotplug notifactions. |
1212 | */ |
1224 | */ |
1213 | intel_fbdev_initial_config(dev); |
1225 | intel_fbdev_initial_config(dev); |
Line 1214... | Line -... | ||
1214 | - | ||
1215 | /* Only enable hotplug handling once the fbdev is fully set up. */ |
- | |
1216 | dev_priv->enable_hotplug_processing = true; |
- | |
1217 | 1226 | ||
Line 1218... | Line 1227... | ||
1218 | drm_kms_helper_poll_init(dev); |
1227 | drm_kms_helper_poll_init(dev); |
Line 1219... | Line 1228... | ||
1219 | 1228 | ||
1220 | return 0; |
1229 | return 0; |
1221 | 1230 | ||
1222 | cleanup_gem: |
1231 | cleanup_gem: |
1223 | mutex_lock(&dev->struct_mutex); |
1232 | mutex_lock(&dev->struct_mutex); |
1224 | i915_gem_cleanup_ringbuffer(dev); |
1233 | i915_gem_cleanup_ringbuffer(dev); |
1225 | i915_gem_context_fini(dev); |
- | |
1226 | mutex_unlock(&dev->struct_mutex); |
1234 | i915_gem_context_fini(dev); |
1227 | i915_gem_cleanup_aliasing_ppgtt(dev); |
- | |
1228 | drm_mm_takedown(&dev_priv->gtt.base.mm); |
1235 | mutex_unlock(&dev->struct_mutex); |
1229 | cleanup_power: |
1236 | WARN_ON(dev_priv->mm.aliasing_ppgtt); |
1230 | intel_display_power_put(dev, POWER_DOMAIN_VGA); |
1237 | cleanup_irq: |
1231 | // drm_irq_uninstall(dev); |
1238 | // drm_irq_uninstall(dev); |
1232 | cleanup_gem_stolen: |
1239 | cleanup_gem_stolen: |
Line 1240... | Line 1247... | ||
1240 | } |
1247 | } |
Line 1241... | Line 1248... | ||
1241 | 1248 | ||
1242 | 1249 | ||
1243 | 1250 | ||
1244 | #if IS_ENABLED(CONFIG_FB) |
1251 | #if IS_ENABLED(CONFIG_FB) |
1245 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
1252 | static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
1246 | { |
1253 | { |
- | 1254 | struct apertures_struct *ap; |
|
Line 1247... | Line 1255... | ||
1247 | struct apertures_struct *ap; |
1255 | struct pci_dev *pdev = dev_priv->dev->pdev; |
1248 | struct pci_dev *pdev = dev_priv->dev->pdev; |
1256 | bool primary; |
1249 | bool primary; |
1257 | int ret; |
Line 1250... | Line 1258... | ||
1250 | 1258 | ||
1251 | ap = alloc_apertures(1); |
1259 | ap = alloc_apertures(1); |
Line 1252... | Line 1260... | ||
1252 | if (!ap) |
1260 | if (!ap) |
1253 | return; |
1261 | return -ENOMEM; |
Line 1254... | Line 1262... | ||
1254 | 1262 | ||
Line 1255... | Line 1263... | ||
1255 | ap->ranges[0].base = dev_priv->gtt.mappable_base; |
1263 | ap->ranges[0].base = dev_priv->gtt.mappable_base; |
- | 1264 | ap->ranges[0].size = dev_priv->gtt.mappable_end; |
|
- | 1265 | ||
1256 | ap->ranges[0].size = dev_priv->gtt.mappable_end; |
1266 | primary = |
1257 | 1267 | pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; |
|
1258 | primary = |
1268 | |
1259 | pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; |
1269 | ret = remove_conflicting_framebuffers(ap, "inteldrmfb", primary); |
- | 1270 | ||
1260 | 1271 | kfree(ap); |
|
1261 | remove_conflicting_framebuffers(ap, "inteldrmfb", primary); |
1272 | |
Line 1262... | Line 1273... | ||
1262 | 1273 | return ret; |
|
1263 | kfree(ap); |
1274 | } |
1264 | } |
1275 | #else |
Line 1265... | Line 1276... | ||
1265 | #else |
1276 | static int i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
1266 | static void i915_kick_out_firmware_fb(struct drm_i915_private *dev_priv) |
1277 | { |
1267 | { |
1278 | return 0; |
1268 | } |
1279 | } |
1269 | #endif |
1280 | #endif |
1270 | 1281 | ||
1271 | static void i915_dump_device_info(struct drm_i915_private *dev_priv) |
1282 | static void i915_dump_device_info(struct drm_i915_private *dev_priv) |
1272 | { |
1283 | { |
- | 1284 | const struct intel_device_info *info = &dev_priv->info; |
|
1273 | const struct intel_device_info *info = dev_priv->info; |
1285 | |
1274 | 1286 | #define PRINT_S(name) "%s" |
|
1275 | #define PRINT_S(name) "%s" |
1287 | #define SEP_EMPTY |
1276 | #define SEP_EMPTY |
1288 | #define PRINT_FLAG(name) info->name ? #name "," : "" |
1277 | #define PRINT_FLAG(name) info->name ? #name "," : "" |
1289 | #define SEP_COMMA , |
1278 | #define SEP_COMMA , |
1290 | DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x rev=0x%02x flags=" |
Line -... | Line 1291... | ||
- | 1291 | DEV_INFO_FOR_EACH_FLAG(PRINT_S, SEP_EMPTY), |
|
- | 1292 | info->gen, |
|
- | 1293 | dev_priv->dev->pdev->device, |
|
- | 1294 | dev_priv->dev->pdev->revision, |
|
- | 1295 | DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_COMMA)); |
|
- | 1296 | #undef PRINT_S |
|
- | 1297 | #undef SEP_EMPTY |
|
- | 1298 | #undef PRINT_FLAG |
|
- | 1299 | #undef SEP_COMMA |
|
- | 1300 | } |
|
- | 1301 | ||
- | 1302 | /* |
|
- | 1303 | * Determine various intel_device_info fields at runtime. |
|
- | 1304 | * |
|
- | 1305 | * Use it when either: |
|
- | 1306 | * - it's judged too laborious to fill n static structures with the limit |
|
- | 1307 | * when a simple if statement does the job, |
|
- | 1308 | * - run-time checks (eg read fuse/strap registers) are needed. |
|
- | 1309 | * |
|
- | 1310 | * This function needs to be called: |
|
- | 1311 | * - after the MMIO has been setup as we are reading registers, |
|
- | 1312 | * - after the PCH has been detected, |
|
- | 1313 | * - before the first usage of the fields it can tweak. |
|
- | 1314 | */ |
|
- | 1315 | static void intel_device_info_runtime_init(struct drm_device *dev) |
|
- | 1316 | { |
|
- | 1317 | struct drm_i915_private *dev_priv = dev->dev_private; |
|
- | 1318 | struct intel_device_info *info; |
|
- | 1319 | enum pipe pipe; |
|
- | 1320 | ||
- | 1321 | info = (struct intel_device_info *)&dev_priv->info; |
|
- | 1322 | ||
- | 1323 | if (IS_VALLEYVIEW(dev)) |
|
- | 1324 | for_each_pipe(pipe) |
|
- | 1325 | info->num_sprites[pipe] = 2; |
|
- | 1326 | else |
|
- | 1327 | for_each_pipe(pipe) |
|
- | 1328 | info->num_sprites[pipe] = 1; |
|
- | 1329 | ||
- | 1330 | if (i915.disable_display) { |
|
- | 1331 | DRM_INFO("Display disabled (module parameter)\n"); |
|
- | 1332 | info->num_pipes = 0; |
|
- | 1333 | } else if (info->num_pipes > 0 && |
|
- | 1334 | (INTEL_INFO(dev)->gen == 7 || INTEL_INFO(dev)->gen == 8) && |
|
- | 1335 | !IS_VALLEYVIEW(dev)) { |
|
- | 1336 | u32 fuse_strap = I915_READ(FUSE_STRAP); |
|
- | 1337 | u32 sfuse_strap = I915_READ(SFUSE_STRAP); |
|
- | 1338 | ||
- | 1339 | /* |
|
- | 1340 | * SFUSE_STRAP is supposed to have a bit signalling the display |
|
- | 1341 | * is fused off. Unfortunately it seems that, at least in |
|
- | 1342 | * certain cases, fused off display means that PCH display |
|
- | 1343 | * reads don't land anywhere. In that case, we read 0s. |
|
- | 1344 | * |
|
- | 1345 | * On CPT/PPT, we can detect this case as SFUSE_STRAP_FUSE_LOCK |
|
- | 1346 | * should be set when taking over after the firmware. |
|
1279 | DRM_DEBUG_DRIVER("i915 device info: gen=%i, pciid=0x%04x flags=" |
1347 | */ |
1280 | DEV_INFO_FOR_EACH_FLAG(PRINT_S, SEP_EMPTY), |
1348 | if (fuse_strap & ILK_INTERNAL_DISPLAY_DISABLE || |
1281 | info->gen, |
1349 | sfuse_strap & SFUSE_STRAP_DISPLAY_DISABLED || |
1282 | dev_priv->dev->pdev->device, |
1350 | (dev_priv->pch_type == PCH_CPT && |
1283 | DEV_INFO_FOR_EACH_FLAG(PRINT_FLAG, SEP_COMMA)); |
1351 | !(sfuse_strap & SFUSE_STRAP_FUSE_LOCK))) { |
Line 1299... | Line 1367... | ||
1299 | * - setup the DRM framebuffer with the allocated memory |
1367 | * - setup the DRM framebuffer with the allocated memory |
1300 | */ |
1368 | */ |
1301 | int i915_driver_load(struct drm_device *dev, unsigned long flags) |
1369 | int i915_driver_load(struct drm_device *dev, unsigned long flags) |
1302 | { |
1370 | { |
1303 | struct drm_i915_private *dev_priv; |
1371 | struct drm_i915_private *dev_priv; |
1304 | struct intel_device_info *info; |
1372 | struct intel_device_info *info, *device_info; |
1305 | int ret = 0, mmio_bar, mmio_size; |
1373 | int ret = 0, mmio_bar, mmio_size; |
1306 | uint32_t aperture_size; |
1374 | uint32_t aperture_size; |
Line 1307... | Line 1375... | ||
1307 | 1375 | ||
Line 1308... | Line 1376... | ||
1308 | info = (struct intel_device_info *) flags; |
1376 | info = (struct intel_device_info *) flags; |
1309 | 1377 | ||
1310 | 1378 | ||
Line 1311... | Line 1379... | ||
1311 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); |
1379 | dev_priv = kzalloc(sizeof(*dev_priv), GFP_KERNEL); |
1312 | if (dev_priv == NULL) |
1380 | if (dev_priv == NULL) |
- | 1381 | return -ENOMEM; |
|
- | 1382 | ||
- | 1383 | dev->dev_private = dev_priv; |
|
1313 | return -ENOMEM; |
1384 | dev_priv->dev = dev; |
Line 1314... | Line 1385... | ||
1314 | 1385 | ||
1315 | dev->dev_private = (void *)dev_priv; |
1386 | /* copy initial configuration to dev_priv->info */ |
1316 | dev_priv->dev = dev; |
1387 | device_info = (struct intel_device_info *)&dev_priv->info; |
1317 | dev_priv->info = info; |
1388 | *device_info = *info; |
1318 | 1389 | ||
- | 1390 | spin_lock_init(&dev_priv->irq_lock); |
|
1319 | spin_lock_init(&dev_priv->irq_lock); |
1391 | spin_lock_init(&dev_priv->gpu_error.lock); |
1320 | spin_lock_init(&dev_priv->gpu_error.lock); |
1392 | spin_lock_init(&dev_priv->backlight_lock); |
Line 1321... | Line 1393... | ||
1321 | spin_lock_init(&dev_priv->backlight_lock); |
1393 | spin_lock_init(&dev_priv->uncore.lock); |
Line 1361... | Line 1433... | ||
1361 | DRM_ERROR("failed to map registers\n"); |
1433 | DRM_ERROR("failed to map registers\n"); |
1362 | ret = -EIO; |
1434 | ret = -EIO; |
1363 | goto put_bridge; |
1435 | goto put_bridge; |
1364 | } |
1436 | } |
Line 1365... | Line -... | ||
1365 | - | ||
1366 | intel_uncore_early_sanitize(dev); |
- | |
1367 | 1437 | ||
1368 | /* This must be called before any calls to HAS_PCH_* */ |
1438 | /* This must be called before any calls to HAS_PCH_* */ |
Line 1369... | Line 1439... | ||
1369 | intel_detect_pch(dev); |
1439 | intel_detect_pch(dev); |
Line 1442... | Line 1512... | ||
1442 | * According to chipset errata, on the 965GM, MSI interrupts may |
1512 | * According to chipset errata, on the 965GM, MSI interrupts may |
1443 | * be lost or delayed, but we use them anyways to avoid |
1513 | * be lost or delayed, but we use them anyways to avoid |
1444 | * stuck interrupts on some machines. |
1514 | * stuck interrupts on some machines. |
1445 | */ |
1515 | */ |
Line 1446... | Line -... | ||
1446 | - | ||
1447 | dev_priv->num_plane = 1; |
- | |
1448 | if (IS_VALLEYVIEW(dev)) |
1516 | |
Line 1449... | Line 1517... | ||
1449 | dev_priv->num_plane = 2; |
1517 | intel_device_info_runtime_init(dev); |
1450 | 1518 | ||
1451 | // if (INTEL_INFO(dev)->num_pipes) { |
1519 | // if (INTEL_INFO(dev)->num_pipes) { |
1452 | // ret = drm_vblank_init(dev, INTEL_INFO(dev)->num_pipes); |
1520 | // ret = drm_vblank_init(dev, INTEL_INFO(dev)->num_pipes); |
1453 | // if (ret) |
1521 | // if (ret) |
Line 1454... | Line 1522... | ||
1454 | // goto out_gem_unload; |
1522 | // goto out_gem_unload; |
Line 1455... | Line 1523... | ||
1455 | // } |
1523 | // } |
1456 | 1524 | ||
1457 | intel_power_domains_init(dev); |
1525 | intel_power_domains_init(dev_priv); |
1458 | 1526 | ||
Line 1469... | Line 1537... | ||
1469 | 1537 | ||
1470 | 1538 | ||
1471 | if (INTEL_INFO(dev)->num_pipes) { |
1539 | if (INTEL_INFO(dev)->num_pipes) { |
1472 | /* Must be done after probing outputs */ |
- | |
1473 | intel_opregion_init(dev); |
1540 | /* Must be done after probing outputs */ |
Line 1474... | Line 1541... | ||
1474 | // acpi_video_register(); |
1541 | intel_opregion_init(dev); |
1475 | } |
1542 | } |
Line 1513... | Line 1580... | ||
1513 | intel_gpu_ips_teardown(); |
1580 | intel_gpu_ips_teardown(); |
Line 1514... | Line 1581... | ||
1514 | 1581 | ||
1515 | /* The i915.ko module is still not prepared to be loaded when |
1582 | /* The i915.ko module is still not prepared to be loaded when |
1516 | * the power well is not enabled, so just enable it in case |
1583 | * the power well is not enabled, so just enable it in case |
1517 | * we're going to unload/reload. */ |
1584 | * we're going to unload/reload. */ |
1518 | intel_display_set_init_power(dev, true); |
1585 | intel_display_set_init_power(dev_priv, true); |
Line 1519... | Line 1586... | ||
1519 | intel_power_domains_remove(dev); |
1586 | intel_power_domains_remove(dev_priv); |
Line 1520... | Line 1587... | ||
1520 | 1587 | ||
1521 | i915_teardown_sysfs(dev); |
1588 | i915_teardown_sysfs(dev); |
Line 1550... | Line 1617... | ||
1550 | /* Free error state after interrupts are fully disabled. */ |
1617 | /* Free error state after interrupts are fully disabled. */ |
1551 | del_timer_sync(&dev_priv->gpu_error.hangcheck_timer); |
1618 | del_timer_sync(&dev_priv->gpu_error.hangcheck_timer); |
1552 | cancel_work_sync(&dev_priv->gpu_error.work); |
1619 | cancel_work_sync(&dev_priv->gpu_error.work); |
1553 | i915_destroy_error_state(dev); |
1620 | i915_destroy_error_state(dev); |
Line 1554... | Line -... | ||
1554 | - | ||
1555 | cancel_delayed_work_sync(&dev_priv->pc8.enable_work); |
- | |
1556 | 1621 | ||
1557 | if (dev->pdev->msi_enabled) |
1622 | if (dev->pdev->msi_enabled) |
Line 1558... | Line 1623... | ||
1558 | pci_disable_msi(dev->pdev); |
1623 | pci_disable_msi(dev->pdev); |
Line 1559... | Line 1624... | ||
1559 | 1624 | ||
1560 | intel_opregion_fini(dev); |
1625 | intel_opregion_fini(dev); |
1561 | 1626 | ||
Line 1562... | Line 1627... | ||
1562 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
1627 | if (drm_core_check_feature(dev, DRIVER_MODESET)) { |
1563 | /* Flush any outstanding unpin_work. */ |
- | |
1564 | flush_workqueue(dev_priv->wq); |
1628 | /* Flush any outstanding unpin_work. */ |
1565 | 1629 | flush_workqueue(dev_priv->wq); |
|
- | 1630 | ||
1566 | mutex_lock(&dev->struct_mutex); |
1631 | mutex_lock(&dev->struct_mutex); |
1567 | i915_gem_free_all_phys_object(dev); |
- | |
1568 | i915_gem_cleanup_ringbuffer(dev); |
1632 | i915_gem_cleanup_ringbuffer(dev); |
Line 1569... | Line 1633... | ||
1569 | i915_gem_context_fini(dev); |
1633 | i915_gem_context_fini(dev); |
1570 | mutex_unlock(&dev->struct_mutex); |
1634 | WARN_ON(dev_priv->mm.aliasing_ppgtt); |
1571 | i915_gem_cleanup_aliasing_ppgtt(dev); |
1635 | mutex_unlock(&dev->struct_mutex); |
Line 1572... | Line -... | ||
1572 | i915_gem_cleanup_stolen(dev); |
- | |
1573 | 1636 | i915_gem_cleanup_stolen(dev); |
|
Line 1574... | Line 1637... | ||
1574 | if (!I915_NEED_GFX_HWS(dev)) |
1637 | |
Line 1575... | Line 1638... | ||
1575 | i915_free_hws(dev); |
1638 | if (!I915_NEED_GFX_HWS(dev)) |
1576 | } |
1639 | i915_free_hws(dev); |
Line -... | Line 1640... | ||
- | 1640 | } |
|
1577 | 1641 | ||
1578 | list_del(&dev_priv->gtt.base.global_link); |
1642 | WARN_ON(!list_empty(&dev_priv->vm_list)); |
Line 1579... | Line 1643... | ||
1579 | WARN_ON(!list_empty(&dev_priv->vm_list)); |
1643 | |
Line 1594... | Line 1658... | ||
1594 | 1658 | ||
1595 | if (dev_priv->slab) |
1659 | if (dev_priv->slab) |
Line 1596... | Line 1660... | ||
1596 | kmem_cache_destroy(dev_priv->slab); |
1660 | kmem_cache_destroy(dev_priv->slab); |
1597 | 1661 | ||
Line 1598... | Line 1662... | ||
1598 | pci_dev_put(dev_priv->bridge_dev); |
1662 | pci_dev_put(dev_priv->bridge_dev); |
1599 | kfree(dev->dev_private); |
1663 | kfree(dev_priv); |
1600 | 1664 | ||
Line 1601... | Line 1665... | ||
1601 | return 0; |
1665 | return 0; |
1602 | } |
1666 | } |
1603 | #endif |
- | |
1604 | - | ||
1605 | int i915_driver_open(struct drm_device *dev, struct drm_file *file) |
- | |
1606 | { |
- | |
1607 | struct drm_i915_file_private *file_priv; |
- | |
1608 | 1667 | #endif |
|
1609 | DRM_DEBUG_DRIVER("\n"); |
- | |
1610 | file_priv = kzalloc(sizeof(*file_priv), GFP_KERNEL); |
- | |
1611 | if (!file_priv) |
- | |
1612 | return -ENOMEM; |
- | |
1613 | - | ||
Line 1614... | Line 1668... | ||
1614 | file->driver_priv = file_priv; |
1668 | |
- | 1669 | int i915_driver_open(struct drm_device *dev, struct drm_file *file) |
|
- | 1670 | { |
|
Line 1615... | Line 1671... | ||
1615 | 1671 | int ret; |
|
1616 | spin_lock_init(&file_priv->mm.lock); |
1672 | |
Line 1617... | Line 1673... | ||
1617 | INIT_LIST_HEAD(&file_priv->mm.request_list); |
1673 | ret = i915_gem_open(dev, file); |
Line 1634... | Line 1690... | ||
1634 | * and DMA structures, since the kernel won't be using them, and clea |
1690 | * and DMA structures, since the kernel won't be using them, and clea |
1635 | * up any GEM state. |
1691 | * up any GEM state. |
1636 | */ |
1692 | */ |
1637 | void i915_driver_lastclose(struct drm_device * dev) |
1693 | void i915_driver_lastclose(struct drm_device *dev) |
1638 | { |
1694 | { |
1639 | drm_i915_private_t *dev_priv = dev->dev_private; |
1695 | struct drm_i915_private *dev_priv = dev->dev_private; |
Line 1640... | Line 1696... | ||
1640 | 1696 | ||
1641 | /* On gen6+ we refuse to init without kms enabled, but then the drm core |
1697 | /* On gen6+ we refuse to init without kms enabled, but then the drm core |
1642 | * goes right around and calls lastclose. Check for this and don't clean |
1698 | * goes right around and calls lastclose. Check for this and don't clean |
1643 | * up anything. */ |
1699 | * up anything. */ |
Line 1653... | Line 1709... | ||
1653 | i915_gem_lastclose(dev); |
1709 | i915_gem_lastclose(dev); |
Line 1654... | Line 1710... | ||
1654 | 1710 | ||
1655 | i915_dma_cleanup(dev); |
1711 | i915_dma_cleanup(dev); |
Line 1656... | Line 1712... | ||
1656 | } |
1712 | } |
1657 | 1713 | ||
1658 | void i915_driver_preclose(struct drm_device * dev, struct drm_file *file_priv) |
1714 | void i915_driver_preclose(struct drm_device *dev, struct drm_file *file) |
1659 | { |
1715 | { |
1660 | mutex_lock(&dev->struct_mutex); |
1716 | mutex_lock(&dev->struct_mutex); |
1661 | i915_gem_context_close(dev, file_priv); |
1717 | i915_gem_context_close(dev, file); |
1662 | i915_gem_release(dev, file_priv); |
1718 | i915_gem_release(dev, file); |
Line 1663... | Line 1719... | ||
1663 | mutex_unlock(&dev->struct_mutex); |
1719 | mutex_unlock(&dev->struct_mutex); |
1664 | } |
1720 | } |
1665 | 1721 | ||
Line -... | Line 1722... | ||
- | 1722 | void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) |
|
- | 1723 | { |
|
1666 | void i915_driver_postclose(struct drm_device *dev, struct drm_file *file) |
1724 | struct drm_i915_file_private *file_priv = file->driver_priv; |
1667 | { |
1725 | |
Line 1668... | Line 1726... | ||
1668 | struct drm_i915_file_private *file_priv = file->driver_priv; |
1726 | if (file_priv && file_priv->bsd_ring) |
1669 | 1727 | file_priv->bsd_ring = NULL; |
|
Line 1718... | Line 1776... | ||
1718 | DRM_IOCTL_DEF_DRV(I915_GEM_WAIT, i915_gem_wait_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1776 | DRM_IOCTL_DEF_DRV(I915_GEM_WAIT, i915_gem_wait_ioctl, DRM_AUTH|DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1719 | DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_CREATE, i915_gem_context_create_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1777 | DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_CREATE, i915_gem_context_create_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1720 | DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_DESTROY, i915_gem_context_destroy_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1778 | DRM_IOCTL_DEF_DRV(I915_GEM_CONTEXT_DESTROY, i915_gem_context_destroy_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1721 | DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1779 | DRM_IOCTL_DEF_DRV(I915_REG_READ, i915_reg_read_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1722 | DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_get_reset_stats_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
1780 | DRM_IOCTL_DEF_DRV(I915_GET_RESET_STATS, i915_get_reset_stats_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
- | 1781 | DRM_IOCTL_DEF_DRV(I915_GEM_USERPTR, i915_gem_userptr_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW), |
|
1723 | }; |
1782 | }; |
Line 1724... | Line 1783... | ||
1724 | 1783 | ||
Line 1725... | Line 1784... | ||
1725 | int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls); |
1784 | int i915_max_ioctl = ARRAY_SIZE(i915_ioctls); |
1726 | 1785 | ||
1727 | /* |
1786 | /* |
1728 | * This is really ugly: Because old userspace abused the linux agp interface to |
1787 | * This is really ugly: Because old userspace abused the linux agp interface to |