Rev 4560 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4560 | Rev 6131 | ||
---|---|---|---|
Line 124... | Line 124... | ||
124 | i915_gem_object_free(obj); |
124 | i915_gem_object_free(obj); |
125 | return NULL; |
125 | return NULL; |
126 | } |
126 | } |
Line 127... | Line -... | ||
127 | - | ||
128 | - | ||
129 | struct drm_i915_gem_object * |
- | |
130 | kos_gem_fb_object_create(struct drm_device *dev, |
- | |
131 | u32 gtt_offset, |
- | |
132 | u32 size) |
- | |
133 | { |
- | |
134 | struct drm_i915_private *dev_priv = dev->dev_private; |
- | |
135 | struct i915_address_space *ggtt = &dev_priv->gtt.base; |
- | |
136 | struct drm_i915_gem_object *obj; |
- | |
137 | struct drm_mm_node *fb_node; |
- | |
138 | struct i915_vma *vma; |
- | |
139 | int ret; |
- | |
140 | - | ||
141 | DRM_DEBUG_KMS("creating preallocated framebuffer object: gtt_offset=%x, size=%x\n", |
- | |
142 | gtt_offset, size); |
- | |
143 | - | ||
144 | /* KISS and expect everything to be page-aligned */ |
- | |
145 | BUG_ON(size & 4095); |
- | |
146 | - | ||
147 | if (WARN_ON(size == 0)) |
- | |
148 | return NULL; |
- | |
149 | - | ||
150 | fb_node = kzalloc(sizeof(*fb_node), GFP_KERNEL); |
- | |
151 | if (!fb_node) |
- | |
152 | return NULL; |
- | |
153 | - | ||
154 | fb_node->start = gtt_offset; |
- | |
155 | fb_node->size = size; |
- | |
156 | - | ||
157 | obj = _kos_fb_object_create(dev, fb_node); |
- | |
158 | if (obj == NULL) { |
- | |
159 | DRM_DEBUG_KMS("failed to preallocate framebuffer object\n"); |
- | |
160 | kfree(fb_node); |
- | |
161 | return NULL; |
- | |
162 | } |
- | |
163 | - | ||
164 | vma = i915_gem_obj_lookup_or_create_vma(obj, ggtt); |
- | |
165 | if (IS_ERR(vma)) { |
- | |
166 | ret = PTR_ERR(vma); |
- | |
167 | goto err_out; |
- | |
168 | } |
- | |
169 | - | ||
170 | /* To simplify the initialisation sequence between KMS and GTT, |
- | |
171 | * we allow construction of the stolen object prior to |
- | |
172 | * setting up the GTT space. The actual reservation will occur |
- | |
173 | * later. |
- | |
174 | */ |
- | |
175 | vma->node.start = gtt_offset; |
- | |
176 | vma->node.size = size; |
- | |
177 | if (drm_mm_initialized(&ggtt->mm)) { |
- | |
178 | ret = drm_mm_reserve_node(&ggtt->mm, &vma->node); |
- | |
179 | if (ret) { |
- | |
180 | DRM_DEBUG_KMS("failed to allocate framebuffer GTT space\n"); |
- | |
181 | goto err_vma; |
- | |
182 | } |
- | |
183 | } |
- | |
184 | - | ||
185 | // obj->has_global_gtt_mapping = 1; |
- | |
186 | - | ||
187 | list_add_tail(&obj->global_list, &dev_priv->mm.bound_list); |
- | |
188 | list_add_tail(&vma->mm_list, &ggtt->inactive_list); |
- | |
189 | - | ||
190 | mutex_lock(&dev->object_name_lock); |
- | |
191 | idr_preload(GFP_KERNEL); |
- | |
192 | - | ||
193 | if (!obj->base.name) { |
- | |
194 | ret = idr_alloc(&dev->object_name_idr, &obj->base, 1, 0, GFP_NOWAIT); |
- | |
195 | if (ret < 0) |
- | |
196 | goto err_gem; |
- | |
197 | - | ||
198 | obj->base.name = ret; |
- | |
199 | - | ||
200 | /* Allocate a reference for the name table. */ |
- | |
201 | drm_gem_object_reference(&obj->base); |
- | |
202 | - | ||
203 | DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, obj->base.name ); |
- | |
204 | } |
- | |
205 | - | ||
206 | idr_preload_end(); |
- | |
207 | mutex_unlock(&dev->object_name_lock); |
- | |
208 | drm_gem_object_unreference(&obj->base); |
- | |
209 | return obj; |
- | |
210 | - | ||
211 | err_gem: |
- | |
212 | idr_preload_end(); |
- | |
213 | mutex_unlock(&dev->object_name_lock); |
- | |
214 | err_vma: |
- | |
215 | i915_gem_vma_destroy(vma); |
- | |
216 | err_out: |
- | |
217 | kfree(fb_node); |
- | |
218 | drm_gem_object_unreference(&obj->base); |
- |