···3232 The Linux DRM layer contains code intended to support the needs3333 of complex graphics devices, usually containing programmable3434 pipelines well suited to 3D graphics acceleration. Graphics3535- drivers in the kernel can make use of DRM functions to make3535+ drivers in the kernel may make use of DRM functions to make3636 tasks like memory management, interrupt handling and DMA easier,3737 and provide a uniform interface to applications.3838 </para>···5757 existing drivers.5858 </para>5959 <para>6060- First, we'll go over some typical driver initialization6060+ First, we go over some typical driver initialization6161 requirements, like setting up command buffers, creating an6262 initial output configuration, and initializing core services.6363- Subsequent sections will cover core internals in more detail,6363+ Subsequent sections cover core internals in more detail,6464 providing implementation notes and examples.6565 </para>6666 <para>···7474 </para>7575 <para>7676 The core of every DRM driver is struct drm_driver. Drivers7777- will typically statically initialize a drm_driver structure,7777+ typically statically initialize a drm_driver structure,7878 then pass it to drm_init() at load time.7979 </para>8080···8888 </para>8989 <programlisting>9090 static struct drm_driver driver = {9191- /* don't use mtrr's here, the Xserver or user space app should9292- * deal with them for intel hardware.9191+ /* Don't use MTRRs here; the Xserver or userspace app should9292+ * deal with them for Intel hardware.9393 */9494 .driver_features =9595 DRIVER_USE_AGP | DRIVER_REQUIRE_AGP |···154154 </programlisting>155155 <para>156156 In the example above, taken from the i915 DRM driver, the driver157157- sets several flags indicating what core features it supports.158158- We'll go over the individual callbacks in later sections. Since157157+ sets several flags indicating what core features it supports;158158+ we go over the individual callbacks in later sections. Since159159 flags indicate which features your driver supports to the DRM160160 core, you need to set most of them prior to calling drm_init(). Some,161161 like DRIVER_MODESET can be set later based on user supplied parameters,···203203 <term>DRIVER_HAVE_IRQ</term><term>DRIVER_IRQ_SHARED</term>204204 <listitem>205205 <para>206206- DRIVER_HAVE_IRQ indicates whether the driver has a IRQ207207- handler, DRIVER_IRQ_SHARED indicates whether the device &206206+ DRIVER_HAVE_IRQ indicates whether the driver has an IRQ207207+ handler. DRIVER_IRQ_SHARED indicates whether the device &208208 handler support shared IRQs (note that this is required of209209 PCI drivers).210210 </para>···214214 <term>DRIVER_DMA_QUEUE</term>215215 <listitem>216216 <para>217217- If the driver queues DMA requests and completes them218218- asynchronously, this flag should be set. Deprecated.217217+ Should be set if the driver queues DMA requests and completes them218218+ asynchronously. Deprecated.219219 </para>220220 </listitem>221221 </varlistentry>···238238 </variablelist>239239 <para>240240 In this specific case, the driver requires AGP and supports241241- IRQs. DMA, as we'll see, is handled by device specific ioctls241241+ IRQs. DMA, as discussed later, is handled by device-specific ioctls242242 in this case. It also supports the kernel mode setting APIs, though243243 unlike in the actual i915 driver source, this example unconditionally244244 exports KMS capability.···269269 initial output configuration.270270 </para>271271 <para>272272- Note that the tasks performed at driver load time must not273273- conflict with DRM client requirements. For instance, if user272272+ If compatibility is a concern (e.g. with drivers converted over273273+ to the new interfaces from the old ones), care must be taken to274274+ prevent device initialization and control that is incompatible with275275+ currently active userspace drivers. For instance, if user274276 level mode setting drivers are in use, it would be problematic275277 to perform output discovery & configuration at load time.276276- Likewise, if pre-memory management aware user level drivers are278278+ Likewise, if user-level drivers unaware of memory management are277279 in use, memory management and command buffer setup may need to278278- be omitted. These requirements are driver specific, and care280280+ be omitted. These requirements are driver-specific, and care279281 needs to be taken to keep both old and new applications and280282 libraries working. The i915 driver supports the "modeset"281283 module parameter to control whether advanced features are282282- enabled at load time or in legacy fashion. If compatibility is283283- a concern (e.g. with drivers converted over to the new interfaces284284- from the old ones), care must be taken to prevent incompatible285285- device initialization and control with the currently active286286- userspace drivers.284284+ enabled at load time or in legacy fashion.287285 </para>288286289287 <sect2>290288 <title>Driver private & performance counters</title>291289 <para>292290 The driver private hangs off the main drm_device structure and293293- can be used for tracking various device specific bits of291291+ can be used for tracking various device-specific bits of294292 information, like register offsets, command buffer status,295293 register state for suspend/resume, etc. At load time, a296296- driver can simply allocate one and set drm_device.dev_priv297297- appropriately; at unload the driver can free it and set298298- drm_device.dev_priv to NULL.294294+ driver may simply allocate one and set drm_device.dev_priv295295+ appropriately; it should be freed and drm_device.dev_priv set296296+ to NULL when the driver is unloaded.299297 </para>300298 <para>301301- The DRM supports several counters which can be used for rough299299+ The DRM supports several counters which may be used for rough302300 performance characterization. Note that the DRM stat counter303301 system is not often used by applications, and supporting304302 additional counters is completely optional.···305307 These interfaces are deprecated and should not be used. If performance306308 monitoring is desired, the developer should investigate and307309 potentially enhance the kernel perf and tracing infrastructure to export308308- GPU related performance information to performance monitoring309309- tools and applications.310310+ GPU related performance information for consumption by performance311311+ monitoring tools and applications.310312 </para>311313 </sect2>312314313315 <sect2>314316 <title>Configuring the device</title>315317 <para>316316- Obviously, device configuration will be device specific.318318+ Obviously, device configuration is device-specific.317319 However, there are several common operations: finding a318320 device's PCI resources, mapping them, and potentially setting319321 up an IRQ handler.···321323 <para>322324 Finding & mapping resources is fairly straightforward. The323325 DRM wrapper functions, drm_get_resource_start() and324324- drm_get_resource_len() can be used to find BARs on the given326326+ drm_get_resource_len(), may be used to find BARs on the given325327 drm_device struct. Once those values have been retrieved, the326328 driver load function can call drm_addmap() to create a new327327- mapping for the BAR in question. Note you'll probably want a329329+ mapping for the BAR in question. Note that you probably want a328330 drm_local_map_t in your driver private structure to track any329331 mappings you create.330332<!-- !Fdrivers/gpu/drm/drm_bufs.c drm_get_resource_* -->···333335 <para>334336 if compatibility with other operating systems isn't a concern335337 (DRM drivers can run under various BSD variants and OpenSolaris),336336- native Linux calls can be used for the above, e.g. pci_resource_*338338+ native Linux calls may be used for the above, e.g. pci_resource_*337339 and iomap*/iounmap. See the Linux device driver book for more338340 info.339341 </para>340342 <para>341341- Once you have a register map, you can use the DRM_READn() and343343+ Once you have a register map, you may use the DRM_READn() and342344 DRM_WRITEn() macros to access the registers on your device, or343343- use driver specific versions to offset into your MMIO space344344- relative to a driver specific base pointer (see I915_READ for345345- example).345345+ use driver-specific versions to offset into your MMIO space346346+ relative to a driver-specific base pointer (see I915_READ for347347+ an example).346348 </para>347349 <para>348350 If your device supports interrupt generation, you may want to349349- setup an interrupt handler at driver load time as well. This351351+ set up an interrupt handler when the driver is loaded. This350352 is done using the drm_irq_install() function. If your device351353 supports vertical blank interrupts, it should call352354 drm_vblank_init() to initialize the core vblank handling code before···355357 </para>356358<!--!Fdrivers/char/drm/drm_irq.c drm_irq_install-->357359 <para>358358- Once your interrupt handler is registered (it'll use your360360+ Once your interrupt handler is registered (it uses your359361 drm_driver.irq_handler as the actual interrupt handling360362 function), you can safely enable interrupts on your device,361363 assuming any other state your interrupt handler uses is also···369371 using the pci_map_rom() call, a convenience function that370372 takes care of mapping the actual ROM, whether it has been371373 shadowed into memory (typically at address 0xc0000) or exists372372- on the PCI device in the ROM BAR. Note that once you've373373- mapped the ROM and extracted any necessary information, be374374- sure to unmap it; on many devices the ROM address decoder is375375- shared with other BARs, so leaving it mapped can cause374374+ on the PCI device in the ROM BAR. Note that after the ROM375375+ has been mapped and any necessary information has been extracted,376376+ it should be unmapped; on many devices, the ROM address decoder is377377+ shared with other BARs, so leaving it mapped could cause376378 undesired behavior like hangs or memory corruption.377379<!--!Fdrivers/pci/rom.c pci_map_rom-->378380 </para>···387389 should support a memory manager.388390 </para>389391 <para>390390- If your driver supports memory management (it should!), you'll392392+ If your driver supports memory management (it should!), you391393 need to set that up at load time as well. How you initialize392392- it depends on which memory manager you're using, TTM or GEM.394394+ it depends on which memory manager you're using: TTM or GEM.393395 </para>394396 <sect3>395397 <title>TTM initialization</title>···399401 and devices with dedicated video RAM (VRAM), i.e. most discrete400402 graphics devices. If your device has dedicated RAM, supporting401403 TTM is desirable. TTM also integrates tightly with your402402- driver specific buffer execution function. See the radeon404404+ driver-specific buffer execution function. See the radeon403405 driver for examples.404406 </para>405407 <para>···427429 created by the memory manager at runtime. Your global TTM should428430 have a type of TTM_GLOBAL_TTM_MEM. The size field for the global429431 object should be sizeof(struct ttm_mem_global), and the init and430430- release hooks should point at your driver specific init and431431- release routines, which will probably eventually call432432- ttm_mem_global_init and ttm_mem_global_release respectively.432432+ release hooks should point at your driver-specific init and433433+ release routines, which probably eventually call434434+ ttm_mem_global_init and ttm_mem_global_release, respectively.433435 </para>434436 <para>435437 Once your global TTM accounting structure is set up and initialized436436- (done by calling ttm_global_item_ref on the global object you437437- just created), you'll need to create a buffer object TTM to438438+ by calling ttm_global_item_ref() on it,439439+ you need to create a buffer object TTM to438440 provide a pool for buffer object allocation by clients and the439441 kernel itself. The type of this object should be TTM_GLOBAL_TTM_BO,440442 and its size should be sizeof(struct ttm_bo_global). Again,441441- driver specific init and release functions can be provided,442442- likely eventually calling ttm_bo_global_init and443443- ttm_bo_global_release, respectively. Also like the previous444444- object, ttm_global_item_ref is used to create an initial reference443443+ driver-specific init and release functions may be provided,444444+ likely eventually calling ttm_bo_global_init() and445445+ ttm_bo_global_release(), respectively. Also, like the previous446446+ object, ttm_global_item_ref() is used to create an initial reference445447 count for the TTM, which will call your initialization function.446448 </para>447449 </sect3>···451453 GEM is an alternative to TTM, designed specifically for UMA452454 devices. It has simpler initialization and execution requirements453455 than TTM, but has no VRAM management capability. Core GEM454454- initialization is comprised of a basic drm_mm_init call to create456456+ is initialized by calling drm_mm_init() to create455457 a GTT DRM MM object, which provides an address space pool for456456- object allocation. In a KMS configuration, the driver will457457- need to allocate and initialize a command ring buffer following458458- basic GEM initialization. Most UMA devices have a so-called458458+ object allocation. In a KMS configuration, the driver459459+ needs to allocate and initialize a command ring buffer following460460+ core GEM initialization. A UMA device usually has what is called a459461 "stolen" memory region, which provides space for the initial460462 framebuffer and large, contiguous memory regions required by the461461- device. This space is not typically managed by GEM, and must463463+ device. This space is not typically managed by GEM, and it must462464 be initialized separately into its own DRM MM object.463465 </para>464466 <para>465465- Initialization will be driver specific, and will depend on466466- the architecture of the device. In the case of Intel467467+ Initialization is driver-specific. In the case of Intel467468 integrated graphics chips like 965GM, GEM initialization can468469 be done by calling the internal GEM init function,469470 i915_gem_do_init(). Since the 965GM is a UMA device470470- (i.e. it doesn't have dedicated VRAM), GEM will manage471471+ (i.e. it doesn't have dedicated VRAM), GEM manages471472 making regular RAM available for GPU operations. Memory set472473 aside by the BIOS (called "stolen" memory by the i915473473- driver) will be managed by the DRM memrange allocator; the474474- rest of the aperture will be managed by GEM.474474+ driver) is managed by the DRM memrange allocator; the475475+ rest of the aperture is managed by GEM.475476 <programlisting>476477 /* Basic memrange allocator for stolen space (aka vram) */477478 drm_memrange_init(&dev_priv->vram, 0, prealloc_size);···480483<!--!Edrivers/char/drm/drm_memrange.c-->481484 </para>482485 <para>483483- Once the memory manager has been set up, we can allocate the486486+ Once the memory manager has been set up, we may allocate the484487 command buffer. In the i915 case, this is also done with a485488 GEM function, i915_gem_init_ringbuffer().486489 </para>···490493 <sect2>491494 <title>Output configuration</title>492495 <para>493493- The final initialization task is output configuration. This involves494494- finding and initializing the CRTCs, encoders and connectors495495- for your device, creating an initial configuration and496496- registering a framebuffer console driver.496496+ The final initialization task is output configuration. This involves:497497+ <itemizedlist>498498+ <listitem>499499+ Finding and initializing the CRTCs, encoders, and connectors500500+ for the device.501501+ </listitem>502502+ <listitem>503503+ Creating an initial configuration.504504+ </listitem>505505+ <listitem>506506+ Registering a framebuffer console driver.507507+ </listitem>508508+ </itemizedlist>497509 </para>498510 <sect3>499511 <title>Output discovery and initialization</title>500512 <para>501501- Several core functions exist to create CRTCs, encoders and502502- connectors, namely drm_crtc_init(), drm_connector_init() and513513+ Several core functions exist to create CRTCs, encoders, and514514+ connectors, namely: drm_crtc_init(), drm_connector_init(), and503515 drm_encoder_init(), along with several "helper" functions to504516 perform common tasks.505517 </para>···561555 </programlisting>562556 <para>563557 In the example above (again, taken from the i915 driver), a564564- CRT connector and encoder combination is created. A device565565- specific i2c bus is also created, for fetching EDID data and558558+ CRT connector and encoder combination is created. A device-specific559559+ i2c bus is also created for fetching EDID data and566560 performing monitor detection. Once the process is complete,567567- the new connector is registered with sysfs, to make its561561+ the new connector is registered with sysfs to make its568562 properties available to applications.569563 </para>570564 <sect4>···573567 Since many PC-class graphics devices have similar display output574568 designs, the DRM provides a set of helper functions to make575569 output management easier. The core helper routines handle576576- encoder re-routing and disabling of unused functions following577577- mode set. Using the helpers is optional, but recommended for570570+ encoder re-routing and the disabling of unused functions following571571+ mode setting. Using the helpers is optional, but recommended for578572 devices with PC-style architectures (i.e. a set of display planes579573 for feeding pixels to encoders which are in turn routed to580574 connectors). Devices with more complex requirements needing581581- finer grained management can opt to use the core callbacks575575+ finer grained management may opt to use the core callbacks582576 directly.583577 </para>584578 <para>···586580 </para>587581 </sect4>588582 <para>589589- For each encoder, CRTC and connector, several functions must590590- be provided, depending on the object type. Encoder objects591591- need to provide a DPMS (basically on/off) function, mode fixup592592- (for converting requested modes into native hardware timings),593593- and prepare, set and commit functions for use by the core DRM594594- helper functions. Connector helpers need to provide mode fetch and595595- validity functions as well as an encoder matching function for596596- returning an ideal encoder for a given connector. The core597597- connector functions include a DPMS callback, (deprecated)598598- save/restore routines, detection, mode probing, property handling,599599- and cleanup functions.583583+ Each encoder object needs to provide:584584+ <itemizedlist>585585+ <listitem>586586+ A DPMS (basically on/off) function.587587+ </listitem>588588+ <listitem>589589+ A mode-fixup function (for converting requested modes into590590+ native hardware timings).591591+ </listitem>592592+ <listitem>593593+ Functions (prepare, set, and commit) for use by the core DRM594594+ helper functions.595595+ </listitem>596596+ </itemizedlist>597597+ Connector helpers need to provide functions (mode-fetch, validity,598598+ and encoder-matching) for returning an ideal encoder for a given599599+ connector. The core connector functions include a DPMS callback,600600+ save/restore routines (deprecated), detection, mode probing,601601+ property handling, and cleanup functions.600602 </para>601603<!--!Edrivers/char/drm/drm_crtc.h-->602604<!--!Edrivers/char/drm/drm_crtc.c-->···619605 <title>VBlank event handling</title>620606 <para>621607 The DRM core exposes two vertical blank related ioctls:622622- DRM_IOCTL_WAIT_VBLANK and DRM_IOCTL_MODESET_CTL.608608+ <variablelist>609609+ <varlistentry>610610+ <term>DRM_IOCTL_WAIT_VBLANK</term>611611+ <listitem>612612+ <para>613613+ This takes a struct drm_wait_vblank structure as its argument,614614+ and it is used to block or request a signal when a specified615615+ vblank event occurs.616616+ </para>617617+ </listitem>618618+ </varlistentry>619619+ <varlistentry>620620+ <term>DRM_IOCTL_MODESET_CTL</term>621621+ <listitem>622622+ <para>623623+ This should be called by application level drivers before and624624+ after mode setting, since on many devices the vertical blank625625+ counter is reset at that time. Internally, the DRM snapshots626626+ the last vblank count when the ioctl is called with the627627+ _DRM_PRE_MODESET command, so that the counter won't go backwards628628+ (which is dealt with when _DRM_POST_MODESET is used).629629+ </para>630630+ </listitem>631631+ </varlistentry>632632+ </variablelist>623633<!--!Edrivers/char/drm/drm_irq.c-->624624- </para>625625- <para>626626- DRM_IOCTL_WAIT_VBLANK takes a struct drm_wait_vblank structure627627- as its argument, and is used to block or request a signal when a628628- specified vblank event occurs.629629- </para>630630- <para>631631- DRM_IOCTL_MODESET_CTL should be called by application level632632- drivers before and after mode setting, since on many devices the633633- vertical blank counter will be reset at that time. Internally,634634- the DRM snapshots the last vblank count when the ioctl is called635635- with the _DRM_PRE_MODESET command so that the counter won't go636636- backwards (which is dealt with when _DRM_POST_MODESET is used).637634 </para>638635 <para>639636 To support the functions above, the DRM core provides several···657632 register. The enable and disable vblank callbacks should enable658633 and disable vertical blank interrupts, respectively. In the659634 absence of DRM clients waiting on vblank events, the core DRM660660- code will use the disable_vblank() function to disable661661- interrupts, which saves power. They'll be re-enabled again when635635+ code uses the disable_vblank() function to disable636636+ interrupts, which saves power. They are re-enabled again when662637 a client calls the vblank wait ioctl above.663638 </para>664639 <para>665665- Devices that don't provide a count register can simply use an640640+ A device that doesn't provide a count register may simply use an666641 internal atomic counter incremented on every vertical blank667667- interrupt, and can make their enable and disable vblank668668- functions into no-ops.642642+ interrupt (and then treat the enable_vblank() and disable_vblank()643643+ callbacks as no-ops).669644 </para>670645 </sect1>671646672647 <sect1>673648 <title>Memory management</title>674649 <para>675675- The memory manager lies at the heart of many DRM operations, and676676- is also required to support advanced client features like OpenGL677677- pbuffers. The DRM currently contains two memory managers, TTM650650+ The memory manager lies at the heart of many DRM operations; it651651+ is required to support advanced client features like OpenGL652652+ pbuffers. The DRM currently contains two memory managers: TTM678653 and GEM.679654 </para>680655···704679 <para>705680 GEM-enabled drivers must provide gem_init_object() and706681 gem_free_object() callbacks to support the core memory707707- allocation routines. They should also provide several driver708708- specific ioctls to support command execution, pinning, buffer682682+ allocation routines. They should also provide several driver-specific683683+ ioctls to support command execution, pinning, buffer709684 read & write, mapping, and domain ownership transfers.710685 </para>711686 <para>712712- On a fundamental level, GEM involves several operations: memory713713- allocation and freeing, command execution, and aperture management714714- at command execution time. Buffer object allocation is relatively687687+ On a fundamental level, GEM involves several operations:688688+ <itemizedlist>689689+ <listitem>Memory allocation and freeing</listitem>690690+ <listitem>Command execution</listitem>691691+ <listitem>Aperture management at command execution time</listitem>692692+ </itemizedlist>693693+ Buffer object allocation is relatively715694 straightforward and largely provided by Linux's shmem layer, which716695 provides memory to back each object. When mapped into the GTT717696 or used in a command buffer, the backing pages for an object are718697 flushed to memory and marked write combined so as to be coherent719719- with the GPU. Likewise, when the GPU finishes rendering to an object,720720- if the CPU accesses it, it must be made coherent with the CPU's view698698+ with the GPU. Likewise, if the CPU accesses an object after the GPU699699+ has finished rendering to the object, then the object must be made700700+ coherent with the CPU's view721701 of memory, usually involving GPU cache flushing of various kinds.722722- This core CPU<->GPU coherency management is provided by the GEM723723- set domain function, which evaluates an object's current domain and702702+ This core CPU<->GPU coherency management is provided by a703703+ device-specific ioctl, which evaluates an object's current domain and724704 performs any necessary flushing or synchronization to put the object725705 into the desired coherency domain (note that the object may be busy,726726- i.e. an active render target; in that case the set domain function727727- will block the client and wait for rendering to complete before706706+ i.e. an active render target; in that case, setting the domain707707+ blocks the client and waits for rendering to complete before728708 performing any necessary flushing operations).729709 </para>730710 <para>731711 Perhaps the most important GEM function is providing a command732712 execution interface to clients. Client programs construct command733733- buffers containing references to previously allocated memory objects734734- and submit them to GEM. At that point, GEM will take care to bind713713+ buffers containing references to previously allocated memory objects,714714+ and then submit them to GEM. At that point, GEM takes care to bind735715 all the objects into the GTT, execute the buffer, and provide736716 necessary synchronization between clients accessing the same buffers.737717 This often involves evicting some objects from the GTT and re-binding738718 others (a fairly expensive operation), and providing relocation739719 support which hides fixed GTT offsets from clients. Clients must740720 take care not to submit command buffers that reference more objects741741- than can fit in the GTT or GEM will reject them and no rendering721721+ than can fit in the GTT; otherwise, GEM will reject them and no rendering742722 will occur. Similarly, if several objects in the buffer require743723 fence registers to be allocated for correct rendering (e.g. 2D blits744724 on pre-965 chips), care must be taken not to require more fence···759729 <title>Output management</title>760730 <para>761731 At the core of the DRM output management code is a set of762762- structures representing CRTCs, encoders and connectors.732732+ structures representing CRTCs, encoders, and connectors.763733 </para>764734 <para>765735 A CRTC is an abstraction representing a part of the chip that···795765 <sect1>796766 <title>Framebuffer management</title>797767 <para>798798- In order to set a mode on a given CRTC, encoder and connector799799- configuration, clients need to provide a framebuffer object which800800- will provide a source of pixels for the CRTC to deliver to the encoder(s)801801- and ultimately the connector(s) in the configuration. A framebuffer802802- is fundamentally a driver specific memory object, made into an opaque803803- handle by the DRM addfb function. Once an fb has been created this804804- way it can be passed to the KMS mode setting routines for use in805805- a configuration.768768+ Clients need to provide a framebuffer object which provides a source769769+ of pixels for a CRTC to deliver to the encoder(s) and ultimately the770770+ connector(s). A framebuffer is fundamentally a driver-specific memory771771+ object, made into an opaque handle by the DRM's addfb() function.772772+ Once a framebuffer has been created this way, it may be passed to the773773+ KMS mode setting routines for use in a completed configuration.806774 </para>807775 </sect1>808776809777 <sect1>810778 <title>Command submission & fencing</title>811779 <para>812812- This should cover a few device specific command submission780780+ This should cover a few device-specific command submission813781 implementations.814782 </para>815783 </sect1>···817789 <para>818790 The DRM core provides some suspend/resume code, but drivers819791 wanting full suspend/resume support should provide save() and820820- restore() functions. These will be called at suspend,792792+ restore() functions. These are called at suspend,821793 hibernate, or resume time, and should perform any state save or822794 restore required by your device across suspend or hibernate823795 states.···840812 <para>841813 The DRM core exports several interfaces to applications,842814 generally intended to be used through corresponding libdrm843843- wrapper functions. In addition, drivers export device specific844844- interfaces for use by userspace drivers & device aware815815+ wrapper functions. In addition, drivers export device-specific816816+ interfaces for use by userspace drivers & device-aware845817 applications through ioctls and sysfs files.846818 </para>847819 <para>···850822 management, memory management, and output management.851823 </para>852824 <para>853853- Cover generic ioctls and sysfs layout here. Only need high854854- level info, since man pages will cover the rest.825825+ Cover generic ioctls and sysfs layout here. We only need high-level826826+ info, since man pages should cover the rest.855827 </para>856828 </chapter>857829
+2-2
drivers/gpu/drm/i915/i915_drv.c
···789789};790790791791static struct drm_driver driver = {792792- /* don't use mtrr's here, the Xserver or user space app should793793- * deal with them for intel hardware.792792+ /* Don't use MTRRs here; the Xserver or userspace app should793793+ * deal with them for Intel hardware.794794 */795795 .driver_features =796796 DRIVER_USE_AGP | DRIVER_REQUIRE_AGP | /* DRIVER_USE_MTRR |*/