Imported Upstream version 1.15.1
[deb_xorg-server.git] / hw / xfree86 / doc / ddxDesign.xml
CommitLineData
a09e091a
JB
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
3 "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" [
4 <!ENTITY % xorg-defs SYSTEM "defs.ent"> %xorg-defs;
5 <!ENTITY % defs SYSTEM "/xserver/doc/xml/xserver.ent"> %defs;
6 <!-- config file keyword markup -->
7 <!-- specific config file keywords -->
8 <!ENTITY k.device "<emphasis>Device</emphasis>">
9 <!ENTITY k.monitor "<emphasis>Monitor</emphasis>">
10 <!ENTITY k.display "<emphasis>Display</emphasis>">
11 <!ENTITY k.inputdevice "<emphasis>InputDevice</emphasis>">
12 <!ENTITY k.screen "<emphasis>Screen</emphasis>">
13 <!ENTITY k.serverlayout "<emphasis>ServerLayout</emphasis>">
14 <!ENTITY k.driver "<emphasis>Driver</emphasis>">
15 <!ENTITY k.module "<emphasis>Module</emphasis>">
16 <!ENTITY k.identifier "<emphasis>Identifier</emphasis>">
17 <!ENTITY k.serverflags "<emphasis>ServerFlags</emphasis>">
18] >
19
20<article id="ddxDesign">
21 <articleinfo>
22
23 <title>XFree86 DDX Design</title>
24
25 <authorgroup>
26 <corpauthor>The XFree86 Project</corpauthor>
27 <corpauthor>The X.Org Foundation</corpauthor>
28
29 <othercredit>
30 <firstname>Jim</firstname><surname>Gettys</surname>
31 <contrib>Updates for X11R6.7</contrib>
32 </othercredit>
33 </authorgroup>
34
35 <pubdate>&xserver.reldate;</pubdate>
36 <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
37 <releaseinfo>X Server Version &xserver.version;</releaseinfo>
38
39 </articleinfo>
40
41 <note><para>
42This document describes software undergoing continual evolution, and
43the interfaces described here are subject to change without notice.
44This document is intended to cover the interfaces as found in the
45xorg-server-&xserver.version; release, but is probably not completely
46in sync with the code base.
47 </para></note>
48
49
50 <sect1>
51 <title>Preface</title>
52
53 <para>
54This document was originally the design spec for the DDX layer of the
55XFree86 4.0 X server. The X.Org Foundation adopted the XFree86 4.4rc2
56version of that server as the basis of the Xorg server project, and has
57evolved the XFree86 DDX layer greatly since forking. This document thus
58covers only the current implementation of the XFree86 DDX as found in the
59Xorg server &xserver.version; release, and no longer matches the XFree86
60server itself.
61 </para>
62
63 <para>
64The XFree86 Project's broad design principles for XFree86 4.0 were:
65 <itemizedlist>
66 <listitem><para>keep it reasonable
67 <itemizedlist>
68 <listitem><para>We cannot rewrite the complete server
69 </para></listitem>
70 <listitem><para>We don't want to re-invent the wheel
71 </para></listitem>
72 </itemizedlist></para></listitem>
73 <listitem><para>keep it modular
74 <itemizedlist>
75 <listitem><para>As many things as possible should go into modules
76 </para></listitem>
77 <listitem><para>The basic loader binary should be minimal
78 </para></listitem>
79 <listitem><para>A clean design with well defined layering is
80 important</para></listitem>
81 <listitem><para>DDX specific global variables are a nono
82 </para></listitem>
83 <listitem><para>The structure should be flexible enough to allow
84 future extensions</para></listitem>
85 <listitem><para>The structure should minimize duplication of
86 common code</para></listitem>
87 </itemizedlist></para></listitem>
88 <listitem><para>keep important features in mind
89 <itemizedlist>
90 <listitem><para>multiple screens, including multiple instances
91 of drivers</para></listitem>
92 <listitem><para>mixing different color depths and visuals on
93 different and ideally even on the same screen
94 </para></listitem>
95 <listitem><para>better control of the PCI device used
96 </para></listitem>
97 <listitem><para>better config file parser</para></listitem>
98 <listitem><para>get rid of all VGA compatibility assumptions
99 </para></listitem>
100 </itemizedlist></para></listitem>
101 </itemizedlist>
102 </para>
103
104 <para>
105While the XFree86 project had a goal of avoiding changes to the DIX
106layer unless they found major deficiencies there, to avoid divergence from
107the X.Org sample implementation they were integrating changes from, the
108X.Org developers now maintain both sides, and make changes where they are
109most appropriate. This document concentrates on the XFree86 DDX layer used
110in the Xorg server itself (the code found in <filename>hw/xfree86</filename>
111in the source tree), and developers will also want to refer to the
112<filename>Xserver-spec</filename> documentation that covers the DIX layer
113routines common to all the X servers in the sample implementation.
114 </para>
115 </sect1>
116
117 <sect1>
118 <title>The xorg.conf File</title>
119
120 <para>
121The xorg.conf file format is based on the XF86Config format from XFree86 4.4,
122which is in turn similar to the old XFree86 3.x XF86Config format, with the
123following changes:
124 </para>
125
126 <sect2>
127 <title>&k.device; section</title>
128
129 <para>
130 The &k.device; sections are similar to what they used to be, and
131 describe hardware-specific information for a single video card.
132 &k.device;
133 Some new keywords are added:
134
135
136 <variablelist>
137 <varlistentry><term>Driver "drivername"</term>
138 <listitem><para>
139 Specifies the name of the driver to be used for the card. This
140 is mandatory.
141 </para></listitem></varlistentry>
142 <varlistentry><term>BusID "busslot"</term>
143 <listitem><para>
144 Specifies uniquely the location of the card on the bus. The
145 purpose is to identify particular cards in a multi-headed
146 configuration. The format of the argument is intentionally
147 vague, and may be architecture dependent. For a PCI bus, it
148 is something like "bus:slot:func".
149 </para></listitem></varlistentry>
150 </variablelist>
151 </para>
152
153 <para>
154 A &k.device; section is considered <quote>active</quote> if there is a reference
155 to it in an active &k.screen; section.
156 </para>
157 </sect2>
158
159 <sect2>
160 <title>&k.screen; section</title>
161
162 <para>
163 The &k.screen; sections are similar to what they used to be. They
164 no longer have a &k.driver; keyword, but an &k.identifier; keyword
165 is added. (The &k.driver; keyword may be accepted in place of the
166 &k.identifier; keyword for compatibility purposes.) The identifier
167 can be used to identify which screen is to be active when multiple
168 &k.screen; sections are present. It is possible to specify the active
169 screen from the command line. A default is chosen in the absence
170 of one being specified. A &k.screen; section is considered <quote>active</quote>
171 if there is a reference to it either from the command line, or from
172 an active &k.serverlayout; section.
173 </para>
174 </sect2>
175
176 <sect2>
177 <title>&k.inputdevice; section</title>
178
179 <para>
180 The &k.inputdevice; section is a new section that describes
181 configuration information for input devices. It replaces the old
182 <emphasis>Keyboard</emphasis>, <emphasis>Pointer</emphasis> and <emphasis>XInput</emphasis>
183 sections. Like the &k.device; section, it has two mandatory keywords:
184 &k.identifier; and &k.driver;. For compatibility purposes the old
185 <emphasis>Keyboard</emphasis> and <emphasis>Pointer</emphasis> sections are
186 converted by the parser into &k.inputdevice; sections as follows:
187
188 <variablelist>
189 <varlistentry><term><emphasis>Keyboard</emphasis></term>
190 <listitem><literallayout>
191 &k.identifier; "Implicit Core Keyboard"
192 &k.driver; "kbd"
193 </literallayout></listitem></varlistentry>
194 <varlistentry><term><emphasis>Pointer</emphasis></term>
195 <listitem><literallayout>
196 &k.identifier; "Implicit Core Pointer"
197 &k.driver; "mouse"
198 </literallayout></listitem></varlistentry>
199 </variablelist>
200 </para>
201
202 <para>
203 An &k.inputdevice; section is considered active if there is a
204 reference to it in an active &k.serverlayout; section. An
205 &k.inputdevice; section may also be referenced implicitly if there
206 is no &k.serverlayout; section, if the <option>-screen</option> command
207 line options is used, or if the &k.serverlayout; section doesn't
208 reference any &k.inputdevice; sections. In this case, the first
209 sections with drivers "kbd" and "mouse" are used as the core
210 keyboard and pointer respectively.
211 </para>
212 </sect2>
213
214 <sect2>
215 <title>&k.serverlayout; section</title>
216
217 <para>
218 The &k.serverlayout; section is a new section that is used to identify
219 which &k.screen; sections are to be used in a multi-headed configuration,
220 and the relative layout of those screens. It also identifies which
221 &k.inputdevice; sections are to be used. Each &k.serverlayout; section
222 has an identifier, a list of &k.screen; section identifiers, and a list of
223 &k.inputdevice; section identifiers. &k.serverflags; options may also be
224 included in a &k.serverlayout; section, making it possible to override
225 the global values in the &k.serverflags; section.
226 </para>
227
228 <para>
229 A &k.serverlayout; section can be made active by being referenced on
230 the command line. In the absence of this, a default will be chosen
231 (the first one found). The screen names may optionally be followed
232 by a number specifying the preferred screen number, and optionally
233 by information specifying the physical positioning of the screen,
234 either in absolute terms or relative to another screen (or screens).
235 When no screen number is specified, they are numbered according to
236 the order in which they are listed. The old (now obsolete) method
237 of providing the positioning information is to give the names of
238 the four adjacent screens. The order of these is top, bottom, left,
239 right. Here is an example of a &k.serverlayout; section for two
240 screens using the old method, with the second located to the right
241 of the first:
242
243 <programlisting>
244 Section "ServerLayout"
245 Identifier "Main Layout"
246 Screen 0 "Screen 1" "" "" "" "Screen 2"
247 Screen 1 "Screen 2"
248 Screen "Screen 3"
249 EndSection
250 </programlisting>
251 </para>
252
253 <para>
254 The preferred way of specifying the layout is to explicitly specify
255 the screen's location in absolute terms or relative to another
256 screen.
257 </para>
258
259 <para>
260 In the absolute case, the upper left corner's coordinates are given
261 after the <emphasis>Absolute</emphasis> keyword. If the coordinates are
262 omitted, a value of <code>(0,0)</code> is assumed. An example
263 of absolute positioning follows:
264
265 <programlisting>
266 Section "ServerLayout"
267 Identifier "Main Layout"
268 Screen 0 "Screen 1" Absolute 0 0
269 Screen 1 "Screen 2" Absolute 1024 0
270 Screen "Screen 3" Absolute 2048 0
271 EndSection
272 </programlisting>
273 </para>
274
275 <para>
276 In the relative case, the position is specified by either using one of
277 the following keywords followed by the name of the reference screen:
278
279 <simplelist type='vert' columns='1'>
280 <member><emphasis>RightOf</emphasis></member>
281 <member><emphasis>LeftOf</emphasis></member>
282 <member><emphasis>Above</emphasis></member>
283 <member><emphasis>Below</emphasis></member>
284 <member><emphasis>Relative</emphasis></member>
285 </simplelist>
286 </para>
287
288 <para>
289 When the <emphasis>Relative</emphasis> keyword is used, the reference screen
290 name is followed by the coordinates of the new screen's origin
291 relative to reference screen. The following example shows how to use
292 some of the relative positioning options.
293
294 <programlisting>
295 Section "ServerLayout"
296 Identifier "Main Layout"
297 Screen 0 "Screen 1"
298 Screen 1 "Screen 2" RightOf "Screen 1"
299 Screen "Screen 3" Relative "Screen 1" 2048 0
300 EndSection
301 </programlisting>
302 </para>
303 </sect2>
304
305 <sect2>
306 <title>Options</title>
307
308 <para>
309 Options are used more extensively. They may appear in most sections
310 now. Options related to drivers can be present in the &k.screen;,
311 &k.device; and &k.monitor; sections and the &k.display; subsections.
312 The order of precedence is &k.display;, &k.screen;, &k.monitor;,
313 &k.device;. Options have been extended to allow an optional value
314 to be specified in addition to the option name. For more details
315 about options, see the <link linkend="options">Options</link> section
316 for details.
317 </para>
318 </sect2>
319 </sect1>
320
321 <sect1>
322 <title>Driver Interface</title>
323
324 <para>
325The driver interface consists of a minimal set of entry points that are
326required based on the external events that the driver must react to.
327No non-essential structure is imposed on the way they are used beyond
328that. This is a significant difference compared with the old design.
329 </para>
330
331 <para>
332The entry points for drawing operations are already taken care of by
333the framebuffer code. Extensions and enhancements to framebuffer code
334are outside the scope of this document.
335 </para>
336
337 <para>
338This approach to the driver interface provides good flexibility, but does
339increase the complexity of drivers. To help address this, the XFree86
340common layer provides a set of <quote>helper</quote> functions to take care of things
341that most drivers need. These helpers help minimise the amount of code
342duplication between drivers. The use of helper functions by drivers is
343however optional, though encouraged. The basic philosophy behind the
344helper functions is that they should be useful to many drivers, that
345they should balance this against the complexity of their interface. It
346is inevitable that some drivers may find some helpers unsuitable and
347need to provide their own code.
348 </para>
349
350 <para>
351Events that a driver needs to react to are:
352
353 <variablelist>
354 <varlistentry><term>ScreenInit</term>
355
356 <listitem><para>
357 An initialisation function is called from the DIX layer for each
358 screen at the start of each server generation.
359 </para></listitem></varlistentry>
360
361 <varlistentry><term>Enter VT</term>
362
363 <listitem><para>
364 The server takes control of the console.
365 </para></listitem></varlistentry>
366
367 <varlistentry><term>Leave VT</term>
368
369 <listitem><para>
370 The server releases control of the console.
371 </para></listitem></varlistentry>
372
373 <varlistentry><term>Mode Switch</term>
374
375 <listitem><para>
376 Change video mode.
377 </para></listitem></varlistentry>
378
379 <varlistentry><term>ViewPort change</term>
380
381 <listitem><para>
382 Change the origin of the physical view port.
383 </para></listitem></varlistentry>
384
385 <varlistentry><term>ScreenSaver state change</term>
386
387 <listitem><para>
388 Screen saver activation/deactivation.
389 </para></listitem></varlistentry>
390
391 <varlistentry><term>CloseScreen</term>
392
393 <listitem><para>
394 A close screen function is called from the DIX layer for each screen
395 at the end of each server generation.
396 </para></listitem></varlistentry>
397 </variablelist>
398 </para>
399
400
401 <para>
402In addition to these events, the following functions are required by
403the XFree86 common layer:
404
405 <variablelist>
406 <varlistentry><term>Identify</term>
407
408 <listitem><para>
409 Print a driver identifying message.
410 </para></listitem></varlistentry>
411
412 <varlistentry><term>Probe</term>
413
414 <listitem><para>
415 This is how a driver identifies if there is any hardware present that
416 it knows how to drive.
417 </para></listitem></varlistentry>
418
419 <varlistentry><term>PreInit</term>
420
421 <listitem><para>
422 Process information from the xorg.conf file, determine the
423 full characteristics of the hardware, and determine if a valid
424 configuration is present.
425 </para></listitem></varlistentry>
426 </variablelist>
427 </para>
428
429 <para>
430The VidMode extension also requires:
431
432 <variablelist>
433 <varlistentry><term>ValidMode</term>
434
435 <listitem><para>
436 Identify if a new mode is usable with the current configuration.
437 The PreInit function (and/or helpers it calls) may also make use
438 of the ValidMode function or something similar.
439 </para></listitem></varlistentry>
440 </variablelist>
441 </para>
442
443
444 <para>
445Other extensions may require other entry points. The drivers will
446inform the common layer of these in such cases.
447 </para>
448 </sect1>
449
450 <sect1>
451 <title>Resource Access Control Introduction</title>
452
453 <para>
454Graphics devices are accessed through ranges in I/O or memory space.
455While most modern graphics devices allow relocation of such ranges many
456of them still require the use of well established interfaces such as
457VGA memory and IO ranges or 8514/A IO ranges. With modern buses (like
458PCI) it is possible for multiple video devices to share access to these
459resources. The RAC (Resource Access Control) subsystem provides a
460mechanism for this.
461 </para>
462
463 <sect2>
464 <title>Terms and Definitions</title>
465
466 <sect3>
467 <title>Bus</title>
468
469 <para>
470 <quote>Bus</quote> is ambiguous as it is used for different things: it may refer
471 to physical incompatible extension connectors in a computer system.
472 The RAC system knows two such systems: The ISA bus and the PCI bus.
473 (On the software level EISA, MCA and VL buses are currently treated
474 like ISA buses). <quote>Bus</quote> may also refer to logically different
475 entities on a single bus system which are connected via bridges. A
476 PCI system may have several distinct PCI buses connecting each other
477 by PCI-PCI bridges or to the host CPU by HOST-PCI bridges.
478 </para>
479
480 <para>
481 Systems that host more than one bus system link these together using
482 bridges. Bridges are a concern to RAC as they might block or pass
483 specific resources. PCI-PCI bridges may be set up to pass VGA
484 resources to the secondary bus. PCI-ISA buses pass any resources not
485 decoded on the primary PCI bus to the ISA bus. This way VGA resources
486 (although exclusive on the ISA bus) can be shared by ISA and PCI
487 cards. Currently HOST-PCI bridges are not yet handled by RAC as they
488 require specific drivers.
489 </para>
490 </sect3>
491
492 <sect3>
493 <title>Entity</title>
494
495 <para>
496 The smallest independently addressable unit on a system bus is
497 referred to as an entity. So far we know ISA and PCI entities. PCI
498 entities can be located on the PCI bus by an unique ID consisting of
499 the bus, card and function number.
500 </para>
501 </sect3>
502
503 <sect3>
504 <title>Resource</title>
505
506 <para>
507 <quote>Resource</quote> refers to a range of memory or I/O addresses an entity
508 can decode.
509 </para>
510
511 <para>
512 If a device is capable of disabling this decoding the resource is
513 called sharable. For PCI devices a generic method is provided to
514 control resource decoding. Other devices will have to provide a
515 device specific function to control decoding.
516 </para>
517
518 <para>
519 If the entity is capable of decoding this range at a different
520 location this resource is considered relocatable.
521 </para>
522
523 <para>
524 Resources which start at a specific address and occupy a single
525 continuous range are called block resources.
526 </para>
527
528 <para>
529 Alternatively resource addresses can be decoded in a way that they
530 satisfy the conditions:
531 <programlisting>
532 address &amp; mask == base
533 </programlisting>
534 and
535 <programlisting>
536 base &amp; mask == base
537 </programlisting>
538 Resources addressed in such a way are called sparse resources.
539 </para>
540
541 </sect3>
542
543 <sect3>
544 <title>Server States</title>
545
546 <para>
547 The resource access control system knows two server states: the
548 SETUP and the OPERATING state. The SETUP state is entered whenever
549 a mode change takes place or the server exits or does VT switching.
550 During this state all entity resources are under resource access
551 control. During OPERATING state only those entities are controlled
552 which actually have shared resources that conflict with others.
553 </para>
554 </sect3>
555 </sect2>
556 </sect1>
557
558 <sect1>
559 <title>Control Flow in the Server and Mandatory Driver Functions</title>
560
561 <para>
562At the start of each server generation, <function>main()</function>
563(<filename>dix/main.c</filename>) calls the DDX function
564<function>InitOutput()</function>. This is the first place that the DDX gets
565control. <function>InitOutput()</function> is expected to fill in the global
566<structname>screenInfo</structname> struct, and one
567<structfield>screenInfo.screen[]</structfield> entry for each screen present.
568Here is what <function>InitOutput()</function> does:
569 </para>
570
571 <sect2>
572 <title>Parse the xorg.conf file</title>
573
574 <para>
575 This is done at the start of the first server generation only.
576 </para>
577
578 <para>
579 The xorg.conf file is read in full, and the resulting information
580 stored in data structures. None of the parsed information is
581 processed at this point. The parser data structures are opaque to
582 the video drivers and to most of the common layer code.
583 </para>
584
585 <para>
586 The entire file is parsed first to remove any section ordering
587 requirements.
588 </para>
589 </sect2>
590
591
592 <sect2>
593 <title>Initial processing of parsed information and command line options
594 </title>
595
596 <para>
597 This is done at the start of the first server generation only.
598 </para>
599
600 <para>
601 The initial processing is to determine paths like the
602 <emphasis>ModulePath</emphasis>, etc, and to determine which &k.serverlayout;,
603 &k.screen; and &k.device; sections are active.
604 </para>
605 </sect2>
606
607
608 <sect2>
609 <title>Enable port I/O access</title>
610
611 <para>
612 Port I/O access is controlled from the XFree86 common layer, and is
613 <quote>all or nothing</quote>. It is enabled prior to calling driver probes, at
614 the start of subsequent server generations, and when VT switching
615 back to the Xserver. It is disabled at the end of server generations,
616 and when VT switching away from the Xserver.
617 </para>
618
619 <para>
620 The implementation details of this may vary on different platforms.
621 </para>
622 </sect2>
623
624
625 <sect2>
626 <title>General bus probe</title>
627
628 <para>
629 This is done at the start of the first server generation only.
630 </para>
631
632 <para>
633 In the case of ix86 machines, this will be a general PCI probe.
634 The full information obtained here will be available to the drivers.
635 This information persists for the life of the Xserver. In the PCI
636 case, the PCI information for all video cards found is available by
637 calling <function>xf86GetPciVideoInfo()</function>.
638 </para>
639
640 <blockquote><para>
641 <programlisting>
642 pciVideoPtr *xf86GetPciVideoInfo(void);
643 </programlisting>
644 <blockquote><para>
645 returns a pointer to a list of pointers to
646 <structname>pciVideoRec</structname> entries, of which there is one for
647 each detected PCI video card. The list is terminated with a
648 <constant>NULL</constant> pointer. If no PCI video cards were
649 detected, the return value is <constant>NULL</constant>.
650
651 </para></blockquote>
652 </para></blockquote>
653
654 <para>
655 After the bus probe, the resource broker is initialised.
656 </para>
657 </sect2>
658
659
660 <sect2>
661 <title>Load initial set of modules</title>
662
663 <para>
664 This is done at the start of the first server generation only.
665 </para>
666
667 <para>
668 The next set of modules loaded are those specified explicitly in the
669 &k.module; section of the config file.
670 </para>
671
672 <para>
673 The final set of initial modules are the driver modules referenced
674 by the active &k.device; and &k.inputdevice; sections in the config
675 file. Each of these modules is loaded exactly once.
676 </para>
677 </sect2>
678
679
680 <sect2>
681 <title>Register Video and Input Drivers</title>
682
683 <para>
684 This is done at the start of the first server generation only.
685 </para>
686
687 <para>
688 When a driver module is loaded, the loader calls its
689 <function>Setup</function> function. For video drivers, this function
690 calls <function>xf86AddDriver()</function> to register the driver's
691 <structname>DriverRec</structname>, which contains a small set of essential
692 details and driver entry points required during the early phase of
693 <function>InitOutput()</function>. <function>xf86AddDriver()</function>
694 adds it to the global <varname>xf86DriverList[]</varname> array.
695 </para>
696
697 <para>
698 The <structname>DriverRec</structname> contains the driver canonical name,
699 the <function>Identify()</function>,
700 <function>Probe()</function> and <function>AvailableOptions()</function>
701 function entry points as well as a pointer
702 to the driver's module (as returned from the loader when the driver
703 was loaded) and a reference count which keeps track of how many
704 screens are using the driver. The entry driver entry points are
705 those required prior to the driver allocating and filling in its
706 <structname>ScrnInfoRec</structname>.
707 </para>
708
709 <para>
710 For a static server, the <varname>xf86DriverList[]</varname> array is
711 initialised at build time, and the loading of modules is not done.
712 </para>
713
714 <para>
715 A similar procedure is used for input drivers. The input driver's
716 <function>Setup</function> function calls
717 <function>xf86AddInputDriver()</function> to register the driver's
718 <structname>InputDriverRec</structname>, which contains a small set of
719 essential details and driver entry points required during the early
720 phase of <function>InitInput()</function>.
721 <function>xf86AddInputDriver()</function> adds it to the global
722 <varname>xf86InputDriverList[]</varname> array. For a static server,
723 the <varname>xf86InputDriverList[]</varname> array is initialised at
724 build time.
725 </para>
726
727 <para>
728 Both the <varname>xf86DriverList[]</varname> and
729 <varname>xf86InputDriverList[]</varname> arrays have been initialised
730 by the end of this stage.
731 </para>
732
733 <para>
734 Once all the drivers are registered, their
735 <function>ChipIdentify()</function> functions are called.
736 </para>
737
738 <blockquote><para>
739 <programlisting>
740 void ChipIdentify(int flags);
741 </programlisting>
742 <blockquote><para>
743 This is expected to print a message indicating the driver name,
744 a short summary of what it supports, and a list of the chipset
745 names that it supports. It may use the xf86PrintChipsets() helper
746 to do this.
747 </para></blockquote>
748 </para></blockquote>
749
750 <blockquote><para>
751 <programlisting>
752 void xf86PrintChipsets(const char *drvname, const char *drvmsg,
753 SymTabPtr chips);
754 </programlisting>
755 <blockquote><para>
756 This function provides an easy way for a driver's ChipIdentify
757 function to format the identification message.
758 </para></blockquote>
759 </para></blockquote>
760 </sect2>
761
762 <sect2>
763 <title>Initialise Access Control</title>
764
765 <para>
766 This is done at the start of the first server generation only.
767 </para>
768
769 <para>
770 The Resource Access Control (RAC) subsystem is initialised before
771 calling any driver functions that may access hardware. All generic
772 bus information is probed and saved (for restoration later). All
773 (shared resource) video devices are disabled at the generic bus
774 level, and a probe is done to find the <quote>primary</quote> video device. These
775 devices remain disabled for the next step.
776 </para>
777 </sect2>
778
779
780 <sect2 id="probe">
781 <title>Video Driver Probe</title>
782
783 <para>
784 This is done at the start of the first server generation only. The
785 <function>ChipProbe()</function> function of each registered video driver
786 is called.
787 </para>
788
789 <blockquote><para>
790 <programlisting>
791 Bool ChipProbe(DriverPtr drv, int flags);
792 </programlisting>
793 <blockquote><para>
794 The purpose of this is to identify all instances of hardware
795 supported by the driver. The flags value is currently either 0,
796 <constant>PROBE_DEFAULT</constant> or <constant>PROBE_DETECT</constant>.
797 <constant>PROBE_DETECT</constant> is used if "-configure" or "-probe"
798 command line arguments are given and indicates to the
799 <function>Probe()</function> function that it should not configure the
800 bus entities and that no xorg.conf information is available.
801 </para>
802
803 <para>
804 The probe must find the active device sections that match the
805 driver by calling <function>xf86MatchDevice()</function>. The number
806 of matches found limits the maximum number of instances for this
807 driver. If no matches are found, the function should return
808 <constant>FALSE</constant> immediately.
809 </para>
810
811 <para>
812 Devices that cannot be identified by using device-independent
813 methods should be probed at this stage (keeping in mind that access
814 to all resources that can be disabled in a device-independent way
815 are disabled during this phase). The probe must be a minimal
816 probe. It should just determine if there is a card present that
817 the driver can drive. It should use the least intrusive probe
818 methods possible. It must not do anything that is not essential,
819 like probing for other details such as the amount of memory
820 installed, etc. It is recommended that the
821 <function>xf86MatchPciInstances()</function> helper function be used
822 for identifying matching PCI devices, and similarly the
823 <function>xf86MatchIsaInstances()</function> for ISA (non-PCI) devices
824 (see the <link linkend="rac">RAC</link> section). These helpers also
825 checks and claims the appropriate entity. When not using the
826 helper, that should be done with <function>xf86CheckPciSlot()</function>
827 and <function>xf86ClaimPciSlot()</function> for PCI devices and
828 <function>xf86ClaimIsaSlot()</function> for ISA devices (see the
829 <link linkend="rac">RAC</link> section).
830 </para>
831
832 <para>
833 The probe must register all non-relocatable resources at this
834 stage. If a resource conflict is found between exclusive resources
835 the driver will fail immediately. This is usually best done with
836 the <function>xf86ConfigPciEntity()</function> helper function
837 for PCI and <function>xf86ConfigIsaEntity()</function> for ISA
838 (see the <link linkend="rac">RAC</link> section). It is possible to
839 register some entity specific functions with those helpers. When
840 not using the helpers, the <function>xf86AddEntityToScreen()</function>
841 <function>xf86ClaimFixedResources()</function> and
842 <function>xf86SetEntityFuncs()</function> should be used instead (see
843 the <link linkend="rac">RAC</link> section).
844 </para>
845
846 <para>
847 If a chipset is specified in an active device section which the
848 driver considers relevant (ie it has no driver specified, or the
849 driver specified matches the driver doing the probe), the Probe
850 must return <constant>FALSE</constant> if the chipset doesn't match
851 one supported by the driver.
852 </para>
853
854 <para>
855 If there are no active device sections that the driver considers
856 relevant, it must return <constant>FALSE</constant>.
857 </para>
858
859 <para>
860 Allocate a <structname>ScrnInfoRec</structname> for each active instance of the
861 hardware found, and fill in the basic information, including the
862 other driver entry points. This is best done with the
863 <function>xf86ConfigIsaEntity()</function> helper function for ISA
864 instances or <function>xf86ConfigPciEntity()</function> for PCI instances.
865 These functions allocate a <structname>ScrnInfoRec</structname> for active
866 entities. Optionally <function>xf86AllocateScreen()</function>
867 function may also be used to allocate the <structname>ScrnInfoRec</structname>.
868 Any of these functions take care of initialising fields to defined
869 <quote>unused</quote> values.
870 </para>
871
872 <para>
873 Claim the entities for each instance of the hardware found. This
874 prevents other drivers from claiming the same hardware.
875 </para>
876
877 <para>
878 Must leave hardware in the same state it found it in, and must not
879 do any hardware initialisation.
880 </para>
881
882 <para>
883 All detection can be overridden via the config file, and that
884 parsed information is available to the driver at this stage.
885 </para>
886
887 <para>
888 Returns <constant>TRUE</constant> if one or more instances are found,
889 and <constant>FALSE</constant> otherwise.
890 </para>
891
892 </blockquote></para></blockquote>
893
894 <blockquote><para>
895 <programlisting>
896 int xf86MatchDevice(const char *drivername,
897 GDevPtr **driversectlist)
898 </programlisting>
899 <blockquote><para>
900 This function takes the name of the driver and returns via
901 <parameter>driversectlist</parameter> a list of device sections that
902 match the driver name. The function return value is the number
903 of matches found. If a fatal error is encountered the return
904 value is <literal>-1</literal>.
905 </para>
906
907 <para>
908 The caller should use <function>xfree()</function> to free
909 <parameter>*driversectlist</parameter> when it is no longer needed.
910 </para>
911
912 </blockquote></para></blockquote>
913
914 <blockquote><para>
915 <programlisting>
916 ScrnInfoPtr xf86AllocateScreen(DriverPtr drv, int flags)
917 </programlisting>
918 <blockquote><para>
919 This function allocates a new <structname>ScrnInfoRec</structname> in the
920 <varname>xf86Screens[]</varname> array. This function is normally
921 called by the video driver <function>ChipProbe()</function> functions.
922 The return value is a pointer to the newly allocated
923 <structname>ScrnInfoRec</structname>. The <structfield>scrnIndex</structfield>,
924 <structfield>origIndex</structfield>, <structfield>module</structfield> and
925 <structfield>drv</structfield> fields are initialised. The reference count
926 in <parameter>drv</parameter> is incremented. The storage for any
927 currently allocated <quote>privates</quote> pointers is also allocated and
928 the <structfield>privates</structfield> field initialised (the privates data
929 is of course not allocated or initialised). This function never
930 returns on failure. If the allocation fails, the server exits
931 with a fatal error. The flags value is not currently used, and
932 should be set to zero.
933 </para></blockquote>
934 </para></blockquote>
935
936 <para>
937 At the completion of this, a list of <structname>ScrnInfoRecs</structname>
938 have been allocated in the <varname>xf86Screens[]</varname> array, and
939 the associated entities and fixed resources have been claimed. The
940 following <structname>ScrnInfoRec</structname> fields must be initialised at
941 this point:
942
943 <literallayout>
944 driverVersion
945 driverName
946 scrnIndex(*)
947 origIndex(*)
948 drv(*)
949 module(*)
950 name
951 Probe
952 PreInit
953 ScreenInit
954 EnterVT
955 LeaveVT
956 numEntities
957 entityList
958 access
959 </literallayout>
960
961 <literal>(*)</literal> These are initialised when the <structname>ScrnInfoRec</structname>
962 is allocated, and not explicitly by the driver.
963 </para>
964
965 <para>
966 The following <structname>ScrnInfoRec</structname> fields must be initialised
967 if the driver is going to use them:
968
969 <literallayout>
970 SwitchMode
971 AdjustFrame
972 FreeScreen
973 ValidMode
974 </literallayout>
975 </para>
976 </sect2>
977
978 <sect2>
979 <title>Matching Screens</title>
980
981 <para>
982 This is done at the start of the first server generation only.
983 </para>
984
985 <para>
986 After the Probe phase is finished, there will be some number of
987 <structname>ScrnInfoRec</structname>s. These are then matched with the active
988 &k.screen; sections in the xorg.conf, and those not having an active
989 &k.screen; section are deleted. If the number of remaining screens
990 is 0, <function>InitOutput()</function> sets
991 <structfield>screenInfo.numScreens</structfield> to <constant>0</constant> and
992 returns.
993 </para>
994
995 <para>
996 At this point the following fields of the <structname>ScrnInfoRec</structname>s
997 must be initialised:
998
999 <literallayout>
1000 confScreen
1001 </literallayout>
1002 </para>
1003
1004 </sect2>
1005
1006 <sect2>
1007 <title>Allocate non-conflicting resources</title>
1008
1009 <para>
1010 This is done at the start of the first server generation only.
1011 </para>
1012
1013 <para>
1014 Before calling the drivers again, the resource information collected
1015 from the Probe phase is processed. This includes checking the extent
1016 of PCI resources for the probed devices, and resolving any conflicts
1017 in the relocatable PCI resources. It also reports conflicts, checks
1018 bus routing issues, and anything else that is needed to enable the
1019 entities for the next phase.
1020 </para>
1021
1022 <para>
1023 If any drivers registered an <function>EntityInit()</function> function
1024 during the Probe phase, then they are called here.
1025 </para>
1026
1027 </sect2>
1028
1029 <sect2>
1030 <title>Sort the Screens and pre-check Monitor Information</title>
1031
1032 <para>
1033 This is done at the start of the first server generation only.
1034 </para>
1035
1036 <para>
1037 The list of screens is sorted to match the ordering requested in the
1038 config file.
1039 </para>
1040
1041 <para>
1042 The list of modes for each active monitor is checked against the
1043 monitor's parameters. Invalid modes are pruned.
1044 </para>
1045
1046 </sect2>
1047
1048 <sect2>
1049 <title>PreInit</title>
1050
1051 <para>
1052 This is done at the start of the first server generation only.
1053 </para>
1054
1055 <para>
1056 For each <structname>ScrnInfoRec</structname>, enable access to the screens entities and call
1057 the <function>ChipPreInit()</function> function.
1058 </para>
1059
1060 <blockquote><para>
1061 <programlisting>
1062 Bool ChipPreInit(ScrnInfoRec screen, int flags);
1063 </programlisting>
1064 <blockquote><para>
1065 The purpose of this function is to find out all the information
1066 required to determine if the configuration is usable, and to
1067 initialise those parts of the <structname>ScrnInfoRec</structname> that
1068 can be set once at the beginning of the first server generation.
1069 </para>
1070
1071 <para>
1072 The number of entities registered for the screen should be checked
1073 against the expected number (most drivers expect only one). The
1074 entity information for each of them should be retrieved (with
1075 <function>xf86GetEntityInfo()</function>) and checked for the correct
1076 bus type and that none of the sharable resources registered during
1077 the Probe phase was rejected.
1078 </para>
1079
1080 <para>
1081 Access to resources for the entities that can be controlled in a
1082 device-independent way are enabled before this function is called.
1083 If the driver needs to access any resources that it has disabled
1084 in an <function>EntityInit()</function> function that it registered,
1085 then it may enable them here providing that it disables them before
1086 this function returns.
1087 </para>
1088
1089 <para>
1090 This includes probing for video memory, clocks, ramdac, and all
1091 other HW info that is needed. It includes determining the
1092 depth/bpp/visual and related info. It includes validating and
1093 determining the set of video modes that will be used (and anything
1094 that is required to determine that).
1095 </para>
1096
1097 <para>
1098 This information should be determined in the least intrusive way
1099 possible. The state of the HW must remain unchanged by this
1100 function. Although video memory (including MMIO) may be mapped
1101 within this function, it must be unmapped before returning. Driver
1102 specific information should be stored in a structure hooked into
1103 the <structname>ScrnInfoRec</structname>'s <structfield>driverPrivate</structfield>
1104 field. Any other modules which require persistent data (ie data
1105 that persists across server generations) should be initialised in
1106 this function, and they should allocate a <quote>privates</quote> index to
1107 hook their data into by calling
1108 <function>xf86AllocateScrnInfoPrivateIndex()</function>. The <quote>privates</quote>
1109 data is persistent.
1110 </para>
1111
1112 <para>
1113 Helper functions for some of these things are provided at the
1114 XFree86 common level, and the driver can choose to make use of
1115 them.
1116 </para>
1117
1118 <para>
1119 All additional resources that the screen needs must be registered
1120 here. This should be done with
1121 <function>xf86RegisterResources()</function>. If some of the fixed
1122 resources registered in the Probe phase are not needed or not
1123 decoded by the hardware when in the OPERATING server state, their
1124 status should be updated with
1125 <function>xf86SetOperatingState()</function>.
1126 </para>
1127
1128 <para>
1129 Modules may be loaded at any point in this function, and all
1130 modules that the driver will need must be loaded before the end
1131 of this function. Either the <function>xf86LoadSubModule()</function>
1132 or the <function>xf86LoadDrvSubModule()</function> function should be
1133 used to load modules depending on whether a
1134 <structname>ScrnInfoRec</structname> has been set up. A driver may unload
1135 a module within this function if it was only needed temporarily,
1136 and the <function>xf86UnloadSubModule()</function> function should be used
1137 to do that. Otherwise there is no need to explicitly unload modules
1138 because the loader takes care of module dependencies and will
1139 unload submodules automatically if/when the driver module is
1140 unloaded.
1141 </para>
1142
1143 <para>
1144 The bulk of the <structname>ScrnInfoRec</structname> fields should be filled
1145 out in this function.
1146 </para>
1147
1148 <para>
1149 <function>ChipPreInit()</function> returns <constant>FALSE</constant> when
1150 the configuration is unusable in some way (unsupported depth, no
1151 valid modes, not enough video memory, etc), and <constant>TRUE</constant>
1152 if it is usable.
1153 </para>
1154
1155 <para>
1156 It is expected that if the <function>ChipPreInit()</function> function
1157 returns <constant>TRUE</constant>, then the only reasons that subsequent
1158 stages in the driver might fail are lack or resources (like xalloc
1159 failures). All other possible reasons for failure should be
1160 determined by the <function>ChipPreInit()</function> function.
1161 </para></blockquote>
1162 </para></blockquote>
1163
1164 <para>
1165 The <structname>ScrnInfoRec</structname>s for screens where the <function>ChipPreInit()</function> fails are removed.
1166 If none remain, <function>InitOutput()</function> sets <structfield>screenInfo.numScreens</structfield> to <constant>0</constant> and returns.
1167 </para>
1168
1169 <para>
1170 At this point, further fields of the <structname>ScrnInfoRec</structname>s would normally be
1171 filled in. Most are not strictly mandatory, but many are required
1172 by other layers and/or helper functions that the driver may choose
1173 to use. The documentation for those layers and helper functions
1174 indicates which they require.
1175 </para>
1176
1177 <para>
1178 The following fields of the <structname>ScrnInfoRec</structname>s should be filled in if the
1179 driver is going to use them:
1180
1181 <literallayout>
1182 monitor
1183 display
1184 depth
1185 pixmapBPP
1186 bitsPerPixel
1187 weight (&gt;8bpp only)
1188 mask (&gt;8bpp only)
1189 offset (&gt;8bpp only)
1190 rgbBits (8bpp only)
1191 gamma
1192 defaultVisual
1193 maxHValue
1194 maxVValue
1195 virtualX
1196 virtualY
1197 displayWidth
1198 frameX0
1199 frameY0
1200 frameX1
1201 frameY1
1202 zoomLocked
1203 modePool
1204 modes
1205 currentMode
1206 progClock (TRUE if clock is programmable)
1207 chipset
1208 ramdac
1209 clockchip
1210 numClocks (if not programmable)
1211 clock[] (if not programmable)
1212 videoRam
1213 biosBase
1214 memBase
1215 memClk
1216 driverPrivate
1217 chipID
1218 chipRev
1219 </literallayout>
1220 </para>
1221
1222 <blockquote><para>
1223 <programlisting>
1224 pointer xf86LoadSubModule(ScrnInfoPtr pScrn, const char *name);
1225 and
1226 pointer xf86LoadDrvSubModule(DriverPtr drv, const char *name);
1227 </programlisting>
1228 <blockquote><para>
1229 Load a module that a driver depends on. This function loads the
1230 module <parameter>name</parameter> as a sub module of the driver. The
1231 return value is a handle identifying the new module. If the load
1232 fails, the return value will be <constant>NULL</constant>. If a driver
1233 needs to explicitly unload a module it has loaded in this way,
1234 the return value must be saved and passed to
1235 <function>xf86UnloadSubModule()</function> when unloading.
1236
1237 </para></blockquote>
1238 </para></blockquote>
1239
1240 <blockquote><para>
1241 <programlisting>
1242 void xf86UnloadSubModule(pointer module);
1243 </programlisting>
1244 <blockquote><para>
1245 Unloads the module referenced by <parameter>module</parameter>.
1246 <parameter>module</parameter> should be a pointer returned previously
1247 by <function>xf86LoadSubModule()</function> or
1248 <function>xf86LoadDrvSubModule()</function> .
1249
1250 </para></blockquote>
1251 </para></blockquote>
1252 </sect2>
1253
1254 <sect2>
1255 <title>Cleaning up Unused Drivers</title>
1256
1257 <para>
1258 At this point it is known which screens will be in use, and which
1259 drivers are being used. Unreferenced drivers (and modules they
1260 may have loaded) are unloaded here.
1261 </para>
1262
1263 </sect2>
1264
1265 <sect2>
1266 <title>Consistency Checks</title>
1267
1268 <para>
1269 The parameters that must be global to the server, like pixmap formats,
1270 bitmap bit order, bitmap scanline unit and image byte order are
1271 compared for each of the screens. If a mismatch is found, the server
1272 exits with an appropriate message.
1273 </para>
1274
1275 </sect2>
1276
1277 <sect2>
1278 <title>Check if Resource Control is Needed</title>
1279
1280 <para>
1281 Determine if resource access control is needed. This is the case
1282 if more than one screen is used. If necessary the RAC wrapper module
1283 is loaded.
1284 </para>
1285 </sect2>
1286
1287 <sect2>
1288 <title>AddScreen (ScreenInit)</title>
1289
1290 <para>
1291 At this point, the valid screens are known.
1292 <function>AddScreen()</function> is called for each of them, passing
1293 <function>ChipScreenInit()</function> as the argument.
1294 <function>AddScreen()</function> is a DIX function that allocates a new
1295 <structfield>screenInfo.screen[]</structfield> entry (aka
1296 <varname>pScreen</varname>), and does some basic initialisation of it.
1297 It then calls the <function>ChipScreenInit()</function> function, with
1298 <parameter>pScreen</parameter> as one of its arguments. If
1299 <function>ChipScreenInit()</function> returns <constant>FALSE</constant>,
1300 <function>AddScreen()</function> returns <constant>-1</constant>. Otherwise
1301 it returns the index of the screen. <function>AddScreen()</function>
1302 should only fail because of programming errors or failure to allocate
1303 resources (like memory). All configuration problems should be
1304 detected BEFORE this point.
1305 </para>
1306
1307 <blockquote><para>
1308 <programlisting>
1309 Bool ChipScreenInit(ScreenPtr pScreen,
1310 int argc, char **argv);
1311 </programlisting>
1312 <blockquote><para>
1313 This is called at the start of each server generation.
1314 </para>
1315
1316 <para>
1317 Fill in all of <parameter>pScreen</parameter>, possibly doing some of
1318 this by calling ScreenInit functions from other layers like mi,
1319 framebuffers (cfb, etc), and extensions.
1320 </para>
1321
1322 <para>
1323 Decide which operations need to be placed under resource access
1324 control. The classes of operations are the frame buffer operations
1325 (<constant>RAC_FB</constant>), the pointer operations
1326 (<constant>RAC_CURSOR</constant>), the viewport change operations
1327 (<constant>RAC_VIEWPORT</constant>) and the colormap operations
1328 (<constant>RAC_COLORMAP</constant>). Any operation that requires
1329 resources which might be disabled during OPERATING state should
1330 be set to use RAC. This can be specified separately for memory
1331 and IO resources (the <structfield>racMemFlags</structfield> and
1332 <structfield>racIoFlags</structfield> fields of the <structname>ScrnInfoRec</structname>
1333 respectively).
1334 </para>
1335
1336 <para>
1337 Map any video memory or other memory regions.
1338 </para>
1339
1340 <para>
1341 Save the video card state. Enough state must be saved so that
1342 the original state can later be restored.
1343 </para>
1344
1345 <para>
1346 Initialise the initial video mode. The <structname>ScrnInfoRec</structname>'s
1347 <structfield>vtSema</structfield> field should be set to <constant>TRUE</constant>
1348 just prior to changing the video hardware's state.
1349
1350 </para></blockquote>
1351 </para></blockquote>
1352
1353
1354 <para>
1355 The <function>ChipScreenInit()</function> function (or functions from other
1356 layers that it calls) should allocate entries in the
1357 <structname>ScreenRec</structname>'s <structfield>devPrivates</structfield> area by
1358 calling <function>AllocateScreenPrivateIndex()</function> if it needs
1359 per-generation storage. Since the <structname>ScreenRec</structname>'s
1360 <structfield>devPrivates</structfield> information is cleared for each server
1361 generation, this is the correct place to initialise it.
1362 </para>
1363
1364 <para>
1365 After <function>AddScreen()</function> has successfully returned, the
1366 following <structname>ScrnInfoRec</structname> fields are initialised:
1367
1368 <literallayout>
1369 pScreen
1370 racMemFlags
1371 racIoFlags
1372 </literallayout>
1373 </para>
1374
1375 <para>
1376 The <function>ChipScreenInit()</function> function should initialise the
1377 <structfield>CloseScreen</structfield> and <structfield>SaveScreen</structfield> fields
1378 of <parameter>pScreen</parameter>. The old value of
1379 <structfield>pScreen-&gt;CloseScreen</structfield> should be saved as part of
1380 the driver's per-screen private data, allowing it to be called from
1381 <function>ChipCloseScreen()</function>. This means that the existing
1382 <function>CloseScreen()</function> function is wrapped.
1383 </para>
1384 </sect2>
1385
1386 <sect2>
1387 <title>Finalising RAC Initialisation</title>
1388
1389 <para>
1390 After all the <function>ChipScreenInit()</function> functions have been
1391 called, each screen has registered its RAC requirements. This
1392 information is used to determine which shared resources are requested
1393 by more than one driver and set the access functions accordingly.
1394 This is done following these rules:
1395
1396 <orderedlist>
1397 <listitem><para>
1398 The sharable resources registered by each entity are compared.
1399 If a resource is registered by more than one entity the entity
1400 will be marked to indicate that it needs to share this resources
1401 type (IO or MEM).
1402 </para></listitem>
1403
1404 <listitem><para>
1405 A resource marked <quote>disabled</quote> during OPERATING state will be
1406 ignored entirely.
1407 </para></listitem>
1408
1409 <listitem><para>
1410 A resource marked <quote>unused</quote> will only conflict with an overlapping
1411 resource of an other entity if the second is actually in use
1412 during OPERATING state.
1413 </para></listitem>
1414
1415 <listitem><para>
1416 If an <quote>unused</quote> resource was found to conflict but the entity
1417 does not use any other resource of this type the entire resource
1418 type will be disabled for that entity.
1419 </para></listitem>
1420 </orderedlist>
1421 </para>
1422
1423 </sect2>
1424
1425 <sect2>
1426 <title>Finishing InitOutput()</title>
1427
1428 <para>
1429 At this point <function>InitOutput()</function> is finished, and all the
1430 screens have been setup in their initial video mode.
1431 </para>
1432
1433 </sect2>
1434
1435 <sect2>
1436 <title>Mode Switching</title>
1437
1438 <para>
1439 When a SwitchMode event is received, <function>ChipSwitchMode()</function>
1440 is called (when it exists):
1441 </para>
1442
1443 <blockquote><para>
1444 <programlisting>
1445 Bool ChipSwitchMode(int index, DisplayModePtr mode);
1446 </programlisting>
1447 <blockquote><para>
1448 Initialises the new mode for the screen identified by
1449 <parameter>index;</parameter>. The viewport may need to be adjusted
1450 also.
1451
1452 </para></blockquote>
1453 </para></blockquote>
1454
1455 </sect2>
1456
1457 <sect2>
1458 <title>Changing Viewport</title>
1459
1460 <para>
1461 When a Change Viewport event is received,
1462 <function>ChipAdjustFrame()</function> is called (when it exists):
1463 </para>
1464
1465 <blockquote><para>
1466 <programlisting>
1467 void ChipAdjustFrame(int index, int x, int y);
1468 </programlisting>
1469 <blockquote><para>
1470 Changes the viewport for the screen identified by
1471 <parameter>index;</parameter>.
1472 </para>
1473
1474 <para>
1475 It should be noted that many chipsets impose restrictions on where the
1476 viewport may be placed in the virtual resolution, either for alignment
1477 reasons, or to prevent the start of the viewport from being positioned
1478 within a pixel (as can happen in a 24bpp mode). After calculating the
1479 value the chipset's panning registers need to be set to for non-DGA
1480 modes, this function should recalculate the ScrnInfoRec's
1481 <structfield>frameX0</structfield>, <structfield>frameY0</structfield>, <structfield>frameX1</structfield>
1482 and <structfield>frameY1</structfield> fields to correspond to that value. If
1483 this is not done, switching to another mode might cause the position
1484 of a hardware cursor to change.
1485
1486 </para></blockquote>
1487 </para></blockquote>
1488
1489 </sect2>
1490
1491 <sect2>
1492 <title>VT Switching</title>
1493
1494 <para>
1495 When a VT switch event is received, <function>xf86VTSwitch()</function>
1496 is called. <function>xf86VTSwitch()</function> does the following:
1497
1498 <variablelist>
1499 <varlistentry><term>On ENTER:</term>
1500 <listitem>
1501 <itemizedlist>
1502 <listitem><para>
1503 enable port I/O access
1504 </para></listitem>
1505
1506 <listitem><para>
1507 save and initialise the bus/resource state
1508 </para></listitem>
1509
1510 <listitem><para>
1511 enter the SETUP server state
1512 </para></listitem>
1513
1514 <listitem><para>
1515 calls <function>ChipEnterVT()</function> for each screen
1516 </para></listitem>
1517
1518 <listitem><para>
1519 enter the OPERATING server state
1520 </para></listitem>
1521
1522 <listitem><para>
1523 validate GCs
1524 </para></listitem>
1525
1526 <listitem><para>
1527 Restore fb from saved pixmap for each screen
1528 </para></listitem>
1529
1530 <listitem><para>
1531 Enable all input devices
1532 </para></listitem>
1533 </itemizedlist>
1534 </listitem>
1535 </varlistentry>
1536 <varlistentry>
1537 <term>On LEAVE:</term>
1538 <listitem>
1539 <itemizedlist>
1540 <listitem><para>
1541 Save fb to pixmap for each screen
1542 </para></listitem>
1543
1544 <listitem><para>
1545 validate GCs
1546 </para></listitem>
1547
1548 <listitem><para>
1549 enter the SETUP server state
1550 </para></listitem>
1551
1552 <listitem><para>
1553 calls <function>ChipLeaveVT()</function> for each screen
1554 </para></listitem>
1555
1556 <listitem><para>
1557 disable all input devices
1558 </para></listitem>
1559
1560 <listitem><para>
1561 restore bus/resource state
1562 </para></listitem>
1563
1564 <listitem><para>
1565 disables port I/O access
1566 </para></listitem>
1567 </itemizedlist>
1568 </listitem>
1569 </varlistentry>
1570 </variablelist>
1571 </para>
1572
1573 <blockquote><para>
1574 <programlisting>
1575 Bool ChipEnterVT(ScrnInfoPtr pScrn);
1576 </programlisting>
1577 <blockquote><para>
1578 This function should initialise the current video mode and
1579 initialise the viewport, turn on the HW cursor if appropriate,
1580 etc.
1581 </para>
1582
1583 <para>
1584 Should it re-save the video state before initialising the video
1585 mode?
1586 </para>
1587
1588 </blockquote></para></blockquote>
1589
1590 <blockquote><para>
1591 <programlisting>
1592 void ChipLeaveVT(ScrnInfoPtr pScrn);
1593 </programlisting>
1594 <blockquote><para>
1595 This function should restore the saved video state. If
1596 appropriate it should also turn off the HW cursor, and invalidate
1597 any pixmap/font caches.
1598 </para>
1599
1600 </blockquote></para></blockquote>
1601
1602 <para>
1603 Optionally, <function>ChipLeaveVT()</function> may also unmap memory
1604 regions. If so, <function>ChipEnterVT()</function> will need to remap
1605 them. Additionally, if an aperture used to access video memory is
1606 unmapped and remapped in this fashion, <function>ChipEnterVT()</function>
1607 will also need to notify the framebuffer layers of the aperture's new
1608 location in virtual memory. This is done with a call to the screen's
1609 <function>ModifyPixmapHeader()</function> function, as follows
1610 </para>
1611
1612 <blockquote><para>
1613 <programlisting>
1614 (*pScreen-&gt;ModifyPixmapHeader)(pScrn-&gt;ppix,
1615 -1, -1, -1, -1, -1, NewApertureAddress);
1616 </programlisting>
1617 <blockquote><para>
1618 where the <structfield>ppix</structfield> field in a ScrnInfoRec
1619 points to the pixmap used by the screen's
1620 <function>SaveRestoreImage()</function> function to hold the screen's
1621 contents while switched out.
1622 </para>
1623
1624 </blockquote></para></blockquote>
1625
1626 <para>
1627 Other layers may wrap the <function>ChipEnterVT()</function> and
1628 <function>ChipLeaveVT()</function> functions if they need to take some
1629 action when these events are received.
1630 </para>
1631 </sect2>
1632
1633 <sect2>
1634 <title>End of server generation</title>
1635
1636 <para>
1637 At the end of each server generation, the DIX layer calls
1638 <function>ChipCloseScreen()</function> for each screen:
1639 </para>
1640
1641 <blockquote><para>
1642 <programlisting>
1643 Bool ChipCloseScreen(int index, ScreenPtr pScreen);
1644 </programlisting>
1645 <blockquote><para>
1646 This function should restore the saved video state and unmap the
1647 memory regions.
1648 </para>
1649
1650 <para>
1651 It should also free per-screen data structures allocated by the
1652 driver. Note that the persistent data held in the
1653 <structname>ScrnInfoRec</structname>'s <structfield>driverPrivate</structfield> field
1654 should not be freed here because it is needed by subsequent server
1655 generations.
1656 </para>
1657
1658 <para>
1659 The <structname>ScrnInfoRec</structname>'s <structfield>vtSema</structfield> field
1660 should be set to <constant>FALSE</constant> once the video HW state
1661 has been restored.
1662 </para>
1663
1664 <para>
1665 Before freeing the per-screen driver data the saved
1666 <structfield>CloseScreen</structfield> value should be restored to
1667 <structfield>pScreen-&gt;CloseScreen</structfield>, and that function should
1668 be called after freeing the data.
1669
1670 </para></blockquote>
1671 </para></blockquote>
1672 </sect2>
1673 </sect1>
1674
1675 <sect1>
1676 <title>Optional Driver Functions</title>
1677
1678 <para>
1679The functions outlined here can be called from the XFree86 common layer,
1680but their presence is optional.
1681 </para>
1682
1683 <sect2>
1684 <title>Mode Validation</title>
1685
1686 <para>
1687 When a mode validation helper supplied by the XFree86-common layer is
1688 being used, it can be useful to provide a function to check for hw
1689 specific mode constraints:
1690 </para>
1691
1692 <blockquote><para>
1693 <programlisting>
1694 ModeStatus ChipValidMode(ScrnInfoPtr pScrn, DisplayModePtr mode,
1695 Bool verbose, int flags);
1696 </programlisting>
1697 <blockquote><para>
1698 Check the passed mode for hw-specific constraints, and return the
1699 appropriate status value.
1700
1701 </para></blockquote>
1702 </para></blockquote>
1703
1704 <para>
1705This function may also modify the effective timings and clock of the passed
1706mode. These have been stored in the mode's <structfield>Crtc*</structfield> and
1707<structfield>SynthClock</structfield> elements, and have already been adjusted for
1708interlacing, doublescanning, multiscanning and clock multipliers and dividers.
1709The function should not modify any other mode field, unless it wants to modify
1710the mode timings reported to the user by <function>xf86PrintModes()</function>.
1711 </para>
1712
1713 <para>
1714The function is called once for every mode in the xorg.conf Monitor section
1715assigned to the screen, with <parameter>flags</parameter> set to
1716<constant>MODECHECK_INITIAL</constant>. It is subsequently called for every mode
1717in the xorg.conf Display subsection assigned to the screen, with
1718<parameter>flags</parameter> set to <constant>MODECHECK_FINAL</constant>. In the second
1719case, the mode will have successfully passed all other tests. In addition,
1720the <structname>ScrnInfoRec</structname>'s <structfield>virtualX</structfield>,
1721<structfield>virtualY</structfield> and <structfield>displayWidth</structfield> fields will have been
1722set as if the mode to be validated were to be the last mode accepted.
1723 </para>
1724
1725 <para>
1726In effect, calls with MODECHECK_INITIAL are intended for checks that do not
1727depend on any mode other than the one being validated, while calls with
1728MODECHECK_FINAL are intended for checks that may involve more than one mode.
1729 </para>
1730 </sect2>
1731
1732 <sect2>
1733 <title>Free screen data</title>
1734
1735 <para>
1736 When a screen is deleted prior to the completion of the ScreenInit
1737 phase the <function>ChipFreeScreen()</function> function is called when defined.
1738 </para>
1739
1740 <blockquote><para>
1741 <programlisting>
1742 void ChipFreeScreen(ScrnInfoPtr pScrn);
1743 </programlisting>
1744 <blockquote><para>
1745 Free any driver-allocated data that may have been allocated up to
1746 and including an unsuccessful <function>ChipScreenInit()</function>
1747 call. This would predominantly be data allocated by
1748 <function>ChipPreInit()</function> that persists across server
1749 generations. It would include the <structfield>driverPrivate</structfield>,
1750 and any <quote>privates</quote> entries that modules may have allocated.
1751
1752 </para></blockquote>
1753 </para></blockquote>
1754
1755 </sect2>
1756</sect1>
1757
1758 <sect1>
1759 <title>Recommended driver functions</title>
1760
1761 <para>
1762The functions outlined here are for internal use by the driver only.
1763They are entirely optional, and are never accessed directly from higher
1764layers. The sample function declarations shown here are just examples.
1765The interface (if any) used is up to the driver.
1766 </para>
1767
1768 <sect2>
1769 <title>Save</title>
1770
1771 <para>
1772 Save the video state. This could be called from <function>ChipScreenInit()</function> and
1773 (possibly) <function>ChipEnterVT()</function>.
1774 </para>
1775
1776 <blockquote><para>
1777 <programlisting>
1778 void ChipSave(ScrnInfoPtr pScrn);
1779 </programlisting>
1780 <blockquote><para>
1781 Saves the current state. This will only be saving pre-server
1782 states or states before returning to the server. There is only
1783 one current saved state per screen and it is stored in private
1784 storage in the screen.
1785
1786 </para></blockquote>
1787 </para></blockquote>
1788 </sect2>
1789
1790 <sect2>
1791 <title>Restore</title>
1792
1793 <para>
1794 Restore the original video state. This could be called from the
1795 <function>ChipLeaveVT()</function> and <function>ChipCloseScreen()</function>
1796 functions.
1797 </para>
1798
1799 <blockquote><para>
1800 <programlisting>
1801 void ChipRestore(ScrnInfoPtr pScrn);
1802 </programlisting>
1803 <blockquote><para>
1804 Restores the saved state from the private storage. Usually only
1805 used for restoring text modes.
1806
1807 </para></blockquote>
1808 </para></blockquote>
1809
1810 </sect2>
1811
1812 <sect2>
1813 <title>Initialise Mode</title>
1814
1815 <para>
1816 Initialise a video mode. This could be called from the
1817 <function>ChipScreenInit()</function>, <function>ChipSwitchMode()</function>
1818 and <function>ChipEnterVT()</function> functions.
1819 </para>
1820
1821 <blockquote><para>
1822 <programlisting>
1823 Bool ChipModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
1824 </programlisting>
1825 <blockquote><para>
1826 Programs the hardware for the given video mode.
1827
1828 </para></blockquote>
1829 </para></blockquote>
1830
1831 </sect2>
1832 </sect1>
1833
1834 <sect1>
1835 <title>Data and Data Structures</title>
1836
1837 <sect2>
1838 <title>Command line data</title>
1839
1840 <para>
1841Command line options are typically global, and are stored in global
1842variables. These variables are read-only and are available to drivers
1843via a function call interface. Most of these command line values are
1844processed via helper functions to ensure that they are treated consistently
1845by all drivers. The other means of access is provided for cases where
1846the supplied helper functions might not be appropriate.
1847 </para>
1848
1849 <para>
1850Some of them are:
1851
1852 <literallayout>
1853 xf86Verbose verbosity level
1854 xf86Bpp -bpp from the command line
1855 xf86Depth -depth from the command line
1856 xf86Weight -weight from the command line
1857 xf86Gamma -{r,g,b,}gamma from the command line
1858 xf86FlipPixels -flippixels from the command line
1859 xf86ProbeOnly -probeonly from the command line
1860 defaultColorVisualClass -cc from the command line
1861 </literallayout>
1862 </para>
1863
1864 <para>
1865If we ever do allow for screen-specific command line options, we may
1866need to rethink this.
1867 </para>
1868
1869 <para>
1870These can be accessed in a read-only manner by drivers with the following
1871functions:
1872 </para>
1873
1874 <blockquote><para>
1875 <programlisting>
1876 int xf86GetVerbosity();
1877 </programlisting>
1878 <blockquote><para>
1879 Returns the value of <varname>xf86Verbose</varname>.
1880 </para></blockquote>
1881
1882 </para></blockquote>
1883
1884 <blockquote><para>
1885 <programlisting>
1886 int xf86GetDepth();
1887 </programlisting>
1888 <blockquote><para>
1889 Returns the <option>-depth</option> command line setting. If not
1890 set on the command line, <constant>-1</constant> is returned.
1891 </para></blockquote>
1892
1893 </para></blockquote>
1894
1895 <blockquote><para>
1896 <programlisting>
1897 rgb xf86GetWeight();
1898 </programlisting>
1899 <blockquote><para>
1900 Returns the <option>-weight</option> command line setting. If not
1901 set on the command line, <literal remap="tt">{0, 0, 0}</literal> is returned.
1902 </para></blockquote>
1903
1904 </para></blockquote>
1905
1906 <blockquote><para>
1907 <programlisting>
1908 Gamma xf86GetGamma();
1909 </programlisting>
1910 <blockquote><para>
1911 Returns the <option>-gamma</option> or <option>-rgamma</option>,
1912 <option>-ggamma</option>, <option>-bgamma</option> command line settings.
1913 If not set on the command line, <literal remap="tt">{0.0, 0.0, 0.0}</literal>
1914 is returned.
1915 </para></blockquote>
1916
1917 </para></blockquote>
1918
1919 <blockquote><para>
1920 <programlisting>
1921 Bool xf86GetFlipPixels();
1922 </programlisting>
1923 <blockquote><para>
1924 Returns <constant>TRUE</constant> if <option>-flippixels</option> is
1925 present on the command line, and <constant>FALSE</constant> otherwise.
1926 </para></blockquote>
1927
1928 </para></blockquote>
1929
1930 <blockquote><para>
1931 <programlisting>
1932 const char *xf86GetServerName();
1933 </programlisting>
1934 <blockquote><para>
1935 Returns the name of the X server from the command line.
1936 </para></blockquote>
1937
1938 </para></blockquote>
1939 </sect2>
1940
1941 <sect2>
1942 <title>Data handling</title>
1943
1944 <para>
1945Config file data contains parts that are global, and parts that are
1946Screen specific. All of it is parsed into data structures that neither
1947the drivers or most other parts of the server need to know about.
1948 </para>
1949
1950 <para>
1951The global data is typically not required by drivers, and as such, most
1952of it is stored in the private <structname>xf86InfoRec</structname>.
1953 </para>
1954
1955 <para>
1956The screen-specific data collected from the config file is stored in
1957screen, device, display, monitor-specific data structures that are separate
1958from the <varname>ScrnInfoRecs</varname>, with the appropriate elements/fields
1959hooked into the <varname>ScrnInfoRecs</varname> as required. The screen
1960config data is held in <structname>confScreenRec</structname>, device data in
1961the <structname>GDevRec</structname>, monitor data in the <structname>MonRec</structname>,
1962and display data in the <structname>DispRec</structname>.
1963 </para>
1964
1965 <para>
1966The XFree86 common layer's screen specific data (the actual data in use
1967for each screen) is held in the <varname>ScrnInfoRecs</varname>. As has
1968been outlined above, the <varname>ScrnInfoRecs</varname> are allocated at probe
1969time, and it is the responsibility of the Drivers' <function>Probe()</function>
1970and <function>PreInit()</function> functions to finish filling them in based
1971on both data provided on the command line and data provided from the
1972Config file. The precedence for this is:
1973
1974 <blockquote><para>
1975 command line -&gt; config file -&gt; probed/default data
1976 </para></blockquote>
1977 </para>
1978
1979 <para>
1980For most things in this category there are helper functions that the
1981drivers can use to ensure that the above precedence is consistently
1982used.
1983 </para>
1984
1985 <para>
1986As well as containing screen-specific data that the XFree86 common layer
1987(including essential parts of the server infrastructure as well as helper
1988functions) needs to access, it also contains some data that drivers use
1989internally. When considering whether to add a new field to the
1990<structname>ScrnInfoRec</structname>, consider the balance between the convenience
1991of things that lots of drivers need and the size/obscurity of the
1992<structname>ScrnInfoRec</structname>.
1993 </para>
1994
1995 <para>
1996Per-screen driver specific data that cannot be accommodated with the
1997static <structname>ScrnInfoRec</structname> fields is held in a driver-defined
1998data structure, a pointer to which is assigned to the
1999<structname>ScrnInfoRec</structname>'s <structfield>driverPrivate</structfield> field. This
2000is per-screen data that persists across server generations (as does the
2001bulk of the static <structname>ScrnInfoRec</structname> data). It would typically
2002also include the video card's saved state.
2003 </para>
2004
2005 <para>
2006Per-screen data for other modules that the driver uses that is reset for each
2007server generation is hooked into the <structname>ScrnInfoRec</structname>
2008through its <structfield>privates</structfield> field.
2009 </para>
2010
2011 <para>
2012Once it has stabilised, the data structures and variables accessible to
2013video drivers will be documented here. In the meantime, those things
2014defined in the <filename>xf86.h</filename> and <filename>xf86str.h</filename>
2015files are visible to video drivers. Things defined in
2016<filename>xf86Priv.h</filename> and <filename>xf86Privstr.h</filename> are NOT
2017intended to be visible to video drivers, and it is an error for a driver
2018to include those files.
2019 </para>
2020
2021 </sect2>
2022
2023 <sect2>
2024 <title>Accessing global data</title>
2025
2026 <para>
2027Some other global state information that the drivers may access via
2028functions is as follows:
2029 </para>
2030
2031 <blockquote><para>
2032 <programlisting>
2033 Bool xf86ServerIsExiting();
2034 </programlisting>
2035 <blockquote><para>
2036 Returns <constant>TRUE</constant> if the server is at the end of a
2037 generation and is in the process of exiting, and
2038 <constant>FALSE</constant> otherwise.
2039 </para></blockquote>
2040
2041 </para></blockquote>
2042
2043 <blockquote><para>
2044 <programlisting>
2045 Bool xf86ServerIsResetting();
2046 </programlisting>
2047 <blockquote><para>
2048 Returns <constant>TRUE</constant> if the server is at the end of a
2049 generation and is in the process of resetting, and
2050 <constant>FALSE</constant> otherwise.
2051 </para></blockquote>
2052
2053 </para></blockquote>
2054
2055 <blockquote><para>
2056 <programlisting>
2057 Bool xf86ServerIsInitialising();
2058 </programlisting>
2059 <blockquote><para>
2060 Returns <constant>TRUE</constant> if the server is at the beginning of
2061 a generation and is in the process of initialising, and
2062 <constant>FALSE</constant> otherwise.
2063 </para></blockquote>
2064
2065 </para></blockquote>
2066
2067 <blockquote><para>
2068 <programlisting>
2069 Bool xf86ServerIsOnlyProbing();
2070 </programlisting>
2071 <blockquote><para>
2072 Returns <constant>TRUE</constant> if the -probeonly command line flag
2073 was specified, and <constant>FALSE</constant> otherwise.
2074 </para></blockquote>
2075
2076 </para></blockquote>
2077
2078 <blockquote><para>
2079 <programlisting>
2080 Bool xf86CaughtSignal();
2081 </programlisting>
2082 <blockquote><para>
2083 Returns <constant>TRUE</constant> if the server has caught a signal,
2084 and <constant>FALSE</constant> otherwise.
2085 </para></blockquote>
2086
2087 </para></blockquote>
2088 </sect2>
2089
2090 <sect2>
2091 <title>Allocating private data</title>
2092
2093 <para>
2094A driver and any module it uses may allocate per-screen private storage
2095in either the <structname>ScreenRec</structname> (DIX level) or
2096<structname>ScrnInfoRec</structname> (XFree86 common layer level).
2097<structname>ScreenRec</structname> storage persists only for a single server
2098generation, and <structname>ScrnInfoRec</structname> storage persists across
2099generations for the lifetime of the server.
2100 </para>
2101
2102 <para>
2103The <structname>ScreenRec</structname> <structfield>devPrivates</structfield> data must be
2104reallocated/initialised at the start of each new generation. This is
2105normally done from the <function>ChipScreenInit()</function> function, and
2106Init functions for other modules that it calls. Data allocated in this
2107way should be freed by the driver's <function>ChipCloseScreen()</function>
2108functions, and Close functions for other modules that it calls. A new
2109<structfield>devPrivates</structfield> entry is allocated by calling the
2110<function>AllocateScreenPrivateIndex()</function> function.
2111 </para>
2112
2113 <blockquote><para>
2114 <programlisting>
2115 int AllocateScreenPrivateIndex();
2116 </programlisting>
2117 <blockquote><para>
2118 This function allocates a new element in the
2119 <structfield>devPrivates</structfield> field of all currently existing
2120 <literal remap="tt">ScreenRecs</literal>. The return value is the index of this
2121 new element in the <structfield>devPrivates</structfield> array. The
2122 <structfield>devPrivates</structfield> field is of type
2123 <structname>DevUnion</structname>:
2124
2125 <programlisting>
2126 typedef union _DevUnion {
2127 pointer ptr;
2128 long val;
2129 unsigned long uval;
2130 pointer (*fptr)(void);
2131 } DevUnion;
2132 </programlisting>
2133
2134 which allows the element to be used for any of the above types.
2135 It is commonly used as a pointer to data that the caller allocates
2136 after the new index has been allocated.
2137 </para>
2138
2139 <para>
2140 This function will return <constant>-1</constant> when there is an
2141 error allocating the new index.
2142 </para>
2143
2144 </blockquote>
2145 </para></blockquote>
2146
2147 <para>
2148The <structname>ScrnInfoRec</structname> <structfield>privates</structfield> data persists
2149for the life of the server, so only needs to be allocated once. This
2150should be done from the <function>ChipPreInit()</function> function, and Init
2151functions for other modules that it calls. Data allocated in this way
2152should be freed by the driver's <function>ChipFreeScreen()</function> functions,
2153and Free functions for other modules that it calls. A new
2154<structfield>privates</structfield> entry is allocated by calling the
2155<function>xf86AllocateScrnInfoPrivateIndex()</function> function.
2156 </para>
2157
2158 <blockquote><para>
2159 <programlisting>
2160 int xf86AllocateScrnInfoPrivateIndex();
2161 </programlisting>
2162 <blockquote><para>
2163 This function allocates a new element in the <structfield>privates</structfield>
2164 field of all currently existing <varname>ScrnInfoRecs</varname>.
2165 The return value is the index of this new element in the
2166 <structfield>privates</structfield> array. The <structfield>privates</structfield>
2167 field is of type <structfield>DevUnion</structfield>:
2168
2169 <programlisting>
2170 typedef union _DevUnion {
2171 pointer ptr;
2172 long val;
2173 unsigned long uval;
2174 pointer (*fptr)(void);
2175 } DevUnion;
2176 </programlisting>
2177
2178 which allows the element to be used for any of the above types.
2179 It is commonly used as a pointer to data that the caller allocates
2180 after the new index has been allocated.
2181 </para>
2182
2183 <para>
2184 This function will not return when there is an error allocating
2185 the new index. When there is an error it will cause the server
2186 to exit with a fatal error. The similar function for allocation
2187 privates in the <structname>ScreenRec</structname>
2188 (<function>AllocateScreenPrivateIndex()</function>) differs in this
2189 respect by returning <constant>-1</constant> when the allocation fails.
2190 </para>
2191
2192 </blockquote>
2193 </para></blockquote>
2194 </sect2>
2195 </sect1>
2196
2197 <sect1 id="rac">
2198 <title>Keeping Track of Bus Resources</title>
2199
2200 <sect2>
2201 <title>Theory of Operation</title>
2202
2203 <para>
2204The XFree86 common layer has knowledge of generic access control mechanisms
2205for devices on certain bus systems (currently the PCI bus) as well as
2206of methods to enable or disable access to the buses itself. Furthermore
2207it can access information on resources decoded by these devices and if
2208necessary modify it.
2209 </para>
2210
2211 <para>
2212When first starting the Xserver collects all this information, saves it
2213for restoration, checks it for consistency, and if necessary, corrects
2214it. Finally it disables all resources on a generic level prior to
2215calling any driver function.
2216 </para>
2217
2218 <para>
2219When the <function>Probe()</function> function of each driver is called the
2220device sections are matched against the devices found in the system.
2221The driver may probe devices at this stage that cannot be identified by
2222using device independent methods. Access to all resources that can be
2223controlled in a device independent way is disabled. The
2224<function>Probe()</function> function should register all non-relocatable
2225resources at this stage. If a resource conflict is found between
2226exclusive resources the driver will fail immediately. Optionally the
2227driver might specify an <function>EntityInit()</function>,
2228<function>EntityLeave()</function> and <function>EntityEnter()</function> function.
2229 </para>
2230
2231 <para>
2232<function>EntityInit()</function> can be used to disable any shared resources
2233that are not controlled by the generic access control functions. It is
2234called prior to the PreInit phase regardless if an entity is active or
2235not. When calling the <function>EntityInit()</function>,
2236<function>EntityEnter()</function> and <function>EntityLeave()</function> functions
2237the common level will disable access to all other entities on a generic
2238level. Since the common level has no knowledge of device specific
2239methods to disable access to resources it cannot be guaranteed that
2240certain resources are not decoded by any other entity until the
2241<function>EntityInit()</function> or <function>EntityEnter()</function> phase is
2242finished. Device drivers should therefore register all those resources
2243which they are going to disable. If these resources are never to be
2244used by any driver function they may be flagged <constant>ResInit</constant>
2245so that they can be removed from the resource list after processing all
2246<function>EntityInit()</function> functions. <function>EntityEnter()</function>
2247should disable decoding of all resources which are not registered as
2248exclusive and which are not handled by the generic access control in
2249the common level. The difference to <function>EntityInit()</function> is
2250that the latter one is only called once during lifetime of the server.
2251It can therefore be used to set up variables prior to disabling resources.
2252<function>EntityLeave()</function> should restore the original state when
2253exiting the server or switching to a different VT. It also needs to
2254disable device specific access functions if they need to be disabled on
2255server exit or VT switch. The default state is to enable them before
2256giving up the VT.
2257 </para>
2258
2259 <para>
2260In <function>PreInit()</function> phase each driver should check if any
2261sharable resources it has registered during <function>Probe()</function> has
2262been denied and take appropriate action which could simply be to fail.
2263If it needs to access resources it has disabled during
2264<function>EntitySetup()</function> it can do so provided it has registered
2265these and will disable them before returning from
2266<function>PreInit()</function>. This also applies to all other driver
2267functions. Several functions are provided to request resource ranges,
2268register these, correct PCI config space and add replacements for the
2269generic access functions. Resources may be marked <quote>disabled</quote> or
2270<quote>unused</quote> during OPERATING stage. Although these steps could also be
2271performed in <function>ScreenInit()</function>, this is not desirable.
2272 </para>
2273
2274 <para>
2275Following <function>PreInit()</function> phase the common level determines
2276if resource access control is needed. This is the case if more than
2277one screen is used. If necessary the RAC wrapper module is loaded. In
2278<function>ScreenInit()</function> the drivers can decide which operations
2279need to be placed under RAC. Available are the frame buffer operations,
2280the pointer operations and the colormap operations. Any operation that
2281requires resources which might be disabled during OPERATING state should
2282be set to use RAC. This can be specified separately for memory and IO
2283resources.
2284 </para>
2285
2286 <para>
2287When <function>ScreenInit()</function> phase is done the common level will
2288determine which shared resources are requested by more than one driver
2289and set the access functions accordingly. This is done following these
2290rules:
2291
2292 <orderedlist>
2293 <listitem><para>
2294 The sharable resources registered by each entity are compared. If
2295 a resource is registered by more than one entity the entity will be
2296 marked to need to share this resources type (<constant>IO</constant> or
2297 <constant>MEM</constant>).
2298 </para></listitem>
2299
2300 <listitem><para>
2301 A resource marked <quote>disabled</quote> during OPERATING state will be ignored
2302 entirely.
2303 </para></listitem>
2304
2305 <listitem><para>
2306 A resource marked <quote>unused</quote> will only conflicts with an overlapping
2307 resource of an other entity if the second is actually in use during
2308 OPERATING state.
2309 </para></listitem>
2310
2311 <listitem><para>
2312 If an <quote>unused</quote> resource was found to conflict however the entity
2313 does not use any other resource of this type the entire resource type
2314 will be disabled for that entity.
2315 </para></listitem>
2316 </orderedlist>
2317 </para>
2318
2319 <para>
2320The driver has the choice among different ways to control access to
2321certain resources:
2322
2323 <orderedlist>
2324 <listitem><para>
2325 It can rely on the generic access functions. This is probably the
2326 most common case. Here the driver only needs to register any resource
2327 it is going to use.
2328 </para></listitem>
2329
2330 <listitem><para>
2331 It can replace the generic access functions by driver specific
2332 ones. This will mostly be used in cases where no generic access
2333 functions are available. In this case the driver has to make sure
2334 these resources are disabled when entering the <function>PreInit()</function>
2335 stage. Since the replacement functions are registered in
2336 <function>PreInit()</function> the driver will have to enable these
2337 resources itself if it needs to access them during this state. The
2338 driver can specify if the replacement functions can control memory
2339 and/or I/O resources separately.
2340 </para></listitem>
2341
2342 <listitem><para>
2343 The driver can enable resources itself when it needs them. Each
2344 driver function enabling them needs to disable them before it will
2345 return. This should be used if a resource which can be controlled
2346 in a device dependent way is only required during SETUP state. This
2347 way it can be marked <quote>unused</quote> during OPERATING state.
2348 </para></listitem>
2349 </orderedlist>
2350 </para>
2351
2352 <para>
2353A resource which is decoded during OPERATING state however never accessed
2354by the driver should be marked unused.
2355 </para>
2356
2357 <para>
2358Since access switching latencies are an issue during Xserver operation,
2359the common level attempts to minimize the number of entities that need
2360to be placed under RAC control. When a wrapped operation is called,
2361the <function>EnableAccess()</function> function is called before control is
2362passed on. <function>EnableAccess()</function> checks if a screen is under
2363access control. If not it just establishes bus routing and returns.
2364If the screen needs to be under access control,
2365<function>EnableAccess()</function> determines which resource types
2366(<literal remap="tt">MEM</literal>, <literal remap="tt">IO</literal>) are required. Then it tests
2367if this access is already established. If so it simply returns. If
2368not it disables the currently established access, fixes bus routing and
2369enables access to all entities registered for this screen.
2370 </para>
2371
2372 <para>
2373Whenever a mode switch or a VT-switch is performed the common level will
2374return to SETUP state.
2375 </para>
2376 </sect2>
2377
2378 <sect2>
2379 <title>Resource Types</title>
2380
2381 <para>
2382Resource have certain properties. When registering resources each range
2383is accompanied by a flag consisting of the ORed flags of the different
2384properties the resource has. Each resource range may be classified
2385according to
2386
2387 <itemizedlist>
2388 <listitem><para>
2389 its physical properties i.e., if it addresses
2390 memory (<constant>ResMem</constant>) or
2391 I/O space (<constant>ResIo</constant>),
2392 </para></listitem>
2393 <listitem><para>
2394 if it addresses a
2395 block (<constant>ResBlock</constant>) or
2396 sparse (<constant>ResSparse</constant>)
2397 range,
2398 </para></listitem>
2399 <listitem><para>
2400 its access properties.
2401 </para></listitem>
2402 </itemizedlist>
2403 </para>
2404
2405 <para>
2406There are two known access properties:
2407
2408 <itemizedlist>
2409 <listitem><para>
2410 <constant>ResExclusive</constant>
2411 for resources which may not be shared with any other device and
2412 </para></listitem>
2413 <listitem><para>
2414 <constant>ResShared</constant>
2415 for resources which can be disabled and therefore can be shared.
2416 </para></listitem>
2417 </itemizedlist>
2418 </para>
2419
2420 <para>
2421If it is necessary to test a resource against any type a generic access
2422type <constant>ResAny</constant> is provided. If this is set the resource
2423will conflict with any resource of a different entity intersecting its
2424range. Further it can be specified that a resource is decoded however
2425never used during any stage (<constant>ResUnused</constant>) or during
2426OPERATING state (<constant>ResUnusedOpr</constant>). A resource only visible
2427during the init functions (ie. <function>EntityInit()</function>,
2428<function>EntityEnter()</function> and <function>EntityLeave()</function> should
2429be registered with the flag <constant>ResInit</constant>. A resource that
2430might conflict with background resource ranges may be flagged with
2431<constant>ResBios</constant>. This might be useful when registering resources
2432ranges that were assigned by the system Bios.
2433 </para>
2434
2435 <para>
2436Several predefined resource lists are available for VGA and 8514/A
2437resources in <filename>common/xf86Resources.h</filename>.
2438 </para>
2439 </sect2>
2440
2441 <sect2 id="avail">
2442 <title>Available Functions</title>
2443
2444 <para>
2445The functions provided for resource management are listed in their order
2446of use in the driver.
2447 </para>
2448
2449 <sect3>
2450 <title>Probe Phase</title>
2451
2452 <para>
2453In this phase each driver detects those resources it is able to drive,
2454creates an entity record for each of them, registers non-relocatable
2455resources and allocates screens and adds the resources to screens.
2456 </para>
2457
2458 <para>
2459Two helper functions are provided for matching device sections in the
2460xorg.conf file to the devices:
2461 </para>
2462
2463 <blockquote><para>
2464 <programlisting>
2465 int xf86MatchPciInstances(const char *driverName, int vendorID,
2466 SymTabPtr chipsets, PciChipsets *PCIchipsets,
2467 GDevPtr *devList, int numDevs, DriverPtr drvp,
2468 int **foundEntities);
2469 </programlisting>
2470 <blockquote><para>
2471 This function finds matches between PCI cards that a driver supports
2472 and config file device sections. It is intended for use in the
2473 <function>ChipProbe()</function> function of drivers for PCI cards.
2474 Only probed PCI devices with a vendor ID matching
2475 <parameter>vendorID</parameter> are considered. <parameter>devList</parameter>
2476 and <parameter>numDevs</parameter> are typically those found from
2477 calling <function>xf86MatchDevice()</function>, and represent the active
2478 config file device sections relevant to the driver.
2479 <parameter>PCIchipsets</parameter> is a table that provides a mapping
2480 between the PCI device IDs, the driver's internal chipset tokens
2481 and a list of fixed resources.
2482 </para>
2483
2484 <para>
2485 When a device section doesn't have a <emphasis>BusID</emphasis> entry it
2486 can only match the primary video device. Secondary devices are
2487 only matched with device sections that have a matching
2488 <emphasis>BusID</emphasis> entry.
2489 </para>
2490
2491 <para>
2492 Once the preliminary matches have been found, a final match is
2493 confirmed by checking if the chipset override, ChipID override or
2494 probed PCI chipset type match one of those given in the
2495 <parameter>chipsets</parameter> and <parameter>PCIchipsets</parameter> lists.
2496 The <parameter>PCIchipsets</parameter> list includes a list of the PCI
2497 device IDs supported by the driver. The list should be terminated
2498 with an entry with PCI ID <constant>-1</constant>". The
2499 <parameter>chipsets</parameter> list is a table mapping the driver's
2500 internal chipset tokens to names, and should be terminated with
2501 a <constant>NULL</constant> entry. Only those entries with a
2502 corresponding entry in the <parameter>PCIchipsets</parameter> list are
2503 considered. The order of precedence is: config file chipset,
2504 config file ChipID, probed PCI device ID.
2505 </para>
2506
2507 <para>
2508 In cases where a driver handles PCI chipsets with more than one
2509 vendor ID, it may set <parameter>vendorID</parameter> to
2510 <constant>0</constant>, and OR each devID in the list with (the
2511 vendor&nbsp;ID&nbsp;&lt;&lt;&nbsp;16).
2512 </para>
2513
2514 <para>
2515 Entity index numbers for confirmed matches are returned as an
2516 array via <parameter>foundEntities</parameter>. The PCI information,
2517 chipset token and device section for each match are found in the
2518 <structname>EntityInfoRec</structname> referenced by the indices.
2519 </para>
2520
2521 <para>
2522 The function return value is the number of confirmed matches. A
2523 return value of <constant>-1</constant> indicates an internal error.
2524 The returned <parameter>foundEntities</parameter> array should be freed
2525 by the driver with <function>xfree()</function> when it is no longer
2526 needed in cases where the return value is greater than zero.
2527 </para>
2528
2529 </blockquote></para></blockquote>
2530
2531 <blockquote><para>
2532 <programlisting>
2533 int xf86MatchIsaInstances(const char *driverName,
2534 SymTabPtr chipsets, IsaChipsets *ISAchipsets,
2535 DriverPtr drvp, FindIsaDevProc FindIsaDevice,
2536 GDevPtr *devList, int numDevs,
2537 int **foundEntities);
2538 </programlisting>
2539 <blockquote><para>
2540 This function finds matches between ISA cards that a driver supports
2541 and config file device sections. It is intended for use in the
2542 <function>ChipProbe()</function> function of drivers for ISA cards.
2543 <parameter>devList</parameter> and <parameter>numDevs</parameter> are
2544 typically those found from calling <function>xf86MatchDevice()</function>,
2545 and represent the active config file device sections relevant to
2546 the driver. <parameter>ISAchipsets</parameter> is a table that provides
2547 a mapping between the driver's internal chipset tokens and the
2548 resource classes. <parameter>FindIsaDevice</parameter> is a
2549 driver-provided function that probes the hardware and returns the
2550 chipset token corresponding to what was detected, and
2551 <constant>-1</constant> if nothing was detected.
2552 </para>
2553
2554 <para>
2555 If the config file device section contains a chipset entry, then
2556 it is checked against the <parameter>chipsets</parameter> list. When
2557 no chipset entry is present, the <parameter>FindIsaDevice</parameter>
2558 function is called instead.
2559 </para>
2560
2561 <para>
2562 Entity index numbers for confirmed matches are returned as an
2563 array via <parameter>foundEntities</parameter>. The chipset token and
2564 device section for each match are found in the
2565 <structname>EntityInfoRec</structname> referenced by the indices.
2566 </para>
2567
2568 <para>
2569 The function return value is the number of confirmed matches. A
2570 return value of <constant>-1</constant> indicates an internal error.
2571 The returned <parameter>foundEntities</parameter> array should be freed
2572 by the driver with <function>xfree()</function> when it is no longer
2573 needed in cases where the return value is greater than zero.
2574 </para>
2575
2576 </blockquote></para></blockquote>
2577
2578 <para>
2579These two helper functions make use of several core functions that are
2580available at the driver level:
2581 </para>
2582
2583 <blockquote><para>
2584 <programlisting>
2585 Bool xf86ParsePciBusString(const char *busID, int *bus,
2586 int *device, int *func);
2587 </programlisting>
2588 <blockquote><para>
2589 Takes a <parameter>BusID</parameter> string, and if it is in the correct
2590 format, returns the PCI <parameter>bus</parameter>, <parameter>device</parameter>,
2591 <parameter>func</parameter> values that it indicates. The format of the
2592 string is expected to be "PCI:bus:device:func" where each of <quote>bus</quote>,
2593 <quote>device</quote> and <quote>func</quote> are decimal integers. The ":func" part may
2594 be omitted, and the func value assumed to be zero, but this isn't
2595 encouraged. The "PCI" prefix may also be omitted. The prefix
2596 "AGP" is currently equivalent to the "PCI" prefix. If the string
2597 isn't a valid PCI BusID, the return value is <constant>FALSE</constant>.
2598 </para>
2599
2600 </blockquote></para></blockquote>
2601
2602 <blockquote><para>
2603 <programlisting>
2604 Bool xf86ComparePciBusString(const char *busID, int bus,
2605 int device, int func);
2606 </programlisting>
2607 <blockquote><para>
2608 Compares a <parameter>BusID</parameter> string with PCI <parameter>bus</parameter>,
2609 <parameter>device</parameter>, <parameter>func</parameter> values. If they
2610 match <constant>TRUE</constant> is returned, and <constant>FALSE</constant>
2611 if they don't.
2612 </para>
2613
2614 </blockquote></para></blockquote>
2615
2616 <blockquote><para>
2617 <programlisting>
2618 Bool xf86ParseIsaBusString(const char *busID);
2619 </programlisting>
2620 <blockquote><para>
2621 Compares a <parameter>BusID</parameter> string with the ISA bus ID string
2622 ("ISA" or "ISA:"). If they match <constant>TRUE</constant> is returned,
2623 and <constant>FALSE</constant> if they don't.
2624 </para>
2625
2626 </blockquote></para></blockquote>
2627
2628 <blockquote><para>
2629 <programlisting>
2630 Bool xf86CheckPciSlot(int bus, int device, int func);
2631 </programlisting>
2632 <blockquote><para>
2633 Checks if the PCI slot <literal remap="tt">bus:device:func</literal> has been
2634 claimed. If so, it returns <constant>FALSE</constant>, and otherwise
2635 <constant>TRUE</constant>.
2636 </para>
2637
2638 </blockquote></para></blockquote>
2639
2640 <blockquote><para>
2641 <programlisting>
2642 int xf86ClaimPciSlot(int bus, int device, int func, DriverPtr drvp,
2643 int chipset, GDevPtr dev, Bool active);
2644 </programlisting>
2645 <blockquote><para>
2646 This function is used to claim a PCI slot, allocate the associated
2647 entity record and initialise their data structures. The return
2648 value is the index of the newly allocated entity record, or
2649 <constant>-1</constant> if the claim fails. This function should always
2650 succeed if <function>xf86CheckPciSlot()</function> returned
2651 <constant>TRUE</constant> for the same PCI slot.
2652 </para>
2653
2654 </blockquote></para></blockquote>
2655
2656 <blockquote><para>
2657 <programlisting>
2658 Bool xf86IsPrimaryPci(void);
2659 </programlisting>
2660 <blockquote><para>
2661 This function returns <constant>TRUE</constant> if the primary card is
2662 a PCI device, and <constant>FALSE</constant> otherwise.
2663 </para>
2664
2665 </blockquote></para></blockquote>
2666
2667 <blockquote><para>
2668 <programlisting>
2669 int xf86ClaimIsaSlot(DriverPtr drvp, int chipset,
2670 GDevPtr dev, Bool active);
2671 </programlisting>
2672 <blockquote><para>
2673 This allocates an entity record entity and initialise the data
2674 structures. The return value is the index of the newly allocated
2675 entity record.
2676 </para>
2677
2678 </blockquote></para></blockquote>
2679
2680 <blockquote><para>
2681 <programlisting>
2682 Bool xf86IsPrimaryIsa(void);
2683 </programlisting>
2684 <blockquote><para>
2685 This function returns <constant>TRUE</constant> if the primary card is
2686 an ISA (non-PCI) device, and <constant>FALSE</constant> otherwise.
2687 </para>
2688
2689 </blockquote></para></blockquote>
2690
2691 <para>
2692Two helper functions are provided to aid configuring entities:
2693 </para>
2694
2695 <blockquote><para>
2696 <programlisting>
2697 ScrnInfoPtr xf86ConfigPciEntity(ScrnInfoPtr pScrn,
2698 int scrnFlag, int entityIndex,
2699 PciChipsets *p_chip,
2700 resList res, EntityProc init,
2701 EntityProc enter, EntityProc leave,
2702 pointer private);
2703
2704 ScrnInfoPtr xf86ConfigIsaEntity(ScrnInfoPtr pScrn,
2705 int scrnFlag, int entityIndex,
2706 IsaChipsets *i_chip,
2707 resList res, EntityProc init,
2708 EntityProc enter, EntityProc leave,
2709 pointer private);
2710 </programlisting>
2711 <blockquote><para>
2712 These functions are used to register the non-relocatable resources
2713 for an entity, and the optional entity-specific <parameter>Init</parameter>, <parameter>Enter</parameter> and
2714 <parameter>Leave</parameter> functions. Usually the list of fixed resources is obtained
2715 from the Isa/PciChipsets lists. However an additional list of
2716 resources may be passed. Generally this is not required.
2717 For active entities a <structname>ScrnInfoRec</structname> is allocated
2718 if the <parameter>pScrn</parameter> argument is <constant>NULL</constant>.
2719The
2720 return value is <constant>TRUE</constant> when successful. The init, enter, leave
2721 functions are defined as follows:
2722
2723 <blockquote><para>
2724 <programlisting>
2725 typedef void (*EntityProc)(int entityIndex,
2726 pointer private);
2727 </programlisting>
2728 </para></blockquote>
2729
2730 They are passed the entity index and a pointer to a private scratch
2731 area. This can be set up during <function>Probe()</function> and
2732 its address can be passed to
2733 <function>xf86ConfigIsaEntity()</function> and
2734 <function>xf86ConfigPciEntity()</function> as the last argument.
2735 </para>
2736
2737 </blockquote></para></blockquote>
2738
2739 <para>
2740These two helper functions make use of several core functions that are
2741available at the driver level:
2742
2743 <blockquote><para>
2744 <programlisting>
2745 void xf86ClaimFixedResources(resList list, int entityIndex);
2746 </programlisting>
2747 <blockquote><para>
2748 This function registers the non-relocatable resources which cannot
2749 be disabled and which therefore would cause the server to fail
2750 immediately if they were found to conflict. It also records
2751 non-relocatable but sharable resources for processing after the
2752 <function>Probe()</function> phase.
2753 </para>
2754
2755 </blockquote></para></blockquote>
2756
2757 <blockquote><para>
2758 <programlisting>
2759 Bool xf86SetEntityFuncs(int entityIndex, EntityProc init,
2760 EntityProc enter, EntityProc leave, pointer);
2761 </programlisting>
2762 <blockquote><para>
2763 This function registers with an entity the <parameter>init</parameter>,
2764 <parameter>enter</parameter>, <parameter>leave</parameter> functions along
2765 with the pointer to their private area.
2766 </para>
2767
2768 </blockquote></para></blockquote>
2769
2770 <blockquote><para>
2771 <programlisting>
2772 void xf86AddEntityToScreen(ScrnInfoPtr pScrn, int entityIndex);
2773 </programlisting>
2774 <blockquote><para>
2775 This function associates the entity referenced by
2776 <parameter>entityIndex</parameter> with the screen.
2777 </para>
2778
2779 </blockquote></para></blockquote>
2780 </para>
2781 </sect3>
2782
2783 <sect3>
2784 <title>PreInit Phase</title>
2785
2786 <para>
2787During this phase the remaining resources should be registered.
2788<function>PreInit()</function> should call <function>xf86GetEntityInfo()</function>
2789to obtain a pointer to an <structname>EntityInfoRec</structname> for each entity
2790it is able to drive and check if any resource are listed in its
2791<structfield>resources</structfield> field. If resources registered in the Probe
2792phase have been rejected in the post-Probe phase
2793(<structfield>resources</structfield> is non-<constant>NULL</constant>), then the driver should
2794decide if it can continue without using these or if it should fail.
2795 </para>
2796
2797 <blockquote><para>
2798 <programlisting>
2799 EntityInfoPtr xf86GetEntityInfo(int entityIndex);
2800 </programlisting>
2801 <blockquote><para>
2802 This function returns a pointer to the <structname>EntityInfoRec</structname>
2803 referenced by <parameter>entityIndex</parameter>. The returned
2804 <structname>EntityInfoRec</structname> should be freed with
2805 <function>xfree()</function> when no longer needed.
2806 </para>
2807
2808 </blockquote></para></blockquote>
2809
2810 <para>
2811Several functions are provided to simplify resource registration:
2812 <blockquote><para>
2813 <programlisting>
2814 Bool xf86IsEntityPrimary(int entityIndex);
2815 </programlisting>
2816 <blockquote><para>
2817 This function returns <constant>TRUE</constant> if the entity referenced
2818 by <parameter>entityIndex</parameter> is the primary display device (i.e.,
2819 the one initialised at boot time and used in text mode).
2820 </para>
2821
2822 </blockquote></para></blockquote>
2823
2824 <blockquote><para>
2825 <programlisting>
2826 Bool xf86IsScreenPrimary(ScrnInfoPtr pScrn);
2827 </programlisting>
2828 <blockquote><para>
2829 This function returns <constant>TRUE</constant> if the primary entity
2830 is registered with the screen referenced by
2831 <parameter>pScrn</parameter>.
2832 </para>
2833
2834 </blockquote></para></blockquote>
2835
2836 <blockquote><para>
2837 <programlisting>
2838 pciVideoPtr xf86GetPciInfoForEntity(int entityIndex);
2839 </programlisting>
2840 <blockquote><para>
2841 This function returns a pointer to the <structname>pciVideoRec</structname>
2842 for the specified entity. If the entity is not a PCI device,
2843 <constant>NULL</constant> is returned.
2844 </para>
2845
2846 </blockquote></para></blockquote>
2847 </para>
2848
2849 <para>
2850The primary function for registration of resources is:
2851 <blockquote><para>
2852 <programlisting>
2853 resPtr xf86RegisterResources(int entityIndex, resList list,
2854 int access);
2855 </programlisting>
2856 <blockquote><para>
2857 This function tries to register the resources in
2858 <parameter>list</parameter>. If list is <constant>NULL</constant> it tries
2859 to determine the resources automatically. This only works for
2860 entities that provide a generic way to read out the resource ranges
2861 they decode. So far this is only the case for PCI devices. By
2862 default the PCI resources are registered as shared
2863 (<constant>ResShared</constant>) if the driver wants to set a different
2864 access type it can do so by specifying the access flags in the
2865 third argument. A value of <constant>0</constant> means to use the
2866 default settings. If for any reason the resource broker is not
2867 able to register some of the requested resources the function will
2868 return a pointer to a list of the failed ones. In this case the
2869 driver may be able to move the resource to different locations.
2870 In case of PCI bus entities this is done by passing the list of
2871 failed resources to <function>xf86ReallocatePciResources()</function>.
2872 When the registration succeeds, the return value is
2873 <constant>NULL</constant>.
2874 </para>
2875
2876 </blockquote></para></blockquote>
2877 </para>
2878
2879 <blockquote><para>
2880 <programlisting>
2881 resPtr xf86ReallocatePciResources(int entityIndex, resPtr pRes);
2882 </programlisting>
2883 <blockquote><para>
2884 This function takes a list of PCI resources that need to be
2885 reallocated and returns <constant>NULL</constant> when all relocations are
2886 successful.
2887 <function>xf86RegisterResources()</function> should be called again to
2888 register the relocated resources with the broker.
2889 If the reallocation fails, a list of the resources that could not be
2890 relocated is returned.
2891 </para>
2892
2893 </blockquote></para></blockquote>
2894
2895<para>
2896Two functions are provided to obtain a resource range of a given type:
2897 <blockquote><para>
2898 <programlisting>
2899 resRange xf86GetBlock(long type, memType size,
2900 memType window_start, memType window_end,
2901 memType align_mask, resPtr avoid);
2902 </programlisting>
2903 <blockquote><para>
2904 This function tries to find a block range of size
2905 <parameter>size</parameter> and type <parameter>type</parameter> in a window
2906 bound by <parameter>window_start</parameter> and <parameter>window_end</parameter>
2907 with the alignment specified in <parameter>align_mask</parameter>.
2908 Optionally a list of resource ranges which should be avoided within
2909 the window can be supplied. On failure a zero-length range of
2910 type <constant>ResEnd</constant> will be returned.
2911 </para>
2912 </blockquote></para></blockquote>
2913
2914 <blockquote><para>
2915 <programlisting>
2916 resRange xf86GetSparse(long type, memType fixed_bits,
2917 memType decode_mask, memType address_mask,
2918 resPtr avoid);
2919 </programlisting>
2920 <blockquote><para>
2921 This function is like the previous one, but attempts to find a
2922 sparse range instead of a block range. Here three values have to
2923 be specified: the <parameter>address_mask</parameter> which marks all
2924 bits of the mask part of the address, the <parameter>decode_mask</parameter>
2925 which masks out the bits which are hardcoded and are therefore
2926 not available for relocation and the values of the fixed bits.
2927 The function tries to find a base that satisfies the given condition.
2928 If the function fails it will return a zero range of type
2929 <constant>ResEnd</constant>. Optionally it might be passed a list of
2930 resource ranges to avoid.
2931 </para>
2932
2933 </blockquote></para></blockquote>
2934 </para>
2935
2936 <para>
2937Some PCI devices are broken in the sense that they return invalid size
2938information for a certain resource. In this case the driver can supply
2939the correct size and make sure that the resource range allocated for
2940the card is large enough to hold the address range decoded by the card.
2941The function <function>xf86FixPciResource()</function> can be used to do this:
2942 <blockquote><para>
2943 <programlisting>
2944 Bool xf86FixPciResource(int entityIndex, unsigned int prt,
2945 CARD32 alignment, long type);
2946 </programlisting>
2947 <blockquote><para>
2948 This function fixes a PCI resource allocation. The
2949 <parameter>prt</parameter> parameter contains the number of the PCI base
2950 register that needs to be fixed (<constant>0-5</constant>, and
2951 <constant>6</constant> for the BIOS base register). The size is
2952 specified by the alignment. Since PCI resources need to span an
2953 integral range of size <literal remap="tt">2&circ;n</literal>, the alignm ent also
2954 specifies the number of addresses that will be decoded. If the
2955 driver specifies a type mask it can override the default type for
2956 PCI resources which is <constant>ResShared</constant>. The resource
2957 broker needs to know that to find a matching resource range. This
2958 function should be called before calling
2959 <function>xf86RegisterResources()</function>. The return value is
2960 <constant>TRUE</constant> when the function succeeds.
2961 </para>
2962
2963 </blockquote></para></blockquote>
2964
2965 <blockquote><para>
2966 <programlisting>
2967 Bool xf86CheckPciMemBase(pciVideoPtr pPci, memType base);
2968 </programlisting>
2969 <blockquote><para>
2970 This function checks that the memory base address specified matches
2971 one of the PCI base address register values for the given PCI
2972 device. This is mostly used to check that an externally provided
2973 base address (e.g., from a config file) matches an actual value
2974 allocated to a device.
2975 </para>
2976
2977 </blockquote></para></blockquote>
2978 </para>
2979
2980 <para>
2981The driver may replace the generic access control functions for an entity.
2982This is done with the <function>xf86SetAccessFuncs()</function>:
2983 <blockquote><para>
2984 <programlisting>
2985 void xf86SetAccessFuncs(EntityInfoPtr pEnt,
2986 xf86SetAccessFuncPtr funcs,
2987 xf86SetAccessFuncPtr oldFuncs);
2988 </programlisting>
2989 with:
2990 <programlisting>
2991 typedef struct {
2992 xf86AccessPtr mem;
2993 xf86AccessPtr io;
2994 xf86AccessPtr io_mem;
2995 } xf86SetAccessFuncRec, *xf86SetAccessFuncPtr;
2996 </programlisting>
2997 <blockquote><para>
2998 The driver can pass three functions: one for I/O access, one for
2999 memory access and one for combined memory and I/O access. If the
3000 memory access and combined access functions are identical the
3001 common level assumes that the memory access cannot be controlled
3002 independently of I/O access, if the I/O access function and the
3003 combined access functions are the same it is assumed that I/O can
3004 not be controlled independently. If memory and I/O have to be
3005 controlled together all three values should be the same. If a
3006 non <constant>NULL</constant> value is passed as third argument it is
3007 interpreted as an address where to store the old access record.
3008 If the third argument is <constant>NULL</constant> it will be assumed
3009 that the generic access should be enabled before replacing the
3010 access functions. Otherwise it will be disabled. The driver may
3011 enable them itself using the returned values. It should do this
3012 from its replacement access functions as the generic access may
3013 be disabled by the common level on certain occasions. If replacement
3014 functions are specified they must control all resources of the
3015 specific type registered for the entity.
3016 </para>
3017
3018 </blockquote></para></blockquote>
3019 </para>
3020
3021 <para>
3022To find out if a specific resource range conflicts with another
3023resource the <function>xf86ChkConflict()</function> function may be used:
3024 <blockquote><para>
3025 <programlisting>
3026 memType xf86ChkConflict(resRange *rgp, int entityIndex);
3027 </programlisting>
3028 <blockquote><para>
3029 This function checks if the resource range <parameter>rgp</parameter> of
3030 for the specified entity conflicts with with another resource.
3031 If a conflict is found, the address of the start of the conflict
3032 is returned. The return value is zero when there is no conflict.
3033 </para>
3034
3035 </blockquote></para></blockquote>
3036 </para>
3037
3038 <para>
3039The OPERATING state properties of previously registered fixed resources
3040can be set with the <function>xf86SetOperatingState()</function> function:
3041 <blockquote><para>
3042 <programlisting>
3043 resPtr xf86SetOperatingState(resList list, int entityIndex,
3044 int mask);
3045 </programlisting>
3046 <blockquote><para>
3047 This function is used to set the status of a resource during
3048 OPERATING state. <parameter>list</parameter> holds a list to which
3049 <parameter>mask</parameter> is to be applied. The parameter
3050 <parameter>mask</parameter> may have the value <constant>ResUnusedOpr</constant>
3051 and <constant>ResDisableOpr</constant>. The first one should be used
3052 if a resource isn't used by the driver during OPERATING state
3053 although it is decoded by the device, while the latter one indicates
3054 that the resource is not decoded during OPERATING state. Note
3055 that the resource ranges have to match those specified during
3056 registration. If a range has been specified starting at
3057 <literal remap="tt">A</literal> and ending at <literal remap="tt">B</literal> and suppose
3058 <literal remap="tt">C</literal> us a value satisfying
3059 <literal remap="tt">A&nbsp;&lt;&nbsp;C&nbsp;&lt;&nbsp;B</literal> one may not
3060 specify the resource range <literal remap="tt">(A,B)</literal> by splitting it
3061 into two ranges <literal remap="tt">(A,C)</literal> and <literal remap="tt">(C,B)</literal>.
3062 </para>
3063
3064 </blockquote></para></blockquote>
3065 </para>
3066
3067 <para>
3068The following two functions are provided for special cases:
3069 <blockquote><para>
3070 <programlisting>
3071 void xf86RemoveEntityFromScreen(ScrnInfoPtr pScrn, int entityIndex);
3072 </programlisting>
3073 <blockquote><para>
3074 This function may be used to remove an entity from a screen. This
3075 only makes sense if a screen has more than one entity assigned or
3076 the screen is to be deleted. No test is made if the screen has
3077 any entities left.
3078 </para>
3079
3080 </blockquote></para></blockquote>
3081
3082 <blockquote><para>
3083 <programlisting>
3084 void xf86DeallocateResourcesForEntity(int entityIndex, long type);
3085 </programlisting>
3086 <blockquote><para>
3087 This function deallocates all resources of a given type registered
3088 for a certain entity from the resource broker list.
3089 </para>
3090
3091 </blockquote></para></blockquote>
3092 </para>
3093
3094 </sect3>
3095
3096 <sect3>
3097 <title>ScreenInit Phase</title>
3098
3099 <para>
3100All that is required in this phase is to setup the RAC flags. Note that
3101it is also permissible to set these flags up in the PreInit phase. The
3102RAC flags are held in the <structfield>racIoFlags</structfield> and <structfield>racMemFlags</structfield> fields of the
3103<structname>ScrnInfoRec</structname> for each screen. They specify which graphics operations
3104might require the use of shared resources. This can be specified
3105separately for memory and I/O resources. The available flags are defined
3106in <filename>rac/xf86RAC.h</filename>. They are:
3107
3108 <variablelist>
3109 <varlistentry><term><constant>RAC_FB</constant></term>
3110 <listitem><para>
3111 for framebuffer operations (including hw acceleration)
3112 </para></listitem></varlistentry>
3113 <varlistentry><term><constant>RAC_CURSOR</constant></term>
3114 <listitem><para>
3115 for Cursor operations
3116 (??? I'm not sure if we need this for SW cursor it depends
3117 on which level the sw cursor is drawn)
3118 </para></listitem></varlistentry>
3119 <varlistentry><term><constant>RAC_COLORMAP</constant></term>
3120 <listitem><para>
3121 for colormap operations
3122 </para></listitem></varlistentry>
3123 <varlistentry><term><constant>RAC_VIEWPORT</constant></term>
3124 <listitem><para>
3125 for the call to <function>ChipAdjustFrame()</function>
3126 </para></listitem></varlistentry>
3127 </variablelist>
3128
3129
3130The flags are ORed together.
3131 </para>
3132 </sect3>
3133 </sect2>
3134 </sect1>
3135
3136 <sect1 id="options">
3137 <title>Config file <quote>Option</quote> entries</title>
3138
3139 <para>
3140Option entries are permitted in most sections and subsections of the
3141config file. There are two forms of option entries:
3142
3143 <variablelist>
3144 <varlistentry><term>Option "option-name"</term>
3145 <listitem><para>
3146 A boolean option.
3147 </para></listitem></varlistentry>
3148 <varlistentry><term>Option "option-name" "option-value"</term>
3149 <listitem><para>
3150 An option with an arbitrary value.
3151 </para></listitem></varlistentry>
3152 </variablelist>
3153 </para>
3154
3155 <para>
3156The option entries are handled by the parser, and a list of the parsed
3157options is included with each of the appropriate data structures that
3158the drivers have access to. The data structures used to hold the option
3159information are opaque to the driver, and a driver must not access the
3160option data directly. Instead, the common layer provides a set of
3161functions that may be used to access, check and manipulate the option
3162data.
3163 </para>
3164
3165 <para>
3166First, the low level option handling functions. In most cases drivers
3167would not need to use these directly.
3168 </para>
3169
3170 <blockquote><para>
3171 <programlisting>
3172 XF86OptionPtr xf86FindOption(XF86OptionPtr options, const char *name);
3173 </programlisting>
3174 <blockquote><para>
3175 Takes a list of options and an option name, and returns a handle
3176 for the first option entry in the list matching the name. Returns
3177 <constant>NULL</constant> if no match is found.
3178 </para>
3179
3180 </blockquote></para></blockquote>
3181
3182 <blockquote><para>
3183 <programlisting>
3184 const char *xf86FindOptionValue(XF86OptionPtr options, const char *name);
3185 </programlisting>
3186 <blockquote><para>
3187 Takes a list of options and an option name, and returns the value
3188 associated with the first option entry in the list matching the
3189 name. If the matching option has no value, an empty string
3190 (<constant>""</constant>) is returned. Returns <constant>NULL</constant>
3191 if no match is found.
3192 </para>
3193
3194 </blockquote></para></blockquote>
3195
3196 <blockquote><para>
3197 <programlisting>
3198 void xf86MarkOptionUsed(XF86OptionPtr option);
3199 </programlisting>
3200 <blockquote><para>
3201 Takes a handle for an option, and marks that option as used.
3202 </para>
3203
3204 </blockquote></para></blockquote>
3205
3206 <blockquote><para>
3207 <programlisting>
3208 void xf86MarkOptionUsedByName(XF86OptionPtr options, const char *name);
3209 </programlisting>
3210 <blockquote><para>
3211 Takes a list of options and an option name and marks the first
3212 option entry in the list matching the name as used.
3213 </para>
3214
3215 </blockquote></para></blockquote>
3216
3217 <para>
3218Next, the higher level functions that most drivers would use.
3219 </para>
3220 <blockquote><para>
3221 <programlisting>
3222 void xf86CollectOptions(ScrnInfoPtr pScrn, XF86OptionPtr extraOpts);
3223 </programlisting>
3224 <blockquote><para>
3225 Collect the options from each of the config file sections used by
3226 the screen (<parameter>pScrn</parameter>) and return the merged list as
3227 <structfield>pScrn-&gt;options</structfield>. This function requires that
3228 <structfield>pScrn-&gt;confScreen</structfield>, <structfield>pScrn-&gt;display</structfield>,
3229 <structfield>pScrn-&gt;monitor</structfield>,
3230 <structfield>pScrn-&gt;numEntities</structfield>, and
3231 <structfield>pScrn-&gt;entityList</structfield> are initialised.
3232 <parameter>extraOpts</parameter> may optionally be set to an additional
3233 list of options to be combined with the others. The order of
3234 precedence for options is <parameter>extraOpts</parameter>, display,
3235 confScreen, monitor, device.
3236 </para>
3237
3238 </blockquote></para></blockquote>
3239
3240 <blockquote><para>
3241 <programlisting>
3242 void xf86ProcessOptions(int scrnIndex, XF86OptionPtr options,
3243 OptionInfoPtr optinfo);
3244 </programlisting>
3245 <blockquote><para>
3246 Processes a list of options according to the information in the
3247 array of <structname>OptionInfoRecs</structname> (<parameter>optinfo</parameter>).
3248 The resulting information is stored in the <structfield>value</structfield>
3249 fields of the appropriate <parameter>optinfo</parameter> entries. The
3250 <structfield>found</structfield> fields are set to <constant>TRUE</constant>
3251 when an option with a value of the correct type if found, and
3252 <constant>FALSE</constant> otherwise. The <structfield>type</structfield> field
3253 is used to determine the expected value type for each option.
3254 Each option in the list of options for which there is a name match
3255 (but not necessarily a value type match) is marked as used.
3256 Warning messages are printed when option values don't match the
3257 types specified in the optinfo data.
3258 </para>
3259
3260 <para>
3261 NOTE: If this function is called before a driver's screen number
3262 is known (e.g., from the <function>ChipProbe()</function> function) a
3263 <parameter>scrnIndex</parameter> value of <constant>-1</constant> should be
3264 used.
3265 </para>
3266
3267 <para>
3268 NOTE 2: Given that this function stores into the
3269 <literal remap="tt">OptionInfoRecs</literal> pointed to by <parameter>optinfo</parameter>,
3270 the caller should ensure the <literal remap="tt">OptionInfoRecs</literal> are
3271 (re-)initialised before the call, especially if the caller expects
3272 to use the predefined option values as defaults.
3273 </para>
3274
3275 <para>
3276 The <structname>OptionInfoRec</structname> is defined as follows:
3277
3278 <programlisting>
3279 typedef struct {
3280 double freq;
3281 int units;
3282 } OptFrequency;
3283
3284 typedef union {
3285 unsigned long num;
3286 char * str;
3287 double realnum;
3288 Bool bool;
3289 OptFrequency freq;
3290 } ValueUnion;
3291
3292 typedef enum {
3293 OPTV_NONE = 0,
3294 OPTV_INTEGER,
3295 OPTV_STRING, /* a non-empty string */
3296 OPTV_ANYSTR, /* Any string, including an empty one */
3297 OPTV_REAL,
3298 OPTV_BOOLEAN,
3299 OPTV_PERCENT,
3300 OPTV_FREQ
3301 } OptionValueType;
3302
3303 typedef enum {
3304 OPTUNITS_HZ = 1,
3305 OPTUNITS_KHZ,
3306 OPTUNITS_MHZ
3307 } OptFreqUnits;
3308
3309 typedef struct {
3310 int token;
3311 const char* name;
3312 OptionValueType type;
3313 ValueUnion value;
3314 Bool found;
3315 } OptionInfoRec, *OptionInfoPtr;
3316 </programlisting>
3317 </para>
3318 <para>
3319 <constant>OPTV_FREQ</constant> can be used for options values that are
3320 frequencies. These values are a floating point number with an
3321 optional unit name appended. The unit name can be one of "Hz",
3322 "kHz", "k", "MHz", "M". The multiplier associated with the unit
3323 is stored in <structfield>freq.units</structfield>, and the scaled frequency
3324 is stored in <structfield>freq.freq</structfield>. When no unit is specified,
3325 <structfield>freq.units</structfield> is set to <constant>0</constant>, and
3326 <structfield>freq.freq</structfield> is unscaled.
3327 </para>
3328
3329 <para>
3330 <constant>OPTV_PERCENT</constant> can be used for option values that are
3331 specified in percent (e.g. "20%"). These values are a floating point
3332 number with a percent sign appended. If the percent sign is missing,
3333 the parser will fail to match the value.
3334 </para>
3335
3336 <para>
3337 Typical usage is to setup an array of
3338 <structname>OptionInfoRec</structname>s with all fields initialised.
3339 The <structfield>value</structfield> and <structfield>found</structfield> fields get
3340 set by <function>xf86ProcessOptions()</function>. For cases where the
3341 value parsing is more complex, the driver should specify
3342 <constant>OPTV_STRING</constant>, and parse the string itself. An
3343 example of using this option handling is included in the
3344 <link linkend="sample">Sample Driver</link> section.
3345 </para>
3346
3347 </blockquote></para></blockquote>
3348
3349 <blockquote><para>
3350 <programlisting>
3351 void xf86ShowUnusedOptions(int scrnIndex, XF86OptionPtr options);
3352 </programlisting>
3353 <blockquote><para>
3354 Prints out warning messages for each option in the list of options
3355 that isn't marked as used. This is intended to show options that
3356 the driver hasn't recognised. It would normally be called near
3357 the end of the <function>ChipScreenInit()</function> function, but only
3358 when <code>serverGeneration&nbsp;==&nbsp;1</code>
3359 </para>
3360 </blockquote></para></blockquote>
3361
3362 <blockquote><para>
3363 <programlisting>
3364 OptionInfoPtr xf86TokenToOptinfo(const OptionInfoRec *table,
3365 int token);
3366 </programlisting>
3367 <blockquote><para>
3368 Returns a pointer to the <structname>OptionInfoRec</structname> in
3369 <parameter>table</parameter> with a token field matching
3370 <parameter>token</parameter>. Returns <constant>NULL</constant> if no match
3371 is found.
3372 </para>
3373
3374 </blockquote></para></blockquote>
3375
3376 <blockquote><para>
3377 <programlisting>
3378 Bool xf86IsOptionSet(const OptionInfoRec *table, int token);
3379 </programlisting>
3380 <blockquote><para>
3381 Returns the <literal remap="tt">found</literal> field of the
3382 <structname>OptionInfoRec</structname> in <parameter>table</parameter> with a
3383 <structfield>token</structfield> field matching <parameter>token</parameter>. This
3384 can be used for options of all types. Note that for options of
3385 type <constant>OPTV_BOOLEAN</constant>, it isn't sufficient to check
3386 this to determine the value of the option. Returns
3387 <constant>FALSE</constant> if no match is found.
3388 </para>
3389
3390 </blockquote></para></blockquote>
3391
3392 <blockquote><para>
3393 <programlisting>
3394 char *xf86GetOptValString(const OptionInfoRec *table, int token);
3395 </programlisting>
3396 <blockquote><para>
3397 Returns the <structfield>value.str</structfield> field of the
3398 <structname>OptionInfoRec</structname> in <parameter>table</parameter> with a
3399 token field matching <parameter>token</parameter>. Returns
3400 <constant>NULL</constant> if no match is found.
3401 </para>
3402
3403 </blockquote></para></blockquote>
3404
3405 <blockquote><para>
3406 <programlisting>
3407 Bool xf86GetOptValInteger(const OptionInfoRec *table, int token,
3408
3409 int *value);
3410 </programlisting>
3411 <blockquote><para>
3412 Returns via <parameter>*value</parameter> the <structfield>value.num</structfield>
3413 field of the <structname>OptionInfoRec</structname> in <parameter>table</parameter>
3414 with a <structfield>token</structfield> field matching <parameter>token</parameter>.
3415 <parameter>*value</parameter> is only changed when a match is found so
3416 it can be safely initialised with a default prior to calling this
3417 function. The function return value is as for
3418 <function>xf86IsOptionSet()</function>.
3419 </para>
3420
3421 </blockquote></para></blockquote>
3422
3423 <blockquote><para>
3424 <programlisting>
3425 Bool xf86GetOptValULong(const OptionInfoRec *table, int token,
3426 unsigned long *value);
3427 </programlisting>
3428 <blockquote><para>
3429 Like <function>xf86GetOptValInteger()</function>, except the value is
3430 treated as an <type>unsigned long</type>.
3431 </para>
3432
3433 </blockquote></para></blockquote>
3434
3435 <blockquote><para>
3436 <programlisting>
3437 Bool xf86GetOptValReal(const OptionInfoRec *table, int token,
3438 double *value);
3439 </programlisting>
3440 <blockquote><para>
3441 Like <function>xf86GetOptValInteger()</function>, except that
3442 <structfield>value.realnum</structfield> is used.
3443 </para>
3444
3445 </blockquote></para></blockquote>
3446
3447 <blockquote><para>
3448 <programlisting>
3449 Bool xf86GetOptValFreq(const OptionInfoRec *table, int token,
3450 OptFreqUnits expectedUnits, double *value);
3451 </programlisting>
3452 <blockquote><para>
3453 Like <function>xf86GetOptValInteger()</function>, except that the
3454 <structfield>value.freq</structfield> data is returned. The frequency value
3455 is scaled to the units indicated by <parameter>expectedUnits</parameter>.
3456 The scaling is exact when the units were specified explicitly in
3457 the option's value. Otherwise, the <parameter>expectedUnits</parameter>
3458 field is used as a hint when doing the scaling. In this case,
3459 values larger than <constant>1000</constant> are assumed to have be
3460 specified in the next smallest units. For example, if the Option
3461 value is "10000" and expectedUnits is <constant>OPTUNITS_MHZ</constant>,
3462 the value returned is <constant>10</constant>.
3463 </para>
3464
3465 </blockquote></para></blockquote>
3466
3467 <blockquote><para>
3468 <programlisting>
3469 Bool xf86GetOptValBool(const OptionInfoRec *table, int token, Bool *value);
3470 </programlisting>
3471 <blockquote><para>
3472 This function is used to check boolean options
3473 (<constant>OPTV_BOOLEAN</constant>). If the function return value is
3474 <constant>FALSE</constant>, it means the option wasn't set. Otherwise
3475 <parameter>*value</parameter> is set to the boolean value indicated by
3476 the option's value. No option <parameter>value</parameter> is interpreted
3477 as <constant>TRUE</constant>. Option values meaning <constant>TRUE</constant>
3478 are "1", "yes", "on", "true", and option values meaning
3479 <constant>FALSE</constant> are "0", "no", "off", "false". Option names
3480 both with the "no" prefix in their names, and with that prefix
3481 removed are also checked and handled in the obvious way.
3482 <parameter>*value</parameter> is not changed when the option isn't present.
3483 It should normally be set to a default value before calling this
3484 function.
3485 </para>
3486
3487 </blockquote></para></blockquote>
3488
3489 <blockquote><para>
3490 <programlisting>
3491 Bool xf86ReturnOptValBool(const OptionInfoRec *table, int token, Bool def);
3492 </programlisting>
3493 <blockquote><para>
3494 This function is used to check boolean options
3495 (<constant>OPTV_BOOLEAN</constant>). If the option is set, its value
3496 is returned. If the options is not set, the default value specified
3497 by <parameter>def</parameter> is returned. The option interpretation is
3498 the same as for <function>xf86GetOptValBool()</function>.
3499 </para>
3500
3501 </blockquote></para></blockquote>
3502
3503 <blockquote><para>
3504 <programlisting>
3505 int xf86NameCmp(const char *s1, const char *s2);
3506 </programlisting>
3507 <blockquote><para>
3508 This function should be used when comparing strings from the config
3509 file with expected values. It works like <function>strcmp()</function>,
3510 but is not case sensitive and space, tab, and <quote><literal>_</literal></quote> characters
3511 are ignored in the comparison. The use of this function isn't
3512 restricted to parsing option values. It may be used anywhere
3513 where this functionality required.
3514 </para>
3515
3516 </blockquote></para></blockquote>
3517 </sect1>
3518
3519 <sect1>
3520 <title>Modules, Drivers, Include Files and Interface Issues</title>
3521
3522 <para>
3523NOTE: this section is incomplete.
3524 </para>
3525
3526
3527 <sect2>
3528 <title>Include files</title>
3529
3530 <para>
3531The following include files are typically required by video drivers:
3532
3533 <blockquote><para>
3534 All drivers should include these:
3535 <literallayout><filename>
3536 "xf86.h"
3537 "xf86_OSproc.h"
3538 "xf86_ansic.h"
3539 "xf86Resources.h"
3540 </filename></literallayout>
3541 Wherever inb/outb (and related things) are used the following should be
3542 included:
3543 <literallayout><filename>
3544 "compiler.h"
3545 </filename></literallayout>
3546 Note: in drivers, this must be included after <filename>"xf86_ansic.h"</filename>.
3547 </para>
3548
3549 <para>
3550 Drivers that need to access the PCI config space need this:
3551 <literallayout><filename>
3552 "xf86Pci.h"
3553 </filename></literallayout>
3554 </para>
3555
3556 <para>
3557 Drivers that initialise a SW cursor need this:
3558 <literallayout><filename>
3559 "mipointer.h"
3560 </filename></literallayout>
3561 </para>
3562
3563 <para>
3564 All drivers using the mi colourmap code need this:
3565 <literallayout><filename>
3566 "micmap.h"
3567 </filename></literallayout>
3568 </para>
3569
3570 <para>
3571 If a driver uses the vgahw module, it needs this:
3572 <literallayout><filename>
3573 "vgaHW.h"
3574 </filename></literallayout>
3575 </para>
3576
3577 <para>
3578 Drivers supporting VGA or Hercules monochrome screens need:
3579 <literallayout><filename>
3580 "xf1bpp.h"
3581 </filename></literallayout>
3582 </para>
3583
3584 <para>
3585 Drivers supporting VGA or EGC 16-colour screens need:
3586 <literallayout><filename>
3587 "xf4bpp.h"
3588 </filename></literallayout>
3589 </para>
3590
3591 <para>
3592 Drivers using cfb need:
3593 <programlisting>
3594 #define PSZ 8
3595 #include "cfb.h"
3596 #undef PSZ
3597 </programlisting>
3598 </para>
3599
3600 <para>
3601 Drivers supporting bpp 16, 24 or 32 with cfb need one or more of:
3602 <literallayout><filename>
3603 "cfb16.h"
3604 "cfb24.h"
3605 "cfb32.h"
3606 </filename></literallayout>
3607 </para>
3608
3609 <para>
3610 If a driver uses the fb manager, it needs this:
3611 <literallayout><filename>
3612 "xf86fbman.h"
3613 </filename></literallayout>
3614 </para>
3615 </blockquote>
3616 </para>
3617
3618 <para>
3619Non-driver modules should include <filename>"xf86_ansic.h"</filename> to get the correct
3620wrapping of ANSI C/libc functions.
3621 </para>
3622
3623 <para>
3624All modules must NOT include any system include files, or the following:
3625
3626 <literallayout><filename>
3627 "xf86Priv.h"
3628 "xf86Privstr.h"
3629 "xf86_OSlib.h"
3630 "Xos.h"
3631 </filename></literallayout>
3632 </para>
3633
3634 <para>
3635In addition, "xf86_libc.h" must not be included explicitly. It is
3636included implicitly by "xf86_ansic.h".
3637 </para>
3638
3639 </sect2>
3640 </sect1>
3641
3642 <sect1>
3643 <title>Offscreen Memory Manager</title>
3644
3645 <para>
3646Management of offscreen video memory may be handled by the XFree86
3647framebuffer manager. Once the offscreen memory manager is running,
3648drivers or extensions may allocate, free or resize areas of offscreen
3649video memory using the following functions (definitions taken from
3650<filename>xf86fbman.h</filename>):
3651
3652 <programlisting>
3653 typedef struct _FBArea {
3654 ScreenPtr pScreen;
3655 BoxRec box;
3656 int granularity;
3657 void (*MoveAreaCallback)(struct _FBArea*, struct _FBArea*)
3658 void (*RemoveAreaCallback)(struct _FBArea*)
3659 DevUnion devPrivate;
3660 } FBArea, *FBAreaPtr;
3661
3662 typedef void (*MoveAreaCallbackProcPtr)(FBAreaPtr from, FBAreaPtr to)
3663 typedef void (*RemoveAreaCallbackProcPtr)(FBAreaPtr)
3664
3665 FBAreaPtr xf86AllocateOffscreenArea (
3666 ScreenPtr pScreen,
3667 int width, int height,
3668 int granularity,
3669 MoveAreaCallbackProcPtr MoveAreaCallback,
3670 RemoveAreaCallbackProcPtr RemoveAreaCallback,
3671 pointer privData
3672 )
3673
3674 void xf86FreeOffscreenArea (FBAreaPtr area)
3675
3676 Bool xf86ResizeOffscreenArea (
3677 FBAreaPtr area
3678 int w, int h
3679 )
3680 </programlisting>
3681 </para>
3682
3683 <para>
3684The function:
3685 <programlisting>
3686 Bool xf86FBManagerRunning(ScreenPtr pScreen);
3687 </programlisting>
3688
3689can be used by an extension to check if the driver has initialized
3690the memory manager. The manager is not available if this returns
3691<constant>FALSE</constant> and the functions above will all fail.
3692 </para>
3693
3694
3695 <para>
3696<function>xf86AllocateOffscreenArea()</function> can be used to request a
3697rectangle of dimensions <parameter>width</parameter>&nbsp;&times;&nbsp;<parameter>height</parameter>
3698(in pixels) from unused offscreen memory. <parameter>granularity</parameter>
3699specifies that the leftmost edge of the rectangle must lie on some
3700multiple of <parameter>granularity</parameter> pixels. A granularity of zero
3701means the same thing as a granularity of one - no alignment preference.
3702A <parameter>MoveAreaCallback</parameter> can be provided to notify the requester
3703when the offscreen area is moved. If no <parameter>MoveAreaCallback</parameter>
3704is supplied then the area is considered to be immovable. The
3705<parameter>privData</parameter> field will be stored in the manager's internal
3706structure for that allocated area and will be returned to the requester
3707in the <parameter>FBArea</parameter> passed via the
3708<parameter>MoveAreaCallback</parameter>. An optional
3709<parameter>RemoveAreaCallback</parameter> is provided. If the driver provides
3710this it indicates that the area should be allocated with a lower priority.
3711Such an area may be removed when a higher priority request (one that
3712doesn't have a <parameter>RemoveAreaCallback</parameter>) is made. When this
3713function is called, the driver will have an opportunity to do whatever
3714cleanup it needs to do to deal with the loss of the area, but it must
3715finish its cleanup before the function exits since the offscreen memory
3716manager will free the area immediately after.
3717 </para>
3718
3719 <para>
3720<function>xf86AllocateOffscreenArea()</function> returns <constant>NULL</constant>
3721if it was unable to allocate the requested area. When no longer needed,
3722areas should be freed with <function>xf86FreeOffscreenArea()</function>.
3723 </para>
3724
3725 <para>
3726<function>xf86ResizeOffscreenArea()</function> resizes an existing
3727<literal remap="tt">FBArea</literal>. <function>xf86ResizeOffscreenArea()</function>
3728returns <constant>TRUE</constant> if the resize was successful. If
3729<function>xf86ResizeOffscreenArea()</function> returns <constant>FALSE</constant>,
3730the original <literal remap="tt">FBArea</literal> is left unmodified. Resizing an
3731area maintains the area's original <literal remap="tt">granularity</literal>,
3732<literal remap="tt">devPrivate</literal>, and <literal remap="tt">MoveAreaCallback</literal>.
3733<function>xf86ResizeOffscreenArea()</function> has considerably less overhead
3734than freeing the old area then reallocating the new size, so it should
3735be used whenever possible.
3736 </para>
3737
3738 <para>
3739The function:
3740 <programlisting>
3741 Bool xf86QueryLargestOffscreenArea(
3742 ScreenPtr pScreen,
3743 int *width, int *height,
3744 int granularity,
3745 int preferences,
3746 int priority
3747 );
3748 </programlisting>
3749
3750is provided to query the width and height of the largest single
3751<structname>FBArea</structname> allocatable given a particular priority.
3752<parameter>preferences</parameter> can be one of the following to indicate
3753whether width, height or area should be considered when determining
3754which is the largest single <structname>FBArea</structname> available.
3755
3756 <programlisting>
3757 FAVOR_AREA_THEN_WIDTH
3758 FAVOR_AREA_THEN_HEIGHT
3759 FAVOR_WIDTH_THEN_AREA
3760 FAVOR_HEIGHT_THEN_AREA
3761 </programlisting>
3762 </para>
3763
3764 <para>
3765<parameter>priority</parameter> is one of the following:
3766
3767 <blockquote>
3768 <para>
3769 <constant>PRIORITY_LOW</constant>
3770 <blockquote><para>
3771 Return the largest block available without stealing anyone else's
3772 space. This corresponds to the priority of allocating a
3773 <structname>FBArea</structname> when a <function>RemoveAreaCallback</function>
3774 is provided.
3775 </para></blockquote>
3776 </para>
3777
3778 <para>
3779 <constant>PRIORITY_NORMAL</constant>
3780 <blockquote><para>
3781 Return the largest block available if it is acceptable to steal a
3782 lower priority area from someone. This corresponds to the priority
3783 of allocating a <structname>FBArea</structname> without providing a
3784 <function>RemoveAreaCallback</function>.
3785 </para></blockquote>
3786 </para>
3787
3788 <para>
3789 <constant>PRIORITY_EXTREME</constant>
3790 <blockquote><para>
3791 Return the largest block available if all <structname>FBArea</structname>s
3792 that aren't locked down were expunged from memory first. This
3793 corresponds to any allocation made directly after a call to
3794 <function>xf86PurgeUnlockedOffscreenAreas()</function>.
3795 </para></blockquote>
3796 </para>
3797
3798 </blockquote>
3799 </para>
3800
3801
3802 <para>
3803The function:
3804
3805 <programlisting>
3806 Bool xf86PurgeUnlockedOffscreenAreas(ScreenPtr pScreen);
3807 </programlisting>
3808
3809is provided as an extreme method to free up offscreen memory. This
3810will remove all removable <structname>FBArea</structname> allocations.
3811 </para>
3812
3813
3814 <para>
3815Initialization of the XFree86 framebuffer manager is done via
3816
3817 <programlisting>
3818 Bool xf86InitFBManager(ScreenPtr pScreen, BoxPtr FullBox);
3819 </programlisting>
3820
3821<parameter>FullBox</parameter> represents the area of the framebuffer that the
3822manager is allowed to manage. This is typically a box with a width of
3823<structfield>pScrn-&gt;displayWidth</structfield> and a height of as many lines as
3824can be fit within the total video memory, however, the driver can reserve
3825areas at the extremities by passing a smaller area to the manager.
3826 </para>
3827 </sect1>
3828
3829 <sect1 id="cmap">
3830 <title>Colormap Handling</title>
3831
3832 <para>
3833A generic colormap handling layer is provided within the XFree86 common
3834layer. This layer takes care of most of the details, and only requires
3835a function from the driver that loads the hardware palette when required.
3836To use the colormap layer, a driver calls the
3837<function>xf86HandleColormaps()</function> function.
3838
3839 <blockquote><para>
3840 <programlisting>
3841 Bool xf86HandleColormaps(ScreenPtr pScreen, int maxColors,
3842 int sigRGBbits, LoadPaletteFuncPtr loadPalette,
3843 SetOverscanFuncPtr setOverscan,
3844 unsigned int flags);
3845 </programlisting>
3846 <blockquote><para>
3847 This function must be called after the default colormap has been
3848 initialised. The <structfield>pScrn-&gt;gamma</structfield> field must also
3849 be initialised, preferably by calling <function>xf86SetGamma()</function>.
3850 <parameter>maxColors</parameter> is the number of entries in the palette.
3851 <parameter>sigRGBbits</parameter> is the size in bits of each color
3852 component in the DAC's palette. <parameter>loadPalette</parameter>
3853 is a driver-provided function for loading a colormap into the
3854 hardware, and is described below. <parameter>setOverscan</parameter> is
3855 an optional function that may be provided when the overscan color
3856 is an index from the standard LUT and when it needs to be adjusted
3857 to keep it as close to black as possible. The
3858 <parameter>setOverscan</parameter> function programs the overscan index.
3859 It shouldn't normally be used for depths other than 8.
3860 <parameter>setOverscan</parameter> should be set to <constant>NULL</constant>
3861 when it isn't needed. <parameter>flags</parameter> may be set to the
3862 following (which may be ORed together):
3863
3864 <variablelist>
3865 <varlistentry>
3866 <term><constant>CMAP_PALETTED_TRUECOLOR</constant></term>
3867 <listitem><para>
3868 the TrueColor visual is paletted and is
3869 just a special case of DirectColor.
3870 This flag is only valid for
3871 <code>bpp&nbsp;&gt;&nbsp;8</code>.
3872
3873 </para></listitem></varlistentry>
3874 <varlistentry>
3875 <term><constant>CMAP_RELOAD_ON_MODE_SWITCH</constant></term>
3876 <listitem><para>
3877 reload the colormap automatically
3878 after mode switches. This is useful
3879 for when the driver is resetting the
3880 hardware during mode switches and
3881 corrupting or erasing the hardware
3882 palette.
3883
3884 </para></listitem></varlistentry>
3885 <varlistentry>
3886 <term><constant>CMAP_LOAD_EVEN_IF_OFFSCREEN</constant></term>
3887 <listitem><para>
3888 reload the colormap even if the screen
3889 is switched out of the server's VC.
3890 The palette is <emphasis>not</emphasis> reloaded when
3891 the screen is switched back in, nor after
3892 mode switches. This is useful when the
3893 driver needs to keep track of palette
3894 changes.
3895
3896 </para></listitem></varlistentry>
3897 </variablelist>
3898 </para>
3899
3900 <para>
3901 The colormap layer normally reloads the palette after VT enters so it
3902 is not necessary for the driver to save and restore the palette
3903 when switching VTs. The driver must, however, still save the
3904 initial palette during server start up and restore it during
3905 server exit.
3906 </para>
3907
3908 </blockquote></para></blockquote>
3909
3910 <blockquote><para>
3911 <programlisting>
3912 void LoadPalette(ScrnInfoPtr pScrn, int numColors, int *indices,
3913 LOCO *colors, VisualPtr pVisual);
3914 </programlisting>
3915 <blockquote><para>
3916 <function>LoadPalette()</function> is a driver-provided function for
3917 loading a colormap into hardware. <parameter>colors</parameter> is the
3918 array of RGB values that represent the full colormap.
3919 <parameter>indices</parameter> is a list of index values into the colors
3920 array. These indices indicate the entries that need to be updated.
3921 <parameter>numColors</parameter> is the number of the indices to be
3922 updated.
3923 </para>
3924
3925 </blockquote></para></blockquote>
3926
3927 <blockquote><para>
3928 <programlisting>
3929 void SetOverscan(ScrnInfoPtr pScrn, int overscan);
3930 </programlisting>
3931 <blockquote><para>
3932 <function>SetOverscan()</function> is a driver-provided function for
3933 programming the <parameter>overscan</parameter> index. As described
3934 above, it is normally only appropriate for LUT modes where all
3935 colormap entries are available for the display, but where one of
3936 them is also used for the overscan (typically 8bpp for VGA compatible
3937 LUTs). It isn't required in cases where the overscan area is
3938 never visible.
3939 </para>
3940
3941 </blockquote></para>
3942 </blockquote></para>
3943
3944 </sect1>
3945
3946 <sect1>
3947 <title>DPMS Extension</title>
3948
3949 <para>
3950Support code for the DPMS extension is included in the XFree86 common layer.
3951This code provides an interface between the main extension code, and a means
3952for drivers to initialise DPMS when they support it. One function is
3953available to drivers to do this initialisation, and it is always available,
3954even when the DPMS extension is not supported by the core server (in
3955which case it returns a failure result).
3956 </para>
3957
3958 <blockquote><para>
3959 <programlisting>
3960 Bool xf86DPMSInit(ScreenPtr pScreen, DPMSSetProcPtr set, int flags);
3961 </programlisting>
3962 <blockquote><para>
3963 This function registers a driver's DPMS level programming function
3964 <parameter>set</parameter>. It also checks
3965 <structfield>pScrn-&gt;options</structfield> for the "dpms" option, and when
3966 present marks DPMS as being enabled for that screen. The
3967 <parameter>set</parameter> function is called whenever the DPMS level
3968 changes, and is used to program the requested level.
3969 <parameter>flags</parameter> is currently not used, and should be
3970 <constant>0</constant>. If the initialisation fails for any reason,
3971 including when there is no DPMS support in the core server, the
3972 function returns <constant>FALSE</constant>.
3973 </para>
3974
3975 </blockquote></para></blockquote>
3976
3977
3978 <para>
3979Drivers that implement DPMS support must provide the following function,
3980that gets called when the DPMS level is changed:
3981
3982
3983 <blockquote><para>
3984 <programlisting>
3985 void ChipDPMSSet(ScrnInfoPtr pScrn, int level, int flags);
3986 </programlisting>
3987 <blockquote><para>
3988 Program the DPMS level specified by <parameter>level</parameter>. Valid
3989 values of <parameter>level</parameter> are <constant>DPMSModeOn</constant>,
3990 <constant>DPMSModeStandby</constant>, <constant>DPMSModeSuspend</constant>,
3991 <constant>DPMSModeOff</constant>. These values are defined in
3992 <filename>"extensions/dpms.h"</filename>.
3993 </para>
3994
3995 </blockquote></para></blockquote>
3996 </para>
3997
3998 </sect1>
3999
4000 <sect1>
4001 <title>DGA Extension</title>
4002
4003 <para>
4004Drivers can support the XFree86 Direct Graphics Architecture (DGA) by
4005filling out a structure of function pointers and a list of modes and
4006passing them to DGAInit.
4007 </para>
4008
4009 <blockquote><para>
4010 <programlisting>
4011 Bool DGAInit(ScreenPtr pScreen, DGAFunctionPtr funcs,
4012 DGAModePtr modes, int num);
4013
4014/** The DGAModeRec **/
4015
4016typedef struct {
4017 int num;
4018 DisplayModePtr mode;
4019 int flags;
4020 int imageWidth;
4021 int imageHeight;
4022 int pixmapWidth;
4023 int pixmapHeight;
4024 int bytesPerScanline;
4025 int byteOrder;
4026 int depth;
4027 int bitsPerPixel;
4028 unsigned long red_mask;
4029 unsigned long green_mask;
4030 unsigned long blue_mask;
4031 int viewportWidth;
4032 int viewportHeight;
4033 int xViewportStep;
4034 int yViewportStep;
4035 int maxViewportX;
4036 int maxViewportY;
4037 int viewportFlags;
4038 int offset;
4039 unsigned char *address;
4040 int reserved1;
4041 int reserved2;
4042} DGAModeRec, *DGAModePtr;
4043 </programlisting>
4044
4045 <variablelist>
4046 <varlistentry>
4047 <term><structfield>num</structfield></term>
4048 <listitem><para>
4049 Can be ignored. The DGA DDX will assign these numbers.
4050 </para></listitem></varlistentry>
4051
4052 <varlistentry>
4053 <term><structfield>mode</structfield></term>
4054 <listitem><para>
4055 A pointer to the <structname>DisplayModeRec</structname> for this mode.
4056 </para></listitem></varlistentry>
4057
4058 <varlistentry>
4059 <term><structfield>flags</structfield></term>
4060 <listitem><para>
4061 The following flags are defined and may be OR'd together:
4062
4063 <variablelist>
4064 <varlistentry>
4065 <term><constant>DGA_CONCURRENT_ACCESS</constant></term>
4066 <listitem><para>
4067 Indicates that the driver supports concurrent graphics
4068 accelerator and linear framebuffer access.
4069
4070 </para></listitem></varlistentry>
4071
4072 <varlistentry>
4073 <term><constant>DGA_FILL_RECT
4074 DGA_BLIT_RECT
4075 DGA_BLIT_RECT_TRANS</constant></term>
4076 <listitem><para>
4077 Indicates that the driver supports the FillRect, BlitRect
4078 or BlitTransRect functions in this mode.
4079
4080 </para></listitem></varlistentry>
4081
4082 <varlistentry>
4083 <term><constant>DGA_PIXMAP_AVAILABLE</constant></term>
4084 <listitem><para>
4085 Indicates that Xlib may be used on the framebuffer.
4086 This flag will usually be set unless the driver wishes
4087 to prohibit this for some reason.
4088
4089 </para></listitem></varlistentry>
4090
4091 <varlistentry>
4092 <term><constant>DGA_INTERLACED
4093 DGA_DOUBLESCAN</constant></term>
4094 <listitem><para>
4095 Indicates that these are interlaced or double scan modes.
4096
4097 </para></listitem></varlistentry>
4098 </variablelist>
4099 </para></listitem></varlistentry>
4100
4101 <varlistentry>
4102 <term><structfield>imageWidth
4103 imageHeight</structfield></term>
4104 <listitem><para>
4105 These are the dimensions of the linear framebuffer
4106 accessible by the client.
4107
4108 </para></listitem></varlistentry>
4109
4110 <varlistentry>
4111 <term><structfield>pixmapWidth
4112 pixmapHeight</structfield></term>
4113 <listitem><para>
4114 These are the dimensions of the area of the
4115 framebuffer accessible by the graphics accelerator.
4116
4117 </para></listitem></varlistentry>
4118
4119 <varlistentry>
4120 <term><structfield>bytesPerScanline</structfield></term>
4121 <listitem><para>
4122 Pitch of the framebuffer in bytes.
4123
4124 </para></listitem></varlistentry>
4125
4126 <varlistentry>
4127 <term><structfield>byteOrder</structfield></term>
4128 <listitem><para>
4129 Usually the same as
4130 <structfield>pScrn-&gt;imageByteOrder</structfield>.
4131
4132 </para></listitem></varlistentry>
4133
4134 <varlistentry>
4135 <term><structfield>depth</structfield></term>
4136 <listitem><para>
4137 The depth of the framebuffer in this mode.
4138
4139 </para></listitem></varlistentry>
4140
4141 <varlistentry>
4142 <term><structfield>bitsPerPixel</structfield></term>
4143 <listitem><para>
4144 The number of bits per pixel in this mode.
4145
4146 </para></listitem></varlistentry>
4147
4148 <varlistentry>
4149 <term><structfield>red_mask</structfield></term>
4150 <term><structfield>green_mask</structfield></term>
4151 <term><structfield>blue_mask</structfield></term>
4152 <listitem><para>
4153 The RGB masks for this mode, if applicable.
4154
4155 </para></listitem></varlistentry>
4156
4157 <varlistentry>
4158 <term><structfield>viewportWidth</structfield></term>
4159 <term><structfield>viewportHeight</structfield></term>
4160 <listitem><para>
4161 Dimensions of the visible part of the framebuffer.
4162 Usually <structfield>mode-&gt;HDisplay</structfield> and
4163 <structfield>mode-&gt;VDisplay</structfield>.
4164
4165 </para></listitem></varlistentry>
4166
4167 <varlistentry>
4168 <term><structfield>xViewportStep
4169 yViewportStep</structfield></term>
4170 <listitem><para>
4171 The granularity of x and y viewport positions that
4172 the driver supports in this mode.
4173
4174 </para></listitem></varlistentry>
4175
4176 <varlistentry>
4177 <term><structfield>maxViewportX
4178 maxViewportY</structfield></term>
4179 <listitem><para>
4180 The maximum viewport position supported by the
4181 driver in this mode.
4182 </para></listitem></varlistentry>
4183
4184 <varlistentry>
4185 <term><structfield>viewportFlags</structfield></term>
4186 <listitem><para>
4187 The following may be OR'd together:
4188
4189 <variablelist>
4190 <varlistentry>
4191 <term><constant>DGA_FLIP_IMMEDIATE</constant></term>
4192 <listitem><para>
4193 The driver supports immediate viewport changes.
4194 </para></listitem></varlistentry>
4195
4196 <varlistentry>
4197 <term><constant>DGA_FLIP_RETRACE</constant></term>
4198
4199 <listitem><para>
4200 The driver supports viewport changes at retrace.
4201 </para></listitem></varlistentry>
4202 </variablelist>
4203 </para></listitem></varlistentry>
4204
4205 <varlistentry>
4206 <term><structfield>offset</structfield></term>
4207 <listitem><para>
4208 The offset into the linear framebuffer that corresponds to
4209 pixel (0,0) for this mode.
4210 </para></listitem></varlistentry>
4211
4212 <varlistentry>
4213 <term><structfield>address</structfield></term>
4214 <listitem><para>
4215 The virtual address of the framebuffer as mapped by the driver.
4216 This is needed when DGA_PIXMAP_AVAILABLE is set.
4217 </para></listitem></varlistentry>
4218
4219 </variablelist>
4220
4221 <programlisting>
4222/** The DGAFunctionRec **/
4223
4224typedef struct {
4225 Bool (*OpenFramebuffer)(
4226 ScrnInfoPtr pScrn,
4227 char **name,
4228 unsigned char **mem,
4229 int *size,
4230 int *offset,
4231 int *extra
4232 );
4233 void (*CloseFramebuffer)(ScrnInfoPtr pScrn);
4234 Bool (*SetMode)(ScrnInfoPtr pScrn, DGAModePtr pMode);
4235 void (*SetViewport)(ScrnInfoPtr pScrn, int x, int y, int flags);
4236 int (*GetViewport)(ScrnInfoPtr pScrn);
4237 void (*Sync)(ScrnInfoPtr);
4238 void (*FillRect)(
4239 ScrnInfoPtr pScrn,
4240 int x, int y, int w, int h,
4241 unsigned long color
4242 );
4243 void (*BlitRect)(
4244 ScrnInfoPtr pScrn,
4245 int srcx, int srcy,
4246 int w, int h,
4247 int dstx, int dsty
4248 );
4249 void (*BlitTransRect)(
4250 ScrnInfoPtr pScrn,
4251 int srcx, int srcy,
4252 int w, int h,
4253 int dstx, int dsty,
4254 unsigned long color
4255 );
4256} DGAFunctionRec, *DGAFunctionPtr;
4257 </programlisting>
4258
4259
4260 <blockquote><para>
4261 <programlisting>
4262 Bool OpenFramebuffer (pScrn, name, mem, size, offset, extra);
4263 </programlisting>
4264 <blockquote><para>
4265 <function>OpenFramebuffer()</function> should pass the client everything
4266 it needs to know to be able to open the framebuffer. These
4267 parameters are OS specific and their meanings are to be interpreted
4268 by an OS specific client library.
4269
4270 <variablelist>
4271 <varlistentry>
4272 <term><parameter>name</parameter></term>
4273 <listitem><para>
4274 The name of the device to open or <constant>NULL</constant> if
4275 there is no special device to open. A <constant>NULL</constant>
4276 name tells the client that it should open whatever device
4277 one would usually open to access physical memory.
4278 </para></listitem></varlistentry>
4279
4280 <varlistentry>
4281 <term><parameter>mem</parameter></term>
4282 <listitem><para>
4283 The physical address of the start of the framebuffer.
4284 </para></listitem></varlistentry>
4285
4286 <varlistentry>
4287 <term><parameter>size</parameter></term>
4288 <listitem><para>
4289 The size of the framebuffer in bytes.
4290 </para></listitem></varlistentry>
4291
4292 <varlistentry>
4293 <term><parameter>offset</parameter></term>
4294 <listitem><para>
4295 Any offset into the device, if applicable.
4296 </para></listitem></varlistentry>
4297
4298 <varlistentry>
4299 <term><parameter>flags</parameter></term>
4300 <listitem><para>
4301 Any additional information that the client may need.
4302 Currently, only the <constant>DGA_NEED_ROOT</constant> flag is
4303 defined.
4304 </para></listitem></varlistentry>
4305
4306 </variablelist>
4307 </para></blockquote>
4308 </para></blockquote>
4309
4310 <blockquote><para>
4311 <programlisting>
4312 void CloseFramebuffer (pScrn);
4313 </programlisting>
4314 <blockquote><para>
4315 <function>CloseFramebuffer()</function> merely informs the driver (if it
4316 even cares) that client no longer needs to access the framebuffer
4317 directly. This function is optional.
4318 </para>
4319
4320 </blockquote></para></blockquote>
4321
4322 <blockquote><para>
4323 <programlisting>
4324 Bool SetMode (pScrn, pMode);
4325 </programlisting>
4326 <blockquote><para>
4327 <function>SetMode()</function> tells the driver to initialize the mode
4328 passed to it. If <parameter>pMode</parameter> is <constant>NULL</constant>,
4329 then the driver should restore the original pre-DGA mode.
4330 </para>
4331
4332 </blockquote></para></blockquote>
4333
4334 <blockquote><para>
4335 <programlisting>
4336 void SetViewport (pScrn, x, y, flags);
4337 </programlisting>
4338 <blockquote><para>
4339 <function>SetViewport()</function> tells the driver to make the upper
4340 left-hand corner of the visible screen correspond to coordinate
4341 <literal remap="tt">(x,y)</literal> on the framebuffer. <parameter>flags</parameter>
4342 currently defined are:
4343
4344 <variablelist>
4345 <varlistentry>
4346 <term><constant>DGA_FLIP_IMMEDIATE</constant></term>
4347 <listitem><para>
4348 The viewport change should occur immediately.
4349 </para></listitem></varlistentry>
4350
4351 <varlistentry>
4352 <term><constant>DGA_FLIP_RETRACE</constant></term>
4353 <listitem><para>
4354 The viewport change should occur at the
4355 vertical retrace, but this function should
4356 return sooner if possible.
4357 </para></listitem></varlistentry>
4358 </variablelist>
4359 </para>
4360
4361 <para>
4362 The <literal remap="tt">(x,y)</literal> locations will be passed as the client
4363 specified them, however, the driver is expected to round these
4364 locations down to the next supported location as specified by the
4365 <structfield>xViewportStep</structfield> and <structfield>yViewportStep</structfield>
4366 for the current mode.
4367 </para>
4368 </blockquote></para></blockquote>
4369
4370 <blockquote><para>
4371 <programlisting>
4372 int GetViewport (pScrn);
4373 </programlisting>
4374 <blockquote><para>
4375 <function>GetViewport()</function> gets the current page flip status.
4376 Set bits in the returned int correspond to viewport change requests
4377 still pending. For instance, set bit zero if the last SetViewport
4378 request is still pending, bit one if the one before that is still
4379 pending, etc.
4380 </para>
4381
4382 </blockquote></para></blockquote>
4383
4384 <blockquote><para>
4385 <programlisting>
4386 void Sync (pScrn);
4387 </programlisting>
4388 <blockquote><para>
4389 This function should ensure that any graphics accelerator operations
4390 have finished. This function should not return until the graphics
4391 accelerator is idle.
4392 </para>
4393
4394 </blockquote></para></blockquote>
4395
4396 <blockquote><para>
4397 <programlisting>
4398 void FillRect (pScrn, x, y, w, h, color);
4399 </programlisting>
4400 <blockquote><para>
4401 This optional function should fill a rectangle
4402 <parameter>w&nbsp;&times;&nbsp;h</parameter> located at
4403 <parameter>(x,y)</parameter> in the given color.
4404 </para>
4405
4406 </blockquote></para></blockquote>
4407
4408 <blockquote><para>
4409 <programlisting>
4410 void BlitRect (pScrn, srcx, srcy, w, h, dstx, dsty);
4411 </programlisting>
4412 <blockquote><para>
4413 This optional function should copy an area
4414 <parameter>w&nbsp;&times;&nbsp;h</parameter> located at
4415 <parameter>(srcx,srcy)</parameter> to location <parameter>(dstx,dsty)</parameter>.
4416 This function will need to handle copy directions as appropriate.
4417 </para>
4418
4419 </blockquote></para></blockquote>
4420
4421 <blockquote><para>
4422 <programlisting>
4423 void BlitTransRect (pScrn, srcx, srcy, w, h, dstx, dsty, color);
4424 </programlisting>
4425 <blockquote><para>
4426 This optional function is the same as BlitRect except that pixels
4427 in the source corresponding to the color key <parameter>color</parameter>
4428 should be skipped.
4429 </para>
4430
4431 </blockquote></para></blockquote>
4432 </para></blockquote>
4433
4434 </sect1>
4435
4436 <sect1>
4437 <title>The XFree86 X Video Extension (Xv) Device Dependent Layer</title>
4438
4439 <para>
4440XFree86 offers the X Video Extension which allows clients to treat video
4441as any another primitive and <quote>Put</quote> video into drawables. By default,
4442the extension reports no video adaptors as being available since the
4443DDX layer has not been initialized. The driver can initialize the DDX
4444layer by filling out one or more <literal remap="tt">XF86VideoAdaptorRecs</literal>
4445as described later in this document and passing a list of
4446<literal remap="tt">XF86VideoAdaptorPtr</literal> pointers to the following function:
4447
4448 <programlisting>
4449 Bool xf86XVScreenInit(ScreenPtr pScreen,
4450 XF86VideoAdaptorPtr *adaptPtrs,
4451 int num);
4452 </programlisting>
4453 </para>
4454
4455 <para>
4456After doing this, the extension will report video adaptors as being
4457available, providing the data in their respective
4458<literal remap="tt">XF86VideoAdaptorRecs</literal> was valid.
4459<function>xf86XVScreenInit()</function> <emphasis>copies</emphasis> data from the structure
4460passed to it so the driver may free it after the initialization. At
4461the moment, the DDX only supports rendering into Window drawables.
4462Pixmap rendering will be supported after a sufficient survey of suitable
4463hardware is completed.
4464 </para>
4465
4466 <para>
4467The <structname>XF86VideoAdaptorRec</structname>:
4468
4469 <programlisting>
4470typedef struct {
4471 unsigned int type;
4472 int flags;
4473 char *name;
4474 int nEncodings;
4475 XF86VideoEncodingPtr pEncodings;
4476 int nFormats;
4477 XF86VideoFormatPtr pFormats;
4478 int nPorts;
4479 DevUnion *pPortPrivates;
4480 int nAttributes;
4481 XF86AttributePtr pAttributes;
4482 int nImages;
4483 XF86ImagePtr pImages;
4484 PutVideoFuncPtr PutVideo;
4485 PutStillFuncPtr PutStill;
4486 GetVideoFuncPtr GetVideo;
4487 GetStillFuncPtr GetStill;
4488 StopVideoFuncPtr StopVideo;
4489 SetPortAttributeFuncPtr SetPortAttribute;
4490 GetPortAttributeFuncPtr GetPortAttribute;
4491 QueryBestSizeFuncPtr QueryBestSize;
4492 PutImageFuncPtr PutImage;
4493 QueryImageAttributesFuncPtr QueryImageAttributes;
4494} XF86VideoAdaptorRec, *XF86VideoAdaptorPtr;
4495 </programlisting></para>
4496
4497 <para>
4498Each adaptor will have its own XF86VideoAdaptorRec. The fields are
4499as follows:
4500
4501 <variablelist>
4502 <varlistentry>
4503 <term><structfield>type</structfield></term>
4504 <listitem><para>
4505 This can be any of the following flags OR'd together.
4506
4507 <variablelist>
4508 <varlistentry>
4509 <term><constant>XvInputMask</constant>
4510 <constant>XvOutputMask</constant></term>
4511 <listitem><para>
4512 These refer to the target drawable and are similar to a Window's
4513 class. <literal remap="tt">XvInputMask</literal> indicates that the adaptor
4514 can put video into a drawable. <literal remap="tt">XvOutputMask</literal>
4515 indicates that the adaptor can get video from a drawable.
4516 </para></listitem></varlistentry>
4517
4518 <varlistentry>
4519 <term><constant>XvVideoMask</constant>
4520 <constant>XvStillMask</constant>
4521 <constant>XvImageMask</constant></term>
4522 <listitem><para>
4523 These indicate that the adaptor supports video, still or
4524 image primitives respectively.
4525 </para></listitem></varlistentry>
4526
4527 <varlistentry>
4528 <term><constant>XvWindowMask</constant>
4529 <constant>XvPixmapMask</constant></term>
4530 <listitem><para>
4531 These indicate the types of drawables the adaptor is capable
4532 of rendering into. At the moment, Pixmap rendering is not
4533 supported and the <constant>XvPixmapMask</constant> flag is ignored.
4534 </para></listitem></varlistentry>
4535 </variablelist>
4536
4537 </para></listitem></varlistentry>
4538
4539 <varlistentry>
4540 <term><structfield>flags</structfield></term>
4541 <listitem><para>
4542 Currently, the following flags are defined:
4543
4544 <variablelist>
4545 <varlistentry>
4546 <term><constant>VIDEO_NO_CLIPPING</constant></term>
4547 <listitem><para>
4548 This indicates that the video adaptor does not support
4549 clipping. The driver will never receive <quote>Put</quote> requests
4550 where less than the entire area determined by
4551 <parameter>drw_x</parameter>, <parameter>drw_y</parameter>,
4552 <parameter>drw_w</parameter> and <parameter>drw_h</parameter> is visible.
4553 This flag does not apply to <quote>Get</quote> requests. Hardware
4554 that is incapable of clipping <quote>Gets</quote> may punt or get
4555 the extents of the clipping region passed to it.
4556 </para></listitem>
4557
4558 </varlistentry>
4559
4560 <varlistentry>
4561 <term><constant>VIDEO_INVERT_CLIPLIST</constant></term>
4562 <listitem><para>
4563 This indicates that the video driver requires the clip
4564 list to contain the regions which are obscured rather
4565 than the regions which are are visible.
4566 </para></listitem>
4567
4568 </varlistentry>
4569
4570 <varlistentry>
4571 <term><constant>VIDEO_OVERLAID_STILLS</constant></term>
4572 <listitem><para>
4573 Implementing PutStill for hardware that does video as an
4574 overlay can be awkward since it's unclear how long to leave
4575 the video up for. When this flag is set, StopVideo will be
4576 called whenever the destination gets clipped or moved so that
4577 the still can be left up until then.
4578 </para></listitem>
4579
4580 </varlistentry>
4581
4582 <varlistentry>
4583 <term><constant>VIDEO_OVERLAID_IMAGES</constant></term>
4584 <listitem><para>
4585 Same as <constant>VIDEO_OVERLAID_STILLS</constant> but for images.
4586 </para></listitem>
4587 </varlistentry>
4588
4589 <varlistentry>
4590 <term><constant>VIDEO_CLIP_TO_VIEWPORT</constant></term>
4591 <listitem><para>
4592 Indicates that the clip region passed to the driver functions
4593 should be clipped to the visible portion of the screen in the
4594 case where the viewport is smaller than the virtual desktop.
4595 </para></listitem></varlistentry>
4596
4597 </variablelist>
4598 </para></listitem></varlistentry>
4599
4600 <varlistentry>
4601 <term><structfield>name</structfield></term>
4602 <listitem><para>
4603 The name of the adaptor.
4604 </para></listitem></varlistentry>
4605
4606
4607 <varlistentry>
4608 <term><structfield>nEncodings</structfield>
4609 <structfield>pEncodings</structfield></term>
4610 <listitem><para>
4611 The number of encodings the adaptor is capable of and pointer
4612 to the <structname>XF86VideoEncodingRec</structname> array. The
4613 <structname>XF86VideoEncodingRec</structname> is described later on.
4614 For drivers that only support XvImages there should be an encoding
4615 named "XV_IMAGE" and the width and height should specify
4616 the maximum size source image supported.
4617 </para></listitem></varlistentry>
4618
4619
4620 <varlistentry>
4621 <term><structfield>nFormats</structfield>
4622 <structfield>pFormats</structfield></term>
4623 <listitem><para>
4624 The number of formats the adaptor is capable of and pointer to
4625 the <structname>XF86VideoFormatRec</structname> array. The
4626 <structname>XF86VideoFormatRec</structname> is described later on.
4627 </para></listitem></varlistentry>
4628
4629
4630 <varlistentry>
4631 <term><structfield>nPorts</structfield>
4632 <structfield>pPortPrivates</structfield></term>
4633 <listitem><para>
4634 The number of ports is the number of separate data streams which
4635 the adaptor can handle simultaneously. If you have more than
4636 one port, the adaptor is expected to be able to render into more
4637 than one window at a time. <structfield>pPortPrivates</structfield> is
4638 an array of pointers or ints - one for each port. A port's
4639 private data will be passed to the driver any time the port is
4640 requested to do something like put the video or stop the video.
4641 In the case where there may be many ports, this enables the
4642 driver to know which port the request is intended for. Most
4643 commonly, this will contain a pointer to the data structure
4644 containing information about the port. In Xv, all ports on
4645 a particular adaptor are expected to be identical in their
4646 functionality.
4647 </para></listitem></varlistentry>
4648
4649
4650 <varlistentry>
4651 <term><structfield>nAttributes</structfield>
4652 <structfield>pAttributes</structfield></term>
4653 <listitem><para>
4654 The number of attributes recognized by the adaptor and a pointer to
4655 the array of <structname>XF86AttributeRecs</structname>. The
4656 <structname>XF86AttributeRec</structname> is described later on.
4657 </para></listitem></varlistentry>
4658
4659
4660 <varlistentry>
4661 <term><structfield>nImages</structfield>
4662 <structfield>pImages</structfield></term>
4663 <listitem><para>
4664 The number of <structname>XF86ImageRecs</structname> supported by the adaptor
4665 and a pointer to the array of <structname>XF86ImageRecs</structname>. The
4666 <structname>XF86ImageRec</structname> is described later on.
4667 </para></listitem></varlistentry>
4668
4669
4670 <varlistentry>
4671 <term><structfield>
4672 PutVideo PutStill GetVideo GetStill StopVideo
4673 SetPortAttribute GetPortAttribute QueryBestSize PutImage
4674 QueryImageAttributes
4675 </structfield></term>
4676 <listitem><para>
4677 These functions define the DDX-&gt;driver interface. In each
4678 case, the pointer <parameter>data</parameter> is passed to the driver.
4679 This is the port private for that port as described above. All
4680 fields are required except under the following conditions:
4681
4682 <orderedlist>
4683 <listitem><para>
4684 <structfield>PutVideo</structfield>, <structfield>PutStill</structfield> and
4685 the image routines <structfield>PutImage</structfield> and
4686 <structfield>QueryImageAttributes</structfield> are not required when the
4687 adaptor type does not contain <constant>XvInputMask</constant>.
4688 </para></listitem>
4689
4690 <listitem><para>
4691 <structfield>GetVideo</structfield> and <structfield>GetStill</structfield>
4692 are not required when the adaptor type does not contain
4693 <constant>XvOutputMask</constant>.
4694 </para></listitem>
4695
4696 <listitem><para>
4697 <structfield>GetVideo</structfield> and <structfield>PutVideo</structfield>
4698 are not required when the adaptor type does not contain
4699 <constant>XvVideoMask</constant>.
4700 </para></listitem>
4701
4702 <listitem><para>
4703 <structfield>GetStill</structfield> and <structfield>PutStill</structfield>
4704 are not required when the adaptor type does not contain
4705 <constant>XvStillMask</constant>.
4706 </para></listitem>
4707
4708 <listitem><para>
4709 <structfield>PutImage</structfield> and <structfield>QueryImageAttributes</structfield>
4710 are not required when the adaptor type does not contain
4711 <constant>XvImageMask</constant>.
4712 </para></listitem>
4713
4714 </orderedlist>
4715
4716 </para>
4717
4718 <para>
4719 With the exception of <structfield>QueryImageAttributes</structfield>, these
4720 functions should return <constant>Success</constant> if the operation was
4721 completed successfully. They can return <constant>XvBadAlloc</constant>
4722 otherwise. <structfield>QueryImageAttributes</structfield> returns the size
4723 of the XvImage queried.
4724 </para>
4725
4726 <para>
4727 If the <constant>VIDEO_NO_CLIPPING</constant>
4728 flag is set, the <literal remap="tt">clipBoxes</literal> may be ignored by
4729 the driver. <literal remap="tt">ClipBoxes</literal> is an <literal remap="tt">X-Y</literal>
4730 banded region identical to those used throughout the server.
4731 The clipBoxes represent the visible portions of the area determined
4732 by <literal remap="tt">drw_x</literal>, <literal remap="tt">drw_y</literal>,
4733 <literal remap="tt">drw_w</literal> and <literal remap="tt">drw_h</literal> in the Get/Put
4734 function. The boxes are in screen coordinates, are guaranteed
4735 not to overlap and an empty region will never be passed.
4736 If the driver has specified <constant>VIDEO_INVERT_CLIPLIST</constant>,
4737 <literal remap="tt">clipBoxes</literal> will indicate the areas of the primitive
4738 which are obscured rather than the areas visible.
4739
4740 </para></listitem></varlistentry>
4741 </variablelist>
4742
4743 <blockquote><para>
4744 <programlisting>
4745 typedef int (* PutVideoFuncPtr)( ScrnInfoPtr pScrn,
4746 short vid_x, short vid_y, short drw_x, short drw_y,
4747 short vid_w, short vid_h, short drw_w, short drw_h,
4748 RegionPtr clipBoxes, pointer data );
4749 </programlisting>
4750 <blockquote><para>
4751 This indicates that the driver should take a subsection
4752 <parameter>vid_w</parameter> by <parameter>vid_h</parameter> at location
4753 <parameter>(vid_x,vid_y)</parameter> from the video stream and direct
4754 it into the rectangle <parameter>drw_w</parameter> by <parameter>drw_h</parameter>
4755 at location <parameter>(drw_x,drw_y)</parameter> on the screen, scaling as
4756 necessary. Due to the large variations in capabilities of
4757 the various hardware expected to be used with this extension,
4758 it is not expected that all hardware will be able to do this
4759 exactly as described. In that case the driver should just do
4760 <quote>the best it can,</quote> scaling as closely to the target rectangle
4761 as it can without rendering outside of it. In the worst case,
4762 the driver can opt to just not turn on the video.
4763 </para>
4764
4765 </blockquote></para></blockquote>
4766
4767 <blockquote><para>
4768 <programlisting>
4769 typedef int (* PutStillFuncPtr)( ScrnInfoPtr pScrn,
4770 short vid_x, short vid_y, short drw_x, short drw_y,
4771 short vid_w, short vid_h, short drw_w, short drw_h,
4772 RegionPtr clipBoxes, pointer data );
4773 </programlisting>
4774 <blockquote><para>
4775 This is same as <structfield>PutVideo</structfield> except that the driver
4776 should place only one frame from the stream on the screen.
4777 </para>
4778
4779 </blockquote></para></blockquote>
4780
4781 <blockquote><para>
4782 <programlisting>
4783 typedef int (* GetVideoFuncPtr)( ScrnInfoPtr pScrn,
4784 short vid_x, short vid_y, short drw_x, short drw_y,
4785 short vid_w, short vid_h, short drw_w, short drw_h,
4786 RegionPtr clipBoxes, pointer data );
4787 </programlisting>
4788 <blockquote><para>
4789 This is same as <structfield>PutVideo</structfield> except that the driver
4790 gets video from the screen and outputs it. The driver should
4791 do the best it can to get the requested dimensions correct
4792 without reading from an area larger than requested.
4793 </para>
4794
4795 </blockquote></para></blockquote>
4796
4797 <blockquote><para>
4798 <programlisting>
4799 typedef int (* GetStillFuncPtr)( ScrnInfoPtr pScrn,
4800 short vid_x, short vid_y, short drw_x, short drw_y,
4801 short vid_w, short vid_h, short drw_w, short drw_h,
4802 RegionPtr clipBoxes, pointer data );
4803 </programlisting>
4804 <blockquote><para>
4805 This is the same as <literal remap="tt">GetVideo</literal> except that the
4806 driver should place only one frame from the screen into the
4807 output stream.
4808 </para>
4809
4810 </blockquote></para></blockquote>
4811
4812 <blockquote><para>
4813 <programlisting>
4814 typedef void (* StopVideoFuncPtr)(ScrnInfoPtr pScrn,
4815 pointer data, Bool cleanup);
4816 </programlisting>
4817 <blockquote><para>
4818 This indicates the driver should stop displaying the video.
4819 This is used to stop both input and output video. The
4820 <parameter>cleanup</parameter> field indicates that the video is
4821 being stopped because the client requested it to stop or
4822 because the server is exiting the current VT. In that case
4823 the driver should deallocate any offscreen memory areas (if
4824 there are any) being used to put the video to the screen. If
4825 <parameter>cleanup</parameter> is not set, the video is being stopped
4826 temporarily due to clipping or moving of the window, etc...
4827 and video will likely be restarted soon so the driver should
4828 not deallocate any offscreen areas associated with that port.
4829 </para>
4830
4831 </blockquote></para></blockquote>
4832 <blockquote><para>
4833 <programlisting>
4834 typedef int (* SetPortAttributeFuncPtr)(ScrnInfoPtr pScrn,
4835 Atom attribute,INT32 value, pointer data);
4836 </programlisting>
4837
4838 <programlisting>
4839 typedef int (* GetPortAttributeFuncPtr)(ScrnInfoPtr pScrn,
4840 Atom attribute,INT32 *value, pointer data);
4841 </programlisting>
4842 <blockquote><para>
4843 A port may have particular attributes such as hue,
4844 saturation, brightness or contrast. Xv clients set and
4845 get these attribute values by sending attribute strings
4846 (Atoms) to the server. Such requests end up at these
4847 driver functions. It is recommended that the driver provide
4848 at least the following attributes mentioned in the Xv client
4849 library docs:
4850 <literallayout><constant>
4851 XV_ENCODING
4852 XV_HUE
4853 XV_SATURATION
4854 XV_BRIGHTNESS
4855 XV_CONTRAST
4856 </constant></literallayout>
4857 but the driver may recognize as many atoms as it wishes. If
4858 a requested attribute is unknown by the driver it should return
4859 <constant>BadMatch</constant>. <constant>XV_ENCODING</constant> is the
4860 attribute intended to let the client specify which video
4861 encoding the particular port should be using (see the description
4862 of <structname>XF86VideoEncodingRec</structname> below). If the
4863 requested encoding is unsupported, the driver should return
4864 <constant>XvBadEncoding</constant>. If the value lies outside the
4865 advertised range <constant>BadValue</constant> may be returned.
4866 <constant>Success</constant> should be returned otherwise.
4867 </para>
4868
4869 </blockquote></para></blockquote>
4870
4871 <blockquote><para>
4872 <programlisting>
4873 typedef void (* QueryBestSizeFuncPtr)(ScrnInfoPtr pScrn,
4874 Bool motion, short vid_w, short vid_h,
4875 short drw_w, short drw_h,
4876 unsigned int *p_w, unsigned int *p_h, pointer data);
4877 </programlisting>
4878 <blockquote><para>
4879 <function>QueryBestSize</function> provides the client with a way
4880 to query what the destination dimensions would end up being
4881 if they were to request that an area
4882 <parameter>vid_w</parameter> by <parameter>vid_h</parameter> from the video
4883 stream be scaled to rectangle of
4884 <parameter>drw_w</parameter> by <parameter>drw_h</parameter> on the screen.
4885 Since it is not expected that all hardware will be able to
4886 get the target dimensions exactly, it is important that the
4887 driver provide this function.
4888 </para>
4889
4890 </blockquote></para></blockquote>
4891
4892 <blockquote><para>
4893 <programlisting>
4894 typedef int (* PutImageFuncPtr)( ScrnInfoPtr pScrn,
4895 short src_x, short src_y, short drw_x, short drw_y,
4896 short src_w, short src_h, short drw_w, short drw_h,
4897 int image, char *buf, short width, short height,
4898 Bool sync, RegionPtr clipBoxes, pointer data );
4899 </programlisting>
4900 <blockquote><para>
4901 This is similar to <structfield>PutStill</structfield> except that the
4902 source of the video is not a port but the data stored in a system
4903 memory buffer at <parameter>buf</parameter>. The data is in the format
4904 indicated by the <parameter>image</parameter> descriptor and represents a
4905 source of size <parameter>width</parameter> by <parameter>height</parameter>.
4906 If <parameter>sync</parameter> is TRUE the driver should not return
4907 from this function until it is through reading the data
4908 from <parameter>buf</parameter>. Returning when <parameter>sync</parameter>
4909 is TRUE indicates that it is safe for the data at <parameter>buf</parameter>
4910 to be replaced, freed, or modified.
4911 </para>
4912
4913 </blockquote></para></blockquote>
4914
4915 <blockquote><para>
4916 <programlisting>
4917 typedef int (* QueryImageAttributesFuncPtr)( ScrnInfoPtr pScrn,
4918 int image, short *width, short *height,
4919 int *pitches, int *offsets);
4920 </programlisting>
4921 <blockquote><para>
4922 This function is called to let the driver specify how data for
4923 a particular <parameter>image</parameter> of size <parameter>width</parameter>
4924 by <parameter>height</parameter> should be stored. Sometimes only
4925 the size and corrected width and height are needed. In that
4926 case <parameter>pitches</parameter> and <parameter>offsets</parameter> are
4927 NULL. The size of the memory required for the image is returned
4928 by this function. The <parameter>width</parameter> and
4929 <parameter>height</parameter> of the requested image can be altered by
4930 the driver to reflect format limitations (such as component
4931 sampling periods that are larger than one). If
4932 <parameter>pitches</parameter> and <parameter>offsets</parameter> are not NULL,
4933 these will be arrays with as many elements in them as there
4934 are planes in the <parameter>image</parameter> format. The driver
4935 should specify the pitch (in bytes) of each scanline in the
4936 particular plane as well as the offset to that plane (in bytes)
4937 from the beginning of the image.
4938 </para>
4939
4940 </blockquote></para></blockquote>
4941 </para>
4942
4943 <para>
4944The XF86VideoEncodingRec:
4945
4946 <blockquote><para>
4947 <programlisting>
4948typedef struct {
4949 int id;
4950 char *name;
4951 unsigned short width, height;
4952 XvRationalRec rate;
4953} XF86VideoEncodingRec, *XF86VideoEncodingPtr;
4954
4955 </programlisting>
4956 <blockquote><para>
4957 The <structname>XF86VideoEncodingRec</structname> specifies what encodings
4958 the adaptor can support. Most of this data is just informational
4959 and for the client's benefit, and is what will be reported by
4960 <function>XvQueryEncodings</function>. The <parameter>id</parameter> field is
4961 expected to be a unique identifier to allow the client to request a
4962 certain encoding via the <constant>XV_ENCODING</constant> attribute string.
4963
4964 </para>
4965 </blockquote></para></blockquote>
4966 </para>
4967
4968 <para>
4969The XF86VideoFormatRec:
4970
4971 <blockquote><para>
4972 <programlisting>
4973typedef struct {
4974 char depth;
4975 short class;
4976} XF86VideoFormatRec, *XF86VideoFormatPtr;
4977
4978 </programlisting>
4979 <blockquote><para>
4980 This specifies what visuals the video is viewable in.
4981 <parameter>depth</parameter> is the depth of the visual (not bpp).
4982 <parameter>class</parameter> is the visual class such as
4983 <constant>TrueColor</constant>, <constant>DirectColor</constant> or
4984 <constant>PseudoColor</constant>. Initialization of an adaptor will fail
4985 if none of the visuals on that screen are supported.
4986 </para>
4987
4988 </blockquote></para></blockquote>
4989 </para>
4990
4991 <para>
4992The XF86AttributeRec:
4993
4994 <blockquote><para>
4995 <programlisting>
4996typedef struct {
4997 int flags;
4998 int min_value;
4999 int max_value;
5000 char *name;
5001} XF86AttributeListRec, *XF86AttributeListPtr;
5002
5003 </programlisting>
5004 <blockquote><para>
5005 Each adaptor may have an array of these advertising the attributes
5006 for its ports. Currently defined flags are <literal remap="tt">XvGettable</literal>
5007 and <literal remap="tt">XvSettable</literal> which may be OR'd together indicating that
5008 attribute is <quote>gettable</quote> or <quote>settable</quote> by the client. The
5009 <literal remap="tt">min</literal> and <literal remap="tt">max</literal> field specify the valid range
5010 for the value. <literal remap="tt">Name</literal> is a text string describing the
5011 attribute by name.
5012 </para>
5013
5014 </blockquote></para></blockquote>
5015
5016 </para>
5017
5018 <para>
5019The XF86ImageRec:
5020
5021 <blockquote><para>
5022 <programlisting>
5023typedef struct {
5024 int id;
5025 int type;
5026 int byte_order;
5027 char guid[16];
5028 int bits_per_pixel;
5029 int format;
5030 int num_planes;
5031
5032 /* for RGB formats */
5033 int depth;
5034 unsigned int red_mask;
5035 unsigned int green_mask;
5036 unsigned int blue_mask;
5037
5038 /* for YUV formats */
5039 unsigned int y_sample_bits;
5040 unsigned int u_sample_bits;
5041 unsigned int v_sample_bits;
5042 unsigned int horz_y_period;
5043 unsigned int horz_u_period;
5044 unsigned int horz_v_period;
5045 unsigned int vert_y_period;
5046 unsigned int vert_u_period;
5047 unsigned int vert_v_period;
5048 char component_order[32];
5049 int scanline_order;
5050} XF86ImageRec, *XF86ImagePtr;
5051
5052 </programlisting>
5053 <blockquote><para>
5054 XF86ImageRec describes how video source data is laid out in memory.
5055 The fields are as follows:
5056
5057 <variablelist>
5058 <varlistentry>
5059 <term><structfield>id</structfield></term>
5060 <listitem><para>
5061 This is a unique descriptor for the format. It is often good to
5062 set this value to the FOURCC for the format when applicable.
5063 </para></listitem></varlistentry>
5064
5065 <varlistentry>
5066 <term><structfield>type</structfield></term>
5067 <listitem><para>
5068 This is <constant>XvRGB</constant> or <constant>XvYUV</constant>.
5069 </para></listitem></varlistentry>
5070
5071 <varlistentry>
5072 <term><structfield>byte_order</structfield></term>
5073 <listitem><para>
5074 This is <constant>LSBFirst</constant> or <constant>MSBFirst</constant>.
5075 </para></listitem></varlistentry>
5076
5077 <varlistentry>
5078 <term><structfield>guid</structfield></term>
5079 <listitem><para>
5080 This is the Globally Unique IDentifier for the format. When
5081 not applicable, all characters should be NULL.
5082 </para></listitem></varlistentry>
5083
5084 <varlistentry>
5085 <term><structfield>bits_per_pixel</structfield></term>
5086 <listitem><para>
5087 The number of bits taken up (but not necessarily used) by each
5088 pixel. Note that for some planar formats which have fractional
5089 bits per pixel (such as IF09) this number may be rounded _down_.
5090 </para></listitem></varlistentry>
5091
5092 <varlistentry>
5093 <term><structfield>format</structfield></term>
5094 <listitem><para>
5095 This is <constant>XvPlanar</constant> or <constant>XvPacked</constant>.
5096 </para></listitem></varlistentry>
5097
5098 <varlistentry>
5099 <term><structfield>num_planes</structfield></term>
5100 <listitem><para>
5101 The number of planes in planar formats. This should be set to
5102 one for packed formats.
5103 </para></listitem></varlistentry>
5104
5105 <varlistentry>
5106 <term><structfield>depth</structfield></term>
5107 <listitem><para>
5108 The significant bits per pixel in RGB formats (analgous to the
5109 depth of a pixmap format).
5110 </para></listitem></varlistentry>
5111
5112 <varlistentry>
5113 <term><structfield>red_mask</structfield></term>
5114 <term><structfield>green_mask</structfield></term>
5115 <term><structfield>blue_mask</structfield></term>
5116 <listitem><para>
5117 The red, green and blue bitmasks for packed RGB formats.
5118 </para></listitem></varlistentry>
5119
5120 <varlistentry>
5121 <term><structfield>y_sample_bits</structfield></term>
5122 <term><structfield>u_sample_bits</structfield></term>
5123 <term><structfield>v_sample_bits</structfield></term>
5124 <listitem><para>
5125 The y, u and v sample sizes (in bits).
5126 </para></listitem></varlistentry>
5127
5128 <varlistentry>
5129 <term><structfield>horz_y_period</structfield></term>
5130 <term><structfield>horz_u_period</structfield></term>
5131 <term><structfield>horz_v_period</structfield></term>
5132 <listitem><para>
5133 The y, u and v sampling periods in the horizontal direction.
5134 </para></listitem></varlistentry>
5135
5136 <varlistentry>
5137 <term><structfield>vert_y_period</structfield></term>
5138 <term><structfield>vert_u_period</structfield></term>
5139 <term><structfield>vert_v_period</structfield></term>
5140 <listitem><para>
5141 The y, u and v sampling periods in the vertical direction.
5142 </para></listitem></varlistentry>
5143
5144 <varlistentry>
5145 <term><structfield>component_order</structfield></term>
5146 <listitem><para>
5147 Uppercase ascii characters representing the order that
5148 samples are stored within packed formats. For planar formats
5149 this represents the ordering of the planes. Unused characters
5150 in the 32 byte string should be set to NULL.
5151 </para></listitem></varlistentry>
5152
5153 <varlistentry>
5154 <term><structfield>scanline_order</structfield></term>
5155 <listitem><para>
5156 This is <constant>XvTopToBottom</constant> or <constant>XvBottomToTop</constant>.
5157 </para></listitem></varlistentry>
5158
5159 </variablelist>
5160 </para>
5161
5162 <para>
5163 Since some formats (particular some planar YUV formats) may not
5164be completely defined by the parameters above, the guid, when
5165available, should provide the most accurate description of the
5166format.
5167 </para>
5168
5169 </blockquote></para></blockquote>
5170 </para>
5171 </sect1>
5172
5173 <sect1>
5174 <title>The Loader</title>
5175
5176 <para>
5177This section describes the interfaces to the module loader. The loader
5178interfaces can be divided into two groups: those that are only available to
5179the XFree86 common layer, and those that are also available to modules.
5180 </para>
5181
5182 <sect2>
5183 <title>Loader Overview</title>
5184
5185 <para>
5186The loader is capable of loading modules in a range of object formats,
5187and knowledge of these formats is built in to the loader. Knowledge of
5188new object formats can be added to the loader in a straightforward
5189manner. This makes it possible to provide OS-independent modules (for
5190a given CPU architecture type). In addition to this, the loader can
5191load modules via the OS-provided <function>dlopen(3)</function> service where
5192available. Such modules are not platform independent, and the semantics
5193of <function>dlopen()</function> on most systems results in significant
5194limitations in the use of modules of this type. Support for
5195<function>dlopen()</function> modules in the loader is primarily for
5196experimental and development purposes.
5197 </para>
5198
5199 <para>
5200Symbols exported by the loader (on behalf of the core X server) to
5201modules are determined at compile time. Only those symbols explicitly
5202exported are available to modules. All external symbols of loaded
5203modules are exported to other modules, and to the core X server. The
5204loader can be requested to check for unresolved symbols at any time,
5205and the action to be taken for unresolved symbols can be controlled by
5206the caller of the loader. Typically the caller identifies which symbols
5207can safely remain unresolved and which cannot.
5208 </para>
5209
5210 <para>
5211NOTE: Now that ISO-C allows pointers to functions and pointers to data to
5212have different internal representations, some of the following interfaces
5213will need to be revisited.
5214 </para>
5215 </sect2>
5216
5217 <sect2>
5218 <title>Semi-private Loader Interface</title>
5219
5220 <para>
5221The following is the semi-private loader interface that is available to the
5222XFree86 common layer.
5223 </para>
5224
5225 <blockquote><para>
5226 <programlisting>
5227 void LoaderInit(void);
5228 </programlisting>
5229 <blockquote><para>
5230 The <function>LoaderInit()</function> function initialises the loader,
5231 and it must be called once before calling any other loader functions.
5232 This function initialises the tables of exported symbols, and anything
5233 else that might need to be initialised.
5234 </para>
5235
5236 </blockquote></para></blockquote>
5237
5238 <blockquote><para>
5239 <programlisting>
5240 void LoaderSetPath(const char *path);
5241 </programlisting>
5242 <blockquote><para>
5243 The <function>LoaderSetPath()</function> function initialises a default
5244 module search path. This must be called if calls to other functions
5245 are to be made without explicitly specifying a module search path.
5246 The search path <parameter>path</parameter> must be a string of one or more
5247 comma separated absolute paths. Modules are expected to be located
5248 below these paths, possibly in subdirectories of these paths.
5249 </para>
5250
5251 </blockquote></para></blockquote>
5252
5253 <blockquote><para>
5254 <programlisting>
5255 pointer LoadModule(const char *module, const char *path,
5256 const char **subdirlist, const char **patternlist,
5257 pointer options, const XF86ModReqInfo * modreq,
5258 int *errmaj, int *errmin);
5259 </programlisting>
5260 <blockquote><para>
5261 The <function>LoadModule()</function> function loads the module called
5262 <parameter>module</parameter>. The return value is a module handle, and
5263 may be used in future calls to the loader that require a reference
5264 to a loaded module. The module name <parameter>module</parameter> is
5265 normally the module's canonical name, which doesn't contain any
5266 directory path information, or any object/library file prefixes of
5267 suffixes. Currently a full pathname and/or filename is also accepted.
5268 This might change. The other parameters are:
5269
5270 <variablelist>
5271 <varlistentry>
5272 <term><parameter>path</parameter></term>
5273 <listitem><para>
5274 An optional comma-separated list of module search paths.
5275 When <constant>NULL</constant>, the default search path is used.
5276 </para></listitem></varlistentry>
5277
5278
5279 <varlistentry>
5280 <term><parameter>subdirlist</parameter></term>
5281 <listitem><para>
5282 An optional <constant>NULL</constant> terminated list of
5283 subdirectories to search. When <constant>NULL</constant>,
5284 the default built-in list is used (refer to
5285 <varname>stdSubdirs</varname> in <filename>loadmod.c</filename>).
5286 The default list is also substituted for entries in
5287 <parameter>subdirlist</parameter> with the value
5288 <constant>DEFAULT_LIST</constant>. This makes is possible
5289 to augment the default list instead of replacing it.
5290 Subdir elements must be relative, and must not contain
5291 <literal remap="tt">".."</literal>. If any violate this requirement,
5292 the load fails.
5293 </para></listitem></varlistentry>
5294
5295
5296 <varlistentry>
5297 <term><parameter>patternlist</parameter></term>
5298 <listitem><para>
5299 An optional <constant>NULL</constant> terminated list of
5300 POSIX regular expressions used to connect module
5301 filenames with canonical module names. Each regex
5302 should contain exactly one subexpression that corresponds
5303 to the canonical module name. When <constant>NULL</constant>,
5304 the default built-in list is used (refer to
5305 <varname>stdPatterns</varname> in
5306 <filename>loadmod.c</filename>). The default list is also
5307 substituted for entries in <parameter>patternlist</parameter>
5308 with the value <constant>DEFAULT_LIST</constant>. This
5309 makes it possible to augment the default list instead
5310 of replacing it.
5311 </para></listitem></varlistentry>
5312
5313
5314 <varlistentry>
5315 <term><parameter>options</parameter></term>
5316 <listitem><para>
5317 An optional parameter that is passed to the newly
5318 loaded module's <literal remap="tt">SetupProc</literal> function
5319 (if it has one). This argument is normally a
5320 <constant>NULL</constant> terminated list of
5321 <structname>Options</structname>, and must be interpreted that
5322 way by modules loaded directly by the XFree86 common
5323 layer. However, it may be used for application-specific
5324 parameter passing in other situations.
5325 </para></listitem></varlistentry>
5326
5327
5328 <varlistentry>
5329 <term><parameter>modreq</parameter></term>
5330 <listitem><para>
5331 An optional <structname>XF86ModReqInfo*</structname> containing
5332 version/ABI/vendor information to requirements to
5333 check the newly loaded module against. The main
5334 purpose of this is to allow the loader to verify that
5335 a module of the correct type/version before running
5336 its <function>SetupProc</function> function.
5337 </para>
5338
5339 <para>
5340 The <literal remap="tt">XF86ModReqInfo</literal> struct is defined
5341 as follows:
5342 <programlisting>
5343typedef struct {
5344 CARD8 majorversion; /* MAJOR_UNSPEC */
5345 CARD8 minorversion; /* MINOR_UNSPEC */
5346 CARD16 patchlevel; /* PATCH_UNSPEC */
5347 const char * abiclass; /* ABI_CLASS_NONE */
5348 CARD32 abiversion; /* ABI_VERS_UNSPEC */
5349 const char * moduleclass; /* MOD_CLASS_NONE */
5350} XF86ModReqInfo;
5351 </programlisting>
5352
5353 The information here is compared against the equivalent
5354 information in the module's
5355 <structname>XF86ModuleVersionInfo</structname> record (which
5356 is described below). The values in comments above
5357 indicate <quote>don't care</quote> settings for each of the fields.
5358 The comparisons made are as follows:
5359
5360 <variablelist>
5361 <varlistentry>
5362 <term><structfield>majorversion</structfield></term>
5363 <listitem><para>
5364 Must match the module's majorversion
5365 exactly.
5366 </para></listitem></varlistentry>
5367
5368 <varlistentry>
5369 <term><structfield>minorversion</structfield></term>
5370 <listitem><para>
5371 The module's minor version must be
5372 no less than this value. This
5373 comparison is only made if
5374 <structfield>majorversion</structfield> is
5375 specified and matches.
5376 </para></listitem></varlistentry>
5377
5378 <varlistentry>
5379 <term><structfield>patchlevel</structfield></term>
5380 <listitem><para>
5381 The module's patchlevel must be no
5382 less than this value. This comparison
5383 is only made if
5384 <structfield>minorversion</structfield> is
5385 specified and matches.
5386 </para></listitem></varlistentry>
5387
5388 <varlistentry>
5389 <term><structfield>abiclass</structfield></term>
5390 <listitem><para>
5391 String must match the module's abiclass
5392 string.
5393 </para></listitem></varlistentry>
5394
5395 <varlistentry>
5396 <term><structfield>abiversion</structfield></term>
5397 <listitem><para>
5398 Must be consistent with the module's
5399 abiversion (major equal, minor no
5400 older).
5401 </para></listitem></varlistentry>
5402
5403 <varlistentry>
5404 <term><structfield>moduleclass</structfield></term>
5405 <listitem><para>
5406 String must match the module's
5407 moduleclass string.
5408 </para></listitem></varlistentry>
5409
5410 </variablelist>
5411 </para></listitem></varlistentry>
5412
5413 <varlistentry>
5414 <term><parameter>errmaj</parameter></term>
5415 <listitem><para>
5416 An optional pointer to a variable holding the major
5417 part or the error code. When provided,
5418 <parameter>*errmaj</parameter> is filled in when
5419 <function>LoadModule()</function> fails.
5420 </para></listitem></varlistentry>
5421
5422 <varlistentry>
5423 <term><parameter>errmin</parameter></term>
5424 <listitem><para>
5425 Like <parameter>errmaj</parameter>, but for the minor part
5426 of the error code.
5427 </para></listitem></varlistentry>
5428
5429 </variablelist>
5430
5431 </para></blockquote>
5432 </para></blockquote>
5433
5434 <blockquote><para>
5435 <programlisting>
5436 void UnloadModule(pointer mod);
5437 </programlisting>
5438 <blockquote><para>
5439 This function unloads the module referred to by the handle mod.
5440 All child modules are also unloaded recursively. This function must
5441 not be used to directly unload modules that are child modules (i.e.,
5442 those that have been loaded with the <function>LoadSubModule()</function>
5443 described below).
5444 </para>
5445
5446 </blockquote></para></blockquote>
5447 </sect2>
5448
5449 <sect2>
5450 <title>Module Requirements</title>
5451
5452 <para>
5453Modules must provide information about themselves to the loader, and
5454may optionally provide entry points for "setup" and "teardown" functions
5455(those two functions are referred to here as <function>SetupProc</function>
5456and <function>TearDownProc</function>).
5457 </para>
5458
5459 <para>
5460The module information is contained in the
5461<structname>XF86ModuleVersionInfo</structname> struct, which is defined as follows:
5462
5463 <programlisting>
5464typedef struct {
5465 const char * modname; /* name of module, e.g. "foo" */
5466 const char * vendor; /* vendor specific string */
5467 CARD32 _modinfo1_; /* constant MODINFOSTRING1/2 to find */
5468 CARD32 _modinfo2_; /* infoarea with a binary editor/sign tool */
5469 CARD32 xf86version; /* contains XF86_VERSION_CURRENT */
5470 CARD8 majorversion; /* module-specific major version */
5471 CARD8 minorversion; /* module-specific minor version */
5472 CARD16 patchlevel; /* module-specific patch level */
5473 const char * abiclass; /* ABI class that the module uses */
5474 CARD32 abiversion; /* ABI version */
5475 const char * moduleclass; /* module class */
5476 CARD32 checksum[4]; /* contains a digital signature of the */
5477 /* version info structure */
5478} XF86ModuleVersionInfo;
5479 </programlisting>
5480
5481The fields are used as follows:
5482
5483 <variablelist>
5484 <varlistentry>
5485 <term><structfield>modname</structfield></term>
5486 <listitem><para>
5487 The module's name. This field is currently only for
5488 informational purposes, but the loader may be modified
5489 in future to require it to match the module's canonical
5490 name.
5491 </para></listitem></varlistentry>
5492
5493
5494 <varlistentry>
5495 <term><structfield>vendor</structfield></term>
5496 <listitem><para>
5497 The module vendor. This field is for informational purposes
5498 only.
5499 </para></listitem></varlistentry>
5500
5501
5502 <varlistentry>
5503 <term><structfield>_modinfo1_</structfield></term>
5504 <listitem><para>
5505 This field holds the first part of a signature that can
5506 be used to locate this structure in the binary. It should
5507 always be initialised to <constant>MODINFOSTRING1</constant>.
5508 </para></listitem></varlistentry>
5509
5510
5511 <varlistentry>
5512 <term><structfield>_modinfo2_</structfield></term>
5513 <listitem><para>
5514 This field holds the second part of a signature that can
5515 be used to locate this structure in the binary. It should
5516 always be initialised to <constant>MODINFOSTRING2</constant>.
5517 </para></listitem></varlistentry>
5518
5519
5520 <varlistentry>
5521 <term><structfield>xf86version</structfield></term>
5522 <listitem><para>
5523 The XFree86 version against which the module was compiled.
5524 This is mostly for informational/diagnostic purposes. It
5525 should be initialised to <constant>XF86_VERSION_CURRENT</constant>, which is
5526 defined in <filename>xf86Version.h</filename>.
5527 </para></listitem></varlistentry>
5528
5529
5530 <varlistentry>
5531 <term><structfield>majorversion</structfield></term>
5532 <listitem><para>
5533 The module-specific major version. For modules where this
5534 version is used for more than simply informational
5535 purposes, the major version should only change (be
5536 incremented) when ABI incompatibilities are introduced,
5537 or ABI components are removed.
5538 </para></listitem></varlistentry>
5539
5540
5541 <varlistentry>
5542 <term><structfield>minorversion</structfield></term>
5543 <listitem><para>
5544 The module-specific minor version. For modules where this
5545 version is used for more than simply informational
5546 purposes, the minor version should only change (be
5547 incremented) when ABI additions are made in a backward
5548 compatible way. It should be reset to zero when the major
5549 version is increased.
5550 </para></listitem></varlistentry>
5551
5552
5553 <varlistentry>
5554 <term><structfield>patchlevel</structfield></term>
5555 <listitem><para>
5556 The module-specific patch level. The patch level should
5557 increase with new revisions of the module where there
5558 are no ABI changes, and it should be reset to zero when
5559 the minor version is increased.
5560 </para></listitem></varlistentry>
5561
5562
5563 <varlistentry>
5564 <term><structfield>abiclass</structfield></term>
5565 <listitem><para>
5566 The ABI class that the module requires. The class is
5567 specified as a string for easy extensibility. It should
5568 indicate which (if any) of the X server's built-in ABI
5569 classes that the module relies on, or a third-party ABI
5570 if appropriate. Built-in ABI classes currently defined are:
5571
5572 <variablelist>
5573 <varlistentry>
5574 <term><constant>ABI_CLASS_NONE</constant></term>
5575 <listitem><para>no class
5576 </para></listitem></varlistentry>
5577 <varlistentry>
5578 <term><constant>ABI_CLASS_ANSIC</constant></term>
5579 <listitem><para>only requires the ANSI C interfaces
5580 </para></listitem></varlistentry>
5581 <varlistentry>
5582 <term><constant>ABI_CLASS_VIDEODRV</constant></term>
5583 <listitem><para>requires the video driver ABI
5584 </para></listitem></varlistentry>
5585 <varlistentry>
5586 <term><constant>ABI_CLASS_XINPUT</constant></term>
5587 <listitem><para>requires the XInput driver ABI
5588 </para></listitem></varlistentry>
5589 <varlistentry>
5590 <term><constant>ABI_CLASS_EXTENSION</constant></term>
5591 <listitem><para>requires the extension module ABI
5592 </para></listitem></varlistentry>
5593 <varlistentry>
5594 <term><constant>ABI_CLASS_FONT</constant></term>
5595 <listitem><para>requires the font module ABI
5596 </para></listitem></varlistentry>
5597 </variablelist>
5598
5599 </para></listitem></varlistentry>
5600
5601 <varlistentry>
5602 <term><structfield>abiversion</structfield></term>
5603 <listitem><para>
5604 The version of abiclass that the module requires. The
5605 version consists of major and minor components. The
5606 major version must match and the minor version must be
5607 no newer than that provided by the server or parent
5608 module. Version identifiers for the built-in classes
5609 currently defined are:
5610
5611 <literallayout><constant>
5612 ABI_ANSIC_VERSION
5613 ABI_VIDEODRV_VERSION
5614 ABI_XINPUT_VERSION
5615 ABI_EXTENSION_VERSION
5616 ABI_FONT_VERSION
5617 </constant></literallayout>
5618
5619 </para></listitem></varlistentry>
5620
5621 <varlistentry>
5622 <term><structfield>moduleclass</structfield></term>
5623 <listitem><para>
5624 This is similar to the abiclass field, except that it
5625 defines the type of module rather than the ABI it
5626 requires. For example, although all video drivers require
5627 the video driver ABI, not all modules that require the
5628 video driver ABI are video drivers. This distinction
5629 can be made with the moduleclass. Currently pre-defined
5630 module classes are:
5631
5632 <literallayout><constant>
5633 MOD_CLASS_NONE
5634 MOD_CLASS_VIDEODRV
5635 MOD_CLASS_XINPUT
5636 MOD_CLASS_FONT
5637 MOD_CLASS_EXTENSION
5638 </constant></literallayout>
5639
5640 </para></listitem></varlistentry>
5641
5642 <varlistentry>
5643 <term><structfield>checksum</structfield></term>
5644 <listitem><para>
5645 Not currently used.
5646 </para></listitem></varlistentry>
5647
5648 </variablelist>
5649 </para>
5650
5651 <para>
5652The module version information, and the optional <function>SetupProc</function>
5653and <function>TearDownProc</function> entry points are found by the loader
5654by locating a data object in the module called "modnameModuleData",
5655where "modname" is the canonical name of the module. Modules must
5656contain such a data object, and it must be declared with global scope,
5657be compile-time initialised, and is of the following type:
5658
5659 <programlisting>
5660typedef struct {
5661 XF86ModuleVersionInfo * vers;
5662 ModuleSetupProc setup;
5663 ModuleTearDownProc teardown;
5664} XF86ModuleData;
5665 </programlisting>
5666 </para>
5667
5668 <para>
5669The vers parameter must be initialised to a pointer to a correctly
5670initialised <structname>XF86ModuleVersionInfo</structname> struct. The other
5671two parameter are optional, and should be initialised to
5672<constant>NULL</constant> when not required. The other parameters are defined
5673as
5674
5675 <blockquote><para>
5676 <programlisting>
5677 typedef pointer (*ModuleSetupProc)(pointer, pointer, int *, int *);
5678
5679 typedef void (*ModuleTearDownProc)(pointer);
5680
5681 pointer SetupProc(pointer module, pointer options,
5682 int *errmaj, int *errmin);
5683 </programlisting>
5684 <blockquote><para>
5685 When defined, this function is called by the loader after successfully
5686 loading a module. module is a handle for the newly loaded module,
5687 and maybe used by the <function>SetupProc</function> if it calls other
5688 loader functions that require a reference to it. The remaining
5689 arguments are those that were passed to the
5690 <function>LoadModule()</function> (or <function>LoadSubModule()</function>),
5691 and are described above. When the <function>SetupProc</function> is
5692 successful it must return a non-<constant>NULL</constant> value. The
5693 loader checks this, and if it is <constant>NULL</constant> it unloads
5694 the module and reports the failure to the caller of
5695 <function>LoadModule()</function>. If the <function>SetupProc</function>
5696 does things that need to be undone when the module is unloaded,
5697 it should define a <function>TearDownProc</function>, and return a
5698 pointer that the <function>TearDownProc</function> can use to undo what
5699 has been done.
5700 </para>
5701
5702 <para>
5703 When a module is loaded multiple times, the <function>SetupProc</function>
5704 is called once for each time it is loaded.
5705 </para>
5706
5707 </blockquote></para></blockquote>
5708
5709 <blockquote><para>
5710 <programlisting>
5711 void TearDownProc(pointer tearDownData);
5712 </programlisting>
5713 <blockquote><para>
5714 When defined, this function is called when the loader unloads a
5715 module. The <parameter>tearDownData</parameter> parameter is the return
5716 value of the <function>SetupProc()</function> that was called when the
5717 module was loaded. The purpose of this function is to clean up
5718 before the module is unloaded (for example, by freeing allocated
5719 resources).
5720 </para>
5721
5722 </blockquote></para></blockquote>
5723 </para>
5724 </sect2>
5725
5726 <sect2>
5727 <title>Public Loader Interface</title>
5728
5729 <para>
5730The following is the Loader interface that is available to any part of
5731the server, and may also be used from within modules.
5732 </para>
5733
5734 <blockquote><para>
5735 <programlisting>
5736 pointer LoadSubModule(pointer parent, const char *module,
5737 const char **subdirlist, const char **patternlist,
5738 pointer options, const XF86ModReqInfo * modreq,
5739 int *errmaj, int *errmin);
5740 </programlisting>
5741 <blockquote><para>
5742 This function is like the <function>LoadModule()</function> function
5743 described above, except that the module loaded is registered as a
5744 child of the calling module. The <parameter>parent</parameter> parameter
5745 is the calling module's handle. Modules loaded with this function
5746 are automatically unloaded when the parent module is unloaded. The
5747 other difference is that the path parameter may not be specified.
5748 The module search path used for modules loaded with this function
5749 is the default search path as initialised with
5750 <function>LoaderSetPath()</function>.
5751 </para>
5752
5753 </blockquote></para></blockquote>
5754
5755 <blockquote><para>
5756 <programlisting>
5757 void UnloadSubModule(pointer module);
5758 </programlisting>
5759 <blockquote><para>
5760 This function unloads the module with handle <parameter>module</parameter>.
5761 If that module itself has children, they are also unloaded. It is
5762 like <function>UnloadModule()</function>, except that it is safe to use
5763 for unloading child modules.
5764 </para>
5765
5766 </blockquote></para></blockquote>
5767
5768 <blockquote><para>
5769 <programlisting>
5770 pointer LoaderSymbol(const char *symbol);
5771 </programlisting>
5772 <blockquote><para>
5773 This function returns the address of the symbol with name
5774 <parameter>symbol</parameter>. This may be used to locate a module entry
5775 point with a known name.
5776 </para>
5777
5778 </blockquote></para></blockquote>
5779
5780 <blockquote><para>
5781 <programlisting>
5782 char **LoaderlistDirs(const char **subdirlist,
5783 const char **patternlist);
5784 </programlisting>
5785 <blockquote><para>
5786 This function returns a <constant>NULL</constant> terminated list of
5787 canonical modules names for modules found in the default module
5788 search path. The <parameter>subdirlist</parameter> and
5789 <parameter>patternlist</parameter> parameters are as described above, and
5790 can be used to control the locations and names that are searched.
5791 If no modules are found, the return value is <constant>NULL</constant>.
5792 The returned list should be freed by calling
5793 <function>LoaderFreeDirList()</function> when it is no longer needed.
5794 </para>
5795
5796 </blockquote></para></blockquote>
5797
5798 <blockquote><para>
5799 <programlisting>
5800 void LoaderFreeDirList(char **list);
5801 </programlisting>
5802 <blockquote><para>
5803 This function frees a module list created by
5804 <function>LoaderlistDirs()</function>.
5805 </para>
5806
5807 </blockquote></para></blockquote>
5808
5809 <blockquote><para>
5810 <programlisting>
5811 void LoaderReqSymLists(const char **list0, ...);
5812 </programlisting>
5813 <blockquote><para>
5814 This function allows the registration of required symbols with the
5815 loader. It is normally used by a caller of
5816 <function>LoadSubModule()</function>. If any symbols registered in this
5817 way are found to be unresolved when
5818 <function>LoaderCheckUnresolved()</function> is called then
5819 <function>LoaderCheckUnresolved()</function> will report a failure.
5820 The function takes one or more <constant>NULL</constant> terminated
5821 lists of symbols. The end of the argument list is indicated by a
5822 <constant>NULL</constant> argument.
5823 </para>
5824
5825 </blockquote></para></blockquote>
5826
5827 <blockquote><para>
5828 <programlisting>
5829 void LoaderReqSymbols(const char *sym0, ...);
5830 </programlisting>
5831 <blockquote><para>
5832 This function is like <function>LoaderReqSymLists()</function> except
5833 that its arguments are symbols rather than lists of symbols. This
5834 function is more convenient when single functions are to be registered,
5835 especially when the single function might depend on runtime factors.
5836 The end of the argument list is indicated by a <constant>NULL</constant>
5837 argument.
5838 </para>
5839
5840 </blockquote></para></blockquote>
5841
5842 <blockquote><para>
5843 <programlisting>
5844 void LoaderRefSymLists(const char **list0, ...);
5845 </programlisting>
5846 <blockquote><para>
5847 This function allows the registration of possibly unresolved symbols
5848 with the loader. When <function>LoaderCheckUnresolved()</function> is
5849 run it won't generate warnings for symbols registered in this way
5850 unless they were also registered as required symbols.
5851 The function takes one or more <constant>NULL</constant> terminated
5852 lists of symbols. The end of the argument list is indicated by a
5853 <constant>NULL</constant> argument.
5854 </para>
5855
5856 </blockquote></para></blockquote>
5857
5858 <blockquote><para>
5859 <programlisting>
5860 void LoaderRefSymbols(const char *sym0, ...);
5861 </programlisting>
5862 <blockquote><para>
5863 This function is like <function>LoaderRefSymLists()</function> except
5864 that its arguments are symbols rather than lists of symbols. This
5865 function is more convenient when single functions are to be registered,
5866 especially when the single function might depend on runtime factors.
5867 The end of the argument list is indicated by a <constant>NULL</constant>
5868 argument.
5869 </para>
5870
5871 </blockquote></para></blockquote>
5872
5873 <blockquote><para>
5874 <programlisting>
5875 int LoaderCheckUnresolved(int delayflag);
5876 </programlisting>
5877 <blockquote><para>
5878 This function checks for unresolved symbols. It generates warnings
5879 for unresolved symbols that have not been registered with
5880 <function>LoaderRefSymLists()</function>, and maps them to a dummy
5881 function. This behaviour may change in future. If unresolved
5882 symbols are found that have been registered with
5883 <function>LoaderReqSymLists()</function> or
5884 <function>LoaderReqSymbols()</function> then this function returns a
5885 non-zero value. If none of these symbols are unresolved the return
5886 value is zero, indicating success.
5887 </para>
5888
5889 <para>
5890 The <parameter>delayflag</parameter> parameter should normally be set to
5891 <constant>LD_RESOLV_IFDONE</constant>.
5892 </para>
5893
5894 </blockquote></para></blockquote>
5895
5896 <blockquote><para>
5897 <programlisting>
5898 LoaderErrorMsg(const char *name, const char *modname,
5899 int errmaj, int errmin);
5900 </programlisting>
5901 <blockquote><para>
5902 This function prints an error message that includes the text <quote>Failed
5903 to load module</quote>, the module name <parameter>modname</parameter>, a message
5904 specific to the <parameter>errmaj</parameter> value, and the value if
5905 <parameter>errmin</parameter>. If <parameter>name</parameter> is
5906 non-<constant>NULL</constant>, it is printed as an identifying prefix
5907 to the message (followed by a <quote>:</quote>).
5908 </para>
5909
5910 </blockquote></para></blockquote>
5911 </sect2>
5912
5913 <sect2>
5914 <title>Special Registration Functions</title>
5915
5916 <para>
5917The loader contains some functions for registering some classes of modules.
5918These may be moved out of the loader at some point.
5919 </para>
5920
5921 <blockquote><para>
5922 <programlisting>
5923 void LoadExtension(ExtensionModule *ext);
5924 </programlisting>
5925 <blockquote><para>
5926 This registers the entry points for the extension identified by
5927 <parameter>ext</parameter>. The <structname>ExtensionModule</structname> struct is
5928 defined as:
5929
5930 <programlisting>
5931typedef struct {
5932 InitExtension initFunc;
5933 char * name;
5934 Bool *disablePtr;
5935} ExtensionModule;
5936 </programlisting>
5937 </para>
5938
5939 </blockquote></para></blockquote>
5940
5941 </sect2>
5942
5943 </sect1>
5944
5945 <sect1>
5946 <title>Helper Functions</title>
5947
5948 <para>
5949This section describe <quote>helper</quote> functions that video driver
5950might find useful. While video drivers are not required to use any of
5951these to be considered <quote>compliant</quote>, the use of appropriate helpers is
5952strongly encouraged to improve the consistency of driver behaviour.
5953 </para>
5954
5955 <sect2>
5956 <title>Functions for printing messages</title>
5957
5958 <blockquote><para>
5959 <programlisting>
5960 ErrorF(const char *format, ...);
5961 </programlisting>
5962 <blockquote><para>
5963 This is the basic function for writing to the error log (typically
5964 stderr and/or a log file). Video drivers should usually avoid
5965 using this directly in favour of the more specialised functions
5966 described below. This function is useful for printing messages
5967 while debugging a driver.
5968 </para>
5969
5970 </blockquote></para></blockquote>
5971
5972 <blockquote><para>
5973 <programlisting>
5974 FatalError(const char *format, ...);
5975 </programlisting>
5976 <blockquote><para>
5977 This prints a message and causes the Xserver to abort. It should
5978 rarely be used within a video driver, as most error conditions
5979 should be flagged by the return values of the driver functions.
5980 This allows the higher layers to decide how to proceed. In rare
5981 cases, this can be used within a driver if a fatal unexpected
5982 condition is found.
5983 </para>
5984
5985 </blockquote></para></blockquote>
5986
5987 <blockquote><para>
5988 <programlisting>
5989 xf86ErrorF(const char *format, ...);
5990 </programlisting>
5991 <blockquote><para>
5992 This is like <function>ErrorF()</function>, except that the message is
5993 only printed when the Xserver's verbosity level is set to the
5994 default (<constant>1</constant>) or higher. It means that the messages
5995 are not printed when the server is started with the
5996 <option>-quiet</option> flag. Typically this function would only be
5997 used for continuing messages started with one of the more specialised
5998 functions described below.
5999 </para>
6000
6001 </blockquote></para></blockquote>
6002
6003 <blockquote><para>
6004 <programlisting>
6005 xf86ErrorFVerb(int verb, const char *format, ...);
6006 </programlisting>
6007 <blockquote><para>
6008 Like <function>xf86ErrorF()</function>, except the minimum verbosity
6009 level for which the message is to be printed is given explicitly.
6010 Passing a <parameter>verb</parameter> value of zero means the message
6011 is always printed. A value higher than <constant>1</constant> can be
6012 used for information would normally not be needed, but which might
6013 be useful when diagnosing problems.
6014 </para>
6015
6016 </blockquote></para></blockquote>
6017
6018
6019 <blockquote><para>
6020 <programlisting>
6021 xf86Msg(MessageType type, const char *format, ...);
6022 </programlisting>
6023 <blockquote><para>
6024 This is like <function>xf86ErrorF()</function>, except that the message
6025 is prefixed with a marker determined by the value of
6026 <parameter>type</parameter>. The marker is used to indicate the type of
6027 message (warning, error, probed value, config value, etc). Note
6028 the <varname>xf86Verbose</varname> value is ignored for messages of
6029 type <constant>X_ERROR</constant>.
6030 </para>
6031
6032 <para>
6033 The marker values are:
6034
6035 <variablelist>
6036 <varlistentry>
6037 <term><constant>X_PROBED</constant></term>
6038 <listitem><para>Value was probed.
6039 </para></listitem></varlistentry>
6040 <varlistentry>
6041 <term><constant>X_CONFIG</constant></term>
6042 <listitem><para>Value was given in the config file.
6043 </para></listitem></varlistentry>
6044 <varlistentry>
6045 <term><constant>X_DEFAULT</constant></term>
6046 <listitem><para>Value is a default.
6047 </para></listitem></varlistentry>
6048 <varlistentry>
6049 <term><constant>X_CMDLINE</constant></term>
6050 <listitem><para>Value was given on the command line.
6051 </para></listitem></varlistentry>
6052 <varlistentry>
6053 <term><constant>X_NOTICE</constant></term>
6054 <listitem><para>Notice.
6055 </para></listitem></varlistentry>
6056 <varlistentry>
6057 <term><constant>X_ERROR</constant></term>
6058 <listitem><para>Error message.
6059 </para></listitem></varlistentry>
6060 <varlistentry>
6061 <term><constant>X_WARNING</constant></term>
6062 <listitem><para>Warning message.
6063 </para></listitem></varlistentry>
6064 <varlistentry>
6065 <term><constant>X_INFO</constant></term>
6066 <listitem><para>Informational message.
6067 </para></listitem></varlistentry>
6068 <varlistentry>
6069 <term><constant>X_NONE</constant></term>
6070 <listitem><para>No prefix.
6071 </para></listitem></varlistentry>
6072 <varlistentry>
6073 <term><constant>X_NOT_IMPLEMENTED</constant></term>
6074 <listitem><para>The message relates to functionality
6075 that is not yetimplemented.
6076 </para></listitem></varlistentry>
6077 </variablelist>
6078
6079 </para>
6080
6081 </blockquote></para></blockquote>
6082
6083 <blockquote><para>
6084 <programlisting>
6085 xf86MsgVerb(MessageType type, int verb, const char *format, ...);
6086 </programlisting>
6087 <blockquote><para>
6088 Like <function>xf86Msg()</function>, but with the verbosity level given
6089 explicitly.
6090 </para>
6091
6092 </blockquote></para></blockquote>
6093
6094 <blockquote><para>
6095 <programlisting>
6096 xf86DrvMsg(int scrnIndex, MessageType type, const char *format, ...);
6097 </programlisting>
6098 <blockquote><para>
6099 This is like <function>xf86Msg()</function> except that the driver's
6100 name (the <structfield>name</structfield> field of the
6101 <structname>ScrnInfoRec</structname>) followed by the
6102 <parameter>scrnIndex</parameter> in parentheses is printed following the
6103 prefix. This should be used by video drivers in most cases as it
6104 clearly indicates which driver/screen the message is for. If
6105 <parameter>scrnIndex</parameter> is negative, this function behaves
6106 exactly like <function>xf86Msg()</function>.
6107 </para>
6108
6109 <para>
6110 NOTE: This function can only be used after the
6111 <structname>ScrnInfoRec</structname> and its <structfield>name</structfield> field
6112 have been allocated. Normally, this means that it can not be
6113 used before the END of the <function>ChipProbe()</function> function.
6114 Prior to that, use <function>xf86Msg()</function>, providing the
6115 driver's name explicitly. No screen number can be supplied at
6116 that point.
6117 </para>
6118
6119 </blockquote></para></blockquote>
6120
6121 <blockquote><para>
6122 <programlisting>
6123 xf86DrvMsgVerb(int scrnIndex, MessageType type, int verb,
6124 const char *format, ...);
6125 </programlisting>
6126 <blockquote><para>
6127 Like <function>xf86DrvMsg()</function>, but with the verbosity level
6128 given explicitly.
6129 </para>
6130
6131 </blockquote></para></blockquote>
6132 </sect2>
6133
6134
6135 <sect2>
6136 <title>Functions for setting values based on command line and config file</title>
6137
6138 <blockquote><para>
6139 <programlisting>
6140 Bool xf86SetDepthBpp(ScrnInfoPtr scrp, int depth, int bpp,
6141
6142 int fbbpp, int depth24flags);
6143 </programlisting>
6144 <blockquote><para>
6145 This function sets the <structfield>depth</structfield>, <structfield>pixmapBPP</structfield> and <structfield>bitsPerPixel</structfield> fields
6146 of the <structname>ScrnInfoRec</structname>. It also determines the defaults for display-wide
6147 attributes and pixmap formats the screen will support, and finds
6148 the Display subsection that matches the depth/bpp. This function
6149 should normally be called very early from the
6150 <function>ChipPreInit()</function> function.
6151 </para>
6152
6153 <para>
6154 It requires that the <structfield>confScreen</structfield> field of the <structname>ScrnInfoRec</structname> be
6155 initialised prior to calling it. This is done by the XFree86
6156 common layer prior to calling <function>ChipPreInit()</function>.
6157 </para>
6158
6159 <para>
6160 The parameters passed are:
6161
6162 <variablelist>
6163 <varlistentry>
6164 <term><parameter>depth</parameter></term>
6165 <listitem><para>
6166 driver's preferred default depth if no other is given.
6167 If zero, use the overall server default.
6168 </para></listitem></varlistentry>
6169
6170 <varlistentry>
6171 <term><parameter>bpp</parameter></term>
6172 <listitem><para>
6173 Same, but for the pixmap bpp.
6174 </para></listitem></varlistentry>
6175
6176 <varlistentry>
6177 <term><parameter>fbbpp</parameter></term>
6178 <listitem><para>
6179 Same, but for the framebuffer bpp.
6180 </para></listitem></varlistentry>
6181
6182 <varlistentry>
6183 <term><parameter>depth24flags</parameter></term>
6184 <listitem><para>
6185 Flags that indicate the level of 24/32bpp support
6186 and whether conversion between different framebuffer
6187 and pixmap formats is supported. The flags for this
6188 argument are defined as follows, and multiple flags
6189 may be ORed together:
6190
6191 <variablelist>
6192 <varlistentry>
6193 <term><constant>NoDepth24Support</constant></term>
6194 <listitem><para>No depth 24 formats supported
6195 </para></listitem></varlistentry>
6196 <varlistentry>
6197 <term><constant>Support24bppFb</constant></term>
6198 <listitem><para>24bpp framebuffer supported
6199 </para></listitem></varlistentry>
6200 <varlistentry>
6201 <term><constant>Support32bppFb</constant></term>
6202 <listitem><para>32bpp framebuffer supported
6203 </para></listitem></varlistentry>
6204 <varlistentry>
6205 <term><constant>SupportConvert24to32</constant></term>
6206 <listitem><para>Can convert 24bpp pixmap to 32bpp fb
6207 </para></listitem></varlistentry>
6208 <varlistentry>
6209 <term><constant>SupportConvert32to24</constant></term>
6210 <listitem><para>Can convert 32bpp pixmap to 24bpp fb
6211 </para></listitem></varlistentry>
6212 <varlistentry>
6213 <term><constant>ForceConvert24to32</constant></term>
6214 <listitem><para>Force 24bpp pixmap to 32bpp fb conversion
6215 </para></listitem></varlistentry>
6216 <varlistentry>
6217 <term><constant>ForceConvert32to24</constant></term>
6218 <listitem><para>Force 32bpp pixmap to 24bpp fb conversion
6219 </para></listitem></varlistentry>
6220 </variablelist>
6221 </para></listitem></varlistentry>
6222
6223 </variablelist>
6224 </para>
6225
6226 <para>
6227 It uses the command line, config file, and default values in the
6228 correct order of precedence to determine the depth and bpp values.
6229 It is up to the driver to check the results to see that it supports
6230 them. If not the <function>ChipPreInit()</function> function should
6231 return <constant>FALSE</constant>.
6232 </para>
6233
6234 <para>
6235 If only one of depth/bpp is given, the other is set to a reasonable
6236 (and consistent) default.
6237 </para>
6238
6239 <para>
6240 If a driver finds that the initial <parameter>depth24flags</parameter>
6241 it uses later results in a fb format that requires more video
6242 memory than is available it may call this function a second time
6243 with a different <parameter>depth24flags</parameter> setting.
6244 </para>
6245
6246 <para>
6247 On success, the return value is <constant>TRUE</constant>. On failure
6248 it prints an error message and returns <constant>FALSE</constant>.
6249 </para>
6250
6251 <para>
6252 The following fields of the <structname>ScrnInfoRec</structname> are
6253 initialised by this function:
6254
6255 <blockquote><para>
6256<structfield>depth</structfield>, <structfield>bitsPerPixel</structfield>,
6257<structfield>display</structfield>, <structfield>imageByteOrder</structfield>,
6258<structfield>bitmapScanlinePad</structfield>,
6259<structfield>bitmapScanlineUnit</structfield>, <structfield>bitmapBitOrder</structfield>,
6260<structfield>numFormats</structfield>, <structfield>formats</structfield>,
6261<structfield>fbFormat</structfield>.
6262 </para></blockquote>
6263 </para>
6264
6265 </blockquote></para></blockquote>
6266
6267 <blockquote><para>
6268 <programlisting>
6269 void xf86PrintDepthBpp(scrnInfoPtr scrp);
6270 </programlisting>
6271 <blockquote><para>
6272 This function can be used to print out the depth and bpp settings.
6273 It should be called after the final call to
6274 <function>xf86SetDepthBpp()</function>.
6275 </para>
6276
6277 </blockquote></para></blockquote>
6278
6279 <blockquote><para>
6280 <programlisting>
6281 Bool xf86SetWeight(ScrnInfoPtr scrp, rgb weight, rgb mask);
6282 </programlisting>
6283 <blockquote><para>
6284 This function sets the <structfield>weight</structfield>, <structfield>mask</structfield>,
6285 <structfield>offset</structfield> and <structfield>rgbBits</structfield> fields of the
6286 <structname>ScrnInfoRec</structname>. It would normally be called fairly
6287 early in the <function>ChipPreInit()</function> function for
6288 depths&nbsp;&gt;&nbsp;8bpp.
6289 </para>
6290
6291 <para>
6292 It requires that the <structfield>depth</structfield> and
6293 <structfield>display</structfield> fields of the <structname>ScrnInfoRec</structname>
6294 be initialised prior to calling it.
6295 </para>
6296
6297 <para>
6298 The parameters passed are:
6299
6300 <variablelist>
6301 <varlistentry>
6302 <term><parameter>weight</parameter></term>
6303 <listitem><para>
6304 driver's preferred default weight if no other is given.
6305 If zero, use the overall server default.
6306
6307 </para></listitem></varlistentry>
6308
6309 <varlistentry>
6310 <term><parameter>mask</parameter></term>
6311 <listitem><para>
6312 Same, but for mask.
6313
6314 </para></listitem></varlistentry>
6315 </variablelist>
6316 </para>
6317
6318 <para>
6319 It uses the command line, config file, and default values in the
6320 correct order of precedence to determine the weight value. It
6321 derives the mask and offset values from the weight and the defaults.
6322 It is up to the driver to check the results to see that it supports
6323 them. If not the <function>ChipPreInit()</function> function should
6324 return <constant>FALSE</constant>.
6325 </para>
6326
6327 <para>
6328 On success, this function prints a message showing the weight
6329 values selected, and returns <constant>TRUE</constant>.
6330 </para>
6331
6332 <para>
6333 On failure it prints an error message and returns <constant>FALSE</constant>.
6334 </para>
6335
6336 <para>
6337 The following fields of the <structname>ScrnInfoRec</structname> are
6338 initialised by this function:
6339
6340 <blockquote><para>
6341 <structfield>weight</structfield>,
6342 <structfield>mask</structfield>,
6343 <structfield>offset</structfield>.
6344 </para></blockquote>
6345 </para>
6346
6347 </blockquote></para></blockquote>
6348
6349 <blockquote><para>
6350 <programlisting>
6351 Bool xf86SetDefaultVisual(ScrnInfoPtr scrp, int visual);
6352 </programlisting>
6353 <blockquote><para>
6354 This function sets the <structfield>defaultVisual</structfield> field of the
6355 <structname>ScrnInfoRec</structname>. It would normally be called fairly
6356 early from the <function>ChipPreInit()</function> function.
6357 </para>
6358
6359 <para>
6360 It requires that the <structfield>depth</structfield> and
6361 <structfield>display</structfield> fields of the <structname>ScrnInfoRec</structname>
6362 be initialised prior to calling it.
6363 </para>
6364
6365 <para>
6366 The parameters passed are:
6367
6368 <variablelist>
6369 <varlistentry>
6370 <term><parameter>visual</parameter></term>
6371 <listitem><para>
6372 driver's preferred default visual if no other is given.
6373 If <constant>-1</constant>, use the overall server default.
6374 </para></listitem></varlistentry>
6375
6376 </variablelist>
6377 </para>
6378
6379 <para>
6380 It uses the command line, config file, and default values in the
6381 correct order of precedence to determine the default visual value.
6382 It is up to the driver to check the result to see that it supports
6383 it. If not the <function>ChipPreInit()</function> function should
6384 return <constant>FALSE</constant>.
6385 </para>
6386
6387 <para>
6388 On success, this function prints a message showing the default visual
6389 selected, and returns <constant>TRUE</constant>.
6390 </para>
6391
6392 <para>
6393 On failure it prints an error message and returns <constant>FALSE</constant>.
6394 </para>
6395
6396 </blockquote></para></blockquote>
6397
6398 <blockquote><para>
6399 <programlisting>
6400 Bool xf86SetGamma(ScrnInfoPtr scrp, Gamma gamma);
6401 </programlisting>
6402 <blockquote><para>
6403 This function sets the <structfield>gamma</structfield> field of the
6404 <structname>ScrnInfoRec</structname>. It would normally be called fairly
6405 early from the <function>ChipPreInit()</function> function in cases
6406 where the driver supports gamma correction.
6407 </para>
6408
6409 <para>
6410 It requires that the <structfield>monitor</structfield> field of the
6411 <structname>ScrnInfoRec</structname> be initialised prior to calling it.
6412 </para>
6413
6414 <para>
6415 The parameters passed are:
6416
6417 <variablelist>
6418 <varlistentry>
6419 <term><parameter>gamma</parameter></term>
6420 <listitem><para>
6421 driver's preferred default gamma if no other is given.
6422 If zero (<code>&lt; 0.01</code>), use the overall server
6423 default.
6424 </para></listitem></varlistentry>
6425
6426 </variablelist>
6427 </para>
6428
6429 <para>
6430 It uses the command line, config file, and default values in the
6431 correct order of precedence to determine the gamma value. It is
6432 up to the driver to check the results to see that it supports
6433 them. If not the <function>ChipPreInit()</function> function should
6434 return <constant>FALSE</constant>.
6435 </para>
6436
6437 <para>
6438 On success, this function prints a message showing the gamma
6439 value selected, and returns <constant>TRUE</constant>.
6440 </para>
6441
6442 <para>
6443 On failure it prints an error message and returns <constant>FALSE</constant>.
6444 </para>
6445
6446 </blockquote></para></blockquote>
6447
6448
6449 <blockquote><para>
6450 <programlisting>
6451 void xf86SetDpi(ScrnInfoPtr pScrn, int x, int y);
6452 </programlisting>
6453 <blockquote><para>
6454 This function sets the <structfield>xDpi</structfield> and <structfield>yDpi</structfield>
6455 fields of the <structname>ScrnInfoRec</structname>. The driver can specify
6456 preferred defaults by setting <parameter>x</parameter> and <parameter>y</parameter>
6457 to non-zero values. The <option>-dpi</option> command line option
6458 overrides all other settings. Otherwise, if the
6459 <emphasis>DisplaySize</emphasis> entry is present in the screen's &k.monitor;
6460 config file section, it is used together with the virtual size to
6461 calculate the dpi values. This function should be called after
6462 all the mode resolution has been done.
6463 </para>
6464
6465 </blockquote></para></blockquote>
6466
6467 <blockquote><para>
6468 <programlisting>
6469 void xf86SetBlackWhitePixels(ScrnInfoPtr pScrn);
6470 </programlisting>
6471 <blockquote><para>
6472 This functions sets the <structfield>blackPixel</structfield> and
6473 <structfield>whitePixel</structfield> fields of the <structname>ScrnInfoRec</structname>
6474 according to whether or not the <option>-flipPixels</option> command
6475 line options is present.
6476 </para>
6477
6478 </blockquote></para></blockquote>
6479
6480 <blockquote><para>
6481 <programlisting>
6482 const char *xf86GetVisualName(int visual);
6483 </programlisting>
6484 <blockquote><para>
6485 Returns a printable string with the visual name matching the
6486 numerical visual class provided. If the value is outside the
6487 range of valid visual classes, <constant>NULL</constant> is returned.
6488 </para>
6489
6490 </blockquote></para></blockquote>
6491
6492 </sect2>
6493
6494 <sect2>
6495 <title>Primary Mode functions</title>
6496
6497 <para>
6498The primary mode helper functions are those which would normally be
6499used by a driver, unless it has unusual requirements which cannot
6500be catered for the by the helpers.
6501 </para>
6502
6503 <blockquote><para>
6504 <programlisting>
6505 int xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes,
6506 char **modeNames, ClockRangePtr clockRanges,
6507 int *linePitches, int minPitch, int maxPitch,
6508 int pitchInc, int minHeight, int maxHeight,
6509 int virtualX, int virtualY,
6510 unsigned long apertureSize,
6511 LookupModeFlags strategy);
6512 </programlisting>
6513 <blockquote><para>
6514 This function basically selects the set of modes to use based on
6515 those available and the various constraints. It also sets some
6516 other related parameters. It is normally called near the end of
6517 the <function>ChipPreInit()</function> function.
6518 </para>
6519
6520 <para>
6521 The parameters passed to the function are:
6522
6523 <variablelist>
6524 <varlistentry>
6525 <term><parameter>availModes</parameter></term>
6526 <listitem><para>
6527 List of modes available for the monitor.
6528 </para></listitem></varlistentry>
6529
6530 <varlistentry>
6531 <term><parameter>modeNames</parameter></term>
6532 <listitem><para>
6533 List of mode names that the screen is requesting.
6534 </para></listitem></varlistentry>
6535
6536 <varlistentry>
6537 <term><parameter>clockRanges</parameter></term>
6538 <listitem><para>
6539 A list of clock ranges allowed by the driver. Each
6540 range includes whether interlaced or multiscan modes
6541 are supported for that range. See below for more on
6542 <parameter>clockRanges</parameter>.
6543 </para></listitem></varlistentry>
6544
6545 <varlistentry>
6546 <term><parameter>linePitches</parameter></term>
6547 <listitem><para>
6548 List of line pitches supported by the driver.
6549 This is optional and should be <constant>NULL</constant> when
6550 not used.
6551 </para></listitem></varlistentry>
6552
6553 <varlistentry>
6554 <term><parameter>minPitch</parameter></term>
6555 <listitem><para>
6556 Minimum line pitch supported by the driver. This must
6557 be supplied when <parameter>linePitches</parameter> is
6558 <constant>NULL</constant>, and is ignored otherwise.
6559 </para></listitem></varlistentry>
6560
6561 <varlistentry>
6562 <term><parameter>maxPitch</parameter></term>
6563 <listitem><para>
6564 Maximum line pitch supported by the driver. This is
6565 required when <parameter>minPitch</parameter> is required.
6566 </para></listitem></varlistentry>
6567
6568 <varlistentry>
6569 <term><parameter>pitchInc</parameter></term>
6570 <listitem><para>
6571 Granularity of horizontal pitch values as supported by
6572 the chipset. This is expressed in bits. This must be
6573 supplied.
6574 </para></listitem></varlistentry>
6575
6576 <varlistentry>
6577 <term><parameter>minHeight</parameter></term>
6578 <listitem><para>
6579 minimum virtual height allowed. If zero, no limit is
6580 imposed.
6581 </para></listitem></varlistentry>
6582
6583 <varlistentry>
6584 <term><parameter>maxHeight</parameter></term>
6585 <listitem><para>
6586 maximum virtual height allowed. If zero, no limit is
6587 imposed.
6588 </para></listitem></varlistentry>
6589
6590 <varlistentry>
6591 <term><parameter>virtualX</parameter></term>
6592 <listitem><para>
6593 If greater than zero, this is the virtual width value
6594 that will be used. Otherwise, the virtual width is
6595 chosen to be the smallest that can accommodate the modes
6596 selected.
6597 </para></listitem></varlistentry>
6598
6599 <varlistentry>
6600 <term><parameter>virtualY</parameter></term>
6601 <listitem><para>
6602 If greater than zero, this is the virtual height value
6603 that will be used. Otherwise, the virtual height is
6604 chosen to be the smallest that can accommodate the modes
6605 selected.
6606 </para></listitem></varlistentry>
6607
6608 <varlistentry>
6609 <term><parameter>apertureSize</parameter></term>
6610 <listitem><para>
6611 The size (in bytes) of the aperture used to access video
6612 memory.
6613 </para></listitem></varlistentry>
6614
6615 <varlistentry>
6616 <term><parameter>strategy</parameter></term>
6617 <listitem><para>
6618 The strategy to use when choosing from multiple modes
6619 with the same name. The options are:
6620
6621 <variablelist>
6622 <varlistentry>
6623 <term><constant>LOOKUP_DEFAULT</constant></term>
6624 <listitem><para>???
6625 </para></listitem></varlistentry>
6626 <varlistentry>
6627 <term><constant>LOOKUP_BEST_REFRESH</constant></term>
6628 <listitem><para>mode with best refresh rate
6629 </para></listitem></varlistentry>
6630 <varlistentry>
6631 <term><constant>LOOKUP_CLOSEST_CLOCK</constant></term>
6632 <listitem><para>mode with closest matching clock
6633 </para></listitem></varlistentry>
6634 <varlistentry>
6635 <term><constant>LOOKUP_LIST_ORDER</constant></term>
6636 <listitem><para>first usable mode in list
6637 </para></listitem></varlistentry>
6638 </variablelist>
6639
6640 The following options can also be combined (OR'ed) with
6641 one of the above:
6642
6643 <variablelist>
6644 <varlistentry>
6645 <term><constant>LOOKUP_CLKDIV2</constant></term>
6646 <listitem><para>Allow halved clocks
6647 </para></listitem></varlistentry>
6648 <varlistentry>
6649 <term><constant>LOOKUP_OPTIONAL_TOLERANCES</constant></term>
6650 <listitem><para>
6651 Allow missing horizontal sync and/or vertical refresh
6652 ranges in the xorg.conf Monitor section
6653 </para></listitem></varlistentry>
6654 </variablelist>
6655
6656 <constant>LOOKUP_OPTIONAL_TOLERANCES</constant> should only be
6657 specified when the driver can ensure all modes it generates
6658 can sync on, or at least not damage, the monitor or digital
6659 flat panel. Horizontal sync and/or vertical refresh ranges
6660 specified by the user will still be honoured (and acted upon).
6661
6662 </para></listitem></varlistentry>
6663 </variablelist>
6664 </para>
6665
6666 <para>
6667 This function requires that the following fields of the
6668 <structname>ScrnInfoRec</structname> are initialised prior to calling it:
6669
6670 <variablelist>
6671 <varlistentry>
6672 <term><structfield>clock[]</structfield></term>
6673 <listitem><para>
6674 List of discrete clocks (when non-programmable)
6675 </para></listitem></varlistentry>
6676 <varlistentry>
6677 <term><structfield>numClocks</structfield></term>
6678 <listitem><para>
6679 Number of discrete clocks (when non-programmable)
6680 </para></listitem></varlistentry>
6681 <varlistentry>
6682 <term><structfield>progClock</structfield></term>
6683 <listitem><para>
6684 Whether the clock is programmable or not
6685 </para></listitem></varlistentry>
6686 <varlistentry>
6687 <term><structfield>monitor</structfield></term>
6688 <listitem><para>
6689 Pointer to the applicable xorg.conf monitor section
6690 </para></listitem></varlistentry>
6691 <varlistentry>
6692 <term><structfield>fdFormat</structfield></term>
6693 <listitem><para>
6694 Format of the screen buffer
6695 </para></listitem></varlistentry>
6696 <varlistentry>
6697 <term><structfield>videoRam</structfield></term>
6698 <listitem><para>
6699 total video memory size (in bytes)
6700 </para></listitem></varlistentry>
6701 <varlistentry>
6702 <term><structfield>maxHValue</structfield></term>
6703 <listitem><para>
6704 Maximum horizontal timing value allowed
6705 </para></listitem></varlistentry>
6706 <varlistentry>
6707 <term><structfield>maxVValue</structfield></term>
6708 <listitem><para>
6709 Maximum vertical timing value allowed
6710 </para></listitem></varlistentry>
6711 <varlistentry>
6712 <term><structfield>xInc</structfield></term>
6713 <listitem><para>
6714 Horizontal timing increment in pixels (defaults to 8)
6715 </para></listitem></varlistentry>
6716 </variablelist>
6717 </para>
6718
6719 <para>
6720 This function fills in the following <structname>ScrnInfoRec</structname>
6721 fields:
6722
6723 <variablelist>
6724 <varlistentry>
6725 <term><structfield>modePool</structfield></term>
6726 <listitem><para>
6727 A subset of the modes available to the monitor which
6728 are compatible with the driver.
6729 </para></listitem></varlistentry>
6730
6731 <varlistentry>
6732 <term><structfield>modes</structfield></term>
6733 <listitem><para>
6734 One mode entry for each of the requested modes, with
6735 the status field of each filled in to indicate if
6736 the mode has been accepted or not. This list of
6737 modes is a circular list.
6738 </para></listitem></varlistentry>
6739
6740 <varlistentry>
6741 <term><structfield>virtualX</structfield></term>
6742 <listitem><para>
6743 The resulting virtual width.
6744 </para></listitem></varlistentry>
6745
6746 <varlistentry>
6747 <term><structfield>virtualY</structfield></term>
6748 <listitem><para>
6749 The resulting virtual height.
6750 </para></listitem></varlistentry>
6751
6752 <varlistentry>
6753 <term><structfield>displayWidth</structfield></term>
6754 <listitem><para>
6755 The resulting line pitch.
6756 </para></listitem></varlistentry>
6757
6758 <varlistentry>
6759 <term><structfield>virtualFrom</structfield></term>
6760 <listitem><para>
6761 Where the virtual size was determined from.
6762 </para></listitem></varlistentry>
6763
6764 </variablelist>
6765 </para>
6766
6767 <para>
6768 The first stage of this function checks that the
6769 <parameter>virtualX</parameter> and <parameter>virtualY</parameter> values
6770 supplied (if greater than zero) are consistent with the line pitch
6771 and <parameter>maxHeight</parameter> limitations. If not, an error
6772 message is printed, and the return value is <constant>-1</constant>.
6773 </para>
6774
6775 <para>
6776 The second stage sets up the mode pool, eliminating immediately
6777 any modes that exceed the driver's line pitch limits, and also
6778 the virtual width and height limits (if greater than zero). For
6779 each mode removed an informational message is printed at verbosity
6780 level <constant>2</constant>. If the mode pool ends up being empty,
6781 a warning message is printed, and the return value is
6782 <constant>0</constant>.
6783 </para>
6784
6785 <para>
6786 The final stage is to lookup each mode name, and fill in the remaining
6787 parameters. If an error condition is encountered, a message is
6788 printed, and the return value is <constant>-1</constant>. Otherwise,
6789 the return value is the number of valid modes found
6790 (<constant>0</constant> if none are found).
6791 </para>
6792
6793 <para>
6794 Even if the supplied mode names include duplicates, no two names will
6795 ever match the same mode. Furthermore, if the supplied mode names do not
6796 yield a valid mode (including the case where no names are passed at all),
6797 the function will continue looking through the mode pool until it finds
6798 a mode that survives all checks, or until the mode pool is exhausted.
6799 </para>
6800
6801 <para>
6802 A message is only printed by this function when a fundamental
6803 problem is found. It is intended that this function may be called
6804 more than once if there is more than one set of constraints that
6805 the driver can work within.
6806 </para>
6807
6808 <para>
6809 If this function returns <constant>-1</constant>, the
6810 <function>ChipPreInit()</function> function should return
6811 <constant>FALSE</constant>.
6812 </para>
6813
6814 <para>
6815 <parameter>clockRanges</parameter> is a linked list of clock ranges
6816 allowed by the driver. If a mode doesn't fit in any of the defined
6817 <parameter>clockRanges</parameter>, it is rejected. The first
6818 <literal remap="tt">clockRange</literal> that matches all requirements is used.
6819 This structure needs to be initialized to NULL when allocated.
6820 </para>
6821
6822 <para>
6823 <parameter>clockRanges</parameter> contains the following fields:
6824
6825 <variablelist>
6826 <varlistentry>
6827 <term><structfield>minClock</structfield></term>
6828 <term><structfield>maxClock</structfield></term>
6829 <listitem><para>
6830 The lower and upper mode clock bounds for which the rest
6831 of the <structname>clockRange</structname> parameters apply.
6832 Since these are the mode clocks, they are not scaled
6833 with the <structfield>ClockMulFactor</structfield> and
6834 <structfield>ClockDivFactor</structfield>. It is up to the driver
6835 to adjust these values if they depend on the clock
6836 scaling factors.
6837 </para></listitem></varlistentry>
6838
6839 <varlistentry>
6840 <term><structfield>clockIndex</structfield></term>
6841 <listitem><para>
6842 (not used yet) <constant>-1</constant> for programmable clocks
6843 </para></listitem></varlistentry>
6844
6845 <varlistentry>
6846 <term><structfield>interlaceAllowed</structfield></term>
6847 <listitem><para>
6848 <constant>TRUE</constant> if interlacing is allowed for this
6849 range
6850 </para></listitem></varlistentry>
6851
6852 <varlistentry>
6853 <term><structfield>doubleScanAllowed</structfield></term>
6854 <listitem><para>
6855 <constant>TRUE</constant> if doublescan or multiscan is allowed
6856 for this range
6857 </para></listitem></varlistentry>
6858
6859 <varlistentry>
6860 <term><structfield>ClockMulFactor</structfield></term>
6861 <term><structfield>ClockDivFactor</structfield></term>
6862 <listitem><para>
6863 Scaling factors that are applied to the mode clocks ONLY
6864 before selecting a clock index (when there is no
6865 programmable clock) or a <structfield>SynthClock</structfield>
6866 value. This is useful for drivers that support pixel
6867 multiplexing or that need to scale the clocks because
6868 of hardware restrictions (like sending 24bpp data to an
6869 8 bit RAMDAC using a tripled clock).
6870 </para>
6871
6872 <para>
6873 Note that these parameters describe what must be done
6874 to the mode clock to achieve the data transport clock
6875 between graphics controller and RAMDAC. For example
6876 for <literal remap="tt">2:1</literal> pixel multiplexing, two pixels
6877 are sent to the RAMDAC on each clock. This allows the
6878 RAMDAC clock to be half of the actual pixel clock.
6879 Hence, <code>ClockMulFactor=1</code> and
6880 <code>ClockDivFactor=2</code>. This means that the
6881 clock used for clock selection (ie, determining the
6882 correct clock index from the list of discrete clocks)
6883 or for the <structfield>SynthClock</structfield> field in case of
6884 a programmable clock is: (<code>mode-&gt;Clock *
6885 ClockMulFactor) / ClockDivFactor</code>.
6886 </para></listitem></varlistentry>
6887
6888 <varlistentry>
6889 <term><structfield>PrivFlags</structfield></term>
6890 <listitem><para>
6891 This field is copied into the
6892 <literal remap="tt">mode-&gt;PrivFlags</literal> field when this
6893 <literal remap="tt">clockRange</literal> is selected by
6894 <function>xf86ValidateModes()</function>. It allows the
6895 driver to find out what clock range was selected, so it
6896 knows it needs to set up pixel multiplexing or any other
6897 range-dependent feature. This field is purely
6898 driver-defined: it may contain flag bits, an index or
6899 anything else (as long as it is an <literal remap="tt">INT</literal>).
6900 </para></listitem></varlistentry>
6901 </variablelist>
6902 </para>
6903
6904 <para>
6905 Note that the <structfield>mode-&gt;SynthClock</structfield> field is always
6906 filled in by <function>xf86ValidateModes()</function>: it will contain
6907 the <quote>data transport clock</quote>, which is the clock that will have
6908 to be programmed in the chip when it has a programmable clock, or
6909 the clock that will be picked from the clocks list when it is not
6910 a programmable one. Thus:
6911
6912 <programlisting>
6913 mode-&gt;SynthClock = (mode-&gt;Clock * ClockMulFactor) / ClockDivFactor
6914 </programlisting>
6915 </para>
6916
6917 </blockquote></para></blockquote>
6918
6919 <blockquote><para>
6920 <programlisting>
6921 void xf86PruneDriverModes(ScrnInfoPtr scrp);
6922 </programlisting>
6923 <blockquote><para>
6924 This function deletes modes in the modes field of the
6925 <structname>ScrnInfoRec</structname> that have been marked as invalid.
6926 This is normally run after having run
6927 <function>xf86ValidateModes()</function> for the last time. For each
6928 mode that is deleted, a warning message is printed out indicating
6929 the reason for it being deleted.
6930 </para>
6931
6932 </blockquote></para></blockquote>
6933
6934 <blockquote><para>
6935 <programlisting>
6936 void xf86SetCrtcForModes(ScrnInfoPtr scrp, int adjustFlags);
6937 </programlisting>
6938 <blockquote><para>
6939 This function fills in the <structname>Crtc*</structname> fields for all
6940 the modes in the <structfield>modes</structfield> field of the
6941 <structname>ScrnInfoRec</structname>. The <parameter>adjustFlags</parameter>
6942 parameter determines how the vertical CRTC values are scaled for
6943 interlaced modes. They are halved if it is
6944 <constant>INTERLACE_HALVE_V</constant>. The vertical CRTC values are
6945 doubled for doublescan modes, and are further multiplied by the
6946 <literal remap="tt">VScan</literal> value.
6947 </para>
6948
6949 <para>
6950 This function is normally called after calling
6951 <function>xf86PruneDriverModes()</function>.
6952 </para>
6953
6954 </blockquote></para></blockquote>
6955
6956 <blockquote><para>
6957 <programlisting>
6958 void xf86PrintModes(ScrnInfoPtr scrp);
6959 </programlisting>
6960 <blockquote><para>
6961 This function prints out the virtual size setting, and the line
6962 pitch being used. It also prints out two lines for each mode being
6963 used. The first line includes the mode's pixel clock, horizontal sync
6964 rate, refresh rate, and whether it is interlaced, doublescanned and/or
6965 multi-scanned. The second line is the mode's Modeline.
6966 </para>
6967
6968 <para>
6969 This function is normally called after calling
6970 <function>xf86SetCrtcForModes()</function>.
6971 </para>
6972
6973 </blockquote></para></blockquote>
6974
6975 </sect2>
6976
6977 <sect2>
6978 <title>Secondary Mode functions</title>
6979
6980 <para>
6981The secondary mode helper functions are functions which are normally
6982used by the primary mode helper functions, and which are not normally
6983called directly by a driver. If a driver has unusual requirements
6984and needs to do its own mode validation, it might be able to make
6985use of some of these secondary mode helper functions.
6986 </para>
6987
6988 <blockquote><para>
6989 <programlisting>
6990 int xf86GetNearestClock(ScrnInfoPtr scrp, int freq, Bool allowDiv2,
6991 int *divider);
6992 </programlisting>
6993 <blockquote><para>
6994 This function returns the index of the closest clock to the
6995 frequency <parameter>freq</parameter> given (in kHz). It assumes that
6996 the number of clocks is greater than zero. It requires that the
6997 <structfield>numClocks</structfield> and <structfield>clock</structfield> fields of the
6998 <structname>ScrnInfoRec</structname> are initialised. The
6999 <structfield>allowDiv2</structfield> field determines if the clocks can be
7000 halved. The <parameter>*divider</parameter> return value indicates
7001 whether clock division is used when determining the clock returned.
7002 </para>
7003
7004 <para>
7005 This function is only for non-programmable clocks.
7006 </para>
7007
7008 </blockquote></para></blockquote>
7009
7010 <blockquote><para>
7011 <programlisting>
7012 const char *xf86ModeStatusToString(ModeStatus status);
7013 </programlisting>
7014 <blockquote><para>
7015 This function converts the <parameter>status</parameter> value to a
7016 descriptive printable string.
7017 </para>
7018
7019 </blockquote></para></blockquote>
7020
7021 <blockquote><para>
7022 <programlisting>
7023 ModeStatus xf86LookupMode(ScrnInfoPtr scrp, DisplayModePtr modep,
7024 ClockRangePtr clockRanges, LookupModeFlags strategy);
7025 </programlisting>
7026 <blockquote><para>
7027 This function takes a pointer to a mode with the name filled in,
7028 and looks for a mode in the <structfield>modePool</structfield> list which
7029 matches. The parameters of the matching mode are filled in to
7030 <parameter>*modep</parameter>. The <parameter>clockRanges</parameter> and
7031 <parameter>strategy</parameter> parameters are as for the
7032 <function>xf86ValidateModes()</function> function above.
7033 </para>
7034
7035 <para>
7036 This function requires the <structfield>modePool</structfield>,
7037 <structfield>clock[]</structfield>, <structfield>numClocks</structfield> and
7038 <structfield>progClock</structfield> fields of the <structname>ScrnInfoRec</structname>
7039 to be initialised before being called.
7040 </para>
7041
7042 <para>
7043 The return value is <constant>MODE_OK</constant> if a mode was found.
7044 Otherwise it indicates why a matching mode could not be found.
7045 </para>
7046
7047 </blockquote></para></blockquote>
7048
7049 <blockquote><para>
7050 <programlisting>
7051 ModeStatus xf86InitialCheckModeForDriver(ScrnInfoPtr scrp,
7052 DisplayModePtr mode, ClockRangePtr clockRanges,
7053 LookupModeFlags strategy, int maxPitch,
7054 int virtualX, int virtualY);
7055 </programlisting>
7056 <blockquote><para>
7057 This function checks the passed mode against some basic driver
7058 constraints. Apart from the ones passed explicitly, the
7059 <structfield>maxHValue</structfield> and <structfield>maxVValue</structfield> fields of
7060 the <structname>ScrnInfoRec</structname> are also used. If the
7061 <structfield>ValidMode</structfield> field of the <structname>ScrnInfoRec</structname>
7062 is set, that function is also called to check the mode. Next, the
7063 mode is checked against the monitor's constraints.
7064 </para>
7065
7066 <para>
7067 If the mode is consistent with all constraints, the return value
7068 is <constant>MODE_OK</constant>. Otherwise the return value indicates
7069 which constraint wasn't met.
7070 </para>
7071
7072 </blockquote></para></blockquote>
7073
7074 <blockquote><para>
7075 <programlisting>
7076 void xf86DeleteMode(DisplayModePtr *modeList, DisplayModePtr mode);
7077 </programlisting>
7078 <blockquote><para>
7079 This function deletes the <parameter>mode</parameter> given from the
7080 <parameter>modeList</parameter>. It never prints any messages, so it is
7081 up to the caller to print a message if required.
7082 </para>
7083
7084 </blockquote></para></blockquote>
7085 </sect2>
7086
7087 <sect2>
7088 <title>Functions for handling strings and tokens</title>
7089
7090 <para>
7091 Tables associating strings and numerical tokens combined with the
7092 following functions provide a compact way of handling strings from
7093 the config file, and for converting tokens into printable strings.
7094 The table data structure is:
7095
7096 <programlisting>
7097typedef struct {
7098 int token;
7099 const char * name;
7100} SymTabRec, *SymTabPtr;
7101 </programlisting>
7102 </para>
7103
7104 <para>
7105 A table is an initialised array of <structname>SymTabRec</structname>. The
7106 tokens must be non-negative integers. Multiple names may be mapped
7107 to a single token. The table is terminated with an element with a
7108 <structfield>token</structfield> value of <constant>-1</constant> and
7109 <constant>NULL</constant> for the <structfield>name</structfield>.
7110 </para>
7111
7112 <blockquote><para>
7113 <programlisting>
7114 const char *xf86TokenToString(SymTabPtr table, int token);
7115 </programlisting>
7116 <blockquote><para>
7117 This function returns the first string in <parameter>table</parameter>
7118 that matches <parameter>token</parameter>. If no match is found,
7119 <constant>NULL</constant> is returned (NOTE, older versions of this
7120 function would return the string "unknown" when no match is found).
7121 </para>
7122
7123 </blockquote></para></blockquote>
7124
7125 <blockquote><para>
7126 <programlisting>
7127 int xf86StringToToken(SymTabPtr table, const char *string);
7128 </programlisting>
7129 <blockquote><para>
7130 This function returns the first token in <parameter>table</parameter>
7131 that matches <parameter>string</parameter>. The
7132 <function>xf86NameCmp()</function> function is used to determine the
7133 match. If no match is found, <constant>-1</constant> is returned.
7134 </para>
7135
7136 </blockquote></para></blockquote>
7137
7138 </sect2>
7139
7140 <sect2>
7141 <title>Functions for finding which config file entries to use</title>
7142
7143 <para>
7144 These functions can be used to select the appropriate config file
7145 entries that match the detected hardware. They are described above
7146 in the <link linkend="probe">Probe</link> and
7147 <link linkend="avail">Available Functions</link> sections.
7148 </para>
7149
7150 </sect2>
7151
7152 <sect2>
7153 <title>Probing discrete clocks on old hardware</title>
7154
7155 <para>
7156 The <function>xf86GetClocks()</function> function may be used to assist
7157 in finding the discrete pixel clock values on older hardware.
7158 </para>
7159
7160 <blockquote><para>
7161 <programlisting>
7162 void xf86GetClocks(ScrnInfoPtr pScrn, int num,
7163 Bool (*ClockFunc)(ScrnInfoPtr, int),
7164 void (*ProtectRegs)(ScrnInfoPtr, Bool),
7165 void (*BlankScreen)(ScrnInfoPtr, Bool),
7166 int vertsyncreg, int maskval, int knownclkindex,
7167 int knownclkvalue);
7168 </programlisting>
7169 <blockquote><para>
7170 This function uses a comparative sampling method to measure the
7171 discrete pixel clock values. The number of discrete clocks to
7172 measure is given by <parameter>num</parameter>. <parameter>clockFunc</parameter>
7173 is a function that selects the <parameter>n</parameter>'th clock. It
7174 should also save or restore any state affected by programming the
7175 clocks when the index passed is <constant>CLK_REG_SAVE</constant> or
7176 <constant>CLK_REG_RESTORE</constant>. <parameter>ProtectRegs</parameter> is
7177 a function that does whatever is required to protect the hardware
7178 state while selecting a new clock. <parameter>BlankScreen</parameter>
7179 is a function that blanks the screen. <parameter>vertsyncreg</parameter>
7180 and <parameter>maskval</parameter> are the register and bitmask to
7181 check for the presence of vertical sync pulses.
7182 <parameter>knownclkindex</parameter> and <parameter>knownclkvalue</parameter>
7183 are the index and value of a known clock. These are the known
7184 references on which the comparative measurements are based. The
7185 number of clocks probed is set in <structfield>pScrn-&gt;numClocks</structfield>,
7186 and the probed clocks are set in the <structfield>pScrn-&gt;clock[]</structfield>
7187 array. All of the clock values are in units of kHz.
7188 </para>
7189
7190 </blockquote></para></blockquote>
7191
7192 <blockquote><para>
7193 <programlisting>
7194 void xf86ShowClocks(ScrnInfoPtr scrp, MessageType from);
7195 </programlisting>
7196 <blockquote><para>
7197 Print out the pixel clocks <parameter>scrp-&gt;clock[]</parameter>.
7198 <parameter>from</parameter> indicates whether the clocks were probed
7199 or from the config file.
7200 </para>
7201
7202 </blockquote></para></blockquote>
7203 </sect2>
7204
7205 <sect2>
7206 <title>Other helper functions</title>
7207
7208 <blockquote><para>
7209 <programlisting>
7210 Bool xf86IsUnblank(int mode);
7211 </programlisting>
7212 <blockquote><para>
7213 Returns <constant>TRUE</constant> when the screen saver mode specified
7214 by <parameter>mode</parameter> requires the screen be unblanked,
7215 and <constant>FALSE</constant> otherwise. The screen saver modes that
7216 require blanking are <constant>SCREEN_SAVER_ON</constant> and
7217 <constant>SCREEN_SAVER_CYCLE</constant>, and the screen saver modes that
7218 require unblanking are <constant>SCREEN_SAVER_OFF</constant> and
7219 <constant>SCREEN_SAVER_FORCER</constant>. Drivers may call this helper
7220 from their <function>SaveScreen()</function> function to interpret the
7221 screen saver modes.
7222 </para>
7223
7224 </blockquote></para></blockquote>
7225 </sect2>
7226 </sect1>
7227
7228 <sect1>
7229 <title>The vgahw module</title>
7230
7231 <para>
7232The vgahw modules provides an interface for saving, restoring and
7233programming the standard VGA registers, and for handling VGA colourmaps.
7234 </para>
7235
7236 <sect2>
7237 <title>Data Structures</title>
7238
7239 <para>
7240 The public data structures used by the vgahw module are
7241 <structname>vgaRegRec</structname> and <structname>vgaHWRec</structname>. They are
7242 defined in <filename>vgaHW.h.</filename>
7243 </para>
7244
7245 </sect2>
7246
7247 <sect2>
7248 <title>General vgahw Functions</title>
7249
7250 <blockquote><para>
7251 <programlisting>
7252 Bool vgaHWGetHWRec(ScrnInfoPtr pScrn);
7253 </programlisting>
7254 <blockquote><para>
7255 This function allocates a <structname>vgaHWRec</structname> structure, and
7256 hooks it into the <structname>ScrnInfoRec</structname>'s
7257 <structfield>privates</structfield>. Like all information hooked into the
7258 <structfield>privates</structfield>, it is persistent, and only needs to be
7259 allocated once per screen. This function should normally be called
7260 from the driver's <function>ChipPreInit()</function> function. The
7261 <structname>vgaHWRec</structname> is zero-allocated, and the following
7262 fields are explicitly initialised:
7263
7264 <variablelist>
7265 <varlistentry>
7266 <term><structfield>ModeReg.DAC[]</structfield></term>
7267 <listitem><para>initialised with a default colourmap
7268 </para></listitem></varlistentry>
7269 <varlistentry>
7270 <term><structfield>ModeReg.Attribute[0x11]</structfield></term>
7271 <listitem><para>initialised with the default overscan index
7272 </para></listitem></varlistentry>
7273 <varlistentry>
7274 <term><structfield>ShowOverscan</structfield></term>
7275 <listitem><para>initialised according to the "ShowOverscan" option
7276 </para></listitem></varlistentry>
7277 <varlistentry>
7278 <term><structfield>paletteEnabled</structfield></term>
7279 <listitem><para>initialised to FALSE
7280 </para></listitem></varlistentry>
7281 <varlistentry>
7282 <term><structfield>cmapSaved</structfield></term>
7283 <listitem><para>initialised to FALSE
7284 </para></listitem></varlistentry>
7285 <varlistentry>
7286 <term><structfield>pScrn</structfield></term>
7287 <listitem><para>initialised to pScrn
7288 </para></listitem></varlistentry>
7289 </variablelist>
7290 </para>
7291
7292 <para>
7293 In addition to the above, <function>vgaHWSetStdFuncs()</function> is
7294 called to initialise the register access function fields with the
7295 standard VGA set of functions.
7296 </para>
7297
7298 <para>
7299 Once allocated, a pointer to the <structname>vgaHWRec</structname> can be
7300 obtained from the <literal remap="tt">ScrnInfoPtr</literal> with the
7301 <literal remap="tt">VGAHWPTR(pScrn)</literal> macro.
7302 </para>
7303
7304 </blockquote></para></blockquote>
7305
7306 <blockquote><para>
7307 <programlisting>
7308 void vgaHWFreeHWRec(ScrnInfoPtr pScrn);
7309 </programlisting>
7310 <blockquote><para>
7311 This function frees a <structname>vgaHWRec</structname> structure. It
7312 should be called from a driver's <function>ChipFreeScreen()</function>
7313 function.
7314 </para>
7315
7316 </blockquote></para></blockquote>
7317
7318 <blockquote><para>
7319 <programlisting>
7320 Bool vgaHWSetRegCounts(ScrnInfoPtr pScrn, int numCRTC,
7321 int numSequencer, int numGraphics, int numAttribute);
7322 </programlisting>
7323 <blockquote><para>
7324 This function allows the number of CRTC, Sequencer, Graphics and
7325 Attribute registers to be changed. This makes it possible for
7326 extended registers to be saved and restored with
7327 <function>vgaHWSave()</function> and <function>vgaHWRestore()</function>.
7328 This function should be called after a <structname>vgaHWRec</structname>
7329 has been allocated with <function>vgaHWGetHWRec()</function>. The
7330 default values are defined in <filename>vgaHW.h</filename> as follows:
7331
7332 <programlisting>
7333#define VGA_NUM_CRTC 25
7334#define VGA_NUM_SEQ 5
7335#define VGA_NUM_GFX 9
7336#define VGA_NUM_ATTR 21
7337 </programlisting>
7338 </para>
7339
7340 </blockquote></para></blockquote>
7341
7342 <blockquote><para>
7343 <programlisting>
7344 Bool vgaHWCopyReg(vgaRegPtr dst, vgaRegPtr src);
7345 </programlisting>
7346 <blockquote><para>
7347 This function copies the contents of the VGA saved registers in
7348 <parameter>src</parameter> to <parameter>dst</parameter>. Note that it isn't
7349 possible to simply do this with <function>memcpy()</function> (or
7350 similar). This function returns <constant>TRUE</constant> unless there
7351 is a problem allocating space for the <structfield>CRTC</structfield> and
7352 related fields in <parameter>dst</parameter>.
7353 </para>
7354
7355 </blockquote></para></blockquote>
7356
7357 <blockquote><para>
7358 <programlisting>
7359 void vgaHWSetStdFuncs(vgaHWPtr hwp);
7360 </programlisting>
7361 <blockquote><para>
7362 This function initialises the register access function fields of
7363 <parameter>hwp</parameter> with the standard VGA set of functions. This
7364 is called by <function>vgaHWGetHWRec()</function>, so there is usually
7365 no need to call this explicitly. The register access functions
7366 are described below. If the registers are shadowed in some other
7367 port I/O space (for example a PCI I/O region), these functions
7368 can be used to access the shadowed registers if
7369 <structfield>hwp-&gt;PIOOffset</structfield> is initialised with
7370 <literal remap="tt">offset</literal>, calculated in such a way that when the
7371 standard VGA I/O port value is added to it the correct offset into
7372 the PIO area results. This value is initialised to zero in
7373 <function>vgaHWGetHWRec()</function>. (Note: the PIOOffset functionality
7374 is present in XFree86 4.1.0 and later.)
7375 </para>
7376
7377 </blockquote></para></blockquote>
7378
7379 <blockquote><para>
7380 <programlisting>
7381 void vgaHWSetMmioFuncs(vgaHWPtr hwp, CARD8 *base, int offset);
7382 </programlisting>
7383 <blockquote><para>
7384 This function initialised the register access function fields of
7385 hwp with a generic MMIO set of functions.
7386 <structfield>hwp-&gt;MMIOBase</structfield> is initialised with
7387 <parameter>base</parameter>, which must be the virtual address that the
7388 start of MMIO area is mapped to. <structfield>hwp-&gt;MMIOOffset</structfield>
7389 is initialised with <parameter>offset</parameter>, which must be calculated
7390 in such a way that when the standard VGA I/O port value is added
7391 to it the correct offset into the MMIO area results. That means
7392 that these functions are only suitable when the VGA I/O ports are
7393 made available in a direct mapping to the MMIO space. If that is
7394 not the case, the driver will need to provide its own register
7395 access functions. The register access functions are described
7396 below.
7397 </para>
7398
7399 </blockquote></para></blockquote>
7400
7401 <blockquote><para>
7402 <programlisting>
7403 Bool vgaHWMapMem(ScrnInfoPtr pScrn);
7404 </programlisting>
7405 <blockquote><para>
7406 This function maps the VGA memory window. It requires that the
7407 <structname>vgaHWRec</structname> be allocated. If a driver requires
7408 non-default <structfield>MapPhys</structfield> or <structfield>MapSize</structfield>
7409 settings (the physical location and size of the VGA memory window)
7410 then those fields of the <structname>vgaHWRec</structname> must be initialised
7411 before calling this function. Otherwise, this function initialiases
7412 the default values of <constant>0xA0000</constant> for
7413 <structfield>MapPhys</structfield> and <code>(64&nbsp;*&nbsp;1024)</code> for
7414 <structfield>MapSize</structfield>. This function must be called before
7415 attempting to save or restore the VGA state. If the driver doesn't
7416 call it explicitly, the <function>vgaHWSave()</function> and
7417 <function>vgaHWRestore()</function> functions may call it if they need
7418 to access the VGA memory (in which case they will also call
7419 <function>vgaHWUnmapMem()</function> to unmap the VGA memory before
7420 exiting).
7421 </para>
7422
7423 </blockquote></para></blockquote>
7424
7425 <blockquote><para>
7426 <programlisting>
7427 void vgaHWUnmapMem(ScrnInfoPtr pScrn);
7428 </programlisting>
7429 <blockquote><para>
7430 This function unmaps the VGA memory window. It must only be called
7431 after the memory has been mapped. The <structfield>Base</structfield> field
7432 of the <structname>vgaHWRec</structname> field is set to <constant>NULL</constant>
7433 to indicate that the memory is no longer mapped.
7434 </para>
7435
7436 </blockquote></para></blockquote>
7437
7438 <blockquote><para>
7439 <programlisting>
7440 void vgaHWGetIOBase(vgaHWPtr hwp);
7441 </programlisting>
7442 <blockquote><para>
7443 This function initialises the <structfield>IOBase</structfield> field of the
7444 <structname>vgaHWRec</structname>. This function must be called before
7445 using any other functions that access the video hardware.
7446 </para>
7447
7448 <para>
7449 A macro <function>VGAHW_GET_IOBASE()</function> is also available in
7450 <filename>vgaHW.h</filename> that returns the I/O base, and this may
7451 be used when the vgahw module is not loaded (for example, in the
7452 <function>ChipProbe()</function> function).
7453 </para>
7454
7455 </blockquote></para></blockquote>
7456
7457 <blockquote><para>
7458 <programlisting>
7459 void vgaHWUnlock(vgaHWPtr hwp);
7460 </programlisting>
7461 <blockquote><para>
7462 This function unlocks the VGA <literal remap="tt">CRTC[0-7]</literal> registers,
7463 and must be called before attempting to write to those registers.
7464 </para>
7465
7466 </blockquote></para></blockquote>
7467
7468 <blockquote><para>
7469 <programlisting>
7470 void vgaHWLock(vgaHWPtr hwp);
7471 </programlisting>
7472 <blockquote><para>
7473 This function locks the VGA <literal remap="tt">CRTC[0-7]</literal> registers.
7474 </para>
7475
7476 </blockquote></para></blockquote>
7477
7478 <blockquote><para>
7479 <programlisting>
7480 void vgaHWEnable(vgaHWPtr hwp);
7481 </programlisting>
7482 <blockquote><para>
7483 This function enables the VGA subsystem. (Note, this function is
7484 present in XFree86 4.1.0 and later.).
7485 </para>
7486
7487 </blockquote></para></blockquote>
7488
7489 <blockquote><para>
7490 <programlisting>
7491 void vgaHWDisable(vgaHWPtr hwp);
7492 </programlisting>
7493 <blockquote><para>
7494 This function disables the VGA subsystem. (Note, this function is
7495 present in XFree86 4.1.0 and later.).
7496 </para>
7497
7498 </blockquote></para></blockquote>
7499
7500 <blockquote><para>
7501 <programlisting>
7502 void vgaHWSave(ScrnInfoPtr pScrn, vgaRegPtr save, int flags);
7503 </programlisting>
7504 <blockquote><para>
7505 This function saves the VGA state. The state is written to the
7506 <structname>vgaRegRec</structname> pointed to by <parameter>save</parameter>.
7507 <parameter>flags</parameter> is set to one or more of the following flags
7508 ORed together:
7509
7510 <variablelist>
7511 <varlistentry>
7512 <term><constant>VGA_SR_MODE</constant></term>
7513 <listitem><para>the mode setting registers are saved
7514 </para></listitem></varlistentry>
7515 <varlistentry>
7516 <term><constant>VGA_SR_FONTS</constant></term>
7517 <listitem><para>the text mode font/text data is saved
7518 </para></listitem></varlistentry>
7519 <varlistentry>
7520 <term><constant>VGA_SR_CMAP</constant></term>
7521 <listitem><para>the colourmap (LUT) is saved
7522 </para></listitem></varlistentry>
7523 <varlistentry>
7524 <term><constant>VGA_SR_ALL</constant></term>
7525 <listitem><para>all of the above are saved
7526 </para></listitem></varlistentry>
7527 </variablelist>
7528 </para>
7529
7530 <para>
7531 The <structname>vgaHWRec</structname> and its <structfield>IOBase</structfield> fields
7532 must be initialised before this function is called. If
7533 <constant>VGA_SR_FONTS</constant> is set in <parameter>flags</parameter>, the
7534 VGA memory window must be mapped. If it isn't then
7535 <function>vgaHWMapMem()</function> will be called to map it, and
7536 <function>vgaHWUnmapMem()</function> will be called to unmap it
7537 afterwards. <function>vgaHWSave()</function> uses the three functions
7538 below in the order <function>vgaHWSaveColormap()</function>,
7539 <function>vgaHWSaveMode()</function>, <function>vgaHWSaveFonts()</function> to
7540 carry out the different save phases. It is undecided at this
7541 stage whether they will remain part of the vgahw module's public
7542 interface or not.
7543 </para>
7544
7545 </blockquote></para></blockquote>
7546
7547 <blockquote><para>
7548 <programlisting>
7549 void vgaHWSaveMode(ScrnInfoPtr pScrn, vgaRegPtr save);
7550 </programlisting>
7551 <blockquote><para>
7552 This function saves the VGA mode registers. They are saved to
7553 the <structname>vgaRegRec</structname> pointed to by <parameter>save</parameter>.
7554 The registers saved are:
7555
7556 <literallayout>
7557 MiscOut
7558 CRTC[0-0x18]
7559 Attribute[0-0x14]
7560 Graphics[0-8]
7561 Sequencer[0-4]
7562 </literallayout>
7563 </para>
7564
7565 <para>
7566 The number of registers actually saved may be modified by a prior call
7567 to <function>vgaHWSetRegCounts()</function>.
7568 </para>
7569
7570 </blockquote></para></blockquote>
7571
7572 <blockquote><para>
7573 <programlisting>
7574 void vgaHWSaveFonts(ScrnInfoPtr pScrn, vgaRegPtr save);
7575 </programlisting>
7576 <blockquote><para>
7577 This function saves the text mode font and text data held in the
7578 video memory. If called while in a graphics mode, no save is
7579 done. The VGA memory window must be mapped with
7580 <function>vgaHWMapMem()</function> before to calling this function.
7581 </para>
7582
7583 <para>
7584 On some platforms, one or more of the font/text plane saves may be
7585 no-ops. This is the case when the platform's VC driver already
7586 takes care of this.
7587 </para>
7588
7589 </blockquote></para></blockquote>
7590
7591 <blockquote><para>
7592 <programlisting>
7593 void vgaHWSaveColormap(ScrnInfoPtr pScrn, vgaRegPtr save);
7594 </programlisting>
7595 <blockquote><para>
7596 This function saves the VGA colourmap (LUT). Before saving it, it
7597 attempts to verify that the colourmap is readable. In rare cases
7598 where it isn't readable, a default colourmap is saved instead.
7599 </para>
7600
7601 </blockquote></para></blockquote>
7602
7603 <blockquote><para>
7604 <programlisting>
7605 void vgaHWRestore(ScrnInfoPtr pScrn, vgaRegPtr restore, int flags);
7606 </programlisting>
7607 <blockquote><para>
7608 This function programs the VGA state. The state programmed is
7609 that contained in the <structname>vgaRegRec</structname> pointed to by
7610 <parameter>restore</parameter>. <parameter>flags</parameter> is the same
7611 as described above for the <function>vgaHWSave()</function> function.
7612 </para>
7613
7614 <para>
7615 The <structname>vgaHWRec</structname> and its <structfield>IOBase</structfield> fields
7616 must be initialised before this function is called. If
7617 <constant>VGA_SR_FONTS</constant> is set in <parameter>flags</parameter>, the
7618 VGA memory window must be mapped. If it isn't then
7619 <function>vgaHWMapMem()</function> will be called to map it, and
7620 <function>vgaHWUnmapMem()</function> will be called to unmap it
7621 afterwards. <function>vgaHWRestore()</function> uses the three functions
7622 below in the order <function>vgaHWRestoreFonts()</function>,
7623 <function>vgaHWRestoreMode()</function>,
7624 <function>vgaHWRestoreColormap()</function> to carry out the different
7625 restore phases. It is undecided at this stage whether they will
7626 remain part of the vgahw module's public interface or not.
7627 </para>
7628
7629 </blockquote></para></blockquote>
7630
7631 <blockquote><para>
7632 <programlisting>
7633 void vgaHWRestoreMode(ScrnInfoPtr pScrn, vgaRegPtr restore);
7634 </programlisting>
7635 <blockquote><para>
7636 This function restores the VGA mode registers. They are restored
7637 from the data in the <structname>vgaRegRec</structname> pointed to by
7638 <parameter>restore</parameter>. The registers restored are:
7639
7640 <literallayout>
7641 MiscOut
7642 CRTC[0-0x18]
7643 Attribute[0-0x14]
7644 Graphics[0-8]
7645 Sequencer[0-4]
7646 </literallayout>
7647 </para>
7648
7649 <para>
7650 The number of registers actually restored may be modified by a prior call
7651 to <function>vgaHWSetRegCounts()</function>.
7652 </para>
7653
7654 </blockquote></para></blockquote>
7655
7656 <blockquote><para>
7657 <programlisting>
7658 void vgaHWRestoreFonts(ScrnInfoPtr pScrn, vgaRegPtr restore);
7659 </programlisting>
7660 <blockquote><para>
7661 This function restores the text mode font and text data to the
7662 video memory. The VGA memory window must be mapped with
7663 <function>vgaHWMapMem()</function> before to calling this function.
7664 </para>
7665
7666 <para>
7667 On some platforms, one or more of the font/text plane restores
7668 may be no-ops. This is the case when the platform's VC driver
7669 already takes care of this.
7670 </para>
7671
7672 </blockquote></para></blockquote>
7673
7674 <blockquote><para>
7675 <programlisting>
7676 void vgaHWRestoreColormap(ScrnInfoPtr pScrn, vgaRegPtr restore);
7677 </programlisting>
7678 <blockquote><para>
7679 This function restores the VGA colourmap (LUT).
7680 </para>
7681
7682 </blockquote></para></blockquote>
7683
7684 <blockquote><para>
7685 <programlisting>
7686 void vgaHWInit(ScrnInfoPtr pScrn, DisplayModePtr mode);
7687 </programlisting>
7688 <blockquote><para>
7689 This function fills in the <structname>vgaHWRec</structname>'s
7690 <structfield>ModeReg</structfield> field with the values appropriate for
7691 programming the given video mode. It requires that the
7692 <structname>ScrnInfoRec</structname>'s <structfield>depth</structfield> field is
7693 initialised, which determines how the registers are programmed.
7694 </para>
7695
7696 </blockquote></para></blockquote>
7697
7698 <blockquote><para>
7699 <programlisting>
7700 void vgaHWSeqReset(vgaHWPtr hwp, Bool start);
7701 </programlisting>
7702 <blockquote><para>
7703 Do a VGA sequencer reset. If start is <constant>TRUE</constant>, the
7704 reset is started. If start is <constant>FALSE</constant>, the reset
7705 is ended.
7706 </para>
7707
7708 </blockquote></para></blockquote>
7709
7710 <blockquote><para>
7711 <programlisting>
7712 void vgaHWProtect(ScrnInfoPtr pScrn, Bool on);
7713 </programlisting>
7714 <blockquote><para>
7715 This function protects VGA registers and memory from corruption
7716 during loads. It is typically called with on set to
7717 <constant>TRUE</constant> before programming, and with on set to
7718 <constant>FALSE</constant> after programming.
7719 </para>
7720
7721 </blockquote></para></blockquote>
7722
7723 <blockquote><para>
7724 <programlisting>
7725 Bool vgaHWSaveScreen(ScreenPtr pScreen, int mode);
7726 </programlisting>
7727 <blockquote><para>
7728 This function blanks and unblanks the screen. It is blanked when
7729 <parameter>mode</parameter> is <constant>SCREEN_SAVER_ON</constant> or
7730 <constant>SCREEN_SAVER_CYCLE</constant>, and unblanked when
7731 <parameter>mode</parameter> is <constant>SCREEN_SAVER_OFF</constant> or
7732 <constant>SCREEN_SAVER_FORCER</constant>.
7733 </para>
7734
7735 </blockquote></para></blockquote>
7736
7737 <blockquote><para>
7738 <programlisting>
7739 void vgaHWBlankScreen(ScrnInfoPtr pScrn, Bool on);
7740 </programlisting>
7741 <blockquote><para>
7742 This function blanks and unblanks the screen. It is blanked when
7743 <parameter>on</parameter> is <constant>FALSE</constant>, and unblanked when
7744 <parameter>on</parameter> is <constant>TRUE</constant>. This function is
7745 provided for use in cases where the <structname>ScrnInfoRec</structname>
7746 can't be derived from the <structname>ScreenRec</structname> (while probing
7747 for clocks, for example).
7748 </para>
7749
7750 </blockquote></para></blockquote>
7751
7752 </sect2>
7753
7754 <sect2>
7755 <title>VGA Colormap Functions</title>
7756
7757 <para>
7758 The vgahw module uses the standard colormap support (see the
7759 <link linkend="cmap">Colormap Handling</link> section. This is initialised
7760 with the following function:
7761
7762 <blockquote><para>
7763 <programlisting>
7764 Bool vgaHWHandleColormaps(ScreenPtr pScreen);
7765 </programlisting>
7766 </para></blockquote>
7767 </para>
7768
7769 </sect2>
7770
7771 <sect2>
7772 <title>VGA Register Access Functions</title>
7773
7774 <para>
7775 The vgahw module abstracts access to the standard VGA registers by
7776 using a set of functions held in the <structname>vgaHWRec</structname>. When
7777 the <structname>vgaHWRec</structname> is created these function pointers are
7778 initialised with the set of standard VGA I/O register access functions.
7779 In addition to these, the vgahw module includes a basic set of MMIO
7780 register access functions, and the <structname>vgaHWRec</structname> function
7781 pointers can be initialised to these by calling the
7782 <function>vgaHWSetMmioFuncs()</function> function described above. Some
7783 drivers/platforms may require a different set of functions for VGA
7784 access. The access functions are described here.
7785 </para>
7786
7787
7788 <blockquote><para>
7789 <programlisting>
7790 void writeCrtc(vgaHWPtr hwp, CARD8 index, CARD8 value);
7791 </programlisting>
7792 <blockquote><para>
7793 Write <parameter>value</parameter> to CRTC register <parameter>index</parameter>.
7794 </para>
7795
7796 </blockquote></para></blockquote>
7797
7798 <blockquote><para>
7799 <programlisting>
7800 CARD8 readCrtc(vgaHWPtr hwp, CARD8 index);
7801 </programlisting>
7802 <blockquote><para>
7803 Return the value read from CRTC register <parameter>index</parameter>.
7804 </para>
7805
7806 </blockquote></para></blockquote>
7807
7808 <blockquote><para>
7809 <programlisting>
7810 void writeGr(vgaHWPtr hwp, CARD8 index, CARD8 value);
7811 </programlisting>
7812 <blockquote><para>
7813 Write <parameter>value</parameter> to Graphics Controller register
7814 <parameter>index</parameter>.
7815 </para>
7816
7817 </blockquote></para></blockquote>
7818
7819 <blockquote><para>
7820 <programlisting>
7821 CARD8 readGR(vgaHWPtr hwp, CARD8 index);
7822 </programlisting>
7823 <blockquote><para>
7824 Return the value read from Graphics Controller register
7825 <parameter>index</parameter>.
7826 </para>
7827
7828 </blockquote></para></blockquote>
7829
7830 <blockquote><para>
7831 <programlisting>
7832 void writeSeq(vgaHWPtr hwp, CARD8 index, CARD8, value);
7833 </programlisting>
7834 <blockquote><para>
7835 Write <parameter>value</parameter> to Sequencer register
7836 <parameter>index</parameter>.
7837 </para>
7838
7839 </blockquote></para></blockquote>
7840
7841 <blockquote><para>
7842 <programlisting>
7843 CARD8 readSeq(vgaHWPtr hwp, CARD8 index);
7844 </programlisting>
7845 <blockquote><para>
7846 Return the value read from Sequencer register <parameter>index</parameter>.
7847 </para>
7848
7849 </blockquote></para></blockquote>
7850
7851 <blockquote><para>
7852 <programlisting>
7853 void writeAttr(vgaHWPtr hwp, CARD8 index, CARD8, value);
7854 </programlisting>
7855 <blockquote><para>
7856 Write <parameter>value</parameter> to Attribute Controller register
7857 <parameter>index</parameter>. When writing out the index value this
7858 function should set bit 5 (<constant>0x20</constant>) according to the
7859 setting of <structfield>hwp-&gt;paletteEnabled</structfield> in order to
7860 preserve the palette access state. It should be cleared when
7861 <structfield>hwp-&gt;paletteEnabled</structfield> is <constant>TRUE</constant>
7862 and set when it is <constant>FALSE</constant>.
7863 </para>
7864
7865 </blockquote></para></blockquote>
7866
7867 <blockquote><para>
7868 <programlisting>
7869 CARD8 readAttr(vgaHWPtr hwp, CARD8 index);
7870 </programlisting>
7871 <blockquote><para>
7872 Return the value read from Attribute Controller register
7873 <parameter>index</parameter>. When writing out the index value this
7874 function should set bit 5 (<constant>0x20</constant>) according to the
7875 setting of <structfield>hwp-&gt;paletteEnabled</structfield> in order to
7876 preserve the palette access state. It should be cleared when
7877 <structfield>hwp-&gt;paletteEnabled</structfield> is <constant>TRUE</constant>
7878 and set when it is <constant>FALSE</constant>.
7879 </para>
7880
7881 </blockquote></para></blockquote>
7882
7883 <blockquote><para>
7884 <programlisting>
7885 void writeMiscOut(vgaHWPtr hwp, CARD8 value);
7886 </programlisting>
7887 <blockquote><para>
7888 Write <quote><parameter>value</parameter></quote> to the Miscellaneous Output register.
7889 </para>
7890
7891 </blockquote></para></blockquote>
7892
7893 <blockquote><para>
7894 <programlisting>
7895 CARD8 readMiscOut(vgwHWPtr hwp);
7896 </programlisting>
7897 <blockquote><para>
7898 Return the value read from the Miscellaneous Output register.
7899 </para>
7900
7901 </blockquote></para></blockquote>
7902
7903 <blockquote><para>
7904 <programlisting>
7905 void enablePalette(vgaHWPtr hwp);
7906 </programlisting>
7907 <blockquote><para>
7908 Clear the palette address source bit in the Attribute Controller
7909 index register and set <literal remap="tt">hwp-&gt;paletteEnabled</literal> to
7910 <constant>TRUE</constant>.
7911 </para>
7912
7913 </blockquote></para></blockquote>
7914
7915 <blockquote><para>
7916 <programlisting>
7917 void disablePalette(vgaHWPtr hwp);
7918 </programlisting>
7919 <blockquote><para>
7920 Set the palette address source bit in the Attribute Controller
7921 index register and set <literal remap="tt">hwp-&gt;paletteEnabled</literal> to
7922 <constant>FALSE</constant>.
7923 </para>
7924
7925 </blockquote></para></blockquote>
7926
7927 <blockquote><para>
7928 <programlisting>
7929 void writeDacMask(vgaHWPtr hwp, CARD8 value);
7930 </programlisting>
7931 <blockquote><para>
7932 Write <parameter>value</parameter> to the DAC Mask register.
7933 </para>
7934
7935 </blockquote></para></blockquote>
7936
7937 <blockquote><para>
7938 <programlisting>
7939 CARD8 readDacMask(vgaHWptr hwp);
7940 </programlisting>
7941 <blockquote><para>
7942 Return the value read from the DAC Mask register.
7943 </para>
7944
7945 </blockquote></para></blockquote>
7946
7947 <blockquote><para>
7948 <programlisting>
7949 void writeDacReadAddress(vgaHWPtr hwp, CARD8 value);
7950 </programlisting>
7951 <blockquote><para>
7952 Write <parameter>value</parameter> to the DAC Read Address register.
7953 </para>
7954
7955 </blockquote></para></blockquote>
7956
7957 <blockquote><para>
7958 <programlisting>
7959 void writeDacWriteAddress(vgaHWPtr hwp, CARD8 value);
7960 </programlisting>
7961 <blockquote><para>
7962 Write <parameter>value</parameter> to the DAC Write Address register.
7963 </para>
7964
7965 </blockquote></para></blockquote>
7966
7967 <blockquote><para>
7968 <programlisting>
7969 void writeDacData(vgaHWPtr hwp, CARD8 value);
7970 </programlisting>
7971 <blockquote><para>
7972 Write <parameter>value</parameter> to the DAC Data register.
7973 </para>
7974
7975 </blockquote></para></blockquote>
7976
7977 <blockquote><para>
7978 <programlisting>
7979 CARD8 readDacData(vgaHWptr hwp);
7980 </programlisting>
7981 <blockquote><para>
7982 Return the value read from the DAC Data register.
7983 </para>
7984
7985 </blockquote></para></blockquote>
7986
7987 <blockquote><para>
7988 <programlisting>
7989 CARD8 readEnable(vgaHWptr hwp);
7990 </programlisting>
7991 <blockquote><para>
7992 Return the value read from the VGA Enable register. (Note: This
7993 function is present in XFree86 4.1.0 and later.)
7994 </para>
7995
7996 </blockquote></para></blockquote>
7997
7998 <blockquote><para>
7999 <programlisting>
8000 void writeEnable(vgaHWPtr hwp, CARD8 value);
8001 </programlisting>
8002 <blockquote><para>
8003 Write <parameter>value</parameter> to the VGA Enable register. (Note: This
8004 function is present in XFree86 4.1.0 and later.)
8005 </para>
8006
8007 </blockquote></para></blockquote>
8008 </sect2>
8009 </sect1>
8010
8011 <sect1 id="sample">
8012 <title>Some notes about writing a driver</title>
8013
8014 <note><para>NOTE: some parts of this are not up to date</para></note>
8015
8016 <para>
8017The following is an outline for writing a basic unaccelerated driver
8018for a PCI video card with a linear mapped framebuffer, and which has a
8019VGA core. It is includes some general information that is relevant to
8020most drivers (even those which don't fit that basic description).
8021 </para>
8022
8023 <para>
8024The information here is based on the initial conversion of the Matrox
8025Millennium driver to the <quote>new design</quote>. For a fleshing out and sample
8026implementation of some of the bits outlined here, refer to that driver.
8027Note that this is an example only. The approach used here will not be
8028appropriate for all drivers.
8029 </para>
8030
8031 <para>
8032Each driver must reserve a unique driver name, and a string that is used
8033to prefix all of its externally visible symbols. This is to avoid name
8034space clashes when loading multiple drivers. The examples here are for
8035the <quote>ZZZ</quote> driver, which uses the <quote>ZZZ</quote> or <quote>zzz</quote> prefix for its externally
8036visible symbols.
8037 </para>
8038
8039 <sect2>
8040 <title>Include files</title>
8041
8042 <para>
8043 All drivers normally include the following headers:
8044 <literallayout><filename>
8045 "xf86.h"
8046 "xf86_OSproc.h"
8047 "xf86_ansic.h"
8048 "xf86Resources.h"
8049 </filename></literallayout>
8050 Wherever inb/outb (and related things) are used the following should be
8051 included:
8052 <literallayout><filename>
8053 "compiler.h"
8054 </filename></literallayout>
8055 Note: in drivers, this must be included after <filename>"xf86_ansic.h"</filename>.
8056 </para>
8057
8058 <para>
8059 Drivers that need to access PCI vendor/device definitions need this:
8060 <literallayout><filename>
8061 "xf86PciInfo.h"
8062 </filename></literallayout>
8063 </para>
8064
8065 <para>
8066 Drivers that need to access the PCI config space need this:
8067 <literallayout><filename>
8068 "xf86Pci.h"
8069 </filename></literallayout>
8070 </para>
8071
8072 <para>
8073 Drivers using the mi banking wrapper need:
8074
8075 <literallayout><filename>
8076 "mibank.h"
8077 </filename></literallayout>
8078 </para>
8079
8080 <para>
8081 Drivers that initialise a SW cursor need this:
8082 <literallayout><filename>
8083 "mipointer.h"
8084 </filename></literallayout>
8085 </para>
8086
8087 <para>
8088 All drivers using the mi colourmap code need this:
8089 <literallayout><filename>
8090 "micmap.h"
8091 </filename></literallayout>
8092 </para>
8093
8094 <para>
8095 If a driver uses the vgahw module, it needs this:
8096 <literallayout><filename>
8097 "vgaHW.h"
8098 </filename></literallayout>
8099 </para>
8100
8101 <para>
8102 Drivers supporting VGA or Hercules monochrome screens need:
8103 <literallayout><filename>
8104 "xf1bpp.h"
8105 </filename></literallayout>
8106 </para>
8107
8108 <para>
8109 Drivers supporting VGA or EGC 16-colour screens need:
8110 <literallayout><filename>
8111 "xf4bpp.h"
8112 </filename></literallayout>
8113 </para>
8114
8115 <para>
8116 Drivers using cfb need:
8117 <programlisting>
8118 #define PSZ 8
8119 #include "cfb.h"
8120 #undef PSZ
8121 </programlisting>
8122 </para>
8123
8124 <para>
8125 Drivers supporting bpp 16, 24 or 32 with cfb need one or more of:
8126 <literallayout><filename>
8127 "cfb16.h"
8128 "cfb24.h"
8129 "cfb32.h"
8130 </filename></literallayout>
8131 </para>
8132
8133 <para>
8134 The driver's own header file:
8135 <literallayout><filename>
8136 "zzz.h"
8137 </filename></literallayout>
8138 </para>
8139
8140 <para>
8141 Drivers must NOT include the following:
8142
8143 <literallayout><filename>
8144 "xf86Priv.h"
8145 "xf86Privstr.h"
8146 "xf86_libc.h"
8147 "xf86_OSlib.h"
8148 "Xos.h"</filename>
8149 any OS header
8150 </literallayout>
8151 </para>
8152
8153 </sect2>
8154
8155 <sect2>
8156 <title>Data structures and initialisation</title>
8157
8158 <itemizedlist>
8159 <listitem>
8160 <para>The following macros should be defined:
8161 <programlisting>
8162#define VERSION &lt;version-as-an-int&gt;
8163#define ZZZ_NAME "ZZZ" /* the name used to prefix messages */
8164#define ZZZ_DRIVER_NAME "zzz" /* the driver name as used in config file */
8165#define ZZZ_MAJOR_VERSION &lt;int&gt;
8166#define ZZZ_MINOR_VERSION &lt;int&gt;
8167#define ZZZ_PATCHLEVEL &lt;int&gt;
8168 </programlisting>
8169 </para>
8170 <para>
8171 NOTE: <constant>ZZZ_DRIVER_NAME</constant> should match the name of the
8172 driver module without things like the "lib" prefix, the "_drv" suffix
8173 or filename extensions.
8174 </para>
8175 </listitem>
8176
8177 <listitem>
8178 <para>
8179 A DriverRec must be defined, which includes the functions required
8180 at the pre-probe phase. The name of this DriverRec must be an
8181 upper-case version of ZZZ_DRIVER_NAME (for the purposes of static
8182 linking).
8183 <programlisting>
8184DriverRec ZZZ = {
8185 VERSION,
8186 ZZZ_DRIVER_NAME,
8187 ZZZIdentify,
8188 ZZZProbe,
8189 ZZZAvailableOptions,
8190 NULL,
8191 0
8192};
8193 </programlisting>
8194 </para>
8195 </listitem>
8196
8197 <listitem>
8198 <para>Define list of supported chips and their matching ID:
8199 <programlisting>
8200static SymTabRec ZZZChipsets[] = {
8201 { PCI_CHIP_ZZZ1234, "zzz1234a" },
8202 { PCI_CHIP_ZZZ5678, "zzz5678a" },
8203 { -1, NULL }
8204};
8205 </programlisting>
8206 </para>
8207 <para>
8208 The token field may be any integer value that the driver may use to
8209 uniquely identify the supported chipsets. For drivers that support
8210 only PCI devices using the PCI device IDs might be a natural choice,
8211 but this isn't mandatory. For drivers that support both PCI and other
8212 devices (like ISA), some other ID should probably used. When other
8213 IDs are used as the tokens it is recommended that the names be
8214 defined as an <type>enum</type> type.
8215 </para>
8216 </listitem>
8217
8218 <listitem>
8219 <para>
8220 If the driver uses the <function>xf86MatchPciInstances()</function>
8221 helper (recommended for drivers that support PCI cards) a list that
8222 maps PCI IDs to chip IDs and fixed resources must be defined:
8223 <programlisting>
8224static PciChipsets ZZZPciChipsets[] = {
8225 { PCI_CHIP_ZZZ1234, PCI_CHIP_ZZZ1234, RES_SHARED_VGA },
8226 { PCI_CHIP_ZZZ5678, PCI_CHIP_ZZZ5678, RES_SHARED_VGA },
8227 { -1, -1, RES_UNDEFINED }
8228}
8229 </programlisting>
8230 </para>
8231 </listitem>
8232
8233 <listitem>
8234 <para>
8235 Define the <structname>XF86ModuleVersionInfo</structname> struct for the
8236 driver. This is required for the dynamically loaded version:
8237 <programlisting>
8238static XF86ModuleVersionInfo zzzVersRec =
8239{
8240 "zzz",
8241 MODULEVENDORSTRING,
8242 MODINFOSTRING1,
8243 MODINFOSTRING2,
8244 XF86_VERSION_CURRENT,
8245 ZZZ_MAJOR_VERSION, ZZZ_MINOR_VERSION, ZZZ_PATCHLEVEL,
8246 ABI_CLASS_VIDEODRV,
8247 ABI_VIDEODRV_VERSION,
8248 MOD_CLASS_VIDEODRV,
8249 {0,0,0,0}
8250};
8251 </programlisting>
8252 </para>
8253 </listitem>
8254
8255 <listitem>
8256 <para>
8257 Define a data structure to hold the driver's screen-specific data.
8258 This must be used instead of global variables. This would be defined
8259 in the <filename>"zzz.h"</filename> file, something like:
8260 <programlisting>
8261typedef struct {
8262 type1 field1;
8263 type2 field2;
8264 int fooHack;
8265 Bool pciRetry;
8266 Bool noAccel;
8267 Bool hwCursor;
8268 CloseScreenProcPtr CloseScreen;
8269 OptionInfoPtr Options;
8270 ...
8271} ZZZRec, *ZZZPtr;
8272 </programlisting>
8273 </para>
8274 </listitem>
8275
8276 <listitem>
8277 <para>
8278 Define the list of config file Options that the driver accepts. For
8279 consistency between drivers those in the list of <quote>standard</quote> options
8280 should be used where appropriate before inventing new options.
8281
8282 <programlisting>
8283typedef enum {
8284 OPTION_FOO_HACK,
8285 OPTION_PCI_RETRY,
8286 OPTION_HW_CURSOR,
8287 OPTION_NOACCEL
8288} ZZZOpts;
8289
8290static const OptionInfoRec ZZZOptions[] = {
8291 { OPTION_FOO_HACK, "FooHack", OPTV_INTEGER, {0}, FALSE },
8292 { OPTION_PCI_RETRY, "PciRetry", OPTV_BOOLEAN, {0}, FALSE },
8293 { OPTION_HW_CURSOR, "HWcursor", OPTV_BOOLEAN, {0}, FALSE },
8294 { OPTION_NOACCEL, "NoAccel", OPTV_BOOLEAN, {0}, FALSE },
8295 { -1, NULL, OPTV_NONE, {0}, FALSE }
8296};
8297 </programlisting>
8298 </para>
8299 </listitem>
8300 </itemizedlist>
8301 </sect2>
8302
8303 <sect2>
8304 <title>Functions</title>
8305
8306
8307 <sect3>
8308 <title>SetupProc</title>
8309
8310 <para>
8311 For dynamically loaded modules, a <varname>ModuleData</varname>
8312 variable is required. It is should be the name of the driver
8313 prepended to "ModuleData". A <function>Setup()</function> function is
8314 also required, which calls <function>xf86AddDriver()</function> to add
8315 the driver to the main list of drivers.
8316 </para>
8317
8318 <programlisting>
8319static MODULESETUPPROTO(zzzSetup);
8320
8321XF86ModuleData zzzModuleData = { &amp;zzzVersRec, zzzSetup, NULL };
8322
8323static pointer
8324zzzSetup(pointer module, pointer opts, int *errmaj, int *errmin)
8325{
8326 static Bool setupDone = FALSE;
8327
8328 /* This module should be loaded only once, but check to be sure. */
8329
8330 if (!setupDone) {
8331 /*
8332 * Modules that this driver always requires may be loaded
8333 * here by calling LoadSubModule().
8334 */
8335
8336 setupDone = TRUE;
8337 xf86AddDriver(&amp;MGA, module, 0);
8338
8339 /*
8340 * The return value must be non-NULL on success even though
8341 * there is no TearDownProc.
8342 */
8343 return (pointer)1;
8344 } else {
8345 if (errmaj) *errmaj = LDR_ONCEONLY;
8346 return NULL;
8347 }
8348}
8349 </programlisting>
8350 </sect3>
8351
8352 <sect3>
8353 <title>GetRec, FreeRec</title>
8354
8355 <para>
8356 A function is usually required to allocate the driver's
8357 screen-specific data structure and hook it into the
8358 <structname>ScrnInfoRec</structname>'s <structfield>driverPrivate</structfield> field.
8359 The <structname>ScrnInfoRec</structname>'s <structfield>driverPrivate</structfield> is
8360 initialised to <constant>NULL</constant>, so it is easy to check if the
8361 initialisation has already been done. After allocating it, initialise
8362 the fields. By using <function>xnfcalloc()</function> to do the allocation
8363 it is zeroed, and if the allocation fails the server exits.
8364 </para>
8365
8366 <para>
8367 NOTE:
8368 When allocating structures from inside the driver which are defined
8369 on the common level it is important to initialize the structure to
8370 zero.
8371 Only this guarantees that the server remains source compatible to
8372 future changes in common level structures.
8373 </para>
8374
8375 <programlisting>
8376static Bool
8377ZZZGetRec(ScrnInfoPtr pScrn)
8378{
8379 if (pScrn-&gt;driverPrivate != NULL)
8380 return TRUE;
8381 pScrn-&gt;driverPrivate = xnfcalloc(sizeof(ZZZRec), 1);
8382 /* Initialise as required */
8383 ...
8384 return TRUE;
8385}
8386 </programlisting>
8387
8388 <para>
8389 Define a macro in <filename>"zzz.h"</filename> which gets a pointer to
8390 the <structname>ZZZRec</structname> when given <parameter>pScrn</parameter>:
8391
8392 <programlisting>
8393#define ZZZPTR(p) ((ZZZPtr)((p)-&gt;driverPrivate))
8394 </programlisting>
8395 </para>
8396
8397 <para>
8398 Define a function to free the above, setting it to <constant>NULL</constant>
8399 once it has been freed:
8400
8401 <programlisting>
8402static void
8403ZZZFreeRec(ScrnInfoPtr pScrn)
8404{
8405 if (pScrn-&gt;driverPrivate == NULL)
8406 return;
8407 xfree(pScrn-&gt;driverPrivate);
8408 pScrn-&gt;driverPrivate = NULL;
8409}
8410 </programlisting>
8411 </para>
8412 </sect3>
8413
8414 <sect3>
8415 <title>Identify</title>
8416
8417 <para>
8418 Define the <function>Identify()</function> function. It is run before
8419 the Probe, and typically prints out an identifying message, which
8420 might include the chipsets it supports. This function is mandatory:
8421
8422 <programlisting>
8423static void
8424ZZZIdentify(int flags)
8425{
8426 xf86PrintChipsets(ZZZ_NAME, "driver for ZZZ Tech chipsets",
8427 ZZZChipsets);
8428}
8429 </programlisting>
8430 </para>
8431 </sect3>
8432
8433 <sect3>
8434 <title>Probe</title>
8435
8436 <para>
8437 Define the <function>Probe()</function> function. The purpose of this
8438 is to find all instances of the hardware that the driver supports,
8439 and for the ones not already claimed by another driver, claim the
8440 slot, and allocate a <structname>ScrnInfoRec</structname>. This should be
8441 a minimal probe, and it should under no circumstances leave the
8442 state of the hardware changed. Because a device is found, don't
8443 assume that it will be used. Don't do any initialisations other
8444 than the required <structname>ScrnInfoRec</structname> initialisations.
8445 Don't allocate any new data structures.
8446 </para>
8447
8448 <para>
8449 This function is mandatory.
8450 </para>
8451
8452 <para>
8453 NOTE: The <function>xf86DrvMsg()</function> functions cannot be used from
8454 the Probe.
8455 </para>
8456
8457 <programlisting>
8458static Bool
8459ZZZProbe(DriverPtr drv, int flags)
8460{
8461 Bool foundScreen = FALSE;
8462 int numDevSections, numUsed;
8463 GDevPtr *devSections;
8464 int *usedChips;
8465 int i;
8466
8467 /*
8468 * Find the config file Device sections that match this
8469 * driver, and return if there are none.
8470 */
8471 if ((numDevSections = xf86MatchDevice(ZZZ_DRIVER_NAME,
8472 &amp;devSections)) &lt;= 0) {
8473 return FALSE;
8474 }
8475
8476 /*
8477 * Since this is a PCI card, "probing" just amounts to checking
8478 * the PCI data that the server has already collected. If there
8479 * is none, return.
8480 *
8481 * Although the config file is allowed to override things, it
8482 * is reasonable to not allow it to override the detection
8483 * of no PCI video cards.
8484 *
8485 * The provided xf86MatchPciInstances() helper takes care of
8486 * the details.
8487 */
8488 /* test if PCI bus present */
8489 if (xf86GetPciVideoInfo()) {
8490
8491 numUsed = xf86MatchPciInstances(ZZZ_NAME, PCI_VENDOR_ZZZ,
8492 ZZZChipsets, ZZZPciChipsets, devSections,
8493 numDevSections, drv, &amp;usedChips);
8494
8495 for (i = 0; i &lt; numUsed; i++) {
8496 ScrnInfoPtr pScrn = NULL;
8497 if ((pScrn = xf86ConfigPciEntity(pScrn, flags, usedChips[i],
8498 ZZZPciChipsets, NULL, NULL,
8499 NULL, NULL, NULL))) {
8500 /* Allocate a ScrnInfoRec */
8501 pScrn-&gt;driverVersion = VERSION;
8502 pScrn-&gt;driverName = ZZZ_DRIVER_NAME;
8503 pScrn-&gt;name = ZZZ_NAME;
8504 pScrn-&gt;Probe = ZZZProbe;
8505 pScrn-&gt;PreInit = ZZZPreInit;
8506 pScrn-&gt;ScreenInit = ZZZScreenInit;
8507 pScrn-&gt;SwitchMode = ZZZSwitchMode;
8508 pScrn-&gt;AdjustFrame = ZZZAdjustFrame;
8509 pScrn-&gt;EnterVT = ZZZEnterVT;
8510 pScrn-&gt;LeaveVT = ZZZLeaveVT;
8511 pScrn-&gt;FreeScreen = ZZZFreeScreen;
8512 pScrn-&gt;ValidMode = ZZZValidMode;
8513 foundScreen = TRUE;
8514 /* add screen to entity */
8515 }
8516 }
8517 xfree(usedChips);
8518 }
8519
8520#ifdef HAS_ISA_DEVS
8521 /*
8522 * If the driver supports ISA hardware, the following block
8523 * can be included too.
8524 */
8525 numUsed = xf86MatchIsaInstances(ZZZ_NAME, ZZZChipsets,
8526 ZZZIsaChipsets, drv, ZZZFindIsaDevice,
8527 devSections, numDevSections, &amp;usedChips);
8528 for (i = 0; i &lt; numUsed; i++) {
8529 ScrnInfoPtr pScrn = NULL;
8530 if ((pScrn = xf86ConfigIsaEntity(pScrn, flags, usedChips[i],
8531 ZZZIsaChipsets, NULL, NULL, NULL,
8532 NULL, NULL))) {
8533 pScrn-&gt;driverVersion = VERSION;
8534 pScrn-&gt;driverName = ZZZ_DRIVER_NAME;
8535 pScrn-&gt;name = ZZZ_NAME;
8536 pScrn-&gt;Probe = ZZZProbe;
8537 pScrn-&gt;PreInit = ZZZPreInit;
8538 pScrn-&gt;ScreenInit = ZZZScreenInit;
8539 pScrn-&gt;SwitchMode = ZZZSwitchMode;
8540 pScrn-&gt;AdjustFrame = ZZZAdjustFrame;
8541 pScrn-&gt;EnterVT = ZZZEnterVT;
8542 pScrn-&gt;LeaveVT = ZZZLeaveVT;
8543 pScrn-&gt;FreeScreen = ZZZFreeScreen;
8544 pScrn-&gt;ValidMode = ZZZValidMode;
8545 foundScreen = TRUE;
8546 }
8547 }
8548 xfree(usedChips);
8549#endif /* HAS_ISA_DEVS */
8550
8551 xfree(devSections);
8552 return foundScreen;
8553 </programlisting>
8554 </sect3>
8555
8556 <sect3>
8557 <title>AvailableOptions</title>
8558
8559 <para>
8560 Define the <function>AvailableOptions()</function> function. The purpose
8561 of this is to return the available driver options back to the
8562 -configure option, so that an xorg.conf file can be built and the
8563 user can see which options are available for them to use.
8564 </para>
8565 </sect3>
8566
8567 <sect3>
8568 <title>PreInit</title>
8569
8570 <para>
8571 Define the <function>PreInit()</function> function. The purpose of
8572 this is to find all the information required to determine if the
8573 configuration is usable, and to initialise those parts of the
8574 <structname>ScrnInfoRec</structname> that can be set once at the beginning
8575 of the first server generation. The information should be found in
8576 the least intrusive way possible.
8577 </para>
8578
8579 <para>
8580 This function is mandatory.
8581 </para>
8582
8583 <para>
8584 NOTES:
8585 <orderedlist>
8586 <listitem><para>
8587 The <function>PreInit()</function> function is only called once
8588 during the life of the X server (at the start of the first
8589 generation).
8590 </para></listitem>
8591
8592 <listitem><para>
8593 Data allocated here must be of the type that persists for
8594 the life of the X server. This means that data that hooks into
8595 the <structname>ScrnInfoRec</structname>'s <structfield>privates</structfield>
8596 field should be allocated here, but data that hooks into the
8597 <structname>ScreenRec</structname>'s <structfield>devPrivates</structfield> field
8598 should not be allocated here. The <structfield>driverPrivate</structfield>
8599 field should also be allocated here.
8600 </para></listitem>
8601
8602 <listitem><para>
8603 Although the <structname>ScrnInfoRec</structname> has been allocated
8604 before this function is called, the <structname>ScreenRec</structname>
8605 has not been allocated. That means that things requiring it
8606 cannot be used in this function.
8607 </para></listitem>
8608
8609 <listitem><para>
8610 Very little of the <structname>ScrnInfoRec</structname> has been
8611 initialised when this function is called. It is important to
8612 get the order of doing things right in this function.
8613 </para></listitem>
8614
8615 </orderedlist>
8616 </para>
8617
8618 <programlisting>
8619static Bool
8620ZZZPreInit(ScrnInfoPtr pScrn, int flags)
8621{
8622 /* Fill in the monitor field */
8623 pScrn-&gt;monitor = pScrn-&gt;confScreen-&gt;monitor;
8624
8625 /*
8626 * If using the vgahw module, it will typically be loaded
8627 * here by calling xf86LoadSubModule(pScrn, "vgahw");
8628 */
8629
8630 /*
8631 * Set the depth/bpp. Use the globally preferred depth/bpp. If the
8632 * driver has special default depth/bpp requirements, the defaults should
8633 * be specified here explicitly.
8634 * We support both 24bpp and 32bpp framebuffer layouts.
8635 * This sets pScrn-&gt;display also.
8636 */
8637 if (!xf86SetDepthBpp(pScrn, 0, 0, 0,
8638 Support24bppFb | Support32bppFb)) {
8639 return FALSE;
8640 } else {
8641 if (depth/bpp isn't one we support) {
8642 print error message;
8643 return FALSE;
8644 }
8645 }
8646 /* Print out the depth/bpp that was set */
8647 xf86PrintDepthBpp(pScrn);
8648
8649 /* Set bits per RGB for 8bpp */
8650 if (pScrn-&gt;depth &lt;= 8) {
8651 /* Take into account a dac_6_bit option here */
8652 pScrn-&gt;rgbBits = 6 or 8;
8653 }
8654
8655 /*
8656 * xf86SetWeight() and xf86SetDefaultVisual() must be called
8657 * after pScrn-&gt;display is initialised.
8658 */
8659
8660 /* Set weight/mask/offset for depth &gt; 8 */
8661 if (pScrn-&gt;depth &gt; 8) {
8662 if (!xf86SetWeight(pScrn, defaultWeight, defaultMask)) {
8663 return FALSE;
8664 } else {
8665 if (weight isn't one we support) {
8666 print error message;
8667 return FALSE;
8668 }
8669 }
8670 }
8671
8672 /* Set the default visual. */
8673 if (!xf86SetDefaultVisual(pScrn, -1)) {
8674 return FALSE;
8675 } else {
8676 if (visual isn't one we support) {
8677 print error message;
8678 return FALSE;
8679 }
8680 }
8681
8682 /* If the driver supports gamma correction, set the gamma. */
8683 if (!xf86SetGamma(pScrn, default_gamma)) {
8684 return FALSE;
8685 }
8686
8687 /* This driver uses a programmable clock */
8688 pScrn-&gt;progClock = TRUE;
8689
8690 /* Allocate the ZZZRec driverPrivate */
8691 if (!ZZZGetRec(pScrn)) {
8692 return FALSE;
8693 }
8694
8695 pZzz = ZZZPTR(pScrn);
8696
8697 /* Collect all of the option flags (fill in pScrn-&gt;options) */
8698 xf86CollectOptions(pScrn, NULL);
8699
8700 /*
8701 * Process the options based on the information in ZZZOptions.
8702 * The results are written to pZzz-&gt;Options. If all of the options
8703 * processing is done within this function a local variable "options"
8704 * can be used instead of pZzz-&gt;Options.
8705 */
8706 if (!(pZzz-&gt;Options = xalloc(sizeof(ZZZOptions))))
8707 return FALSE;
8708 (void)memcpy(pZzz-&gt;Options, ZZZOptions, sizeof(ZZZOptions));
8709 xf86ProcessOptions(pScrn-&gt;scrnIndex, pScrn-&gt;options, pZzz-&gt;Options);
8710
8711 /*
8712 * Set various fields of ScrnInfoRec and/or ZZZRec based on
8713 * the options found.
8714 */
8715 from = X_DEFAULT;
8716 pZzz-&gt;hwCursor = FALSE;
8717 if (xf86IsOptionSet(pZzz-&gt;Options, OPTION_HW_CURSOR)) {
8718 from = X_CONFIG;
8719 pZzz-&gt;hwCursor = TRUE;
8720 }
8721 xf86DrvMsg(pScrn-&gt;scrnIndex, from, "Using %s cursor\n",
8722 pZzz-&gt;hwCursor ? "HW" : "SW");
8723 if (xf86IsOptionSet(pZzz-&gt;Options, OPTION_NOACCEL)) {
8724 pZzz-&gt;noAccel = TRUE;
8725 xf86DrvMsg(pScrn-&gt;scrnIndex, X_CONFIG,
8726 "Acceleration disabled\n");
8727 } else {
8728 pZzz-&gt;noAccel = FALSE;
8729 }
8730 if (xf86IsOptionSet(pZzz-&gt;Options, OPTION_PCI_RETRY)) {
8731 pZzz-&gt;UsePCIRetry = TRUE;
8732 xf86DrvMsg(pScrn-&gt;scrnIndex, X_CONFIG, "PCI retry enabled\n");
8733 }
8734 pZzz-&gt;fooHack = 0;
8735 if (xf86GetOptValInteger(pZzz-&gt;Options, OPTION_FOO_HACK,
8736 &amp;pZzz-&gt;fooHack)) {
8737 xf86DrvMsg(pScrn-&gt;scrnIndex, X_CONFIG, "Foo Hack set to %d\n",
8738 pZzz-&gt;fooHack);
8739 }
8740
8741 /*
8742 * Find the PCI slot(s) that this screen claimed in the probe.
8743 * In this case, exactly one is expected, so complain otherwise.
8744 * Note in this case we're not interested in the card types so
8745 * that parameter is set to NULL.
8746 */
8747 if ((i = xf86GetPciInfoForScreen(pScrn-&gt;scrnIndex, &amp;pciList, NULL))
8748 != 1) {
8749 print error message;
8750 ZZZFreeRec(pScrn);
8751 if (i &gt; 0)
8752 xfree(pciList);
8753 return FALSE;
8754 }
8755 /* Note that pciList should be freed below when no longer needed */
8756
8757 /*
8758 * Determine the chipset, allowing config file chipset and
8759 * chipid values to override the probed information. The config
8760 * chipset value has precedence over its chipid value if both
8761 * are present.
8762 *
8763 * It isn't necessary to fill in pScrn-&gt;chipset if the driver
8764 * keeps track of the chipset in its ZZZRec.
8765 */
8766
8767 ...
8768
8769 /*
8770 * Determine video memory, fb base address, I/O addresses, etc,
8771 * allowing the config file to override probed values.
8772 *
8773 * Set the appropriate pScrn fields (videoRam is probably the
8774 * most important one that other code might require), and
8775 * print out the settings.
8776 */
8777
8778 ...
8779
8780 /* Initialise a clockRanges list. */
8781
8782 ...
8783
8784 /* Set any other chipset specific things in the ZZZRec */
8785
8786 ...
8787
8788 /* Select valid modes from those available */
8789
8790 i = xf86ValidateModes(pScrn, pScrn-&gt;monitor-&gt;Modes,
8791 pScrn-&gt;display-&gt;modes, clockRanges,
8792 NULL, minPitch, maxPitch, rounding,
8793 minHeight, maxHeight,
8794 pScrn-&gt;display-&gt;virtualX,
8795 pScrn-&gt;display-&gt;virtualY,
8796 pScrn-&gt;videoRam * 1024,
8797 LOOKUP_BEST_REFRESH);
8798 if (i == -1) {
8799 ZZZFreeRec(pScrn);
8800 return FALSE;
8801 }
8802
8803 /* Prune the modes marked as invalid */
8804
8805 xf86PruneDriverModes(pScrn);
8806
8807 /* If no valid modes, return */
8808
8809 if (i == 0 || pScrn-&gt;modes == NULL) {
8810 print error message;
8811 ZZZFreeRec(pScrn);
8812 return FALSE;
8813 }
8814
8815 /*
8816 * Initialise the CRTC fields for the modes. This driver expects
8817 * vertical values to be halved for interlaced modes.
8818 */
8819 xf86SetCrtcForModes(pScrn, INTERLACE_HALVE_V);
8820
8821 /* Set the current mode to the first in the list. */
8822 pScrn-&gt;currentMode = pScrn-&gt;modes;
8823
8824 /* Print the list of modes being used. */
8825 xf86PrintModes(pScrn);
8826
8827 /* Set the DPI */
8828 xf86SetDpi(pScrn, 0, 0);
8829
8830 /* Load bpp-specific modules */
8831 switch (pScrn-&gt;bitsPerPixel) {
8832 case 1:
8833 mod = "xf1bpp";
8834 break;
8835 case 4:
8836 mod = "xf4bpp";
8837 break;
8838 case 8:
8839 mod = "cfb";
8840 break;
8841 case 16:
8842 mod = "cfb16";
8843 break;
8844 case 24:
8845 mod = "cfb24";
8846 break;
8847 case 32:
8848 mod = "cfb32";
8849 break;
8850 }
8851 if (mod &amp;&amp; !xf86LoadSubModule(pScrn, mod))
8852 ZZZFreeRec(pScrn);
8853 return FALSE;
8854
8855
8856 /* Done */
8857 return TRUE;
8858}
8859 </programlisting>
8860 </sect3>
8861
8862 <sect3>
8863 <title>MapMem, UnmapMem</title>
8864
8865 <para>
8866 Define functions to map and unmap the video memory and any other
8867 memory apertures required. These functions are not mandatory, but
8868 it is often useful to have such functions.
8869 </para>
8870
8871 <programlisting>
8872static Bool
8873ZZZMapMem(ScrnInfoPtr pScrn)
8874{
8875 /* Call xf86MapPciMem() to map each PCI memory area */
8876 ...
8877 return TRUE or FALSE;
8878}
8879
8880static Bool
8881ZZZUnmapMem(ScrnInfoPtr pScrn)
8882{
8883 /* Call xf86UnMapVidMem() to unmap each memory area */
8884 ...
8885 return TRUE or FALSE;
8886}
8887 </programlisting>
8888 </sect3>
8889
8890 <sect3>
8891 <title>Save, Restore</title>
8892
8893 <para>
8894 Define functions to save and restore the original video state. These
8895 functions are not mandatory, but are often useful.
8896 </para>
8897
8898 <programlisting>
8899static void
8900ZZZSave(ScrnInfoPtr pScrn)
8901{
8902 /*
8903 * Save state into per-screen data structures.
8904 * If using the vgahw module, vgaHWSave will typically be
8905 * called here.
8906 */
8907 ...
8908}
8909
8910static void
8911ZZZRestore(ScrnInfoPtr pScrn)
8912{
8913 /*
8914 * Restore state from per-screen data structures.
8915 * If using the vgahw module, vgaHWRestore will typically be
8916 * called here.
8917 */
8918 ...
8919}
8920 </programlisting>
8921 </sect3>
8922
8923 <sect3>
8924 <title>ModeInit</title>
8925
8926 <para>
8927 Define a function to initialise a new video mode. This function isn't
8928 mandatory, but is often useful.
8929 </para>
8930
8931 <programlisting>
8932static Bool
8933ZZZModeInit(ScrnInfoPtr pScrn, DisplayModePtr mode)
8934{
8935 /*
8936 * Program a video mode. If using the vgahw module,
8937 * vgaHWInit and vgaRestore will typically be called here.
8938 * Once up to the point where there can't be a failure
8939 * set pScrn-&gt;vtSema to TRUE.
8940 */
8941 ...
8942}
8943 </programlisting>
8944 </sect3>
8945
8946 <sect3>
8947 <title>ScreenInit</title>
8948
8949 <para>
8950 Define the <function>ScreenInit()</function> function. This is called
8951 at the start of each server generation, and should fill in as much
8952 of the <structname>ScreenRec</structname> as possible as well as any other
8953 data that is initialised once per generation. It should initialise
8954 the framebuffer layers it is using, and initialise the initial video
8955 mode.
8956 </para>
8957
8958 <para>
8959 This function is mandatory.
8960 </para>
8961
8962 <para>
8963 NOTE: The <structname>ScreenRec</structname> (<parameter>pScreen</parameter>) is
8964 passed to this driver, but it and the
8965 <varname>ScrnInfoRecs</varname> are not yet hooked into each
8966 other. This means that in this function, and functions it
8967 calls, one cannot be found from the other.
8968 </para>
8969
8970 <programlisting>
8971static Bool
8972ZZZScreenInit(ScreenPtr pScreen, int argc, char **argv)
8973{
8974 /* Get the ScrnInfoRec */
8975 pScrn = xf86ScreenToScrn(pScreen);
8976
8977 /*
8978 * If using the vgahw module, its data structures and related
8979 * things are typically initialised/mapped here.
8980 */
8981
8982 /* Save the current video state */
8983 ZZZSave(pScrn);
8984
8985 /* Initialise the first mode */
8986 ZZZModeInit(pScrn, pScrn-&gt;currentMode);
8987
8988 /* Set the viewport if supported */
8989
8990 ZZZAdjustFrame(pScrn, pScrn-&gt;frameX0, pScrn-&gt;frameY0);
8991
8992 /*
8993 * Setup the screen's visuals, and initialise the framebuffer
8994 * code.
8995 */
8996
8997 /* Reset the visual list */
8998 miClearVisualTypes();
8999
9000 /*
9001 * Setup the visuals supported. This driver only supports
9002 * TrueColor for bpp &gt; 8, so the default set of visuals isn't
9003 * acceptable. To deal with this, call miSetVisualTypes with
9004 * the appropriate visual mask.
9005 */
9006
9007 if (pScrn-&gt;bitsPerPixel &gt; 8) {
9008 if (!miSetVisualTypes(pScrn-&gt;depth, TrueColorMask,
9009 pScrn-&gt;rgbBits, pScrn-&gt;defaultVisual))
9010 return FALSE;
9011 } else {
9012 if (!miSetVisualTypes(pScrn-&gt;depth,
9013 miGetDefaultVisualMask(pScrn-&gt;depth),
9014 pScrn-&gt;rgbBits, pScrn-&gt;defaultVisual))
9015 return FALSE;
9016 }
9017
9018 /*
9019 * Initialise the framebuffer.
9020 */
9021
9022 switch (pScrn-&gt;bitsPerPixel) {
9023 case 1:
9024 ret = xf1bppScreenInit(pScreen, FbBase,
9025 pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9026 pScrn-&gt;xDpi, pScrn-&gt;yDpi,
9027 pScrn-&gt;displayWidth);
9028 break;
9029 case 4:
9030 ret = xf4bppScreenInit(pScreen, FbBase,
9031 pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9032 pScrn-&gt;xDpi, pScrn-&gt;yDpi,
9033 pScrn-&gt;displayWidth);
9034 break;
9035 case 8:
9036 ret = cfbScreenInit(pScreen, FbBase,
9037 pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9038 pScrn-&gt;xDpi, pScrn-&gt;yDpi,
9039 pScrn-&gt;displayWidth);
9040 break;
9041 case 16:
9042 ret = cfb16ScreenInit(pScreen, FbBase,
9043 pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9044 pScrn-&gt;xDpi, pScrn-&gt;yDpi,
9045 pScrn-&gt;displayWidth);
9046 break;
9047 case 24:
9048 ret = cfb24ScreenInit(pScreen, FbBase,
9049 pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9050 pScrn-&gt;xDpi, pScrn-&gt;yDpi,
9051 pScrn-&gt;displayWidth);
9052 break;
9053 case 32:
9054 ret = cfb32ScreenInit(pScreen, FbBase,
9055 pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9056 pScrn-&gt;xDpi, pScrn-&gt;yDpi,
9057 pScrn-&gt;displayWidth);
9058 break;
9059 default:
9060 print a message about an internal error;
9061 ret = FALSE;
9062 break;
9063 }
9064
9065 if (!ret)
9066 return FALSE;
9067
9068 /* Override the default mask/offset settings */
9069 if (pScrn-&gt;bitsPerPixel &gt; 8) {
9070 for (i = 0, visual = pScreen-&gt;visuals;
9071 i &lt; pScreen-&gt;numVisuals; i++, visual++) {
9072 if ((visual-&gt;class | DynamicClass) == DirectColor) {
9073 visual-&gt;offsetRed = pScrn-&gt;offset.red;
9074 visual-&gt;offsetGreen = pScrn-&gt;offset.green;
9075 visual-&gt;offsetBlue = pScrn-&gt;offset.blue;
9076 visual-&gt;redMask = pScrn-&gt;mask.red;
9077 visual-&gt;greenMask = pScrn-&gt;mask.green;
9078 visual-&gt;blueMask = pScrn-&gt;mask.blue;
9079 }
9080 }
9081 }
9082
9083 /*
9084 * If banking is needed, initialise an miBankInfoRec (defined in
9085 * "mibank.h"), and call miInitializeBanking().
9086 */
9087 if (!miInitializeBanking(pScreen, pScrn-&gt;virtualX, pScrn-&gt;virtualY,
9088 pScrn-&gt;displayWidth, pBankInfo))
9089 return FALSE;
9090
9091 /*
9092 * Set initial black &amp; white colourmap indices.
9093 */
9094 xf86SetBlackWhitePixels(pScreen);
9095
9096 /*
9097 * Install colourmap functions. If using the vgahw module,
9098 * vgaHandleColormaps would usually be called here.
9099 */
9100
9101 ...
9102
9103 /*
9104 * Initialise cursor functions. This example is for the mi
9105 * software cursor.
9106 */
9107 miDCInitialize(pScreen, xf86GetPointerScreenFuncs());
9108
9109 /* Initialise the default colourmap */
9110 switch (pScrn-&gt;depth) {
9111 case 1:
9112 if (!xf1bppCreateDefColormap(pScreen))
9113 return FALSE;
9114 break;
9115 case 4:
9116 if (!xf4bppCreateDefColormap(pScreen))
9117 return FALSE;
9118 break;
9119 default:
9120 if (!cfbCreateDefColormap(pScreen))
9121 return FALSE;
9122 break;
9123 }
9124
9125 /*
9126 * Wrap the CloseScreen vector and set SaveScreen.
9127 */
9128 ZZZPTR(pScrn)-&gt;CloseScreen = pScreen-&gt;CloseScreen;
9129 pScreen-&gt;CloseScreen = ZZZCloseScreen;
9130 pScreen-&gt;SaveScreen = ZZZSaveScreen;
9131
9132 /* Report any unused options (only for the first generation) */
9133 if (serverGeneration == 1) {
9134 xf86ShowUnusedOptions(pScrn-&gt;scrnIndex, pScrn-&gt;options);
9135 }
9136
9137 /* Done */
9138 return TRUE;
9139}
9140 </programlisting>
9141 </sect3>
9142
9143 <sect3>
9144 <title>SwitchMode</title>
9145
9146 <para>
9147 Define the <function>SwitchMode()</function> function if mode switching
9148 is supported by the driver.
9149 </para>
9150
9151 <programlisting>
9152static Bool
9153ZZZSwitchMode(ScrnInfoPtr pScrn, DisplayModePtr mode)
9154{
9155 return ZZZModeInit(pScrn, mode);
9156}
9157 </programlisting>
9158 </sect3>
9159
9160 <sect3>
9161 <title>AdjustFrame</title>
9162
9163 <para>
9164 Define the <function>AdjustFrame()</function> function if the driver
9165 supports this.
9166 </para>
9167
9168 <programlisting>
9169static void
9170ZZZAdjustFrame(ScrnInfoPtr pScrn, int x, int y)
9171{
9172 /* Adjust the viewport */
9173}
9174 </programlisting>
9175 </sect3>
9176
9177 <sect3>
9178 <title>EnterVT, LeaveVT</title>
9179
9180 <para>
9181 Define the <function>EnterVT()</function> and <function>LeaveVT()</function>
9182 functions.
9183 </para>
9184
9185 <para>
9186 These functions are mandatory.
9187 </para>
9188
9189 <programlisting>
9190static Bool
9191ZZZEnterVT(ScrnInfoPtr pScrn)
9192{
9193 return ZZZModeInit(pScrn, pScrn-&gt;currentMode);
9194}
9195
9196static void
9197ZZZLeaveVT(ScrnInfoPtr pScrn)
9198{
9199 ZZZRestore(pScrn);
9200}
9201 </programlisting>
9202 </sect3>
9203
9204 <sect3>
9205 <title>CloseScreen</title>
9206
9207 <para>
9208 Define the <function>CloseScreen()</function> function:
9209 </para>
9210
9211 <para>
9212 This function is mandatory. Note that it unwraps the previously
9213 wrapped <structfield>pScreen-&gt;CloseScreen</structfield>, and finishes by
9214 calling it.
9215 </para>
9216
9217 <programlisting>
9218static Bool
9219ZZZCloseScreen(ScreenPtr pScreen)
9220{
9221 ScrnInfoPtr pScrn = xf86ScreenToScrn(pScreen);
9222 if (pScrn-&gt;vtSema) {
9223 ZZZRestore(pScrn);
9224 ZZZUnmapMem(pScrn);
9225 }
9226 pScrn-&gt;vtSema = FALSE;
9227 pScreen-&gt;CloseScreen = ZZZPTR(pScrn)-&gt;CloseScreen;
9228 return (*pScreen-&gt;CloseScreen)(pScreen);
9229}
9230 </programlisting>
9231 </sect3>
9232
9233 <sect3>
9234 <title>SaveScreen</title>
9235
9236 <para>
9237 Define the <function>SaveScreen()</function> function (the screen
9238 blanking function). When using the vgahw module, this will typically
9239 be:
9240
9241 <programlisting>
9242static Bool
9243ZZZSaveScreen(ScreenPtr pScreen, int mode)
9244{
9245 return vgaHWSaveScreen(pScreen, mode);
9246}
9247 </programlisting>
9248 </para>
9249
9250 <para>
9251 This function is mandatory. Before modifying any hardware register
9252 directly this function needs to make sure that the Xserver is active
9253 by checking if <parameter>pScrn</parameter> is non-NULL and for
9254 <literal remap="tt">pScrn-&gt;vtSema == TRUE</literal>.
9255 </para>
9256 </sect3>
9257
9258 <sect3>
9259 <title>FreeScreen</title>
9260
9261 <para>
9262 Define the <function>FreeScreen()</function> function. This function
9263 is optional. It should be defined if the <structname>ScrnInfoRec</structname>
9264 <structfield>driverPrivate</structfield> field is used so that it can be freed
9265 when a screen is deleted by the common layer for reasons possibly
9266 beyond the driver's control. This function is not used in during
9267 normal (error free) operation. The per-generation data is freed by
9268 the <function>CloseScreen()</function> function.
9269 </para>
9270
9271 <programlisting>
9272static void
9273ZZZFreeScreen(ScrnInfoPtr pScrn)
9274{
9275 /*
9276 * If the vgahw module is used vgaHWFreeHWRec() would be called
9277 * here.
9278 */
9279 ZZZFreeRec(pScrn);
9280}
9281
9282 </programlisting>
9283
9284 </sect3>
9285
9286 </sect2>
9287
9288 </sect1>
9289
9290</article>