xserver

xserver with xephyr scale patch
git clone https://git.neptards.moe/u3shit/xserver.git
Log | Files | Refs | README | LICENSE

Device.c (12627B)


      1 /*
      2  *
      3  * Copyright (c) 1997  Metro Link Incorporated
      4  *
      5  * Permission is hereby granted, free of charge, to any person obtaining a
      6  * copy of this software and associated documentation files (the "Software"),
      7  * to deal in the Software without restriction, including without limitation
      8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      9  * and/or sell copies of the Software, and to permit persons to whom the
     10  * Software is furnished to do so, subject to the following conditions:
     11  *
     12  * The above copyright notice and this permission notice shall be included in
     13  * all copies or substantial portions of the Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
     19  * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
     20  * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     21  * SOFTWARE.
     22  *
     23  * Except as contained in this notice, the name of the Metro Link shall not be
     24  * used in advertising or otherwise to promote the sale, use or other dealings
     25  * in this Software without prior written authorization from Metro Link.
     26  *
     27  */
     28 /*
     29  * Copyright (c) 1997-2003 by The XFree86 Project, Inc.
     30  *
     31  * Permission is hereby granted, free of charge, to any person obtaining a
     32  * copy of this software and associated documentation files (the "Software"),
     33  * to deal in the Software without restriction, including without limitation
     34  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     35  * and/or sell copies of the Software, and to permit persons to whom the
     36  * Software is furnished to do so, subject to the following conditions:
     37  *
     38  * The above copyright notice and this permission notice shall be included in
     39  * all copies or substantial portions of the Software.
     40  *
     41  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     42  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     43  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     44  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     45  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     46  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     47  * OTHER DEALINGS IN THE SOFTWARE.
     48  *
     49  * Except as contained in this notice, the name of the copyright holder(s)
     50  * and author(s) shall not be used in advertising or otherwise to promote
     51  * the sale, use or other dealings in this Software without prior written
     52  * authorization from the copyright holder(s) and author(s).
     53  */
     54 
     55 #ifdef HAVE_XORG_CONFIG_H
     56 #include <xorg-config.h>
     57 #endif
     58 
     59 #include "xf86Parser.h"
     60 #include "xf86tokens.h"
     61 #include "Configint.h"
     62 
     63 
     64 static const xf86ConfigSymTabRec DeviceTab[] = {
     65     {ENDSECTION, "endsection"},
     66     {IDENTIFIER, "identifier"},
     67     {VENDOR, "vendorname"},
     68     {BOARD, "boardname"},
     69     {CHIPSET, "chipset"},
     70     {RAMDAC, "ramdac"},
     71     {DACSPEED, "dacspeed"},
     72     {CLOCKS, "clocks"},
     73     {MATCHSEAT, "matchseat"},
     74     {OPTION, "option"},
     75     {VIDEORAM, "videoram"},
     76     {BIOSBASE, "biosbase"},
     77     {MEMBASE, "membase"},
     78     {IOBASE, "iobase"},
     79     {CLOCKCHIP, "clockchip"},
     80     {CHIPID, "chipid"},
     81     {CHIPREV, "chiprev"},
     82     {CARD, "card"},
     83     {DRIVER, "driver"},
     84     {BUSID, "busid"},
     85     {IRQ, "irq"},
     86     {SCREEN, "screen"},
     87     {-1, ""},
     88 };
     89 
     90 #define CLEANUP xf86freeDeviceList
     91 
     92 XF86ConfDevicePtr
     93 xf86parseDeviceSection(void)
     94 {
     95     int i;
     96     int has_ident = FALSE;
     97     int token;
     98 
     99     parsePrologue(XF86ConfDevicePtr, XF86ConfDeviceRec)
    100 
    101         /* Zero is a valid value for these */
    102         ptr->dev_chipid = -1;
    103     ptr->dev_chiprev = -1;
    104     ptr->dev_irq = -1;
    105     while ((token = xf86getToken(DeviceTab)) != ENDSECTION) {
    106         switch (token) {
    107         case COMMENT:
    108             ptr->dev_comment = xf86addComment(ptr->dev_comment, xf86_lex_val.str);
    109             break;
    110         case IDENTIFIER:
    111             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    112                 Error(QUOTE_MSG, "Identifier");
    113             if (has_ident == TRUE)
    114                 Error(MULTIPLE_MSG, "Identifier");
    115             ptr->dev_identifier = xf86_lex_val.str;
    116             has_ident = TRUE;
    117             break;
    118         case VENDOR:
    119             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    120                 Error(QUOTE_MSG, "Vendor");
    121             ptr->dev_vendor = xf86_lex_val.str;
    122             break;
    123         case BOARD:
    124             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    125                 Error(QUOTE_MSG, "Board");
    126             ptr->dev_board = xf86_lex_val.str;
    127             break;
    128         case CHIPSET:
    129             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    130                 Error(QUOTE_MSG, "Chipset");
    131             ptr->dev_chipset = xf86_lex_val.str;
    132             break;
    133         case CARD:
    134             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    135                 Error(QUOTE_MSG, "Card");
    136             ptr->dev_card = xf86_lex_val.str;
    137             break;
    138         case DRIVER:
    139             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    140                 Error(QUOTE_MSG, "Driver");
    141             ptr->dev_driver = xf86_lex_val.str;
    142             break;
    143         case RAMDAC:
    144             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    145                 Error(QUOTE_MSG, "Ramdac");
    146             ptr->dev_ramdac = xf86_lex_val.str;
    147             break;
    148         case DACSPEED:
    149             for (i = 0; i < CONF_MAXDACSPEEDS; i++)
    150                 ptr->dev_dacSpeeds[i] = 0;
    151             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER) {
    152                 Error(DACSPEED_MSG, CONF_MAXDACSPEEDS);
    153             }
    154             else {
    155                 ptr->dev_dacSpeeds[0] = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
    156                 for (i = 1; i < CONF_MAXDACSPEEDS; i++) {
    157                     if (xf86getSubToken(&(ptr->dev_comment)) == NUMBER)
    158                         ptr->dev_dacSpeeds[i] = (int)
    159                             (xf86_lex_val.realnum * 1000.0 + 0.5);
    160                     else {
    161                         xf86unGetToken(token);
    162                         break;
    163                     }
    164                 }
    165             }
    166             break;
    167         case VIDEORAM:
    168             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    169                 Error(NUMBER_MSG, "VideoRam");
    170             ptr->dev_videoram = xf86_lex_val.num;
    171             break;
    172         case BIOSBASE:
    173             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    174                 Error(NUMBER_MSG, "BIOSBase");
    175             /* ignored */
    176             break;
    177         case MEMBASE:
    178             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    179                 Error(NUMBER_MSG, "MemBase");
    180             ptr->dev_mem_base = xf86_lex_val.num;
    181             break;
    182         case IOBASE:
    183             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    184                 Error(NUMBER_MSG, "IOBase");
    185             ptr->dev_io_base = xf86_lex_val.num;
    186             break;
    187         case CLOCKCHIP:
    188             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    189                 Error(QUOTE_MSG, "ClockChip");
    190             ptr->dev_clockchip = xf86_lex_val.str;
    191             break;
    192         case CHIPID:
    193             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    194                 Error(NUMBER_MSG, "ChipID");
    195             ptr->dev_chipid = xf86_lex_val.num;
    196             break;
    197         case CHIPREV:
    198             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    199                 Error(NUMBER_MSG, "ChipRev");
    200             ptr->dev_chiprev = xf86_lex_val.num;
    201             break;
    202 
    203         case CLOCKS:
    204             token = xf86getSubToken(&(ptr->dev_comment));
    205             for (i = ptr->dev_clocks;
    206                  token == NUMBER && i < CONF_MAXCLOCKS; i++) {
    207                 ptr->dev_clock[i] = (int) (xf86_lex_val.realnum * 1000.0 + 0.5);
    208                 token = xf86getSubToken(&(ptr->dev_comment));
    209             }
    210             ptr->dev_clocks = i;
    211             xf86unGetToken(token);
    212             break;
    213         case MATCHSEAT:
    214             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    215                 Error(QUOTE_MSG, "MatchSeat");
    216             ptr->match_seat = xf86_lex_val.str;
    217             break;
    218         case OPTION:
    219             ptr->dev_option_lst = xf86parseOption(ptr->dev_option_lst);
    220             break;
    221         case BUSID:
    222             if (xf86getSubToken(&(ptr->dev_comment)) != STRING)
    223                 Error(QUOTE_MSG, "BusID");
    224             ptr->dev_busid = xf86_lex_val.str;
    225             break;
    226         case IRQ:
    227             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    228                 Error(QUOTE_MSG, "IRQ");
    229             ptr->dev_irq = xf86_lex_val.num;
    230             break;
    231         case SCREEN:
    232             if (xf86getSubToken(&(ptr->dev_comment)) != NUMBER)
    233                 Error(NUMBER_MSG, "Screen");
    234             ptr->dev_screen = xf86_lex_val.num;
    235             break;
    236         case EOF_TOKEN:
    237             Error(UNEXPECTED_EOF_MSG);
    238             break;
    239         default:
    240             Error(INVALID_KEYWORD_MSG, xf86tokenString());
    241             break;
    242         }
    243     }
    244 
    245     if (!has_ident)
    246         Error(NO_IDENT_MSG);
    247 
    248 #ifdef DEBUG
    249     printf("Device section parsed\n");
    250 #endif
    251 
    252     return ptr;
    253 }
    254 
    255 #undef CLEANUP
    256 
    257 void
    258 xf86printDeviceSection(FILE * cf, XF86ConfDevicePtr ptr)
    259 {
    260     int i;
    261 
    262     while (ptr) {
    263         fprintf(cf, "Section \"Device\"\n");
    264         if (ptr->dev_comment)
    265             fprintf(cf, "%s", ptr->dev_comment);
    266         if (ptr->dev_identifier)
    267             fprintf(cf, "\tIdentifier  \"%s\"\n", ptr->dev_identifier);
    268         if (ptr->dev_driver)
    269             fprintf(cf, "\tDriver      \"%s\"\n", ptr->dev_driver);
    270         if (ptr->dev_vendor)
    271             fprintf(cf, "\tVendorName  \"%s\"\n", ptr->dev_vendor);
    272         if (ptr->dev_board)
    273             fprintf(cf, "\tBoardName   \"%s\"\n", ptr->dev_board);
    274         if (ptr->dev_chipset)
    275             fprintf(cf, "\tChipSet     \"%s\"\n", ptr->dev_chipset);
    276         if (ptr->dev_card)
    277             fprintf(cf, "\tCard        \"%s\"\n", ptr->dev_card);
    278         if (ptr->dev_ramdac)
    279             fprintf(cf, "\tRamDac      \"%s\"\n", ptr->dev_ramdac);
    280         if (ptr->dev_dacSpeeds[0] > 0) {
    281             fprintf(cf, "\tDacSpeed    ");
    282             for (i = 0; i < CONF_MAXDACSPEEDS && ptr->dev_dacSpeeds[i] > 0; i++)
    283                 fprintf(cf, "%g ", (double) (ptr->dev_dacSpeeds[i]) / 1000.0);
    284             fprintf(cf, "\n");
    285         }
    286         if (ptr->dev_videoram)
    287             fprintf(cf, "\tVideoRam    %d\n", ptr->dev_videoram);
    288         if (ptr->dev_mem_base)
    289             fprintf(cf, "\tMemBase     0x%lx\n", ptr->dev_mem_base);
    290         if (ptr->dev_io_base)
    291             fprintf(cf, "\tIOBase      0x%lx\n", ptr->dev_io_base);
    292         if (ptr->dev_clockchip)
    293             fprintf(cf, "\tClockChip   \"%s\"\n", ptr->dev_clockchip);
    294         if (ptr->dev_chipid != -1)
    295             fprintf(cf, "\tChipId      0x%x\n", ptr->dev_chipid);
    296         if (ptr->dev_chiprev != -1)
    297             fprintf(cf, "\tChipRev     0x%x\n", ptr->dev_chiprev);
    298 
    299         xf86printOptionList(cf, ptr->dev_option_lst, 1);
    300         if (ptr->dev_clocks > 0) {
    301             fprintf(cf, "\tClocks      ");
    302             for (i = 0; i < ptr->dev_clocks; i++)
    303                 fprintf(cf, "%.1f ", (double) ptr->dev_clock[i] / 1000.0);
    304             fprintf(cf, "\n");
    305         }
    306         if (ptr->dev_busid)
    307             fprintf(cf, "\tBusID       \"%s\"\n", ptr->dev_busid);
    308         if (ptr->dev_screen > 0)
    309             fprintf(cf, "\tScreen      %d\n", ptr->dev_screen);
    310         if (ptr->dev_irq >= 0)
    311             fprintf(cf, "\tIRQ         %d\n", ptr->dev_irq);
    312         fprintf(cf, "EndSection\n\n");
    313         ptr = ptr->list.next;
    314     }
    315 }
    316 
    317 void
    318 xf86freeDeviceList(XF86ConfDevicePtr ptr)
    319 {
    320     XF86ConfDevicePtr prev;
    321 
    322     while (ptr) {
    323         TestFree(ptr->dev_identifier);
    324         TestFree(ptr->dev_vendor);
    325         TestFree(ptr->dev_board);
    326         TestFree(ptr->dev_chipset);
    327         TestFree(ptr->dev_card);
    328         TestFree(ptr->dev_driver);
    329         TestFree(ptr->dev_ramdac);
    330         TestFree(ptr->dev_clockchip);
    331         TestFree(ptr->dev_comment);
    332         xf86optionListFree(ptr->dev_option_lst);
    333 
    334         prev = ptr;
    335         ptr = ptr->list.next;
    336         free(prev);
    337     }
    338 }
    339 
    340 XF86ConfDevicePtr
    341 xf86findDevice(const char *ident, XF86ConfDevicePtr p)
    342 {
    343     while (p) {
    344         if (xf86nameCompare(ident, p->dev_identifier) == 0)
    345             return p;
    346 
    347         p = p->list.next;
    348     }
    349     return NULL;
    350 }