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;
156 struct drm_crtc *drm_crtc = NULL;
158 /* Wipe all previous connections. */
159 list_for_each_entry(connector, &display->connectors, item) {
160 connector->output = NULL;
163 list_for_each_entry(output, &display->outputs, item) {
167 list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
168 if (drm_connector->encoder) {
169 output = to_nv50_output(drm_connector->encoder);
170 connector = to_nv50_connector(drm_connector);
172 /* hook up output to connector. */
173 connector->output = output;
175 if (drm_connector->encoder->crtc) {
176 crtc = to_nv50_crtc(drm_connector->encoder->crtc);
178 /* hook up output to crtc. */
184 /* mirror crtc active state */
185 list_for_each_entry(drm_crtc, &dev->mode_config.crtc_list, head) {
186 crtc = to_nv50_crtc(drm_crtc);
188 crtc->enabled = drm_crtc->enabled;
196 static void nv50_kms_framebuffer_destroy(struct drm_framebuffer *drm_framebuffer)
198 drm_framebuffer_cleanup(drm_framebuffer);
200 kfree(drm_framebuffer);
203 static const struct drm_framebuffer_funcs nv50_kms_fb_funcs = {
204 .destroy = nv50_kms_framebuffer_destroy,
208 * Mode config functions.
211 static struct drm_framebuffer *nv50_kms_framebuffer_create(struct drm_device *dev,
212 struct drm_file *file_priv, struct drm_mode_fb_cmd *mode_cmd)
214 struct drm_framebuffer *drm_framebuffer = kzalloc(sizeof(struct drm_framebuffer), GFP_KERNEL);
215 if (!drm_framebuffer)
218 drm_framebuffer_init(dev, drm_framebuffer, &nv50_kms_fb_funcs);
219 drm_helper_mode_fill_fb_struct(drm_framebuffer, mode_cmd);
221 return drm_framebuffer;
224 static int nv50_kms_fb_changed(struct drm_device *dev)
226 return 0; /* not needed until nouveaufb? */
229 static const struct drm_mode_config_funcs nv50_kms_mode_funcs = {
231 .fb_create = nv50_kms_framebuffer_create,
232 .fb_changed = nv50_kms_fb_changed,
239 static int nv50_kms_crtc_cursor_set(struct drm_crtc *drm_crtc,
240 struct drm_file *file_priv,
241 uint32_t buffer_handle,
242 uint32_t width, uint32_t height)
244 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
245 struct nv50_display *display = nv50_get_display(crtc->dev);
248 if (width != 64 || height != 64)
251 /* set bo before doing show cursor */
253 rval = crtc->cursor->set_bo(crtc, (drm_handle_t) buffer_handle);
258 crtc->cursor->visible = buffer_handle ? true : false;
261 rval = crtc->cursor->show(crtc);
264 } else { /* no handle implies hiding the cursor */
265 rval = crtc->cursor->hide(crtc);
273 /* in case this triggers any other cursor changes */
274 display->update(display);
279 static int nv50_kms_crtc_cursor_move(struct drm_crtc *drm_crtc, int x, int y)
281 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
283 return crtc->cursor->set_pos(crtc, x, y);
286 void nv50_kms_crtc_gamma_set(struct drm_crtc *drm_crtc, u16 *r, u16 *g, u16 *b,
289 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
294 crtc->lut->set(crtc, (uint16_t *)r, (uint16_t *)g, (uint16_t *)b);
297 int nv50_kms_crtc_set_config(struct drm_mode_set *set)
300 uint32_t crtc_mask = 0;
301 struct drm_device *dev = NULL;
302 struct drm_nouveau_private *dev_priv = NULL;
303 struct nv50_display *display = NULL;
304 struct drm_connector *drm_connector = NULL;
305 struct drm_encoder *drm_encoder = NULL;
306 struct drm_crtc *drm_crtc = NULL;
308 struct nv50_crtc *crtc = NULL;
309 struct nv50_output *output = NULL;
310 struct nv50_connector *connector = NULL;
311 struct nouveau_hw_mode *hw_mode = NULL;
312 struct nv50_fb_info fb_info;
315 bool switch_fb = false;
316 bool modeset = false;
321 * Supported operations:
323 * - Switch framebuffer.
327 /* Sanity checking */
329 DRM_ERROR("Sanity check failed\n");
334 DRM_ERROR("Sanity check failed\n");
340 if (!drm_mode_equal(set->mode, &set->crtc->mode))
343 if (set->fb != set->crtc->fb)
346 if (set->x != set->crtc->x || set->y != set->crtc->y)
353 if (!set->connectors && !blank) {
354 DRM_ERROR("Sanity check failed\n");
358 /* Basic variable setting */
359 dev = set->crtc->dev;
360 dev_priv = dev->dev_private;
361 display = nv50_get_display(dev);
362 crtc = to_nv50_crtc(set->crtc);
365 * Wiring up the encoders and connectors.
368 /* for switch_fb we verify if any important changes happened */
370 /* Mode validation */
371 hw_mode = nv50_kms_to_hw_mode(set->mode);
373 rval = crtc->validate_mode(crtc, hw_mode);
375 if (rval != MODE_OK) {
376 DRM_ERROR("Mode not ok\n");
380 for (i = 0; i < set->num_connectors; i++) {
381 drm_connector = set->connectors[i];
382 if (!drm_connector) {
383 DRM_ERROR("No connector\n");
386 connector = to_nv50_connector(drm_connector);
388 /* This is to ensure it knows the connector subtype. */
389 drm_connector->funcs->fill_modes(drm_connector, 0, 0);
391 output = connector->to_output(connector, nv50_kms_connector_get_digital(drm_connector));
393 DRM_ERROR("No output\n");
397 rval = output->validate_mode(output, hw_mode);
398 if (rval != MODE_OK) {
399 DRM_ERROR("Mode not ok\n");
403 /* verify if any "sneaky" changes happened */
404 if (output != connector->output)
407 if (output->crtc != crtc)
412 /* Now we verified if anything changed, fail if nothing has. */
413 if (!modeset && !switch_fb && !blank)
414 DRM_INFO("A seemingly empty modeset encountered, this could be a bug.\n");
416 /* Validation done, move on to cleaning of existing structures. */
418 /* find encoders that use this crtc. */
419 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
420 if (drm_encoder->crtc == set->crtc) {
421 /* find the connector that goes with it */
422 list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
423 if (drm_connector->encoder == drm_encoder) {
424 drm_connector->encoder = NULL;
428 drm_encoder->crtc = NULL;
432 /* now find if our desired encoders or connectors are in use already. */
433 for (i = 0; i < set->num_connectors; i++) {
434 drm_connector = set->connectors[i];
435 if (!drm_connector) {
436 DRM_ERROR("No connector\n");
440 if (!drm_connector->encoder)
443 drm_encoder = drm_connector->encoder;
444 drm_connector->encoder = NULL;
446 if (!drm_encoder->crtc)
449 drm_crtc = drm_encoder->crtc;
450 drm_encoder->crtc = NULL;
452 drm_crtc->enabled = false;
455 /* Time to wire up the public encoder, the private one will be handled later. */
456 for (i = 0; i < set->num_connectors; i++) {
457 drm_connector = set->connectors[i];
458 if (!drm_connector) {
459 DRM_ERROR("No connector\n");
463 output = connector->to_output(connector, nv50_kms_connector_get_digital(drm_connector));
465 DRM_ERROR("No output\n");
469 /* find the encoder public structure that matches out output structure. */
470 drm_encoder = to_nv50_kms_encoder(output);
473 DRM_ERROR("No encoder\n");
477 drm_encoder->crtc = set->crtc;
478 set->crtc->enabled = true;
479 drm_connector->encoder = drm_encoder;
488 crtc = to_nv50_crtc(set->crtc);
490 set->crtc->enabled = false;
492 /* disconnect encoders and connectors */
493 for (i = 0; i < set->num_connectors; i++) {
494 drm_connector = set->connectors[i];
496 if (!drm_connector->encoder)
499 drm_connector->encoder->crtc = NULL;
500 drm_connector->encoder = NULL;
505 * All state should now be updated, now onto the real work.
508 /* mirror everything to the private structs */
509 nv50_kms_mirror_routing(dev);
516 crtc = to_nv50_crtc(set->crtc);
518 /* set framebuffer */
519 set->crtc->fb = set->fb;
521 /* set private framebuffer */
522 crtc = to_nv50_crtc(set->crtc);
523 fb_info.block = find_block_by_handle(dev_priv->fb_heap, set->fb->mm_handle);
524 fb_info.width = set->fb->width;
525 fb_info.height = set->fb->height;
526 fb_info.depth = set->fb->depth;
527 fb_info.bpp = set->fb->bits_per_pixel;
528 fb_info.pitch = set->fb->pitch;
532 rval = crtc->fb->bind(crtc, &fb_info);
534 DRM_ERROR("fb_bind failed\n");
539 /* this is !cursor_show */
540 if (!crtc->cursor->enabled) {
541 rval = crtc->cursor->enable(crtc);
543 DRM_ERROR("cursor_enable failed\n");
553 crtc = to_nv50_crtc(set->crtc);
555 rval = crtc->blank(crtc, true);
557 DRM_ERROR("blanking failed\n");
561 /* detach any outputs that are currently unused */
562 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
563 if (!drm_encoder->crtc) {
564 output = to_nv50_output(drm_encoder);
566 rval = output->execute_mode(output, true);
568 DRM_ERROR("detaching output failed\n");
576 * Change framebuffer, without changing mode.
579 if (switch_fb && !modeset && !blank) {
580 crtc = to_nv50_crtc(set->crtc);
582 rval = crtc->set_fb(crtc);
584 DRM_ERROR("set_fb failed\n");
588 /* this also sets the fb offset */
589 rval = crtc->blank(crtc, false);
591 DRM_ERROR("unblanking failed\n");
597 * Normal modesetting.
601 crtc = to_nv50_crtc(set->crtc);
603 /* disconnect unused outputs */
604 list_for_each_entry(output, &display->outputs, item) {
606 crtc_mask |= 1 << output->crtc->index;
608 rval = output->execute_mode(output, true);
610 DRM_ERROR("detaching output failed\n");
616 /* blank any unused crtcs */
617 list_for_each_entry(crtc, &display->crtcs, item) {
618 if (!(crtc_mask & (1 << crtc->index)))
619 crtc->blank(crtc, true);
622 crtc = to_nv50_crtc(set->crtc);
624 rval = crtc->set_mode(crtc, hw_mode);
626 DRM_ERROR("crtc mode set failed\n");
630 /* find native mode. */
631 list_for_each_entry(output, &display->outputs, item) {
632 if (output->crtc != crtc)
635 *crtc->native_mode = *output->native_mode;
636 list_for_each_entry(connector, &display->connectors, item) {
637 if (connector->output != output)
640 crtc->requested_scaling_mode = connector->requested_scaling_mode;
641 crtc->use_dithering = connector->use_dithering;
645 if (crtc->requested_scaling_mode == SCALE_NON_GPU)
646 crtc->use_native_mode = false;
648 crtc->use_native_mode = true;
650 break; /* no use in finding more than one mode */
653 rval = crtc->execute_mode(crtc);
655 DRM_ERROR("crtc execute mode failed\n");
659 list_for_each_entry(output, &display->outputs, item) {
660 if (output->crtc != crtc)
663 rval = output->execute_mode(output, false);
665 DRM_ERROR("output execute mode failed\n");
670 rval = crtc->set_scale(crtc);
672 DRM_ERROR("crtc set scale failed\n");
676 /* next line changes crtc, so putting it here is important */
677 display->last_crtc = crtc->index;
680 /* always reset dpms, regardless if any other modesetting is done. */
682 /* this is executed immediately */
683 list_for_each_entry(output, &display->outputs, item) {
684 if (output->crtc != crtc)
687 rval = output->set_power_mode(output, DRM_MODE_DPMS_ON);
689 DRM_ERROR("output set power mode failed\n");
694 /* update dpms state to DPMSModeOn */
695 for (i = 0; i < set->num_connectors; i++) {
696 drm_connector = set->connectors[i];
697 if (!drm_connector) {
698 DRM_ERROR("No connector\n");
702 rval = drm_connector_property_set_value(drm_connector,
703 dev->mode_config.dpms_property,
706 DRM_ERROR("failed to update dpms state\n");
712 display->update(display);
714 /* Update the current mode, now that all has gone well. */
716 set->crtc->mode = *(set->mode);
717 set->crtc->x = set->x;
718 set->crtc->y = set->y;
734 static void nv50_kms_crtc_destroy(struct drm_crtc *drm_crtc)
736 struct nv50_crtc *crtc = to_nv50_crtc(drm_crtc);
738 drm_crtc_cleanup(drm_crtc);
740 /* this will even destroy the public structure. */
744 static const struct drm_crtc_funcs nv50_kms_crtc_funcs = {
747 .cursor_set = nv50_kms_crtc_cursor_set,
748 .cursor_move = nv50_kms_crtc_cursor_move,
749 .gamma_set = nv50_kms_crtc_gamma_set,
750 .set_config = nv50_kms_crtc_set_config,
751 .destroy = nv50_kms_crtc_destroy,
754 static int nv50_kms_crtcs_init(struct drm_device *dev)
756 struct nv50_display *display = nv50_get_display(dev);
757 struct nv50_crtc *crtc = NULL;
760 * This may look a bit confusing, but:
761 * The internal structure is already allocated and so is the public one.
762 * Just a matter of getting to the memory and register it.
764 list_for_each_entry(crtc, &display->crtcs, item) {
765 struct drm_crtc *drm_crtc = to_nv50_kms_crtc(crtc);
767 drm_crtc_init(dev, drm_crtc, &nv50_kms_crtc_funcs);
769 /* init lut storage */
770 drm_mode_crtc_set_gamma_size(drm_crtc, 256);
780 static void nv50_kms_encoder_destroy(struct drm_encoder *drm_encoder)
782 struct nv50_output *output = to_nv50_output(drm_encoder);
784 drm_encoder_cleanup(drm_encoder);
786 /* this will even destroy the public structure. */
787 output->destroy(output);
790 static const struct drm_encoder_funcs nv50_kms_encoder_funcs = {
791 .destroy = nv50_kms_encoder_destroy,
794 static int nv50_kms_encoders_init(struct drm_device *dev)
796 struct nv50_display *display = nv50_get_display(dev);
797 struct nv50_output *output = NULL;
799 list_for_each_entry(output, &display->outputs, item) {
800 struct drm_encoder *drm_encoder = to_nv50_kms_encoder(output);
801 uint32_t type = DRM_MODE_ENCODER_NONE;
803 switch (output->type) {
805 type = DRM_MODE_ENCODER_DAC;
808 type = DRM_MODE_ENCODER_TMDS;
811 type = DRM_MODE_ENCODER_LVDS;
814 type = DRM_MODE_ENCODER_TVDAC;
817 type = DRM_MODE_ENCODER_NONE;
821 if (type == DRM_MODE_ENCODER_NONE) {
822 DRM_ERROR("DRM_MODE_ENCODER_NONE encountered\n");
826 drm_encoder_init(dev, drm_encoder, &nv50_kms_encoder_funcs, type);
828 /* I've never seen possible crtc's restricted. */
829 drm_encoder->possible_crtcs = 3;
830 drm_encoder->possible_clones = 0;
837 * Connector functions
841 /* These 2 functions wrap the connector properties that deal with multiple encoders per connector. */
842 bool nv50_kms_connector_get_digital(struct drm_connector *drm_connector)
844 struct drm_device *dev = drm_connector->dev;
846 switch (drm_connector->connector_type) {
847 case DRM_MODE_CONNECTOR_VGA:
848 case DRM_MODE_CONNECTOR_SVIDEO:
850 case DRM_MODE_CONNECTOR_DVID:
851 case DRM_MODE_CONNECTOR_LVDS:
857 if (drm_connector->connector_type == DRM_MODE_CONNECTOR_DVII) {
861 rval = drm_connector_property_get_value(drm_connector, dev->mode_config.dvi_i_select_subconnector_property, &prop_val);
863 DRM_ERROR("Unable to find select subconnector property, defaulting to DVI-D\n");
867 /* Is a subconnector explicitly selected? */
869 case DRM_MODE_SUBCONNECTOR_DVID:
871 case DRM_MODE_SUBCONNECTOR_DVIA:
877 rval = drm_connector_property_get_value(drm_connector, dev->mode_config.dvi_i_subconnector_property, &prop_val);
879 DRM_ERROR("Unable to find subconnector property, defaulting to DVI-D\n");
883 /* Do we know what subconnector we currently have connected? */
885 case DRM_MODE_SUBCONNECTOR_DVID:
887 case DRM_MODE_SUBCONNECTOR_DVIA:
890 DRM_ERROR("Unknown subconnector value, defaulting to DVI-D\n");
895 DRM_ERROR("Unknown connector type, defaulting to analog\n");
899 static void nv50_kms_connector_set_digital(struct drm_connector *drm_connector, int digital, bool force)
901 struct drm_device *dev = drm_connector->dev;
903 if (drm_connector->connector_type == DRM_MODE_CONNECTOR_DVII) {
904 uint64_t cur_value, new_value;
906 int rval = drm_connector_property_get_value(drm_connector, dev->mode_config.dvi_i_subconnector_property, &cur_value);
908 DRM_ERROR("Unable to find subconnector property\n");
912 /* Only set when unknown or when forced to do so. */
913 if (cur_value != DRM_MODE_SUBCONNECTOR_Unknown && !force)
917 new_value = DRM_MODE_SUBCONNECTOR_DVID;
918 else if (digital == 0)
919 new_value = DRM_MODE_SUBCONNECTOR_DVIA;
921 new_value = DRM_MODE_SUBCONNECTOR_Unknown;
922 drm_connector_property_set_value(drm_connector, dev->mode_config.dvi_i_subconnector_property, new_value);
926 void nv50_kms_connector_detect_all(struct drm_device *dev)
928 struct drm_connector *drm_connector = NULL;
930 list_for_each_entry(drm_connector, &dev->mode_config.connector_list, head) {
931 drm_connector->funcs->detect(drm_connector);
935 static enum drm_connector_status nv50_kms_connector_detect(struct drm_connector *drm_connector)
937 struct drm_device *dev = drm_connector->dev;
938 struct nv50_connector *connector = to_nv50_connector(drm_connector);
939 struct nv50_output *output = NULL;
940 int hpd_detect = 0, load_detect = 0, i2c_detect = 0;
941 int old_status = drm_connector->status;
944 hpd_detect = connector->hpd_detect(connector);
947 output = connector->to_output(connector, false); /* analog */
948 if (output && output->detect)
949 load_detect = output->detect(output);
951 if (hpd_detect < 0 || load_detect < 0) /* did an error occur? */
952 i2c_detect = connector->i2c_detect(connector);
954 if (load_detect == 1) {
955 nv50_kms_connector_set_digital(drm_connector, 0, true); /* analog, forced */
956 } else if (hpd_detect == 1 && load_detect == 0) {
957 nv50_kms_connector_set_digital(drm_connector, 1, true); /* digital, forced */
959 nv50_kms_connector_set_digital(drm_connector, -1, true); /* unknown, forced */
962 if (hpd_detect == 1 || load_detect == 1 || i2c_detect == 1)
963 drm_connector->status = connector_status_connected;
965 drm_connector->status = connector_status_disconnected;
967 /* update our modes whenever there is reason to */
968 if (old_status != drm_connector->status) {
969 drm_connector->funcs->fill_modes(drm_connector, 0, 0);
971 /* notify fb of changes */
972 dev->mode_config.funcs->fb_changed(dev);
974 /* sent a hotplug event when appropriate. */
975 drm_sysfs_hotplug_event(dev);
978 return drm_connector->status;
981 static void nv50_kms_connector_destroy(struct drm_connector *drm_connector)
983 struct nv50_connector *connector = to_nv50_connector(drm_connector);
985 drm_sysfs_connector_remove(drm_connector);
986 drm_connector_cleanup(drm_connector);
988 /* this will even destroy the public structure. */
989 connector->destroy(connector);
993 * Detailed mode info for a standard 640x480@60Hz monitor
995 static struct drm_display_mode std_mode[] = {
996 /*{ DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 25200, 640, 656,
997 752, 800, 0, 480, 490, 492, 525, 0,
998 DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) },*/ /* 640x480@60Hz */
999 { DRM_MODE("1280x1024", DRM_MODE_TYPE_DEFAULT, 135000, 1280, 1296,
1000 1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
1001 DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
1004 static void nv50_kms_connector_fill_modes(struct drm_connector *drm_connector, uint32_t maxX, uint32_t maxY)
1006 struct nv50_connector *connector = to_nv50_connector(drm_connector);
1007 struct drm_device *dev = drm_connector->dev;
1009 bool connected = false;
1010 struct drm_display_mode *mode, *t;
1011 struct edid *edid = NULL;
1013 NV50_DEBUG("%s\n", drm_get_connector_name(drm_connector));
1014 /* set all modes to the unverified state */
1015 list_for_each_entry_safe(mode, t, &drm_connector->modes, head)
1016 mode->status = MODE_UNVERIFIED;
1018 if (nv50_kms_connector_detect(drm_connector) == connector_status_connected)
1022 NV50_DEBUG("%s is connected\n", drm_get_connector_name(drm_connector));
1024 NV50_DEBUG("%s is disconnected\n", drm_get_connector_name(drm_connector));
1026 /* Not all connnectors have an i2c channel. */
1027 if (connected && connector->i2c_chan)
1028 edid = (struct edid *) drm_do_probe_ddc_edid(&connector->i2c_chan->adapter);
1030 /* This will remove edid if needed. */
1031 drm_mode_connector_update_edid_property(drm_connector, edid);
1034 rval = drm_add_edid_modes(drm_connector, edid);
1036 /* Only update when relevant and when detect couldn't determine type. */
1037 nv50_kms_connector_set_digital(drm_connector, edid->digital ? 1 : 0, false);
1042 if (rval) /* number of modes > 1 */
1043 drm_mode_connector_list_update(drm_connector);
1046 drm_mode_validate_size(dev, &drm_connector->modes, maxX, maxY, 0);
1048 list_for_each_entry_safe(mode, t, &drm_connector->modes, head) {
1049 if (mode->status == MODE_OK) {
1050 struct nouveau_hw_mode *hw_mode = nv50_kms_to_hw_mode(mode);
1051 struct nv50_output *output = connector->to_output(connector, nv50_kms_connector_get_digital(drm_connector));
1053 mode->status = output->validate_mode(output, hw_mode);
1054 /* find native mode, TODO: also check if we actually found one */
1055 if (mode->status == MODE_OK) {
1056 if (mode->type & DRM_MODE_TYPE_PREFERRED)
1057 *output->native_mode = *hw_mode;
1063 /* revalidate now that we have native mode */
1064 list_for_each_entry_safe(mode, t, &drm_connector->modes, head) {
1065 if (mode->status == MODE_OK) {
1066 struct nouveau_hw_mode *hw_mode = nv50_kms_to_hw_mode(mode);
1067 struct nv50_output *output = connector->to_output(connector, nv50_kms_connector_get_digital(drm_connector));
1069 mode->status = output->validate_mode(output, hw_mode);
1074 drm_mode_prune_invalid(dev, &drm_connector->modes, true);
1076 /* pruning is done, so bail out. */
1080 if (list_empty(&drm_connector->modes)) {
1081 struct drm_display_mode *stdmode;
1082 struct nouveau_hw_mode *hw_mode;
1083 struct nv50_output *output;
1085 NV50_DEBUG("No valid modes on %s\n", drm_get_connector_name(drm_connector));
1087 /* Making up native modes for LVDS is a bad idea. */
1088 if (drm_connector->connector_type == DRM_MODE_CONNECTOR_LVDS)
1091 /* Should we do this here ???
1092 * When no valid EDID modes are available we end up
1093 * here and bailed in the past, now we add a standard
1094 * 640x480@60Hz mode and carry on.
1096 stdmode = drm_mode_duplicate(dev, &std_mode[0]);
1097 drm_mode_probed_add(drm_connector, stdmode);
1098 drm_mode_list_concat(&drm_connector->probed_modes,
1099 &drm_connector->modes);
1101 /* also add it as native mode */
1102 hw_mode = nv50_kms_to_hw_mode(mode);
1103 output = connector->to_output(connector, nv50_kms_connector_get_digital(drm_connector));
1106 *output->native_mode = *hw_mode;
1108 DRM_DEBUG("Adding standard 640x480 @ 60Hz to %s\n",
1109 drm_get_connector_name(drm_connector));
1112 drm_mode_sort(&drm_connector->modes);
1114 NV50_DEBUG("Probed modes for %s\n", drm_get_connector_name(drm_connector));
1116 list_for_each_entry_safe(mode, t, &drm_connector->modes, head) {
1117 mode->vrefresh = drm_mode_vrefresh(mode);
1119 /* is this needed, as it's unused by the driver? */
1120 drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V);
1121 drm_mode_debug_printmodeline(mode);
1125 static int nv50_kms_connector_set_property(struct drm_connector *drm_connector,
1126 struct drm_property *property,
1129 struct drm_device *dev = drm_connector->dev;
1130 struct nv50_connector *connector = to_nv50_connector(drm_connector);
1132 bool delay_change = false;
1135 if (property == dev->mode_config.dpms_property && drm_connector->encoder) {
1136 struct nv50_output *output = to_nv50_output(drm_connector->encoder);
1138 rval = output->set_power_mode(output, (int) value);
1144 if (property == dev->mode_config.scaling_mode_property) {
1145 struct nv50_crtc *crtc = NULL;
1146 struct nv50_display *display = nv50_get_display(dev);
1147 int internal_value = 0;
1150 case DRM_MODE_SCALE_NON_GPU:
1151 internal_value = SCALE_NON_GPU;
1153 case DRM_MODE_SCALE_FULLSCREEN:
1154 internal_value = SCALE_FULLSCREEN;
1156 case DRM_MODE_SCALE_NO_SCALE:
1157 internal_value = SCALE_NOSCALE;
1159 case DRM_MODE_SCALE_ASPECT:
1160 internal_value = SCALE_ASPECT;
1166 /* LVDS always needs gpu scaling */
1167 if (connector->type == CONNECTOR_LVDS && internal_value == SCALE_NON_GPU)
1170 connector->requested_scaling_mode = internal_value;
1172 if (drm_connector->encoder && drm_connector->encoder->crtc)
1173 crtc = to_nv50_crtc(drm_connector->encoder->crtc);
1178 crtc->requested_scaling_mode = connector->requested_scaling_mode;
1180 /* going from and to a gpu scaled regime requires a modesetting, so wait until next modeset */
1181 if (crtc->scaling_mode == SCALE_NON_GPU || internal_value == SCALE_NON_GPU) {
1182 DRM_INFO("Moving from or to a non-gpu scaled mode, this will be processed upon next modeset.");
1183 delay_change = true;
1189 rval = crtc->set_scale(crtc);
1193 /* process command buffer */
1194 display->update(display);
1200 if (property == dev->mode_config.dithering_mode_property) {
1201 struct nv50_crtc *crtc = NULL;
1202 struct nv50_display *display = nv50_get_display(dev);
1204 if (value == DRM_MODE_DITHERING_ON)
1205 connector->use_dithering = true;
1207 connector->use_dithering = false;
1209 if (drm_connector->encoder && drm_connector->encoder->crtc)
1210 crtc = to_nv50_crtc(drm_connector->encoder->crtc);
1215 /* update hw state */
1216 crtc->use_dithering = connector->use_dithering;
1217 rval = crtc->set_dither(crtc);
1221 /* process command buffer */
1222 display->update(display);
1230 static const struct drm_connector_funcs nv50_kms_connector_funcs = {
1233 .detect = nv50_kms_connector_detect,
1234 .destroy = nv50_kms_connector_destroy,
1235 .fill_modes = nv50_kms_connector_fill_modes,
1236 .set_property = nv50_kms_connector_set_property
1239 static int nv50_kms_get_scaling_mode(struct drm_connector *drm_connector)
1241 struct nv50_connector *connector = NULL;
1244 if (!drm_connector) {
1245 DRM_ERROR("drm_connector is NULL\n");
1249 connector = to_nv50_connector(drm_connector);
1251 switch (connector->requested_scaling_mode) {
1253 drm_mode = DRM_MODE_SCALE_NON_GPU;
1255 case SCALE_FULLSCREEN:
1256 drm_mode = DRM_MODE_SCALE_FULLSCREEN;
1259 drm_mode = DRM_MODE_SCALE_NO_SCALE;
1262 drm_mode = DRM_MODE_SCALE_ASPECT;
1271 static int nv50_kms_connectors_init(struct drm_device *dev)
1273 struct nv50_display *display = nv50_get_display(dev);
1274 struct nv50_connector *connector = NULL;
1277 /* Initialise some optional connector properties. */
1278 drm_mode_create_scaling_mode_property(dev);
1279 drm_mode_create_dithering_property(dev);
1281 list_for_each_entry(connector, &display->connectors, item) {
1282 struct drm_connector *drm_connector = to_nv50_kms_connector(connector);
1283 uint32_t type = DRM_MODE_CONNECTOR_Unknown;
1285 switch (connector->type) {
1287 type = DRM_MODE_CONNECTOR_VGA;
1289 case CONNECTOR_DVI_D:
1290 type = DRM_MODE_CONNECTOR_DVID;
1292 case CONNECTOR_DVI_I:
1293 type = DRM_MODE_CONNECTOR_DVII;
1295 case CONNECTOR_LVDS:
1296 type = DRM_MODE_CONNECTOR_LVDS;
1299 type = DRM_MODE_CONNECTOR_SVIDEO;
1302 type = DRM_MODE_CONNECTOR_Unknown;
1306 if (type == DRM_MODE_CONNECTOR_Unknown) {
1307 DRM_ERROR("DRM_MODE_CONNECTOR_Unknown encountered\n");
1311 /* It should be allowed sometimes, but let's be safe for the moment. */
1312 drm_connector->interlace_allowed = false;
1313 drm_connector->doublescan_allowed = false;
1315 drm_connector_init(dev, drm_connector, &nv50_kms_connector_funcs, type);
1317 /* Init DVI-I specific properties */
1318 if (type == DRM_MODE_CONNECTOR_DVII) {
1319 drm_mode_create_dvi_i_properties(dev);
1320 drm_connector_attach_property(drm_connector, dev->mode_config.dvi_i_subconnector_property, 0);
1321 drm_connector_attach_property(drm_connector, dev->mode_config.dvi_i_select_subconnector_property, 0);
1324 /* If supported in the future, it will have to use the scalers internally and not expose them. */
1325 if (type != DRM_MODE_CONNECTOR_SVIDEO) {
1326 drm_connector_attach_property(drm_connector, dev->mode_config.scaling_mode_property, nv50_kms_get_scaling_mode(drm_connector));
1329 drm_connector_attach_property(drm_connector, dev->mode_config.dithering_mode_property, connector->use_dithering ? DRM_MODE_DITHERING_ON : DRM_MODE_DITHERING_OFF);
1331 /* attach encoders, possibilities are analog + digital */
1332 for (i = 0; i < 2; i++) {
1333 struct drm_encoder *drm_encoder = NULL;
1334 struct nv50_output *output = connector->to_output(connector, i);
1338 drm_encoder = to_nv50_kms_encoder(output);
1340 DRM_ERROR("No struct drm_connector to match struct nv50_output\n");
1344 drm_mode_connector_attach_encoder(drm_connector, drm_encoder);
1347 drm_sysfs_connector_add(drm_connector);
1357 int nv50_kms_init(struct drm_device *dev)
1359 struct drm_nouveau_private *dev_priv = dev->dev_private;
1360 struct nv50_kms_priv *kms_priv = kzalloc(sizeof(struct nv50_kms_priv), GFP_KERNEL);
1361 struct nv50_display *display = NULL;
1367 dev_priv->kms_priv = kms_priv;
1369 /* function pointers */
1370 /* an allocation interface that deals with the outside world, without polluting the core. */
1371 dev_priv->alloc_crtc = nv50_kms_alloc_crtc;
1372 dev_priv->alloc_output = nv50_kms_alloc_output;
1373 dev_priv->alloc_connector = nv50_kms_alloc_connector;
1375 dev_priv->free_crtc = nv50_kms_free_crtc;
1376 dev_priv->free_output = nv50_kms_free_output;
1377 dev_priv->free_connector = nv50_kms_free_connector;
1379 /* bios is needed for tables. */
1380 rval = nouveau_parse_bios(dev);
1384 /* init basic kernel modesetting */
1385 drm_mode_config_init(dev);
1387 dev->mode_config.min_width = 0;
1388 dev->mode_config.min_height = 0;
1390 dev->mode_config.funcs = (void *)&nv50_kms_mode_funcs;
1392 dev->mode_config.max_width = 8192;
1393 dev->mode_config.max_height = 8192;
1395 dev->mode_config.fb_base = dev_priv->fb_phys;
1397 /* init kms lists */
1398 INIT_LIST_HEAD(&kms_priv->crtcs);
1399 INIT_LIST_HEAD(&kms_priv->encoders);
1400 INIT_LIST_HEAD(&kms_priv->connectors);
1402 /* init the internal core, must be done first. */
1403 rval = nv50_display_create(dev);
1407 display = nv50_get_display(dev);
1414 rval = display->pre_init(display);
1418 /* init external layer */
1419 rval = nv50_kms_crtcs_init(dev);
1423 rval = nv50_kms_encoders_init(dev);
1427 rval = nv50_kms_connectors_init(dev);
1431 /* init now, this'll kill the textmode */
1432 rval = display->init(display);
1436 /* process cmdbuffer */
1437 display->update(display);
1443 dev_priv->kms_priv = NULL;
1448 int nv50_kms_destroy(struct drm_device *dev)
1450 drm_mode_config_cleanup(dev);