Subversion Repositories Kolibri OS

Rev

Rev 6131 | Rev 6296 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6131 Rev 6283
Line 9... Line 9...
9
#include 
9
#include 
10
 
10
 
Line 11... Line 11...
11
#include 
11
#include 
Line 12... Line 12...
12
 
12
 
13
#include "bitmap.h"
13
//#include "bitmap.h"
Line -... Line 14...
-
 
14
#include 
-
 
15
 
-
 
16
void  FASTCALL sysSetFramebuffer(void *fb)__asm__("SetFramebuffer");
-
 
17
void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb);
-
 
18
void init_system_cursors(struct drm_device *dev);
Line 14... Line 19...
14
#include 
19
 
15
 
-
 
16
 
-
 
Line 17... Line 20...
17
display_t *os_display;
20
addr_t dummy_fb_page;
18
struct drm_i915_gem_object *main_fb_obj;
21
 
Line 19... Line 22...
19
struct drm_framebuffer     *main_framebuffer;
22
display_t *os_display;
20
 
23
 
Line 21... Line -...
21
u32 cmd_buffer;
-
 
22
u32 cmd_offset;
-
 
23
 
-
 
24
void init_render();
-
 
25
int  sna_init();
-
 
26
 
-
 
27
static cursor_t*  __stdcall select_cursor_kms(cursor_t *cursor);
-
 
28
static void       __stdcall move_cursor_kms(cursor_t *cursor, int x, int y);
-
 
29
 
-
 
30
void __stdcall restore_cursor(int x, int y)
-
 
31
{};
-
 
32
 
24
u32 cmd_buffer;
33
void disable_mouse(void)
25
u32 cmd_offset;
34
{};
26
 
Line 35... Line 27...
35
 
27
void init_render();
Line 57... Line 49...
57
 
49
 
Line 58... Line 50...
58
    return count;
50
    return count;
59
};
51
};
Line -... Line 52...
-
 
52
 
-
 
53
struct drm_framebuffer *get_framebuffer(struct drm_device *dev, struct drm_display_mode *mode, int tiling)
-
 
54
{
-
 
55
    struct drm_i915_private *dev_priv = dev->dev_private;
-
 
56
    struct intel_fbdev     *ifbdev = dev_priv->fbdev;
-
 
57
    struct intel_framebuffer *intel_fb = ifbdev->fb;
-
 
58
    struct drm_framebuffer *fb = &intel_fb->base;
-
 
59
    struct drm_i915_gem_object *obj = NULL;
-
 
60
    int stride, size;
-
 
61
 
-
 
62
ENTER();
-
 
63
 
-
 
64
    stride = mode->hdisplay *4;
-
 
65
 
-
 
66
    if(tiling)
-
 
67
    {
-
 
68
        int gen3size;
-
 
69
 
-
 
70
        if(IS_GEN3(dev))
-
 
71
            for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1);
-
 
72
        else
-
 
73
            stride = ALIGN(stride, 512);
-
 
74
        size = stride * ALIGN(mode->vdisplay, 8);
-
 
75
 
-
 
76
        if(IS_GEN3(dev))
-
 
77
        {
-
 
78
            for (gen3size = 1024*1024; gen3size < size; gen3size <<= 1);
-
 
79
            size = gen3size;
-
 
80
        }
-
 
81
        else
-
 
82
            size = ALIGN(size, 4096);
-
 
83
    }
-
 
84
    else
-
 
85
    {
-
 
86
        stride = ALIGN(stride, 64);
-
 
87
        size = stride * ALIGN(mode->vdisplay, 2);
-
 
88
    }
-
 
89
 
-
 
90
    dbgprintf("size %x stride %x\n", size, stride);
-
 
91
 
-
 
92
    if(intel_fb == NULL || size > intel_fb->obj->base.size)
-
 
93
    {
-
 
94
        struct drm_mode_fb_cmd2 mode_cmd = {};
-
 
95
        int ret;
-
 
96
 
-
 
97
        DRM_DEBUG_KMS("remove old framebuffer\n");
-
 
98
        drm_framebuffer_remove(fb);
-
 
99
        ifbdev->fb = NULL;
-
 
100
        fb = NULL;
-
 
101
        DRM_DEBUG_KMS("create new framebuffer\n");
-
 
102
 
-
 
103
        mode_cmd.width  = mode->hdisplay;
-
 
104
        mode_cmd.height = mode->vdisplay;
-
 
105
 
-
 
106
        mode_cmd.pitches[0] = stride;
-
 
107
        mode_cmd.pixel_format = DRM_FORMAT_XRGB8888;
-
 
108
 
-
 
109
        mutex_lock(&dev->struct_mutex);
-
 
110
 
-
 
111
        /* If the FB is too big, just don't use it since fbdev is not very
-
 
112
        * important and we should probably use that space with FBC or other
-
 
113
        * features. */
-
 
114
        if (size * 2 < dev_priv->gtt.stolen_usable_size)
-
 
115
            obj = i915_gem_object_create_stolen(dev, size);
-
 
116
        if (obj == NULL)
-
 
117
            obj = i915_gem_alloc_object(dev, size);
-
 
118
        if (!obj) {
-
 
119
            DRM_ERROR("failed to allocate framebuffer\n");
-
 
120
            ret = -ENOMEM;
-
 
121
            goto out;
-
 
122
        }
-
 
123
 
-
 
124
        fb = __intel_framebuffer_create(dev, &mode_cmd, obj);
-
 
125
        if (IS_ERR(fb)) {
-
 
126
            ret = PTR_ERR(fb);
-
 
127
            goto out_unref;
-
 
128
        }
-
 
129
 
-
 
130
        /* Flush everything out, we'll be doing GTT only from now on */
-
 
131
        ret = intel_pin_and_fence_fb_obj(NULL, fb, NULL, NULL, NULL);
-
 
132
        if (ret) {
-
 
133
            DRM_ERROR("failed to pin obj: %d\n", ret);
-
 
134
            goto out_fb;
-
 
135
        }
-
 
136
        mutex_unlock(&dev->struct_mutex);
-
 
137
        ifbdev->fb = to_intel_framebuffer(fb);
-
 
138
    }
