~ubuntu-branches/ubuntu/precise/xorg-server/precise

« back to all changes in this revision

Viewing changes to hw/xfree86/fbdevhw/fbdevhw.c

  • Committer: Bazaar Package Importer
  • Author(s): Christopher James Halse Rogers
  • Date: 2011-01-31 19:45:19 UTC
  • mfrom: (1.1.38 upstream) (0.1.19 experimental)
  • Revision ID: james.westby@ubuntu.com-20110131194519-fx30d1zsg83invba
Tags: 2:1.9.99.901+git20110131.be3be758-0ubuntu1
* Merge from (unreleased) debian-experimental.  Remaining Ubuntu changes:
  - rules:
    + Disable SELinux, libaudit-dev is not in main yet. (LP: #406226)
    + Enable xcsecurity. (LP: #247537)
    + Add --with-extra-module-dir to support GL alternatives.
  - control: 
    + Xvfb depends on xauth, x11-xkb-utils. (LP: #500102)
    + Add breaks for incompatible drivers. (LP: #614993)
    + Drop libaudit-dev from build-deps.
  - local/xvfb-run*: Add correct docs about error codes. (LP #328205)
  - debian/patches:
    + 100_rethrow_signals.patch:
      When aborting, re-raise signals for apport
    + 109_fix-swcursor-crash.patch:
      Avoid dereferencing null pointer while reloading cursors during
      resume. (LP: #371405)
    + 111_armel-drv-fallbacks.patch:
      Add support for armel driver fallbacks.
    + 121_only_switch_vt_when_active.diff:
      Add a check to prevent the X server from changing the VT when killing
      GDM from the console.
    + 122_xext_fix_card32_overflow_in_xauth.patch:
      Fix server crash when “xauth generate” is called with large timeout.
    + 157_check_null_modes.patch, 162_null_crtc_in_rotation.patch,
      166_nullptr_xinerama_keyrepeat.patch, 167_nullptr_xisbread.patch
      169_mipointer_nullptr_checks.patch,
      172_cwgetbackingpicture_nullptr_check.patch:
      Fix various segfaults in xserver by checking pointers for NULL
      values before dereferencing them.
    + 165_man_xorg_conf_no_device_ident.patch
      Correct man page
    + 168_glibc_trace_to_stderr.patch:
      Report abort traces to stderr instead of terminal
    + 184_virtual_devices_autodetect.patch:
      Use vesa for qemu device, which is not supported by cirrus
    + 188_default_primary_to_first_busid.patch:
      Pick the first device and carry on (LP: #459512)
    + 190_cache-xkbcomp_output_for_fast_start_up.patch:
    + 191-Xorg-add-an-extra-module-path.patch:
      Add support for the alternatives module path.
    + 198_nohwaccess.patch:
      Adds a -nohwaccess argument to make X not access the hardware
      ports directly.
    + 200_randr-null.patch:
      Clarify a pointer initialization.
    + 206_intel_8xx_default_to_fbdev.patch:
      Makes 8xx class intel GPUs default to fbdev for stability. (LP: #633593)
* Refresh 121_only_switch_vt_when_active.diff for new upstream.
* Drop 187_edid_quirk_hp_nc8430.patch; upstream.
* Drop 189_xserver_1.5.0_bg_none_root.patch; functionality now upstream.
* Refresh 190_cache-xkbcomp_output_for_fast_start_up.patch for new upstream.
* Drop 197_xvfb-randr.patch:
  - miRandR, which this used, has been removed from the server. 
* Drop 204_fix-neg-sync-transition.patch; upstream.
* Drop 207_dga_master_device.patch; upstream.
* Drop 208_switch_on_release.diff; upstream.
* debian/patches/209_add_legacy_bgnone_option.patch:
  - Add "-nr" as a synonym for "-background none" to ease the transition from
    the old 189_xserver_1.5.0_bg_none_root.patch patch.  Can be dropped once
    all the ?DM have been updated to use the new option.
* debian/control:
  - Add Breaks: to xserver-xorg-video-8 and current fglrx.  These proprietary
    drivers don't yet have appropriate dependency information, so manually
    handle them here to prevent broken upgrades.

Show diffs side-by-side

added added

removed removed

Lines of Context:
16
16
 
17
17
#include "fbdevhw.h"
18
18
#include "fbpriv.h"
19
 
 
20
 
#define PAGE_MASK               (~(getpagesize() - 1))
21
 
 
22
19
#include "globals.h"
23
20
#include <X11/extensions/dpmsconst.h>
24
21
 
25
 
#define DEBUG 0
26
 
 
27
22
#define PAGE_MASK               (~(getpagesize() - 1))
28
23
 
29
 
#if DEBUG
30
 
# define TRACE_ENTER(str)       ErrorF("fbdevHW: " str " %d\n",pScrn->scrnIndex)
31
 
#else
32
 
# define TRACE_ENTER(str)
33
 
#endif
34
 
 
35
 
/* -------------------------------------------------------------------- */
36
 
 
37
 
static MODULESETUPPROTO(fbdevhwSetup);
38
 
 
39
24
static XF86ModuleVersionInfo fbdevHWVersRec =
40
25
{
41
26
        "fbdevhw",
52
37
 
53
38
_X_EXPORT XF86ModuleData fbdevhwModuleData = {
54
39
    &fbdevHWVersRec,
55
 
    fbdevhwSetup,
 
40
    NULL,
56
41
    NULL
57
42
};
58
43
 
59
 
static pointer
60
 
fbdevhwSetup(pointer module, pointer opts, int *errmaj, int *errmin)
61
 
{
62
 
    return (pointer)1;
63
 
}
64
 
 
65
44
#include <fcntl.h>
66
45
#include <errno.h>
67
46
#include <sys/mman.h>
96
75
        /* saved video mode */
97
76
        struct fb_var_screeninfo        saved_var;
98
77
 
99
 
        /* FIXME: unused??? [geert] */
100
 
        struct fb_cmap                  saved_cmap;
101
 
        unsigned short                  *saved_red;
102
 
        unsigned short                  *saved_green;
103
 
        unsigned short                  *saved_blue;
104
 
 
105
78
        /* buildin video mode */
106
79
        DisplayModeRec                  buildin;
107
80
 
445
418
{
446
419
        fbdevHWPtr fPtr;
447
420
 
448
 
        TRACE_ENTER("Init");
449
 
 
450
421
        fbdevHWGetRec(pScrn);
451
422
        fPtr = FBDEVHWPTR(pScrn);
452
423
 
541
512
{
542
513
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
543
514
        struct fb_var_screeninfo req_var = fPtr->var, set_var;
544
 
        
545
 
        TRACE_ENTER("SetMode");
546
515
 
547
516
        xfree2fbdev_fblayout(pScrn, &req_var);
548
517
        xfree2fbdev_timing(mode, &req_var);
586
555
        char **modename;
587
556
        DisplayModePtr mode,this,last = pScrn->modes;
588
557
 
589
 
        TRACE_ENTER("VerifyModes");
590
558
        if (NULL == pScrn->display->modes)
591
559
                return;
592
560
 
643
611
{
644
612
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
645
613
 
646
 
        TRACE_ENTER("UseBuildinMode");
647
614
        pScrn->modes    = &fPtr->buildin;
648
615
        pScrn->virtualX = pScrn->display->virtualX;
649
616
        pScrn->virtualY = pScrn->display->virtualY;
669
636
{
670
637
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
671
638
 
672
 
        TRACE_ENTER("MapVidmem");
673
639
        if (NULL == fPtr->fbmem) {
674
640
                calculateFbmem_len(fPtr);
675
641
                fPtr->fbmem = mmap(NULL, fPtr->fbmem_len, PROT_READ | PROT_WRITE,
695
661
{
696
662
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
697
663
 
698
 
        TRACE_ENTER("LinearOffset");
699
664
        return fPtr->fboff;
700
665
}
701
666
 
704
669
{
705
670
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
706
671
 
707
 
        TRACE_ENTER("UnmapVidmem");
708
672
        if (NULL != fPtr->fbmem) {
709
673
                if (-1 == munmap(fPtr->fbmem, fPtr->fbmem_len))
710
674
                        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
721
685
 
722
686
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
723
687
 
724
 
        TRACE_ENTER("MapMMIO");
725
688
        if (NULL == fPtr->mmio) {
726
689
                /* tell the kernel not to use accels to speed up console scrolling */
727
690
                fPtr->var.accel_flags = 0;
752
715
{
753
716
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
754
717
 
755
 
        TRACE_ENTER("UnmapMMIO");
756
718
        if (NULL != fPtr->mmio) {
757
719
                if (-1 == munmap((void *)((unsigned long)fPtr->mmio & PAGE_MASK), fPtr->mmio_len))
758
720
                        xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
806
768
 
807
769
/* -------------------------------------------------------------------- */
808
770
/* video mode save/restore                                              */
809
 
 
810
 
/* TODO: colormap */
811
771
void
812
772
fbdevHWSave(ScrnInfoPtr pScrn)
813
773
{
814
774
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
815
775
 
816
 
        TRACE_ENTER("Save");
817
776
        if (0 != ioctl(fPtr->fd,FBIOGET_VSCREENINFO,(void*)(&fPtr->saved_var)))
818
777
                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
819
778
                           "FBIOGET_VSCREENINFO: %s\n", strerror(errno));
824
783
{
825
784
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
826
785
 
827
 
        TRACE_ENTER("Restore");
828
786
        if (0 != ioctl(fPtr->fd,FBIOPUT_VSCREENINFO,(void*)(&fPtr->saved_var)))
829
787
                xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
830
788
                           "FBIOPUT_VSCREENINFO: %s\n", strerror(errno));
842
800
        unsigned short red,green,blue;
843
801
        int i;
844
802
 
845
 
        TRACE_ENTER("LoadPalette");
846
803
        cmap.len   = 1;
847
804
        cmap.red   = &red;
848
805
        cmap.green = &green;
870
827
{
871
828
        ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
872
829
 
873
 
        TRACE_ENTER("ValidMode");
874
 
 
875
830
        if (!fbdevHWSetMode(pScrn, mode, TRUE))
876
831
                return MODE_BAD;
877
832
 
883
838
{
884
839
        ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
885
840
 
886
 
        TRACE_ENTER("SwitchMode");
887
841
 
888
842
        if (!fbdevHWSetMode(pScrn, mode, FALSE))
889
843
                return FALSE;
897
851
        ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
898
852
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
899
853
 
900
 
        TRACE_ENTER("AdjustFrame");
901
854
        if ( x < 0 || x + fPtr->var.xres > fPtr->var.xres_virtual || 
902
855
             y < 0 || y + fPtr->var.yres > fPtr->var.yres_virtual )
903
856
                return;
914
867
{
915
868
        ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
916
869
        
917
 
        TRACE_ENTER("EnterVT");
918
870
        if (!fbdevHWModeInit(pScrn, pScrn->currentMode))
919
871
                return FALSE;
920
872
        fbdevHWAdjustFrame(scrnIndex, pScrn->frameX0, pScrn->frameY0, 0);
926
878
{
927
879
        ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
928
880
 
929
 
        TRACE_ENTER("LeaveVT");
930
881
        fbdevHWRestore(pScrn);
931
882
}
932
883
 
936
887
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
937
888
        unsigned long fbmode;
938
889
 
939
 
        TRACE_ENTER("DPMSSet");
940
890
        if (!pScrn->vtSema)
941
891
                return;
942
892
 
969
919
        fbdevHWPtr fPtr = FBDEVHWPTR(pScrn);
970
920
        unsigned long unblank;
971
921
 
972
 
        TRACE_ENTER("HWSaveScreen");
973
922
        if (!pScrn->vtSema)
974
923
                return TRUE;
975
924