Subversion Repositories Kolibri OS

Rev

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);
-