-
 
139
 
-
 
140
    obj = ifbdev->fb->obj;
-
 
141
 
-
 
142
    if(tiling)
-
 
143
    {
-
 
144
        obj->tiling_mode = I915_TILING_X;
-
 
145
        fb->modifier[0]  = I915_FORMAT_MOD_X_TILED;
-
 
146
        obj->fence_dirty = true;
-
 
147
        obj->stride      = stride;
-
 
148
    };
-
 
149
 
-
 
150
    fb->width  = mode->hdisplay;
-
 
151
    fb->height = mode->vdisplay;
-
 
152
 
-
 
153
    fb->pitches[0]  =
-
 
154
    fb->pitches[1]  =
-
 
155
    fb->pitches[2]  =
-
 
156
    fb->pitches[3]  = stride;
-
 
157
 
-
 
158
    fb->bits_per_pixel = 32;
-
 
159
    fb->depth = 24;
-
 
160
LEAVE();
-
 
161
    return fb;
-
 
162
 
-
 
163
out_fb:
-
 
164
    drm_framebuffer_remove(fb);
-
 
165
out_unref:
-
 
166
    drm_gem_object_unreference(&obj->base);
-
 
167
out:
-
 
168
    mutex_unlock(&dev->struct_mutex);
-
 
169
    return NULL;
-
 
170
}
60
 
171
 
61
static int set_mode(struct drm_device *dev, struct drm_connector *connector,
172
static int set_mode(struct drm_device *dev, struct drm_connector *connector,
62
                    struct drm_crtc *crtc, videomode_t *reqmode, bool strict)
173
                    struct drm_crtc *crtc, videomode_t *reqmode, bool strict)
63
{
174
{
64
    struct drm_i915_private *dev_priv   = dev->dev_private;
-
 
65
 
175
    struct drm_i915_private *dev_priv   = dev->dev_private;
66
    struct drm_mode_config  *config     = &dev->mode_config;
176
    struct drm_mode_config  *config     = &dev->mode_config;
67
    struct drm_display_mode *mode       = NULL, *tmpmode;
177
    struct drm_display_mode *mode       = NULL, *tmpmode;
68
    struct drm_connector    *tmpc;
178
    struct drm_connector    *tmpc;
69
    struct drm_framebuffer  *fb         = NULL;
179
    struct drm_framebuffer  *fb         = NULL;
70
    struct drm_mode_set     set;
180
    struct drm_mode_set     set;
71
    const char *con_name;
-
 
72
    unsigned hdisplay, vdisplay;
-
 
73
    int stride;
181
    char  con_edid[128];
Line 74... Line 182...
74
    int ret;
182
    int ret;
Line 75... Line 183...
75
 
183
 
Line 106... Line 214...
106
            }
214
            }
107
        };
215
        };
108
    };
216
    };
109
 
217
 
Line -... Line 218...
-
 
218
out:
-
 
219
    drm_modeset_unlock_all(dev);
110
    DRM_ERROR("%s failed\n", __FUNCTION__);
220
    DRM_ERROR("%s failed\n", __FUNCTION__);
111
 
-
 
112
    return -1;
221
    return -1;
Line 113... Line 222...
113
 
222
 
Line -... Line 223...
-
 
223
do_set:
Line -... Line 224...
-
 
224
 
-
 
225
    drm_modeset_unlock_all(dev);
-
 
226
 
-
 
227
    fb = get_framebuffer(dev, mode, 1);
-
 
228
    if(fb == NULL)
-
 
229
    {
114
do_set:
230
        DRM_ERROR("%s failed\n", __FUNCTION__);
Line 115... Line 231...
115
 
231
        return -1;
Line 116... Line 232...
116
 
232
    };
-
 
233
    drm_framebuffer_reference(fb);
-
 
234
 
117
    con_name = connector->name;
235
    drm_modeset_lock_all(dev);
-
 
236
 
-
 
