2 * Copyright (C) 2008 Maarten Maathuis.
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:
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.
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.
27 #include "nv50_kms_wrapper.h"
28 #include "drm_crtc_helper.h" /* be careful what you use from this */
30 /* This file serves as the interface between the common kernel modesetting code and the device dependent implementation. */
33 * Get private functions.
36 struct nv50_kms_priv *nv50_get_kms_priv(struct drm_device *dev)
38 struct drm_nouveau_private *dev_priv = dev->dev_private;
39 return dev_priv->kms_priv;
43 * Allocation functions.
46 static void *nv50_kms_alloc_crtc(struct drm_device *dev)
48 struct nv50_kms_priv *kms_priv = nv50_get_kms_priv(dev);
49 struct nv50_kms_crtc *crtc = kzalloc(sizeof(struct nv50_kms_crtc), GFP_KERNEL);
54 list_add_tail(&crtc->item, &kms_priv->crtcs);
59 static void *nv50_kms_alloc_output(struct drm_device *dev)
61 struct nv50_kms_priv *kms_priv = nv50_get_kms_priv(dev);
62 struct nv50_kms_encoder *encoder = kzalloc(sizeof(struct nv50_kms_encoder), GFP_KERNEL);
67 list_add_tail(&encoder->item, &kms_priv->encoders);
69 return &(encoder->priv);
72 static void *nv50_kms_alloc_connector(struct drm_device *dev)
74 struct nv50_kms_priv *kms_priv = nv50_get_kms_priv(dev);
75 struct nv50_kms_connector *connector = kzalloc(sizeof(struct nv50_kms_connector), GFP_KERNEL);
80 list_add_tail(&connector->item, &kms_priv->connectors);
82 return &(connector->priv);
85 static void nv50_kms_free_crtc(void *crtc)
87 struct nv50_kms_crtc *kms_crtc = from_nv50_crtc(crtc);
89 list_del(&kms_crtc->item);
94 static void nv50_kms_free_output(void *output)
96 struct nv50_kms_encoder *kms_encoder = from_nv50_output(output);
98 list_del(&kms_encoder->item);
103 static void nv50_kms_free_connector(void *connector)
105 struct nv50_kms_connector *kms_connector = from_nv50_connector(connector);
107 list_del(&kms_connector->item);
109 kfree(kms_connector);
113 * Mode conversion functions.
116 static struct nouveau_hw_mode *nv50_kms_to_hw_mode(struct drm_display_mode *mode)
118 struct nouveau_hw_mode *hw_mode = kzalloc(sizeof(struct nouveau_hw_mode), GFP_KERNEL);
122 /* create hw values. */
123 hw_mode->clock = mode->clock;
124 hw_mode->flags = hw_mode->flags;
126 hw_mode->hdisplay = mode->hdisplay;
127 hw_mode->hsync_start = mode->hsync_start;
128 hw_mode->hsync_end = mode->hsync_end;
129 hw_mode->htotal = mode->htotal;
131 hw_mode->hblank_start = mode->hdisplay + 1;
132 hw_mode->hblank_end = mode->htotal;
134 hw_mode->vdisplay = mode->vdisplay;
135 hw_mode->vsync_start = mode->vsync_start;
136 hw_mode->vsync_end = mode->vsync_end;
137 hw_mode->vtotal = mode->vtotal;
139 hw_mode->vblank_start = mode->vdisplay + 1;
140 hw_mode->vblank_end = mode->vtotal;
146 * State mirroring functions.
149 static void nv50_kms_mirror_routing(struct drm_device *dev)
151 struct nv50_display *display = nv50_get_display(dev);
152 struct nv50_crtc *crtc = NULL;
153 struct nv50_output *output = NULL;
154 struct nv50_connector *connector = NULL;
155 struct drm_connector *drm_connector = NULL;
157 /* Wipe all previous connections. */
158 list_for_each_entry(connector, &display->connectors, head) {
159 connector->output = NULL;
162 list_for_each_entry(output, &display->outputs, head) {
166 list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
167 if (drm_connector->encoder) {
168 output = to_nv50_output(drm_connector->encoder);
169 connector = to_nv50_connector(drm_connector);
171 /* hook up output to connector. */
172 connector->output = output;
174 if (drm_connector->encoder->crtc) {
175 crtc = to_nv50_crtc(drm_connector->encoder->crtc);
177 /* hook up output to crtc. */
188 static void nv50_kms_framebuffer_destroy(struct drm_framebuffer *drm_framebuffer)
190 drm_framebuffer_cleanup(drm_framebuffer);
192 kfree(drm_framebuffer);
195 static const struct drm_framebuffer_funcs nv50_kms_fb_funcs = {
196 .destroy = nv50_kms_framebuffer_destroy,
200 * Mode config functions.
203 static struct drm_framebuffer *nv50_kms_framebuffer_create(struct drm_device *dev,
204 struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd)
206 struct drm_framebuffer *drm_framebuffer = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
207 if (!drm_framebuffer)
210 drm_framebuffer_init(dev, drm_framebuffer, &nv50_kms_fb_funcs);
211 drm_helper_mode_fill_fb_struct(drm_framebuffer, mode_cmd);
213 return drm_framebuffer;
216 static int nv50_kms_fb_changed(struct drm_device *dev)
218 return 0; /* not needed until nouveaufb? */
221 static const struct drm_mode_config_funcs nv50_kms_mode_funcs = {
223 .fb_create = nv50_kms_framebuffer_create,
224 .fb_changed = nv50_kms_fb_changed,
231 static int nv50_kms_crtc_cursor_set(struct drm_crtc *drm_crtc, uint32_t buffer_handle,
232 uint32_t width, uint32_t height)
234 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
235 struct nv50_display *display = nv50_get_display(crtc->dev);
238 if (width != 64 || height != 64)
241 /* set bo before doing show cursor */
243 rval = crtc->cursor->set_bo(crtc, (drm_handle_t) buffer_handle);
248 crtc->cursor->visible = buffer_handle ? true : false;
251 rval = crtc->cursor->show(crtc);
254 } else { /* no handle implies hiding the cursor */
255 rval = crtc->cursor->hide(crtc);
263 /* in case this triggers any other cursor changes */
264 display->update(display);
269 static int nv50_kms_crtc_cursor_move(struct drm_crtc *drm_crtc, int x, int y)
271 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
273 return crtc->cursor->set_pos(crtc, x, y);
276 void nv50_kms_crtc_gamma_set(struct drm_crtc *drm_crtc, u16 *r, u16 *g, u16 *b,
279 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
284 crtc->lut->set(crtc, (uint16_t *)r, (uint16_t *)g, (uint16_t *)b);
287 int nv50_kms_crtc_set_config(struct drm_mode_set *set)
290 uint32_t crtc_mask = 0;
291 struct drm_device *dev = NULL;
292 struct drm_nouveau_private *dev_priv = NULL;
293 struct nv50_display *display = NULL;
294 struct drm_connector *drm_connector = NULL;
295 struct drm_encoder *drm_encoder = NULL;
296 struct drm_crtc *drm_crtc = NULL;
298 struct nv50_crtc *crtc = NULL;
299 struct nv50_output *output = NULL;
300 struct nv50_connector *connector = NULL;
301 struct nouveau_hw_mode *hw_mode = NULL;
302 struct nv50_fb_info fb_info;
305 bool switch_fb = false;
306 bool modeset = false;
311 * Supported operations:
313 * - Switch framebuffer.
317 /* Sanity checking */
319 DRM_ERROR("Sanity check failed\n");
324 DRM_ERROR("Sanity check failed\n");
330 if (!drm_mode_equal(set->mode, &set->crtc->mode))
333 if (set->fb != set->crtc->fb)
336 if (set->x != set->crtc->x || set->y != set->crtc->y)
343 if (!set->connectors && modeset) {
344 DRM_ERROR("Sanity check failed\n");
348 if (!modeset && !switch_fb && !blank) {
349 DRM_ERROR("There is nothing to do, bad input.\n");
353 /* Basic variable setting */
354 dev = set->crtc->dev;
355 dev_priv = dev->dev_private;
356 display = nv50_get_display(dev);
357 crtc = to_nv50_crtc(set->crtc);
360 * Wiring up the encoders and connectors.
364 /* Mode validation */
365 hw_mode = nv50_kms_to_hw_mode(set->mode);
367 rval = crtc->validate_mode(crtc, hw_mode);
369 if (rval != MODE_OK) {
370 DRM_ERROR("Mode not ok\n");
374 for (i = 0; i < set->num_connectors; i++) {
375 drm_connector = set->connectors[i];
376 if (!drm_connector) {
377 DRM_ERROR("No connector\n");
380 connector = to_nv50_connector(drm_connector);
382 output = connector->to_output(connector, connector->digital);
384 DRM_ERROR("No output\n");
388 rval = output->validate_mode(output, hw_mode);
389 if (rval != MODE_OK) {
390 DRM_ERROR("Mode not ok\n");
395 /* Validation done, move on to cleaning of existing structures. */
397 /* find encoders that use this crtc. */
398 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
399 if (drm_encoder->crtc == set->crtc) {
400 /* find the connector that goes with it */
401 list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
402 if (drm_connector->encoder == drm_encoder) {
403 drm_connector->encoder = NULL;
407 drm_encoder->crtc = NULL;
411 /* now find if our desired encoders or connectors are in use already. */
412 for (i = 0; i < set->num_connectors; i++) {
413 drm_connector = set->connectors[i];
414 if (!drm_connector) {
415 DRM_ERROR("No connector\n");
419 if (!drm_connector->encoder)
422 drm_encoder = drm_connector->encoder;
423 drm_connector->encoder = NULL;
425 if (!drm_encoder->crtc)
428 drm_crtc = drm_encoder->crtc;
429 drm_encoder->crtc = NULL;
431 crtc = to_nv50_crtc(drm_crtc);
432 crtc->active = false;
433 drm_crtc->enabled = false;
436 /* Time to wire up the public encoder, the private one will be handled later. */
437 for (i = 0; i < set->num_connectors; i++) {
438 drm_connector = set->connectors[i];
439 if (!drm_connector) {
440 DRM_ERROR("No connector\n");
444 output = connector->to_output(connector, connector->digital);
446 DRM_ERROR("No output\n");
450 /* find the encoder public structure that matches out output structure. */
451 drm_encoder = to_nv50_kms_encoder(output);
454 DRM_ERROR("No encoder\n");
458 drm_encoder->crtc = set->crtc;
459 drm_connector->encoder = drm_encoder;
468 crtc = to_nv50_crtc(set->crtc);
470 /* keeping the encoders and connectors attached, so they can be tracked */
471 crtc->active = false;
472 set->crtc->enabled = false;
476 * All state should now be updated, now onto the real work.
479 /* mirror everything to the private structs */
480 nv50_kms_mirror_routing(dev);
487 crtc = to_nv50_crtc(set->crtc);
489 /* set framebuffer */
490 set->crtc->fb = set->fb;
492 /* set private framebuffer */
493 crtc = to_nv50_crtc(set->crtc);
494 fb_info.block = find_block_by_handle(dev_priv->fb_heap, set->fb->mm_handle);
495 fb_info.width = set->fb->width;
496 fb_info.height = set->fb->height;
497 fb_info.depth = set->fb->depth;
498 fb_info.bpp = set->fb->bits_per_pixel;
499 fb_info.pitch = set->fb->pitch;
503 rval = crtc->fb->bind(crtc, &fb_info);
505 DRM_ERROR("fb_bind failed\n");
510 /* this is !cursor_show */
511 if (!crtc->cursor->enabled) {
512 rval = crtc->cursor->enable(crtc);
514 DRM_ERROR("cursor_enable failed\n");
524 crtc = to_nv50_crtc(set->crtc);
526 rval = crtc->blank(crtc, TRUE);
528 DRM_ERROR("blanking failed\n");
532 /* detach any outputs that are currently running on this crtc */
533 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
534 if (drm_encoder->crtc == set->crtc) {
535 output = to_nv50_output(drm_encoder);
537 rval = output->execute_mode(output, TRUE);
539 DRM_ERROR("detaching output failed\n");
547 * Change framebuffer, without changing mode.
550 if (switch_fb && !modeset && !blank) {
551 crtc = to_nv50_crtc(set->crtc);
553 rval = crtc->blank(crtc, TRUE);
555 DRM_ERROR("blanking failed\n");
559 rval = crtc->set_fb(crtc);
561 DRM_ERROR("set_fb failed\n");
565 /* this also sets the fb offset */
566 rval = crtc->blank(crtc, FALSE);
568 DRM_ERROR("unblanking failed\n");
574 * Normal modesetting.
578 crtc = to_nv50_crtc(set->crtc);
580 /* disconnect unused outputs */
581 list_for_each_entry(output, &display->outputs, head) {
583 crtc_mask |= 1 << output->crtc->index;
585 rval = output->execute_mode(output, TRUE);
587 DRM_ERROR("detaching output failed\n");
593 /* blank any unused crtcs */
594 list_for_each_entry(crtc, &display->crtcs, head) {
595 if (!(crtc_mask & (1 << crtc->index)))
596 crtc->blank(crtc, TRUE);
599 crtc = to_nv50_crtc(set->crtc);
601 rval = crtc->set_mode(crtc, hw_mode);
603 DRM_ERROR("crtc mode set failed\n");
607 /* find native mode. */
608 list_for_each_entry(output, &display->outputs, head) {
609 if (output->crtc != crtc)
612 *crtc->native_mode = *output->native_mode;
613 list_for_each_entry(connector, &display->connectors, head) {
614 if (connector->output != output)
617 crtc->scaling_mode = connector->scaling_mode;
621 if (crtc->scaling_mode == SCALE_PANEL)
622 crtc->use_native_mode = false;
624 crtc->use_native_mode = true;
626 break; /* no use in finding more than one mode */
629 rval = crtc->execute_mode(crtc);
631 DRM_ERROR("crtc execute mode failed\n");
635 list_for_each_entry(output, &display->outputs, head) {
636 if (output->crtc != crtc)
639 rval = output->execute_mode(output, FALSE);
641 DRM_ERROR("output execute mode failed\n");
646 rval = crtc->set_scale(crtc);
648 DRM_ERROR("crtc set scale failed\n");
652 /* next line changes crtc, so putting it here is important */
653 display->last_crtc = crtc->index;
655 /* this is executed immediately */
656 list_for_each_entry(output, &display->outputs, head) {
657 if (output->crtc != crtc)
660 rval = output->set_power_mode(output, DPMSModeOn);
662 DRM_ERROR("output set power mode failed\n");
668 display->update(display);
683 static void nv50_kms_crtc_destroy(struct drm_crtc *drm_crtc)
685 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
687 drm_crtc_cleanup(drm_crtc);
689 /* this will even destroy the public structure. */
693 static const struct drm_crtc_funcs nv50_kms_crtc_funcs = {
696 .cursor_set = nv50_kms_crtc_cursor_set,
697 .cursor_move = nv50_kms_crtc_cursor_move,
698 .gamma_set = nv50_kms_crtc_gamma_set,
699 .set_config = nv50_kms_crtc_set_config,
700 .destroy = nv50_kms_crtc_destroy,
703 static int nv50_kms_crtcs_init(struct drm_device *dev)
705 struct nv50_display *display = nv50_get_display(dev);
706 struct nv50_crtc *crtc = NULL;
709 * This may look a bit confusing, but:
710 * The internal structure is already allocated and so is the public one.
711 * Just a matter of getting to the memory and register it.
713 list_for_each_entry(crtc, &display->crtcs, head) {
714 struct drm_crtc *drm_crtc = to_nv50_kms_crtc(crtc);
716 drm_crtc_init(dev, drm_crtc, &nv50_kms_crtc_funcs);
726 static void nv50_kms_encoder_destroy(struct drm_encoder *drm_encoder)
728 struct nv50_output *output = to_nv50_output(drm_encoder);
730 drm_encoder_cleanup(drm_encoder);
732 /* this will even destroy the public structure. */
733 output->destroy(output);
736 static const struct drm_encoder_funcs nv50_kms_encoder_funcs = {
737 .destroy = nv50_kms_encoder_destroy,
740 static int nv50_kms_encoders_init(struct drm_device *dev)
742 struct nv50_display *display = nv50_get_display(dev);
743 struct nv50_output *output = NULL;
745 list_for_each_entry(output, &display->outputs, head) {
746 struct drm_encoder *drm_encoder = to_nv50_kms_encoder(output);
747 uint32_t type = DRM_MODE_ENCODER_NONE;
749 switch (output->type) {
751 type = DRM_MODE_ENCODER_DAC;
754 type = DRM_MODE_ENCODER_TMDS;
757 type = DRM_MODE_ENCODER_LVDS;
760 type = DRM_MODE_ENCODER_TVDAC;
763 type = DRM_MODE_ENCODER_NONE;
767 if (type == DRM_MODE_ENCODER_NONE) {
768 DRM_ERROR("DRM_MODE_ENCODER_NONE encountered\n");
772 drm_encoder_init(dev, drm_encoder, &nv50_kms_encoder_funcs, type);
774 /* I've never seen possible crtc's restricted. */
775 drm_encoder->possible_crtcs = 3;
776 drm_encoder->possible_clones = 0;
783 * Connector functions
786 void nv50_kms_connector_detect_all(struct drm_device *dev)
788 struct drm_connector *drm_connector = NULL;
790 list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
791 drm_connector->funcs->detect(drm_connector);
795 static enum drm_connector_status nv50_kms_connector_detect(struct drm_connector *drm_connector)
797 struct nv50_connector *connector = to_nv50_connector(drm_connector);
798 struct drm_device *dev = drm_connector->dev;
802 connected = connector->detect(connector);
804 old_status = drm_connector->status;
807 drm_connector->status = connector_status_connected;
809 drm_connector->status = connector_status_disconnected;
811 /* update our modes whenever there is reason to */
812 if (old_status != drm_connector->status) {
813 drm_connector->funcs->fill_modes(drm_connector, 0, 0);
814 /* notify fb of changes */
815 dev->mode_config.funcs->fb_changed(dev);
818 return drm_connector->status;
821 static void nv50_kms_connector_destroy(struct drm_connector *drm_connector)
823 struct nv50_connector *connector = to_nv50_connector(drm_connector);
825 drm_sysfs_connector_remove(drm_connector);
826 drm_connector_cleanup(drm_connector);
828 /* this will even destroy the public structure. */
829 connector->destroy(connector);
833 * Detailed mode info for a standard 640x480@60Hz monitor
835 static struct drm_display_mode std_mode[] = {
836 /*{ DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 25200, 640, 656,
837 752, 800, 0, 480, 490, 492, 525, 0,
838 V_NHSYNC | V_NVSYNC) },*/ /* 640x480@60Hz */
839 { DRM_MODE("1280x1024", DRM_MODE_TYPE_DEFAULT, 135000, 1280, 1296,
840 1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
841 V_PHSYNC | V_PVSYNC) }, /* 1280x1024@75Hz */
844 static void nv50_kms_connector_fill_modes(struct drm_connector *drm_connector, uint32_t maxX, uint32_t maxY)
846 struct nv50_connector *connector = to_nv50_connector(drm_connector);
849 struct drm_display_mode *mode, *t;
850 struct edid *edid = NULL;
852 NV50_DEBUG("%s\n", drm_get_connector_name(drm_connector));
853 /* set all modes to the unverified state */
854 list_for_each_entry_safe(mode, t, &drm_connector->modes, head)
855 mode->status = MODE_UNVERIFIED;
857 connected = connector->detect(connector);
860 drm_connector->status = connector_status_connected;
862 drm_connector->status = connector_status_disconnected;
865 NV50_DEBUG("%s is disconnected\n", drm_get_connector_name(drm_connector));
866 /* TODO set EDID to NULL */
870 /* Not all connnectors have an i2c channel. */
871 if (connector->i2c_chan)
872 edid = (struct edid *) drm_do_probe_ddc_edid(&connector->i2c_chan->adapter);
875 drm_mode_connector_update_edid_property(drm_connector, edid);
876 ret = drm_add_edid_modes(drm_connector, edid);
877 connector->digital = edid->digital; /* cache */
881 if (ret) /* number of modes > 1 */
882 drm_mode_connector_list_update(drm_connector);
885 drm_mode_validate_size(drm_connector->dev, &drm_connector->modes, maxX, maxY, 0);
887 list_for_each_entry_safe(mode, t, &drm_connector->modes, head) {
888 if (mode->status == MODE_OK) {
889 struct nouveau_hw_mode *hw_mode = nv50_kms_to_hw_mode(mode);
890 struct nv50_output *output = connector->to_output(connector, connector->digital);
892 mode->status = output->validate_mode(output, hw_mode);
893 /* find native mode, TODO: also check if we actually found one */
894 if (mode->status == MODE_OK) {
895 if (mode->type & DRM_MODE_TYPE_PREFERRED)
896 *output->native_mode = *hw_mode;
902 /* revalidate now that we have native mode */
903 list_for_each_entry_safe(mode, t, &drm_connector->modes, head) {
904 if (mode->status == MODE_OK) {
905 struct nouveau_hw_mode *hw_mode = nv50_kms_to_hw_mode(mode);
906 struct nv50_output *output = connector->to_output(connector, connector->digital);
908 mode->status = output->validate_mode(output, hw_mode);
913 drm_mode_prune_invalid(drm_connector->dev, &drm_connector->modes, TRUE);
915 if (list_empty(&drm_connector->modes)) {
916 struct drm_display_mode *stdmode;
917 struct nouveau_hw_mode *hw_mode;
918 struct nv50_output *output;
920 NV50_DEBUG("No valid modes on %s\n", drm_get_connector_name(drm_connector));
922 /* Should we do this here ???
923 * When no valid EDID modes are available we end up
924 * here and bailed in the past, now we add a standard
925 * 640x480@60Hz mode and carry on.
927 stdmode = drm_mode_duplicate(drm_connector->dev, &std_mode[0]);
928 drm_mode_probed_add(drm_connector, stdmode);
929 drm_mode_list_concat(&drm_connector->probed_modes,
930 &drm_connector->modes);
932 /* also add it as native mode */
933 hw_mode = nv50_kms_to_hw_mode(mode);
934 output = connector->to_output(connector, connector->digital);
937 *output->native_mode = *hw_mode;
939 DRM_DEBUG("Adding standard 640x480 @ 60Hz to %s\n",
940 drm_get_connector_name(drm_connector));
943 drm_mode_sort(&drm_connector->modes);
945 NV50_DEBUG("Probed modes for %s\n", drm_get_connector_name(drm_connector));
947 list_for_each_entry_safe(mode, t, &drm_connector->modes, head) {
948 mode->vrefresh = drm_mode_vrefresh(mode);
950 /* is this needed, as it's unused by the driver? */
951 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
952 drm_mode_debug_printmodeline(mode);
956 static bool nv50_kms_connector_set_property(struct drm_connector *connector,
957 struct drm_property *property,
960 struct drm_device *dev = connector->dev;
962 if (property == dev->mode_config.dpms_property && connector->encoder) {
963 struct nv50_output *output = to_nv50_output(connector->encoder);
965 if (!output->set_power_mode(output, (int) value))
974 static const struct drm_connector_funcs nv50_kms_connector_funcs = {
977 .detect = nv50_kms_connector_detect,
978 .destroy = nv50_kms_connector_destroy,
979 .fill_modes = nv50_kms_connector_fill_modes,
980 .set_property = nv50_kms_connector_set_property
983 static int nv50_kms_connectors_init(struct drm_device *dev)
985 struct nv50_display *display = nv50_get_display(dev);
986 struct nv50_connector *connector = NULL;
989 list_for_each_entry(connector, &display->connectors, head) {
990 struct drm_connector *drm_connector = to_nv50_kms_connector(connector);
991 uint32_t type = DRM_MODE_CONNECTOR_Unknown;
993 switch (connector->type) {
995 type = DRM_MODE_CONNECTOR_VGA;
997 case CONNECTOR_DVI_D:
998 type = DRM_MODE_CONNECTOR_DVID;
1000 case CONNECTOR_DVI_I:
1001 type = DRM_MODE_CONNECTOR_DVII;
1003 case CONNECTOR_LVDS:
1004 type = DRM_MODE_CONNECTOR_LVDS;
1007 type = DRM_MODE_CONNECTOR_SVIDEO;
1010 type = DRM_MODE_CONNECTOR_Unknown;
1014 if (type == DRM_MODE_CONNECTOR_Unknown) {
1015 DRM_ERROR("DRM_MODE_CONNECTOR_Unknown encountered\n");
1019 /* It should be allowed sometimes, but let's be safe for the moment. */
1020 drm_connector->interlace_allowed = false;
1021 drm_connector->doublescan_allowed = false;
1023 drm_connector_init(dev, drm_connector, &nv50_kms_connector_funcs, type);
1025 /* attach encoders, possibilities are analog + digital */
1026 for (i = 0; i < 2; i++) {
1027 struct drm_encoder *drm_encoder = NULL;
1028 struct nv50_output *output = connector->to_output(connector, i);
1032 drm_encoder = to_nv50_kms_encoder(output);
1034 DRM_ERROR("No struct drm_connector to match struct nv50_output\n");
1038 drm_mode_connector_attach_encoder(drm_connector, drm_encoder);
1041 drm_sysfs_connector_add(drm_connector);
1051 int nv50_kms_init(struct drm_device *dev)
1053 struct drm_nouveau_private *dev_priv = dev->dev_private;
1054 struct nv50_kms_priv *kms_priv = kzalloc(sizeof(struct nv50_kms_priv), GFP_KERNEL);
1055 struct nv50_display *display = NULL;
1061 dev_priv->kms_priv = kms_priv;
1063 /* function pointers */
1064 /* an allocation interface that deals with the outside world, without polluting the core. */
1065 dev_priv->alloc_crtc = nv50_kms_alloc_crtc;
1066 dev_priv->alloc_output = nv50_kms_alloc_output;
1067 dev_priv->alloc_connector = nv50_kms_alloc_connector;
1069 dev_priv->free_crtc = nv50_kms_free_crtc;
1070 dev_priv->free_output = nv50_kms_free_output;
1071 dev_priv->free_connector = nv50_kms_free_connector;
1073 /* bios is needed for tables. */
1074 rval = nouveau_parse_bios(dev);
1078 /* init basic kernel modesetting */
1079 drm_mode_config_init(dev);
1081 dev->mode_config.min_width = 0;
1082 dev->mode_config.min_height = 0;
1084 dev->mode_config.funcs = (void *)&nv50_kms_mode_funcs;
1086 dev->mode_config.max_width = 8192;
1087 dev->mode_config.max_height = 8192;
1089 dev->mode_config.fb_base = dev_priv->fb_phys;
1091 /* init kms lists */
1092 INIT_LIST_HEAD(&kms_priv->crtcs);
1093 INIT_LIST_HEAD(&kms_priv->encoders);
1094 INIT_LIST_HEAD(&kms_priv->connectors);
1096 /* init the internal core, must be done first. */
1097 rval = nv50_display_create(dev);
1101 display = nv50_get_display(dev);
1108 rval = display->pre_init(display);
1112 /* init external layer */
1113 rval = nv50_kms_crtcs_init(dev);
1117 rval = nv50_kms_encoders_init(dev);
1121 rval = nv50_kms_connectors_init(dev);
1125 /* init now, this'll kill the textmode */
1126 rval = display->init(display);
1130 /* process cmdbuffer */
1131 display->update(display);
1137 dev_priv->kms_priv = NULL;
1142 int nv50_kms_destroy(struct drm_device *dev)
1144 drm_mode_config_cleanup(dev);