237
    memcpy(con_edid, connector->edid_blob_ptr->data, 128);
118
 
238
 
119
    char  con_edid[128];
239
    DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n"
120
 
240
                  "monitor: %s model %x serial number %u\n",
121
    memcpy(con_edid, connector->edid_blob_ptr->data, 128);
241
                mode->hdisplay, mode->vdisplay,
Line 122... Line -...
122
    DRM_DEBUG_KMS("Manufacturer: %s Model %x Serial Number %u\n",
-
 
123
            manufacturer_name(con_edid + 0x08),
-
 
124
            (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
-
 
125
            (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
-
 
126
            + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
242
                crtc->base.id, connector->name,
Line 127... Line -...
127
 
-
 
128
    DRM_DEBUG_KMS("set mode %d %d: crtc %d connector %s\n",
-
 
129
              reqmode->width, reqmode->height, crtc->base.id,
-
 
130
              con_name);
-
 
131
 
-
 
132
    drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
-
 
133
 
-
 
134
    hdisplay = mode->hdisplay;
-
 
135
    vdisplay = mode->vdisplay;
-
 
136
 
-
 
137
//    if (crtc->invert_dimensions)
-
 
138
//        swap(hdisplay, vdisplay);
-
 
139
 
-
 
140
    fb = crtc->primary->fb;
-
 
141
    if(fb == NULL)
-
 
142
        fb = main_framebuffer;
-
 
143
 
-
 
144
    fb->width  = reqmode->width;
-
 
145
    fb->height = reqmode->height;
-
 
146
 
-
 
147
    main_fb_obj->tiling_mode = I915_TILING_X;
-
 
148
 
-
 
149
    if( main_fb_obj->tiling_mode == I915_TILING_X)
-
 
150
    {
-
 
151
        if(IS_GEN3(dev))
-
 
152
            for (stride = 512; stride < reqmode->width * 4; stride <<= 1);
-
 
153
        else
-
 
154
            stride = ALIGN(reqmode->width * 4, 512);
-
 
155
    }
-
 
156
    else
-
 
157
    {
-
 
158
        stride = ALIGN(reqmode->width * 4, 64);
-
 
159
    }
-
 
160
 
-
 
161
    fb->pitches[0]  =
-
 
162
    fb->pitches[1]  =
-
 
163
    fb->pitches[2]  =
-
 
164
    fb->pitches[3]  = stride;
243
            manufacturer_name(con_edid + 0x08),
165
 
244
            (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
Line 166... Line -...
166
    main_fb_obj->stride  = stride;
-
 
167
 
-
 
168
    fb->bits_per_pixel = 32;
245
            (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
169
    fb->depth = 24;
246
            + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
Line 170... Line 247...
170
 
247
 
171
    crtc->enabled = true;
248
    drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
172
    os_display->crtc = crtc;
249
 
Line 187... Line 264...
187
    ret = drm_mode_set_config_internal(&set);
264
    ret = drm_mode_set_config_internal(&set);
Line 188... Line 265...
188
 
265
 
189
    if ( !ret )
266
    if ( !ret )
-
 
267
    {
-
 
268
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
-
 
269
        struct kos_framebuffer *kfb = intel_fb->private;
-
 
270
        kolibri_framebuffer_update(dev_priv, kfb);
-
 
271
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
190
    {
272
 
191
        os_display->width    = fb->width;
273
        os_display->width    = mode->hdisplay;
192
        os_display->height   = fb->height;
274
        os_display->height   = mode->vdisplay;
-
 
275
        os_display->vrefresh = drm_mode_vrefresh(mode);
-
 
276
        sysSetFramebuffer(intel_fb->private);
-
 
277
        sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]);
-
 
278
 
-
 
279
        os_display->connector = connector;
-
 
280
        os_display->crtc = connector->encoder->crtc;
-
 
281
        os_display->supported_modes = count_connector_modes(connector);
-
 
282
 
-
 
283
        crtc->cursor_x = os_display->width/2;
Line 193... Line 284...
193
        os_display->vrefresh = drm_mode_vrefresh(mode);
284
        crtc->cursor_y = os_display->height/2;
Line 194... Line 285...
194
 
285
 
195
        sysSetScreen(fb->width, fb->height, fb->pitches[0]);
286
        os_display->select_cursor(os_display->cursor);
196
 
287
 
197
        DRM_DEBUG_KMS("new mode %d x %d pitch %d\n",
288
        DRM_DEBUG_KMS("new mode %d x %d pitch %d\n",
198
                       fb->width, fb->height, fb->pitches[0]);
289
                       mode->hdisplay, mode->vdisplay, fb->pitches[0]);
199
    }
290
    }
Line -... Line 291...
-
 
291
    else
200
    else
292
        DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
Line 201... Line 293...
201
        DRM_ERROR("failed to set mode %d_%d on crtc %p\n",
293
                   fb->width, fb->height, crtc);
202
                   fb->width, fb->height, crtc);
294
 
Line 213... Line 305...
213
    struct drm_connector    *tmpc;
305
    struct drm_connector    *tmpc;
214
    struct drm_mode_config  *config   = &dev->mode_config;
306
    struct drm_mode_config  *config   = &dev->mode_config;
215
    struct drm_framebuffer  *fb       = NULL;
307
    struct drm_framebuffer  *fb       = NULL;
216
    struct drm_mode_set     set;
308
    struct drm_mode_set     set;
217
    char  con_edid[128];
309
    struct drm_crtc *crtc = NULL;
-
 
310
 
-
 
311
    char  con_edid[128];
218
    int stride;
312
    int stride;
219
    int ret;
313
    int ret;
220
 
314
 
Line -... Line 315...
-
 
315
    fb = get_framebuffer(dev, mode, 1);
-
 
316
    if(fb == NULL)
-
 
317
    {
-
 
318
        DRM_ERROR("%s failed\n", __FUNCTION__);
-
 
319
        return -1;
-
 
320
    };
-
 
321
    drm_framebuffer_reference(fb);
-
 
322
 
221
    drm_modeset_lock_all(dev);
323
    drm_modeset_lock_all(dev);
Line 222... Line 324...
222
 
324
 
223
    list_for_each_entry(tmpc, &dev->mode_config.connector_list, head)
325
    list_for_each_entry(tmpc, &dev->mode_config.connector_list, head)
224
    {
326
    {
225
        const struct drm_connector_funcs *f = tmpc->funcs;
327
        const struct drm_connector_funcs *f = tmpc->funcs;
226
        if(tmpc == connector)
328
        if(tmpc == connector)
227
            continue;
329
            continue;
228
        f->dpms(tmpc, DRM_MODE_DPMS_OFF);
330
        f->dpms(tmpc, DRM_MODE_DPMS_OFF);
Line 229... Line -...
229
    };
-
 
230
 
-
 
231
    drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
331
    };
232
 
-
 
233
    fb = connector->encoder->crtc->primary->fb;
-
 
234
    if(fb == NULL)
-
 
235
        fb = main_framebuffer;
-
 
236
 
-
 
237
    fb->width  = mode->hdisplay;
-
 
238
    fb->height = mode->vdisplay;;
-
 
239
 
-
 
240
    main_fb_obj->tiling_mode = I915_TILING_X;
-
 
241
 
-
 
242
    if( main_fb_obj->tiling_mode == I915_TILING_X)
-
 
243
    {
-
 
244
        if(IS_GEN3(dev))
-
 
245
            for (stride = 512; stride < mode->hdisplay * 4; stride <<= 1);
-
 
246
        else
-
 
247
            stride = ALIGN(mode->hdisplay * 4, 512);
-
 
248
    }
-
 
249
    else
-
 
250
    {
-
 
251
        stride = ALIGN(mode->hdisplay * 4, 64);
-
 
252
    }
-
 
253
 
-
 
254
    fb->pitches[0]  =
-
 
255
    fb->pitches[1]  =
-
 
256
    fb->pitches[2]  =
-
 
257
    fb->pitches[3]  = stride;
-
 
258
 
-
 
259
    main_fb_obj->stride  = stride;
-
 
260
 
-
 
261
    fb->bits_per_pixel = 32;
-
 
262
    fb->depth = 24;
-
 
263
 
-
 
264
    connector->encoder->crtc->enabled = true;
-
 
Line 265... Line 332...
265
 
332
 
266
    i915_gem_object_put_fence(main_fb_obj);
333
    crtc = connector->encoder->crtc;
267
 
334
 
268
    memcpy(con_edid, connector->edid_blob_ptr->data, 128);
335
    memcpy(con_edid, connector->edid_blob_ptr->data, 128);
269
    DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n"
336
    DRM_DEBUG_KMS("set mode %dx%d: crtc %d connector %s\n"
270
                  "monitor: %s model %x serial number %u\n",
337
                  "monitor: %s model %x serial number %u\n",
271
                fb->width, fb->height,
338
                mode->hdisplay, mode->vdisplay,
272
                connector->encoder->crtc->base.id, connector->name,
339
                connector->encoder->crtc->base.id, connector->name,
273
                manufacturer_name(con_edid + 0x08),
340
                manufacturer_name(con_edid + 0x08),
Line -... Line 341...
-
 
341
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
-
 
342
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
-
 
343
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
-
 
344
 
-
 
345
    drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
274
                (unsigned short)(con_edid[0x0A] + (con_edid[0x0B] << 8)),
346
 
275
                (unsigned int)(con_edid[0x0C] + (con_edid[0x0D] << 8)
347
    crtc->enabled = true;
Line 276... Line 348...
276
                + (con_edid[0x0E] << 16) + (con_edid[0x0F] << 24)));
348
    os_display->crtc = crtc;
277
 
349
 
278
    DRM_DEBUG_KMS("use framebuffer %p %dx%d pitch %d format %x\n",
350
    DRM_DEBUG_KMS("use framebuffer %p %dx%d pitch %d format %x\n",
279
            fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format);
351
            fb,fb->width,fb->height,fb->pitches[0],fb->pixel_format);
280
 
352
 
281
    set.crtc = connector->encoder->crtc;
353
    set.crtc = crtc;
282
    set.x = 0;
354
    set.x = 0;
Line 283... Line 355...
283
    set.y = 0;
355
    set.y = 0;
284
    set.mode = mode;
356
    set.mode = mode;
285
    set.connectors = &connector;
357
    set.connectors = &connector;
-
 
358
    set.num_connectors = 1;
286
    set.num_connectors = 1;
359
    set.fb = fb;
-
 
360
 
-
 
361
    ret = drm_mode_set_config_internal(&set);
Line 287... Line 362...
287
    set.fb = fb;
362
    if ( !ret )
288
 
363
    {
289
    ret = drm_mode_set_config_internal(&set);
364
        struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
290
    if ( !ret )
-
 
-
 
365
        struct kos_framebuffer *kfb = intel_fb->private;
291
    {
366
        kolibri_framebuffer_update(dev_priv, kfb);
Line 292... Line 367...
292
        struct drm_crtc *crtc = os_display->crtc;
367
        DRM_DEBUG_KMS("kolibri framebuffer %p\n", kfb);
293
 
368
 
294
        os_display->width    = fb->width;
369
        os_display->width    = mode->hdisplay;
Line 295... Line 370...
295
        os_display->height   = fb->height;
370
        os_display->height   = mode->vdisplay;
296
        os_display->vrefresh = drm_mode_vrefresh(mode);
371
        os_display->vrefresh = drm_mode_vrefresh(mode);
Line 297... Line 372...
297
 
372
        sysSetFramebuffer(intel_fb->private);
Line 298... Line 373...
298
        sysSetScreen(fb->width, fb->height, fb->pitches[0]);
373
        sysSetScreen(mode->hdisplay, mode->vdisplay, fb->pitches[0]);
299
 
374
 
300
        os_display->connector = connector;
375
        os_display->connector = connector;
301
        os_display->crtc = connector->encoder->crtc;
376
        os_display->crtc = connector->encoder->crtc;
302
        os_display->supported_modes = count_connector_modes(connector);
377
        os_display->supported_modes = count_connector_modes(connector);
303
 
378
 
Line -... Line 379...
-
 
379
        crtc->cursor_x = os_display->width/2;
304
        crtc->cursor_x = os_display->width/2;
380
        crtc->cursor_y = os_display->height/2;
305
        crtc->cursor_y = os_display->height/2;
-
 
306
 
381
 
307
        select_cursor_kms(os_display->cursor);
382
        os_display->select_cursor(os_display->cursor);
Line 308... Line 383...
308
 
383
 
309
        DRM_DEBUG_KMS("new mode %d x %d pitch %d\n",
384
        DRM_DEBUG_KMS("new mode %d x %d pitch %d\n",
Line 465... Line 540...
465
{
540
{
466
    struct drm_connector_helper_funcs *connector_funcs;
541
    struct drm_connector_helper_funcs *connector_funcs;
467
    struct drm_connector    *connector = NULL;
542
    struct drm_connector    *connector = NULL;
468
    struct drm_crtc         *crtc = NULL;
543
    struct drm_crtc         *crtc = NULL;
469
    struct drm_framebuffer  *fb;
544
    struct drm_plane *plane;
470
 
545
 
Line 471... Line -...
471
    cursor_t  *cursor;
-
 
472
    u32      ifl;
-
 
473
    int       ret;
546
    int       ret;
-
 
547
ENTER();
-
 
548
 
-
 
549
    drm_for_each_plane(plane, dev)
-
 
550
    {
-
 
551
        drm_plane_helper_disable(plane);
-
 
552
    };
Line 474... Line 553...
474
 
553
 
475
    mutex_lock(&dev->mode_config.mutex);
554
    mutex_lock(&dev->mode_config.mutex);
476
    ret = choose_config(dev, &connector, &crtc);
555
    ret = choose_config(dev, &connector, &crtc);
477
    if(ret)
556
    if(ret)
478
    {
557
    {
479
        mutex_unlock(&dev->mode_config.mutex);
558
        mutex_unlock(&dev->mode_config.mutex);
480
        DRM_DEBUG_KMS("No active connectors!\n");
559
        DRM_DEBUG_KMS("No active connectors!\n");
481
        return -1;
560
        return -1;
Line -... Line 561...
-
 
561
    };
482
    };
562
 
483
 
563
/*
484
    mutex_lock(&dev->object_name_lock);
-
 
485
    idr_preload(GFP_KERNEL);
564
    mutex_lock(&dev->object_name_lock);
486
 
565
    idr_preload(GFP_KERNEL);
Line 487... Line 566...
487
    if (!main_fb_obj->base.name) {
566
    if (!main_fb_obj->base.name) {
488
        ret = idr_alloc(&dev->object_name_idr, &main_fb_obj->base, 1, 0, GFP_NOWAIT);
567
        ret = idr_alloc(&dev->object_name_idr, &main_fb_obj->base, 1, 0, GFP_NOWAIT);
489
 
568
 
490
        main_fb_obj->base.name = ret;
569
        main_fb_obj->base.name = ret;
491
        main_fb_obj->base.handle_count++;
-
 
492
        DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, main_fb_obj->base.name );
570
        main_fb_obj->base.handle_count++;
493
    }
571
        DRM_DEBUG_KMS("%s allocate fb name %d\n", __FUNCTION__, main_fb_obj->base.name );
-
 
572
    }
-
 
573
    idr_preload_end();
Line 494... Line 574...
494
 
574
    mutex_unlock(&dev->object_name_lock);
495
    idr_preload_end();
575
*/
496
    mutex_unlock(&dev->object_name_lock);
576
    dummy_fb_page = AllocPage();
497
 
577
 
498
    os_display = GetDisplay();
578
    os_display = GetDisplay();
499
    os_display->ddev = dev;
579
    os_display->ddev = dev;
Line 500... Line 580...
500
    os_display->connector = connector;
580
    os_display->connector = connector;
501
    os_display->crtc = crtc;
-
 
502
    os_display->supported_modes = count_connector_modes(connector);
-
 
503
    mutex_unlock(&dev->mode_config.mutex);
-
 
504
 
-
 
505
    mutex_init(&cursor_lock);
-
 
506
    mutex_lock(&dev->struct_mutex);
-
 
507
 
-
 
508
    ifl = safe_cli();
-
 
509
    {
-
 
510
        list_for_each_entry(cursor, &os_display->cursors, list)
-
 
511
        {
-
 
512
            init_cursor(cursor);
-
 
513
        };
-
 
514
 
-
 
515
        os_display->restore_cursor(0,0);
-
 
516
        os_display->init_cursor    = init_cursor;
-
 
517
        os_display->select_cursor  = select_cursor_kms;
-
 
518
        os_display->show_cursor    = NULL;
-
 
519
        os_display->move_cursor    = move_cursor_kms;
-
 
520
        os_display->restore_cursor = restore_cursor;
-
 
521
        os_display->disable_mouse  = disable_mouse;
-
 
522
 
-
 
523
        crtc->cursor_x = os_display->width/2;
-
 
524
        crtc->cursor_y = os_display->height/2;
-
 
525
 
-
 
Line 526... Line 581...
526
        select_cursor_kms(os_display->cursor);
581
    os_display->crtc = crtc;
Line 527... Line 582...
527
    };
582
    os_display->supported_modes = count_connector_modes(connector);
528
    safe_sti(ifl);
583
    mutex_unlock(&dev->mode_config.mutex);
Line 555... Line 610...
555
 
610
 
Line 556... Line 611...
556
        set_mode(dev, os_display->connector, os_display->crtc, usermode, false);
611
        set_mode(dev, os_display->connector, os_display->crtc, usermode, false);
557
    };
612
    };
Line 558... Line -...
558
 
-
 
559
#ifdef __HWA__
-
 
560
    err = init_bitmaps();
613
 
Line 561... Line 614...
561
#endif
614
LEAVE();
562
 
615
 
Line 743... Line 796...
743
 
796
 
Line 744... Line 797...
744
    f->dpms(os_display->connector, mode);
797
    f->dpms(os_display->connector, mode);
745
};
798
};
Line 746... Line -...
746
 
-
 
747
void __attribute__((regparm(1))) destroy_cursor(cursor_t *cursor)
-
 
748
{
-
 
749
    struct drm_i915_gem_object *obj = cursor->cobj;
-
 
750
    list_del(&cursor->list);
-
 
751
 
-
 
752
    i915_gem_object_ggtt_unpin(cursor->cobj);
-
 
753
 
-
 
754
    mutex_lock(&main_device->struct_mutex);
-
 
755
    drm_gem_object_unreference(&obj->base);
-
 
756
    mutex_unlock(&main_device->struct_mutex);
-
 
757
 
-
 
758
    __DestroyObject(cursor);
-
 
Line 759... Line 799...
759
};
799
 
760
 
800
 
761
int init_cursor(cursor_t *cursor)
-
 
762
{
-
 
763
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
801
int i915_fbinfo(struct drm_i915_fb_info *fb)
764
    struct drm_i915_gem_object *obj;
-
 
765
    uint32_t *bits;
-
 
766
    uint32_t *src;
-
 
767
    void     *mapped;
-
 
768
 
-
 
769
    int       i,j;
-
 
770
    int       ret;
-
 
771
 
-
 
772
    if (dev_priv->info.cursor_needs_physical)
-
 
773
    {
-
 
774
        bits = (uint32_t*)KernelAlloc(KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*8);
-
 
775
        if (unlikely(bits == NULL))
-
 
776
            return ENOMEM;
-
 
777
        cursor->cobj = (struct drm_i915_gem_object *)GetPgAddr(bits);
-
 
778
    }
-
 
779
    else
-
 
780
    {
-
 
781
        obj = i915_gem_alloc_object(os_display->ddev, KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4);
-
 
782
        if (unlikely(obj == NULL))
-
 
783
            return -ENOMEM;
-
 
784
 
-
 
785
        ret = i915_gem_object_ggtt_pin(obj, &i915_ggtt_view_normal, 128*1024, PIN_GLOBAL);
-
 
786
        if (ret) {
-
 
787
            drm_gem_object_unreference(&obj->base);
-
 
788
            return ret;
-
 
789
        }
-
 
790
 
-
 
791
        ret = i915_gem_object_set_to_gtt_domain(obj, true);
-
 
792
        if (ret)
-
 
793
        {
-
 
794
            i915_gem_object_ggtt_unpin(obj);
-
 
795
            drm_gem_object_unreference(&obj->base);
-
 
796
            return ret;
-
 
797
        }
-
 
Line 798... Line -...
798
/* You don't need to worry about fragmentation issues.
-
 
799
 * GTT space is continuous. I guarantee it.                           */
-
 
800
 
-
 
801
        mapped = bits = (u32*)MapIoMem(dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(obj),
-
 
802
                    KMS_CURSOR_WIDTH*KMS_CURSOR_HEIGHT*4, PG_SW);
-
 
803
 
-
 
804
        if (unlikely(bits == NULL))
-
 
805
        {
-
 
806
            i915_gem_object_ggtt_unpin(obj);
-
 
807
            drm_gem_object_unreference(&obj->base);
-
 
808
            return -ENOMEM;
-
 
809
        };
-
 
810
        cursor->cobj = obj;
802
{
811
    };
-
 
812
 
-
 
813
    src = cursor->data;
803
    u32 ifl;
-
 
804
 
-
 
805
    ifl = safe_cli();
-
 
806
    {
-
 
807
        struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
-
 
808
        struct intel_crtc *crtc = to_intel_crtc(os_display->crtc);
-
 
809
        struct kos_framebuffer *kfb = os_display->current_lfb;
814
 
810
        struct intel_framebuffer *intel_fb = (struct intel_framebuffer*)kfb->private;
-
 
811
        struct drm_i915_gem_object *obj = intel_fb->obj;
-
 
812
 
815
    for(i = 0; i < 32; i++)
813
        fb->name   = obj->base.name;
816
    {
814
        fb->width  = os_display->width;
-
 
815
        fb->height = os_display->height;
817
        for(j = 0; j < 32; j++)
816
        fb->pitch  = obj->stride;
818
            *bits++ = *src++;
817
        fb->tiling = obj->tiling_mode;
819
        for(j = 32; j < KMS_CURSOR_WIDTH; j++)
-
 
820
            *bits++ = 0;
818
        fb->crtc   = crtc->base.base.id;
821
    }
-
 
822
    for(i = 0; i < KMS_CURSOR_WIDTH*(KMS_CURSOR_HEIGHT-32); i++)
-
 
823
        *bits++ = 0;
-
 
824
 
-
 
825
    FreeKernelSpace(mapped);
-
 
826
 
-
 
827
    KernelFree(cursor->data);
-
 
828
 
-
 
829
    cursor->data = bits;
-
 
830
 
819
        fb->pipe   = crtc->pipe;
831
    cursor->header.destroy = destroy_cursor;
820
    }
Line 832... Line 821...
832
 
821
    safe_sti(ifl);
833
    return 0;
822
    return 0;
834
}
823
}
-
 
824
 
835
 
825
 
-
 
826
int kolibri_framebuffer_init(struct intel_framebuffer *intel_fb)
836
 
827
{
837
void __stdcall move_cursor_kms(cursor_t *cursor, int x, int y)
828
    struct kos_framebuffer *kfb;
838
{
829
    addr_t dummy_table;
Line 839... Line 830...
839
    struct drm_crtc *crtc = os_display->crtc;
830
    addr_t *pt_addr = NULL;
-
 
831
    int pde;
840
    struct drm_plane_state *cursor_state = crtc->cursor->state;
832
ENTER();
-
 
833
    kfb = kzalloc(sizeof(struct kos_framebuffer),0);
Line -... Line 834...
-
 
834
    kfb->private = intel_fb;
841
 
835
 
842
    x-= cursor->hot_x;
836
    for(pde = 0; pde < 8; pde++)
-
 
837
    {
Line -... Line 838...
-
 
838
        dummy_table = AllocPage();
-
 
839
        kfb->pde[pde] = dummy_table|PG_UW;
-
 
840
 
-
 
841
        pt_addr = kmap((struct page*)dummy_table);
-
 
842
        __builtin_memset(pt_addr,0,4096);
-
 
843
        kunmap((struct page*)dummy_table);
-
 
844
    };
-
 
845
 
-
 
846
    intel_fb->private = kfb;
-
 
847
LEAVE();
-
 
848
    return 0;
-
 
849
#if 0
-
 
850
    struct sg_page_iter sg_iter;
-
 
851
    num_pages = obj->base.size/4096;
-
 
852
    printf("num_pages %d\n",num_pages);
-
 
853
 
-
 
854
    pte = 0;
-
 
855
    pde = 0;
-
 
856
    pt_addr = NULL;
-
 
857
 
-
 
858
    __sg_page_iter_start(&sg_iter, obj->pages->sgl, sg_nents(obj->pages->sgl), 0);
-
 
859
    while (__sg_page_iter_next(&sg_iter))
-
 
860
    {
-
 
861
        if (pt_addr == NULL)
-
 
862
    {
-
 
863
            addr_t pt = AllocPage();
-
 
864
            kfb->pde[pde] = pt|PG_UW;
843
    y-= cursor->hot_y;
865
            pde++;
-
 
866
            pt_addr = kmap_atomic((struct page*)pt);
-
 
867
    }
-
 
868
        pt_addr[pte] = sg_page_iter_dma_address(&sg_iter)|PG_UW|PG_WRITEC;
-
 
869
        if( (pte & 15) == 0)
-
 
870
            DRM_DEBUG_KMS("pte %x\n",pt_addr[pte]);
-
 
871
        if (++pte == 1024)
Line -... Line 872...
-
 
872
    {
-
 
873
            kunmap_atomic(pt_addr);
-
 
874
            pt_addr = NULL;
-
 
875
            if (pde == 8)
-
 
876
                break;
-
 
877
            pte = 0;
-
 
878
        }
844
 
879
        }
Line 845... Line 880...
845
	crtc->cursor_x = x;
880
 
846
	crtc->cursor_y = y;
881
    if(pt_addr)
847
 
882
        {
848
    cursor_state->crtc_x = x;
883
        for(;pte < 1024; pte++)
849
    cursor_state->crtc_y = y;
884
            pt_addr[pte] = dummy_page|PG_UW;
850
 
-
 
-
 
885
        kunmap_atomic(pt_addr);
-
 
886
        }
851
	intel_crtc_update_cursor(crtc, 1);
887
#endif
852
 
888
};
853
};
889
 
-
 
890
void kolibri_framebuffer_update(struct drm_i915_private *dev_priv, struct kos_framebuffer *kfb)
854
 
891
{
855
cursor_t* __stdcall select_cursor_kms(cursor_t *cursor)
892
    struct intel_framebuffer *intel_fb = kfb->private;
856
{
893
    addr_t *pt_addr = NULL;
857
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
894
    int pte = 0;
858
    struct drm_crtc   *crtc = os_display->crtc;
895
    int pde = 0;
859
    struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
896
    int num_pages;
-
 
897
    addr_t pfn;
860
 
898
ENTER();
861
    cursor_t *old;
899
    num_pages = intel_fb->obj->base.size/4096;
862
 
900
    pfn = dev_priv->gtt.mappable_base + i915_gem_obj_ggtt_offset(intel_fb->obj);
-
 
901
 
-
 
902
    while(num_pages)
-
 
903
        {
863
    old = os_display->cursor;
904
        if (pt_addr == NULL)
864
 
905
        {
865
    mutex_lock(&cursor_lock);
906
            addr_t pt = kfb->pde[pde] & 0xFFFFF000;
866
 
907
            pde++;
867
    os_display->cursor = cursor;
908
            pt_addr = kmap_atomic((struct page*)pt);
-
 
909
        }
-
 
910
        pt_addr[pte] = pfn|PG_UW|PG_WRITEC;
-
 
911
        pfn+= 4096;
Line -... Line 912...
-
 
912
        num_pages--;
-
 
913
        if (++pte == 1024)
-
 
914
        {
868
 
915
            kunmap_atomic(pt_addr);
-
 
916
            pt_addr = NULL;
869
    if (!dev_priv->info.cursor_needs_physical)
917
            if (pde == 8)
-
 
918
                break;
870
       intel_crtc->cursor_addr = i915_gem_obj_ggtt_offset(cursor->cobj);
919
            pte = 0;
Line 871... Line -...
871
    else
-
 
872
        intel_crtc->cursor_addr = (addr_t)cursor->cobj;
-
 
873
 
-
 
874
	intel_crtc->base.cursor->state->crtc_w = 64;
-
 
875
	intel_crtc->base.cursor->state->crtc_h = 64;
-
 
876
    intel_crtc->base.cursor->state->rotation = 0;
-
 
877
    mutex_unlock(&cursor_lock);
-
 
878
 
-
 
879
    move_cursor_kms(cursor, crtc->cursor_x, crtc->cursor_y);
-
 
880
    return old;
-
 
881
};
-
 
882
 
-
 
883
int i915_fbinfo(struct drm_i915_fb_info *fb)
-
 
884
{
-
 
885
    struct drm_i915_private *dev_priv = os_display->ddev->dev_private;
-
 
886
    struct intel_crtc *crtc = to_intel_crtc(os_display->crtc);
-
 
887
    struct drm_i915_gem_object *obj = get_fb_obj();
-
 
888
 
-
 
889
    fb->name   = obj->base.name;
920
        }
890
    fb->width  = os_display->width;
921
    }
891
    fb->height = os_display->height;
922
 
892
    fb->pitch  = obj->stride;
923
    if(pt_addr)
893
    fb->tiling = obj->tiling_mode;
924
    {