Merge tag 'drm-misc-next-2023-01-19' of git://anongit.freedesktop.org/drm/drm-misc...
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 24 Jan 2023 16:36:29 +0000 (17:36 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 24 Jan 2023 16:36:29 +0000 (17:36 +0100)
drm-misc-next for $kernel-version:

UAPI Changes:

Cross-subsystem Changes:

Core Changes:

 * Cleanup unneeded include statements wrt <linux/fb.h>, <drm/drm_fb_helper.h>
   and <drm/drm_crtc_helper.h>

 * Remove unused helper DRM_DEBUG_KMS_RATELIMITED()

 * fbdev: Remove obsolete aperture field from struct fb_device, plus
   driver cleanups; Remove unused flag FBINFO_MISC_FIRMWARE

 * MIPI-DSI: Fix brightness, plus rsp. driver updates

 * scheduler: Deprecate drm_sched_resubmit_jobs()

 * ttm: Fix MIPS build; Remove ttm_bo_wait(); Documentation fixes

Driver Changes:

 * Remove obsolete drivers for userspace modesetting i810, mga, r128,
   savage, sis, tdfx, via

 * bridge: Support CDNS DSI J721E, plus DT bindings; lt9611: Various
   fixes and improvements; sil902x: Various fixes; Fixes

 * nouveau: Removed support for legacy ioctls; Replace zero-size array;
   Cleanups

 * panel: Fixes

 * radeon: Use new DRM logging helpers

Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
From: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://patchwork.freedesktop.org/patch/msgid/Y8kDk5YX7Yz3eRhM@linux-uq9g
211 files changed:
Documentation/devicetree/bindings/display/bridge/cdns,dsi.txt [deleted file]
Documentation/devicetree/bindings/display/bridge/cdns,dsi.yaml [new file with mode: 0644]
Documentation/devicetree/bindings/display/bridge/renesas,dsi.yaml
MAINTAINERS
drivers/gpu/drm/Kconfig
drivers/gpu/drm/Makefile
drivers/gpu/drm/amd/amdgpu/amdgpu_acpi.c
drivers/gpu/drm/amd/amdgpu/amdgpu_connectors.c
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c
drivers/gpu/drm/amd/amdgpu/amdgpu_encoders.c
drivers/gpu/drm/amd/amdgpu/amdgpu_irq.c
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
drivers/gpu/drm/amd/amdgpu/atombios_crtc.c
drivers/gpu/drm/amd/amdgpu/atombios_encoders.c
drivers/gpu/drm/amd/amdgpu/dce_v10_0.c
drivers/gpu/drm/amd/amdgpu/dce_v11_0.c
drivers/gpu/drm/amd/amdgpu/dce_v6_0.c
drivers/gpu/drm/amd/amdgpu/dce_v8_0.c
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega10_processpptables.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega12_processpptables.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_hwmgr.c
drivers/gpu/drm/amd/pm/powerplay/hwmgr/vega20_processpptables.c
drivers/gpu/drm/amd/pm/powerplay/smumgr/ci_smumgr.c
drivers/gpu/drm/arm/display/komeda/komeda_crtc.c
drivers/gpu/drm/arm/display/komeda/komeda_drv.c
drivers/gpu/drm/arm/display/komeda/komeda_kms.h
drivers/gpu/drm/aspeed/aspeed_gfx_crtc.c
drivers/gpu/drm/aspeed/aspeed_gfx_drv.c
drivers/gpu/drm/aspeed/aspeed_gfx_out.c
drivers/gpu/drm/ast/ast_drv.c
drivers/gpu/drm/ast/ast_main.c
drivers/gpu/drm/ast/ast_mode.c
drivers/gpu/drm/bridge/Kconfig
drivers/gpu/drm/bridge/Makefile
drivers/gpu/drm/bridge/analogix/analogix-anx6345.c
drivers/gpu/drm/bridge/analogix/anx7625.c
drivers/gpu/drm/bridge/cadence/Kconfig
drivers/gpu/drm/bridge/cadence/Makefile
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c [moved from drivers/gpu/drm/bridge/cdns-dsi.c with 97% similarity]
drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h [new file with mode: 0644]
drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.c [new file with mode: 0644]
drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.h [new file with mode: 0644]
drivers/gpu/drm/bridge/cadence/cdns-mhdp8546-core.c
drivers/gpu/drm/bridge/fsl-ldb.c
drivers/gpu/drm/bridge/ite-it6505.c
drivers/gpu/drm/bridge/ite-it66121.c
drivers/gpu/drm/bridge/lontium-lt9611.c
drivers/gpu/drm/bridge/sii902x.c
drivers/gpu/drm/bridge/tc358767.c
drivers/gpu/drm/bridge/tc358768.c
drivers/gpu/drm/bridge/tc358775.c
drivers/gpu/drm/drm_bufs.c
drivers/gpu/drm/drm_context.c
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/drm_lease.c
drivers/gpu/drm/drm_mipi_dsi.c
drivers/gpu/drm/drm_modes.c
drivers/gpu/drm/drm_plane_helper.c
drivers/gpu/drm/gma500/backlight.c
drivers/gpu/drm/gma500/cdv_device.c
drivers/gpu/drm/gma500/cdv_intel_crt.c
drivers/gpu/drm/gma500/cdv_intel_display.c
drivers/gpu/drm/gma500/cdv_intel_dp.c
drivers/gpu/drm/gma500/cdv_intel_hdmi.c
drivers/gpu/drm/gma500/cdv_intel_lvds.c
drivers/gpu/drm/gma500/framebuffer.c
drivers/gpu/drm/gma500/gma_display.c
drivers/gpu/drm/gma500/oaktrail_crtc.c
drivers/gpu/drm/gma500/oaktrail_hdmi.c
drivers/gpu/drm/gma500/oaktrail_lvds.c
drivers/gpu/drm/gma500/psb_device.c
drivers/gpu/drm/gma500/psb_intel_display.c
drivers/gpu/drm/gma500/psb_intel_drv.h
drivers/gpu/drm/gma500/psb_intel_lvds.c
drivers/gpu/drm/gma500/psb_intel_sdvo.c
drivers/gpu/drm/i2c/ch7006_drv.c
drivers/gpu/drm/i2c/ch7006_priv.h
drivers/gpu/drm/i810/Makefile [deleted file]
drivers/gpu/drm/i810/i810_dma.c [deleted file]
drivers/gpu/drm/i810/i810_drv.c [deleted file]
drivers/gpu/drm/i810/i810_drv.h [deleted file]
drivers/gpu/drm/i915/display/intel_fbdev.c
drivers/gpu/drm/ingenic/ingenic-drm-drv.c
drivers/gpu/drm/kmb/kmb_crtc.c
drivers/gpu/drm/kmb/kmb_plane.c
drivers/gpu/drm/logicvc/logicvc_interface.c
drivers/gpu/drm/logicvc/logicvc_mode.c
drivers/gpu/drm/mga/Makefile [deleted file]
drivers/gpu/drm/mga/mga_dma.c [deleted file]
drivers/gpu/drm/mga/mga_drv.c [deleted file]
drivers/gpu/drm/mga/mga_drv.h [deleted file]
drivers/gpu/drm/mga/mga_ioc32.c [deleted file]
drivers/gpu/drm/mga/mga_irq.c [deleted file]
drivers/gpu/drm/mga/mga_state.c [deleted file]
drivers/gpu/drm/mga/mga_warp.c [deleted file]
drivers/gpu/drm/nouveau/Kconfig
drivers/gpu/drm/nouveau/dispnv04/crtc.c
drivers/gpu/drm/nouveau/dispnv04/dac.c
drivers/gpu/drm/nouveau/dispnv04/dfp.c
drivers/gpu/drm/nouveau/dispnv04/tvmodesnv17.c
drivers/gpu/drm/nouveau/dispnv04/tvnv04.c
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c
drivers/gpu/drm/nouveau/dispnv50/head.c
drivers/gpu/drm/nouveau/include/nvfw/hs.h
drivers/gpu/drm/nouveau/nouveau_bo.c
drivers/gpu/drm/nouveau/nouveau_drm.c
drivers/gpu/drm/nouveau/nouveau_gem.c
drivers/gpu/drm/nouveau/nouveau_vga.c
drivers/gpu/drm/omapdrm/omap_gem.c
drivers/gpu/drm/omapdrm/omap_irq.c
drivers/gpu/drm/panel/Kconfig
drivers/gpu/drm/panel/panel-ilitek-ili9881c.c
drivers/gpu/drm/panel/panel-raspberrypi-touchscreen.c
drivers/gpu/drm/panel/panel-ronbo-rb070d30.c
drivers/gpu/drm/panel/panel-samsung-sofef00.c
drivers/gpu/drm/panel/panel-visionox-vtdr6130.c
drivers/gpu/drm/r128/Makefile [deleted file]
drivers/gpu/drm/r128/ati_pcigart.c [deleted file]
drivers/gpu/drm/r128/ati_pcigart.h [deleted file]
drivers/gpu/drm/r128/r128_cce.c [deleted file]
drivers/gpu/drm/r128/r128_drv.c [deleted file]
drivers/gpu/drm/r128/r128_drv.h [deleted file]
drivers/gpu/drm/r128/r128_ioc32.c [deleted file]
drivers/gpu/drm/r128/r128_irq.c [deleted file]
drivers/gpu/drm/r128/r128_state.c [deleted file]
drivers/gpu/drm/radeon/atombios_crtc.c
drivers/gpu/drm/radeon/atombios_encoders.c
drivers/gpu/drm/radeon/r300.c
drivers/gpu/drm/radeon/radeon_acpi.c
drivers/gpu/drm/radeon/radeon_asic.c
drivers/gpu/drm/radeon/radeon_connectors.c
drivers/gpu/drm/radeon/radeon_display.c
drivers/gpu/drm/radeon/radeon_dp_auxch.c
drivers/gpu/drm/radeon/radeon_drv.c
drivers/gpu/drm/radeon/radeon_encoders.c
drivers/gpu/drm/radeon/radeon_fb.c
drivers/gpu/drm/radeon/radeon_irq_kms.c
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
drivers/gpu/drm/radeon/radeon_legacy_encoders.c
drivers/gpu/drm/radeon/radeon_legacy_tv.c
drivers/gpu/drm/radeon/radeon_mode.h
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
drivers/gpu/drm/savage/Makefile [deleted file]
drivers/gpu/drm/savage/savage_bci.c [deleted file]
drivers/gpu/drm/savage/savage_drv.c [deleted file]
drivers/gpu/drm/savage/savage_drv.h [deleted file]
drivers/gpu/drm/savage/savage_state.c [deleted file]
drivers/gpu/drm/scheduler/sched_main.c
drivers/gpu/drm/shmobile/shmob_drm_crtc.c
drivers/gpu/drm/shmobile/shmob_drm_drv.c
drivers/gpu/drm/shmobile/shmob_drm_plane.c
drivers/gpu/drm/sis/Makefile [deleted file]
drivers/gpu/drm/sis/sis_drv.c [deleted file]
drivers/gpu/drm/sis/sis_drv.h [deleted file]
drivers/gpu/drm/sis/sis_mm.c [deleted file]
drivers/gpu/drm/sprd/sprd_dpu.c
drivers/gpu/drm/sprd/sprd_drm.c
drivers/gpu/drm/sprd/sprd_dsi.c
drivers/gpu/drm/sun4i/sun8i_dw_hdmi.c
drivers/gpu/drm/tdfx/Makefile [deleted file]
drivers/gpu/drm/tdfx/tdfx_drv.c [deleted file]
drivers/gpu/drm/tdfx/tdfx_drv.h [deleted file]
drivers/gpu/drm/tidss/tidss_crtc.c
drivers/gpu/drm/tidss/tidss_drv.c
drivers/gpu/drm/tidss/tidss_encoder.c
drivers/gpu/drm/tidss/tidss_kms.c
drivers/gpu/drm/tidss/tidss_plane.c
drivers/gpu/drm/ttm/ttm_bo.c
drivers/gpu/drm/ttm/ttm_bo_util.c
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/udl/udl_modeset.c
drivers/gpu/drm/vboxvideo/vbox_drv.c
drivers/gpu/drm/vboxvideo/vbox_main.c
drivers/gpu/drm/via/Makefile [deleted file]
drivers/gpu/drm/via/via_3d_reg.h [deleted file]
drivers/gpu/drm/via/via_dri1.c [deleted file]
drivers/gpu/drm/vmwgfx/ttm_object.h
drivers/video/fbdev/clps711x-fb.c
drivers/video/fbdev/core/fbcon.c
drivers/video/fbdev/core/fbmem.c
drivers/video/fbdev/core/fbsysfs.c
drivers/video/fbdev/efifb.c
drivers/video/fbdev/hyperv_fb.c
drivers/video/fbdev/offb.c
drivers/video/fbdev/simplefb.c
drivers/video/fbdev/vesafb.c
drivers/video/fbdev/vga16fb.c
include/drm/drm_crtc_helper.h
include/drm/drm_drv.h
include/drm/drm_fb_helper.h
include/drm/drm_fixed.h
include/drm/drm_mipi_dsi.h
include/drm/drm_modeset_helper_vtables.h
include/drm/drm_pciids.h
include/drm/drm_print.h
include/drm/gpu_scheduler.h
include/drm/ttm/ttm_bo.h
include/linux/fb.h
include/uapi/drm/i810_drm.h [deleted file]
include/uapi/drm/mga_drm.h [deleted file]
include/uapi/drm/r128_drm.h [deleted file]
include/uapi/drm/savage_drm.h [deleted file]
include/uapi/drm/sis_drm.h [deleted file]
include/uapi/drm/via_drm.h [deleted file]
samples/vfio-mdev/mdpy-fb.c

diff --git a/Documentation/devicetree/bindings/display/bridge/cdns,dsi.txt b/Documentation/devicetree/bindings/display/bridge/cdns,dsi.txt
deleted file mode 100644 (file)
index 525a4bf..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-Cadence DSI bridge
-==================
-
-The Cadence DSI bridge is a DPI to DSI bridge supporting up to 4 DSI lanes.
-
-Required properties:
-- compatible: should be set to "cdns,dsi".
-- reg: physical base address and length of the controller's registers.
-- interrupts: interrupt line connected to the DSI bridge.
-- clocks: DSI bridge clocks.
-- clock-names: must contain "dsi_p_clk" and "dsi_sys_clk".
-- phys: phandle link to the MIPI D-PHY controller.
-- phy-names: must contain "dphy".
-- #address-cells: must be set to 1.
-- #size-cells: must be set to 0.
-
-Optional properties:
-- resets: DSI reset lines.
-- reset-names: can contain "dsi_p_rst".
-
-Required subnodes:
-- ports: Ports as described in Documentation/devicetree/bindings/graph.txt.
-  2 ports are available:
-  * port 0: this port is only needed if some of your DSI devices are
-           controlled through  an external bus like I2C or SPI. Can have at
-           most 4 endpoints. The endpoint number is directly encoding the
-           DSI virtual channel used by this device.
-  * port 1: represents the DPI input.
-  Other ports will be added later to support the new kind of inputs.
-
-- one subnode per DSI device connected on the DSI bus. Each DSI device should
-  contain a reg property encoding its virtual channel.
-
-Example:
-       dsi0: dsi@fd0c0000 {
-               compatible = "cdns,dsi";
-               reg = <0x0 0xfd0c0000 0x0 0x1000>;
-               clocks = <&pclk>, <&sysclk>;
-               clock-names = "dsi_p_clk", "dsi_sys_clk";
-               interrupts = <1>;
-               phys = <&dphy0>;
-               phy-names = "dphy";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               ports {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       port@1 {
-                               reg = <1>;
-                               dsi0_dpi_input: endpoint {
-                                       remote-endpoint = <&xxx_dpi_output>;
-                               };
-                       };
-               };
-
-               panel: dsi-dev@0 {
-                       compatible = "<vendor,panel>";
-                       reg = <0>;
-               };
-       };
-
-or
-
-       dsi0: dsi@fd0c0000 {
-               compatible = "cdns,dsi";
-               reg = <0x0 0xfd0c0000 0x0 0x1000>;
-               clocks = <&pclk>, <&sysclk>;
-               clock-names = "dsi_p_clk", "dsi_sys_clk";
-               interrupts = <1>;
-               phys = <&dphy1>;
-               phy-names = "dphy";
-               #address-cells = <1>;
-               #size-cells = <0>;
-
-               ports {
-                       #address-cells = <1>;
-                       #size-cells = <0>;
-
-                       port@0 {
-                               reg = <0>;
-                               #address-cells = <1>;
-                               #size-cells = <0>;
-
-                               dsi0_output: endpoint@0 {
-                                       reg = <0>;
-                                       remote-endpoint = <&dsi_panel_input>;
-                               };
-                       };
-
-                       port@1 {
-                               reg = <1>;
-                               dsi0_dpi_input: endpoint {
-                                       remote-endpoint = <&xxx_dpi_output>;
-                               };
-                       };
-               };
-       };
-
-       i2c@xxx {
-               panel: panel@59 {
-                       compatible = "<vendor,panel>";
-                       reg = <0x59>;
-
-                       port {
-                               dsi_panel_input: endpoint {
-                                       remote-endpoint = <&dsi0_output>;
-                               };
-                       };
-               };
-       };
diff --git a/Documentation/devicetree/bindings/display/bridge/cdns,dsi.yaml b/Documentation/devicetree/bindings/display/bridge/cdns,dsi.yaml
new file mode 100644 (file)
index 0000000..2306032
--- /dev/null
@@ -0,0 +1,180 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/display/bridge/cdns,dsi.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Cadence DSI bridge
+
+maintainers:
+  - Boris Brezillon <boris.brezillon@bootlin.com>
+
+description: |
+   CDNS DSI is a bridge device which converts DPI to DSI
+
+properties:
+  compatible:
+    enum:
+      - cdns,dsi
+      - ti,j721e-dsi
+
+  reg:
+    minItems: 1
+    items:
+      - description:
+          Register block for controller's registers.
+      - description:
+          Register block for wrapper settings registers in case of TI J7 SoCs.
+
+  clocks:
+    items:
+      - description: PSM clock, used by the IP
+      - description: sys clock, used by the IP
+
+  clock-names:
+    items:
+      - const: dsi_p_clk
+      - const: dsi_sys_clk
+
+  phys:
+    maxItems: 1
+
+  phy-names:
+    const: dphy
+
+  interrupts:
+    maxItems: 1
+
+  resets:
+    maxItems: 1
+
+  reset-names:
+    const: dsi_p_rst
+
+  ports:
+    $ref: /schemas/graph.yaml#/properties/ports
+
+    properties:
+      port@0:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          Output port representing the DSI output. It can have
+          at most 4 endpoints. The endpoint number is directly encoding
+          the DSI virtual channel used by this device.
+
+      port@1:
+        $ref: /schemas/graph.yaml#/properties/port
+        description:
+          Input port representing the DPI input.
+
+    required:
+      - port@1
+
+allOf:
+  - $ref: ../dsi-controller.yaml#
+
+  - if:
+      properties:
+        compatible:
+          contains:
+            const: ti,j721e-dsi
+    then:
+      properties:
+        reg:
+          minItems: 2
+          maxItems: 2
+        power-domains:
+          maxItems: 1
+    else:
+      properties:
+        reg:
+          maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - clock-names
+  - phys
+  - phy-names
+  - ports
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    bus {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        dsi@fd0c0000 {
+            compatible = "cdns,dsi";
+            reg = <0x0 0xfd0c0000 0x0 0x1000>;
+            clocks = <&pclk>, <&sysclk>;
+            clock-names = "dsi_p_clk", "dsi_sys_clk";
+            interrupts = <1>;
+            phys = <&dphy0>;
+            phy-names = "dphy";
+
+            #address-cells = <1>;
+            #size-cells = <0>;
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@1 {
+                    reg = <1>;
+                    endpoint {
+                        remote-endpoint = <&xxx_dpi_output>;
+                    };
+                };
+            };
+
+            panel@0 {
+                compatible = "panasonic,vvx10f034n00";
+                reg = <0>;
+                power-supply = <&vcc_lcd_reg>;
+            };
+        };
+    };
+
+  - |
+    bus {
+        #address-cells = <2>;
+        #size-cells = <2>;
+
+        dsi@fd0c0000 {
+            compatible = "cdns,dsi";
+            reg = <0x0 0xfd0c0000 0x0 0x1000>;
+            clocks = <&pclk>, <&sysclk>;
+            clock-names = "dsi_p_clk", "dsi_sys_clk";
+            interrupts = <1>;
+            phys = <&dphy1>;
+            phy-names = "dphy";
+
+            ports {
+                #address-cells = <1>;
+                #size-cells = <0>;
+
+                port@0 {
+                    reg = <0>;
+                    #address-cells = <1>;
+                    #size-cells = <0>;
+
+                    endpoint@0 {
+                        reg = <0>;
+                        remote-endpoint = <&dsi_panel_input>;
+                    };
+                };
+
+                port@1 {
+                    reg = <1>;
+                    endpoint {
+                        remote-endpoint = <&xxx_dpi_output>;
+                    };
+                };
+            };
+        };
+    };
index 131d5b63ec4f7b3740e3fb805536e21ed4500c25..e08c24633926b2023825bf49eea7355a7e850e30 100644 (file)
@@ -22,6 +22,7 @@ properties:
     items:
       - enum:
           - renesas,r9a07g044-mipi-dsi # RZ/G2{L,LC}
+          - renesas,r9a07g054-mipi-dsi # RZ/V2L
       - const: renesas,rzg2l-mipi-dsi
 
   reg:
index 7fc9e31ab03fa70cab4fe0b8cad57861c770ac84..1bd2a1d3f14f19ae0c2656c028e885bb15f7a1e3 100644 (file)
@@ -6579,11 +6579,6 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/ilitek,ili9486.yaml
 F:     drivers/gpu/drm/tiny/ili9486.c
 
-DRM DRIVER FOR INTEL I810 VIDEO CARDS
-S:     Orphan / Obsolete
-F:     drivers/gpu/drm/i810/
-F:     include/uapi/drm/i810_drm.h
-
 DRM DRIVER FOR JADARD JD9365DA-H3 MIPI-DSI LCD PANELS
 M:     Jagan Teki <jagan@edgeble.ai>
 S:     Maintained
@@ -6612,11 +6607,6 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/display/panel/mantix,mlaf057we51-x.yaml
 F:     drivers/gpu/drm/panel/panel-mantix-mlaf057we51.c
 
-DRM DRIVER FOR MATROX G200/G400 GRAPHICS CARDS
-S:     Orphan / Obsolete
-F:     drivers/gpu/drm/mga/
-F:     include/uapi/drm/mga_drm.h
-
 DRM DRIVER FOR MGA G200 GRAPHICS CHIPS
 M:     Dave Airlie <airlied@redhat.com>
 R:     Thomas Zimmermann <tzimmermann@suse.de>
@@ -6735,11 +6725,6 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     drivers/gpu/drm/qxl/
 F:     include/uapi/drm/qxl_drm.h
 
-DRM DRIVER FOR RAGE 128 VIDEO CARDS
-S:     Orphan / Obsolete
-F:     drivers/gpu/drm/r128/
-F:     include/uapi/drm/r128_drm.h
-
 DRM DRIVER FOR RAYDIUM RM67191 PANELS
 M:     Robert Chiras <robert.chiras@nxp.com>
 S:     Maintained
@@ -6767,11 +6752,6 @@ S:       Maintained
 F:     Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
 F:     drivers/gpu/drm/panel/panel-sitronix-st7703.c
 
-DRM DRIVER FOR SAVAGE VIDEO CARDS
-S:     Orphan / Obsolete
-F:     drivers/gpu/drm/savage/
-F:     include/uapi/drm/savage_drm.h
-
 DRM DRIVER FOR FIRMWARE FRAMEBUFFERS
 M:     Thomas Zimmermann <tzimmermann@suse.de>
 M:     Javier Martinez Canillas <javierm@redhat.com>
@@ -6787,11 +6767,6 @@ F:       include/drm/drm_aperture.h
 F:     include/linux/aperture.h
 F:     include/video/nomodeset.h
 
-DRM DRIVER FOR SIS VIDEO CARDS
-S:     Orphan / Obsolete
-F:     drivers/gpu/drm/sis/
-F:     include/uapi/drm/sis_drm.h
-
 DRM DRIVER FOR SITRONIX ST7586 PANELS
 M:     David Lechner <david@lechnology.com>
 S:     Maintained
@@ -6819,10 +6794,6 @@ T:       git git://anongit.freedesktop.org/drm/drm-misc
 F:     Documentation/devicetree/bindings/display/ste,mcde.yaml
 F:     drivers/gpu/drm/mcde/
 
-DRM DRIVER FOR TDFX VIDEO CARDS
-S:     Orphan / Obsolete
-F:     drivers/gpu/drm/tdfx/
-
 DRM DRIVER FOR TI DLPC3433 MIPI DSI TO DMD BRIDGE
 M:     Jagan Teki <jagan@amarulasolutions.com>
 S:     Maintained
index 748b93d00184d42f2553a40c5bb6a0c1b284a648..f42d4c6a19f2ae21babe2bd08baaea6b8235bf62 100644 (file)
@@ -397,64 +397,7 @@ menuconfig DRM_LEGACY
          Unless you have strong reasons to go rogue, say "N".
 
 if DRM_LEGACY
-
-config DRM_TDFX
-       tristate "3dfx Banshee/Voodoo3+"
-       depends on DRM && PCI
-       help
-         Choose this option if you have a 3dfx Banshee or Voodoo3 (or later),
-         graphics card.  If M is selected, the module will be called tdfx.
-
-config DRM_R128
-       tristate "ATI Rage 128"
-       depends on DRM && PCI
-       select FW_LOADER
-       help
-         Choose this option if you have an ATI Rage 128 graphics card.  If M
-         is selected, the module will be called r128.  AGP support for
-         this card is strongly suggested (unless you have a PCI version).
-
-config DRM_I810
-       tristate "Intel I810"
-       # !PREEMPTION because of missing ioctl locking
-       depends on DRM && AGP && AGP_INTEL && (!PREEMPTION || BROKEN)
-       help
-         Choose this option if you have an Intel I810 graphics card.  If M is
-         selected, the module will be called i810.  AGP support is required
-         for this driver to work.
-
-config DRM_MGA
-       tristate "Matrox g200/g400"
-       depends on DRM && PCI
-       select FW_LOADER
-       help
-         Choose this option if you have a Matrox G200, G400 or G450 graphics
-         card.  If M is selected, the module will be called mga.  AGP
-         support is required for this driver to work.
-
-config DRM_SIS
-       tristate "SiS video cards"
-       depends on DRM && AGP
-       depends on FB_SIS || FB_SIS=n
-       help
-         Choose this option if you have a SiS 630 or compatible video
-         chipset. If M is selected the module will be called sis. AGP
-         support is required for this driver to work.
-
-config DRM_VIA
-       tristate "Via unichrome video cards"
-       depends on DRM && PCI
-       help
-         Choose this option if you have a Via unichrome or compatible video
-         chipset. If M is selected the module will be called via.
-
-config DRM_SAVAGE
-       tristate "Savage video cards"
-       depends on DRM && PCI
-       help
-         Choose this option if you have a Savage3D/4/SuperSavage/Pro/Twister
-         chipset. If M is selected the module will be called savage.
-
+# leave here to list legacy drivers
 endif # DRM_LEGACY
 
 config DRM_EXPORT_FOR_TESTS
index 496fa5a6147af9cc6f6aa8d4ee70ea48c93a9351..ab4460fcd63f6b181e8d4e296dcc1527cd336245 100644 (file)
@@ -134,21 +134,14 @@ obj-y                     += arm/
 obj-y                  += display/
 obj-$(CONFIG_DRM_TTM)  += ttm/
 obj-$(CONFIG_DRM_SCHED)        += scheduler/
-obj-$(CONFIG_DRM_TDFX) += tdfx/
-obj-$(CONFIG_DRM_R128) += r128/
 obj-$(CONFIG_DRM_RADEON)+= radeon/
 obj-$(CONFIG_DRM_AMDGPU)+= amd/amdgpu/
-obj-$(CONFIG_DRM_MGA)  += mga/
-obj-$(CONFIG_DRM_I810) += i810/
 obj-$(CONFIG_DRM_I915) += i915/
 obj-$(CONFIG_DRM_KMB_DISPLAY)  += kmb/
 obj-$(CONFIG_DRM_MGAG200) += mgag200/
 obj-$(CONFIG_DRM_V3D)  += v3d/
 obj-$(CONFIG_DRM_VC4)  += vc4/
-obj-$(CONFIG_DRM_SIS)   += sis/
-obj-$(CONFIG_DRM_SAVAGE)+= savage/
 obj-$(CONFIG_DRM_VMWGFX)+= vmwgfx/
-obj-$(CONFIG_DRM_VIA)  +=via/
 obj-$(CONFIG_DRM_VGEM) += vgem/
 obj-$(CONFIG_DRM_VKMS) += vkms/
 obj-$(CONFIG_DRM_NOUVEAU) +=nouveau/
index 57b5e11446c65a4c95eb237cb268b9260f0f9be5..f29c1d0ad4c181c9b1599e8a2bec5b0259761479 100644 (file)
@@ -24,6 +24,7 @@
 
 #include <linux/pci.h>
 #include <linux/acpi.h>
+#include <linux/backlight.h>
 #include <linux/slab.h>
 #include <linux/power_supply.h>
 #include <linux/pm_runtime.h>
@@ -31,7 +32,6 @@
 #include <acpi/video.h>
 #include <acpi/actbl.h>
 
-#include <drm/drm_crtc_helper.h>
 #include "amdgpu.h"
 #include "amdgpu_pm.h"
 #include "amdgpu_display.h"
index d2abd334b1b5ea2318bc91e910c5813e8e428df1..6be30dcb029d579dd28995c10c0a8a27c762b81f 100644 (file)
@@ -25,7 +25,9 @@
  */
 
 #include <drm/display/drm_dp_helper.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
index 4f38c55e767e1bf313c228fa409c1ce923a55f26..76a2b4a4de10e57091627439ff315e2d468b5aca 100644 (file)
@@ -38,6 +38,7 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/amdgpu_drm.h>
index a876648e3d7a612fe4079223292772b90e8d5697..503f89a766c3774e4626b70f7ea49cacd7e31b2f 100644 (file)
@@ -42,6 +42,7 @@
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper.h>
 #include <drm/drm_vblank.h>
 
 /**
index 82b9f85f922b679be04ecd2012c8a0a22adf3fe3..e3fed38a0d901593e4b82681e0941d62a560c561 100644 (file)
@@ -38,7 +38,6 @@
 #include <linux/mmu_notifier.h>
 #include <linux/suspend.h>
 #include <linux/cc_platform.h>
-#include <linux/fb.h>
 #include <linux/dynamic_debug.h>
 
 #include "amdgpu.h"
index c96e458ed0889eb0065a409f85c26a6868d19ff0..27a782a9dc72817d25ae6ee4f4cf75d119ac6dbb 100644 (file)
@@ -24,7 +24,6 @@
  *          Alex Deucher
  */
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
 #include "amdgpu_connectors.h"
index a6aef488a8228fd161aea9be93eec05c19b1ae10..d0a1cc88832cc4bd3c53ddf6f5f1127d491bcb2a 100644 (file)
@@ -45,7 +45,6 @@
 #include <linux/irq.h>
 #include <linux/pci.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_vblank.h>
 #include <drm/amdgpu_drm.h>
 #include <drm/drm_drv.h>
index 93c73faa5714abdfb9ae95a80e77989c2d819003..44c57f4a84c45c81e17eb1514f1afb9b0deeaa84 100644 (file)
@@ -35,7 +35,6 @@
 #include <drm/drm_edid.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fixed.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_probe_helper.h>
 #include <linux/i2c.h>
index afad094f84c2d8b65b916cb532205f2b177d60e8..10098fdd33fc4723efab3448fb4b5044d72c8788 100644 (file)
@@ -24,7 +24,6 @@
  *          Alex Deucher
  */
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/amdgpu_drm.h>
 #include <drm/drm_fixed.h>
 #include "amdgpu.h"
index 18ae9433e463d2dd7346b4d3433d6baa1cbfb1e7..d95b2dc7806341d777fd90f0b63ef39f08afee7f 100644 (file)
@@ -28,7 +28,6 @@
 
 #include <acpi/video.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
 #include "amdgpu_connectors.h"
index e85e57933cc45f4d1d22041de559b9122f8ada21..9a24ed463abdf431c96ef3eae97216f716471d0a 100644 (file)
@@ -21,8 +21,9 @@
  *
  */
 
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 
 #include "amdgpu.h"
index 6b406bb7f3f366ef8f963603ce5893ce6f4030ee..c14b70350a51aeb12f476d66ed6cde6701e89c19 100644 (file)
@@ -21,8 +21,9 @@
  *
  */
 
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 
 #include "amdgpu.h"
index 2aa21eec0e063a91ff6585d83551eeb602a8f51b..7f85ba5b726f6860e2ae80506b231145b196e5c0 100644 (file)
@@ -23,8 +23,9 @@
 
 #include <linux/pci.h>
 
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 
 #include "amdgpu.h"
index 9da338889d363df7bc67cc1bf47f43e991738dbd..d421a268c9ffeb8bf2e7105ba8e8d9a2b4ebc064 100644 (file)
@@ -21,8 +21,9 @@
  *
  */
 
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 
 #include "amdgpu.h"
index 4300ce98ce8d88c57c0eb21d0ab66d767c23defd..2db449fed3003c352e692c3bba344cfa320e952c 100644 (file)
@@ -67,6 +67,7 @@
 #include "ivsrcid/ivsrcid_vislands30.h"
 
 #include "i2caux_interface.h"
+#include <linux/backlight.h>
 #include <linux/module.h>
 #include <linux/moduleparam.h>
 #include <linux/types.h>
index 6dd33a2cd987085fb3273c195a955c3cfbc768ff..a2e1f6ed525f12566e7643c39fe51540115cd64b 100644 (file)
@@ -22,7 +22,6 @@
  */
 #include "pp_debug.h"
 #include <linux/delay.h>
-#include <linux/fb.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
index 6f5161738bf83e5084cc571c83476489266c7b65..99cd2e63afdd4369594eef59a334766817875a2d 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 #include <linux/delay.h>
-#include <linux/fb.h>
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
index 95b988823f50f1fec903972de074ae22056a0741..bb90d8abf79b1ea50ed0c04da9945560410fab21 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/module.h>
 #include <linux/pci.h>
 #include <linux/slab.h>
-#include <linux/fb.h>
 
 #include "vega10_processpptables.h"
 #include "ppatomfwctrl.h"
index 33f31461ea6c62ee16cd071fd17d3a80d656603c..e9db137cd1c6cb79abb6894c03077ddd4f5a2fb9 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 #include <linux/delay.h>
-#include <linux/fb.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 
index bd54fbd393b97792d21983977d52d1185f215779..89148f73b514a4ae3f71a3777cdbea5794d9ea9e 100644 (file)
@@ -22,7 +22,6 @@
  */
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/fb.h>
 
 #include "vega12/smu9_driver_if.h"
 #include "vega12_processpptables.h"
index 2a5abac81b4a94c8500de31c89970bf16be563f5..0d4d4811527c641a030ba3f0a6663dcbd1b35b95 100644 (file)
@@ -22,7 +22,6 @@
  */
 
 #include <linux/delay.h>
-#include <linux/fb.h>
 #include <linux/module.h>
 #include <linux/slab.h>
 
index 1f90825394575da09af05cfbfe7063784b9002a4..79c817752a3315a3eee6bd1548de92d1cd94bf9a 100644 (file)
@@ -22,7 +22,6 @@
  */
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/fb.h>
 
 #include "smu11_driver_if.h"
 #include "vega20_processpptables.h"
index 5ca3c422f7d4f09940b8c8c670a7497af8651c01..5c3f42d97f69465b5d649a114d958b5ec3a074f5 100644 (file)
@@ -22,7 +22,6 @@
  */
 #include <linux/module.h>
 #include <linux/slab.h>
-#include <linux/fb.h>
 #include "linux/delay.h"
 #include <linux/types.h>
 #include <linux/pci.h>
index 4cc07d6bb9d82eb4bb475a2bff2d1f732417391f..cea3fd5772b574efec47283551543062ca0fa94e 100644 (file)
@@ -10,7 +10,6 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_print.h>
 #include <drm/drm_vblank.h>
 
index 3f4e719eebd8571d6656998afccb0bfdc90e2188..28f76e07dd95842bc8015bc317dc8aa49d29bdbe 100644 (file)
@@ -6,6 +6,7 @@
  */
 #include <linux/module.h>
 #include <linux/kernel.h>
+#include <linux/of.h>
 #include <linux/platform_device.h>
 #include <linux/component.h>
 #include <linux/pm_runtime.h>
index 7339339ef6b87cc0f8a06e02a0a6014ebce37c70..3a872c292091230f971b54efb6b13fabe6c8395b 100644 (file)
@@ -11,7 +11,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_blend.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_writeback.h>
 #include <drm/drm_print.h>
index 55a3444a51d8a84acc250a5c2dd0ba95059b0aa2..7877a57b8e2657ae2fd14aad8319b6d907d529d8 100644 (file)
@@ -5,7 +5,6 @@
 #include <linux/reset.h>
 #include <linux/regmap.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_fourcc.h>
index 718119e168a698ac2c9a3ed9abefc00121c84ea8..ecfb060d2557bf03293eaf8bd9c5fca86bb40459 100644 (file)
@@ -14,7 +14,6 @@
 #include <linux/reset.h>
 
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
index 4f2187025a215a299563684eb080383cefbaf796..78775e0c853fd03fa9313840ebadfd18beeafdf0 100644 (file)
@@ -3,7 +3,6 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_connector.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_probe_helper.h>
 
index 420fc75c240e4d1c7dfb5f0edcd7b08a121e002e..d78852c7cf5b148ce4639fb39fdebc01678ecd19 100644 (file)
@@ -31,7 +31,6 @@
 
 #include <drm/drm_aperture.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_shmem_helper.h>
index bffa310a04319e97bad5175b88f5cd79a4c0928d..f83ce77127cb485108bce24e6d576bb4eaee17e0 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/pci.h>
 
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_managed.h>
index e82e9a8d85e57421a56673b1dcf358d50d31f97c..dcb8ced4ce75e7f65ff034583e39b535cebdeaf3 100644 (file)
@@ -35,7 +35,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_atomic_state_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_format_helper.h>
index 57946d80b02dbb906291adf272d3831f7532616e..8b2226f72b2459647529676f803a136b546fae95 100644 (file)
@@ -15,17 +15,6 @@ config DRM_PANEL_BRIDGE
 menu "Display Interface Bridges"
        depends on DRM && DRM_BRIDGE
 
-config DRM_CDNS_DSI
-       tristate "Cadence DPI/DSI bridge"
-       select DRM_KMS_HELPER
-       select DRM_MIPI_DSI
-       select DRM_PANEL_BRIDGE
-       select GENERIC_PHY_MIPI_DPHY
-       depends on OF
-       help
-         Support Cadence DPI to DSI bridge. This is an internal
-         bridge and is meant to be directly embedded in a SoC.
-
 config DRM_CHIPONE_ICN6211
        tristate "Chipone ICN6211 MIPI-DSI/RGB Converter bridge"
        depends on OF
index 1884803c6860dcee4869d20aed3790337ee0f256..52f6e8b4a821784b15207af52c99ebc66b9fac5f 100644 (file)
@@ -1,5 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0
-obj-$(CONFIG_DRM_CDNS_DSI) += cdns-dsi.o
 obj-$(CONFIG_DRM_CHIPONE_ICN6211) += chipone-icn6211.o
 obj-$(CONFIG_DRM_CHRONTEL_CH7033) += chrontel-ch7033.o
 obj-$(CONFIG_DRM_CROS_EC_ANX7688) += cros-ec-anx7688.o
index 339e0f05b2601f1a3d11866bb5dd3a60dfbebfd7..3577c532abb4e3de1b6ea222ea928ed550ee3275 100644 (file)
@@ -22,7 +22,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
index b375887e655d9c2647c69d605e374df357a30421..6846199a2ee14a2706a6c0c1a9695b5fe9227015 100644 (file)
@@ -26,7 +26,6 @@
 #include <drm/display/drm_hdcp_helper.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_of.h>
index 1d06182bea71091b3660acdd03f6f83c7aba6085..ec35215a20034c11fe28e12de2b9d40b5a6a3f86 100644 (file)
@@ -1,4 +1,25 @@
 # SPDX-License-Identifier: GPL-2.0-only
+config DRM_CDNS_DSI
+       tristate "Cadence DPI/DSI bridge"
+       select DRM_KMS_HELPER
+       select DRM_MIPI_DSI
+       select DRM_PANEL_BRIDGE
+       select GENERIC_PHY_MIPI_DPHY
+       depends on OF
+       help
+         Support Cadence DPI to DSI bridge. This is an internal
+         bridge and is meant to be directly embedded in a SoC.
+
+if DRM_CDNS_DSI
+
+config DRM_CDNS_DSI_J721E
+       bool "J721E Cadence DSI wrapper support"
+       default y
+       help
+         Support J721E Cadence DSI wrapper. The wrapper manages
+         the routing of the DSS DPI signal to the Cadence DSI.
+endif
+
 config DRM_CDNS_MHDP8546
        tristate "Cadence DPI/DP bridge"
        select DRM_DISPLAY_DP_HELPER
index 4d2db8df1bc6e97cdfab0aee589824f83825d53e..c95fd5b81d137a7efb3c58d1b920fbb4d36370ec 100644 (file)
@@ -1,4 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
+obj-$(CONFIG_DRM_CDNS_DSI) += cdns-dsi.o
+cdns-dsi-y := cdns-dsi-core.o
+cdns-dsi-$(CONFIG_DRM_CDNS_DSI_J721E) += cdns-dsi-j721e.o
 obj-$(CONFIG_DRM_CDNS_MHDP8546) += cdns-mhdp8546.o
 cdns-mhdp8546-y := cdns-mhdp8546-core.o cdns-mhdp8546-hdcp.o
 cdns-mhdp8546-$(CONFIG_DRM_CDNS_MHDP8546_J721E) += cdns-mhdp8546-j721e.o
similarity index 97%
rename from drivers/gpu/drm/bridge/cdns-dsi.c
rename to drivers/gpu/drm/bridge/cadence/cdns-dsi-core.c
index 20bece84ff8cc77cd88f01bfb2b252187e3c2efb..5dbfc7226b31ee965e8d67affb8b93d202137dee 100644 (file)
@@ -6,10 +6,7 @@
  */
 
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_bridge.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_mipi_dsi.h>
-#include <drm/drm_panel.h>
 #include <drm/drm_probe_helper.h>
 #include <video/mipi_display.h>
 
 #include <linux/iopoll.h>
 #include <linux/module.h>
 #include <linux/of_address.h>
+#include <linux/of_device.h>
 #include <linux/of_graph.h>
 #include <linux/platform_device.h>
 #include <linux/pm_runtime.h>
 #include <linux/reset.h>
 
-#include <linux/phy/phy.h>
 #include <linux/phy/phy-mipi-dphy.h>
 
+#include "cdns-dsi-core.h"
+#ifdef CONFIG_DRM_CDNS_DSI_J721E
+#include "cdns-dsi-j721e.h"
+#endif
+
 #define IP_CONF                                0x0
 #define SP_HS_FIFO_DEPTH(x)            (((x) & GENMASK(30, 26)) >> 26)
 #define SP_LP_FIFO_DEPTH(x)            (((x) & GENMASK(25, 21)) >> 21)
 #define DSI_NULL_FRAME_OVERHEAD                6
 #define DSI_EOT_PKT_SIZE               4
 
-struct cdns_dsi_output {
-       struct mipi_dsi_device *dev;
-       struct drm_panel *panel;
-       struct drm_bridge *bridge;
-       union phy_configure_opts phy_opts;
-};
-
-enum cdns_dsi_input_id {
-       CDNS_SDI_INPUT,
-       CDNS_DPI_INPUT,
-       CDNS_DSC_INPUT,
-};
-
-struct cdns_dsi_cfg {
-       unsigned int hfp;
-       unsigned int hsa;
-       unsigned int hbp;
-       unsigned int hact;
-       unsigned int htotal;
-};
-
-struct cdns_dsi_input {
-       enum cdns_dsi_input_id id;
-       struct drm_bridge bridge;
-};
-
-struct cdns_dsi {
-       struct mipi_dsi_host base;
-       void __iomem *regs;
-       struct cdns_dsi_input input;
-       struct cdns_dsi_output output;
-       unsigned int direct_cmd_fifo_depth;
-       unsigned int rx_fifo_depth;
-       struct completion direct_cmd_comp;
-       struct clk *dsi_p_clk;
-       struct reset_control *dsi_p_rst;
-       struct clk *dsi_sys_clk;
-       bool link_initialized;
-       bool phy_initialized;
-       struct phy *dphy;
-};
-
 static inline struct cdns_dsi *input_to_dsi(struct cdns_dsi_input *input)
 {
        return container_of(input, struct cdns_dsi, input);
@@ -709,6 +669,10 @@ static void cdns_dsi_bridge_disable(struct drm_bridge *bridge)
 
        val = readl(dsi->regs + MCTL_MAIN_EN) & ~IF_EN(input->id);
        writel(val, dsi->regs + MCTL_MAIN_EN);
+
+       if (dsi->platform_ops && dsi->platform_ops->disable)
+               dsi->platform_ops->disable(dsi);
+
        pm_runtime_put(dsi->base.dev);
 }
 
@@ -804,6 +768,9 @@ static void cdns_dsi_bridge_enable(struct drm_bridge *bridge)
        if (WARN_ON(pm_runtime_get_sync(dsi->base.dev) < 0))
                return;
 
+       if (dsi->platform_ops && dsi->platform_ops->enable)
+               dsi->platform_ops->enable(dsi);
+
        mode = &bridge->encoder->crtc->state->adjusted_mode;
        nlanes = output->dev->lanes;
 
@@ -1244,6 +1211,8 @@ static int cdns_dsi_drm_probe(struct platform_device *pdev)
                goto err_disable_pclk;
        }
 
+       dsi->platform_ops = of_device_get_match_data(&pdev->dev);
+
        val = readl(dsi->regs + IP_CONF);
        dsi->direct_cmd_fifo_depth = 1 << (DIRCMD_FIFO_DEPTH(val) + 2);
        dsi->rx_fifo_depth = RX_FIFO_DEPTH(val);
@@ -1279,14 +1248,27 @@ static int cdns_dsi_drm_probe(struct platform_device *pdev)
        dsi->base.dev = &pdev->dev;
        dsi->base.ops = &cdns_dsi_ops;
 
+       if (dsi->platform_ops && dsi->platform_ops->init) {
+               ret = dsi->platform_ops->init(dsi);
+               if (ret != 0) {
+                       dev_err(&pdev->dev, "platform initialization failed: %d\n",
+                               ret);
+                       goto err_disable_runtime_pm;
+               }
+       }
+
        ret = mipi_dsi_host_register(&dsi->base);
        if (ret)
-               goto err_disable_runtime_pm;
+               goto err_deinit_platform;
 
        clk_disable_unprepare(dsi->dsi_p_clk);
 
        return 0;
 
+err_deinit_platform:
+       if (dsi->platform_ops && dsi->platform_ops->deinit)
+               dsi->platform_ops->deinit(dsi);
+
 err_disable_runtime_pm:
        pm_runtime_disable(&pdev->dev);
 
@@ -1301,6 +1283,10 @@ static int cdns_dsi_drm_remove(struct platform_device *pdev)
        struct cdns_dsi *dsi = platform_get_drvdata(pdev);
 
        mipi_dsi_host_unregister(&dsi->base);
+
+       if (dsi->platform_ops && dsi->platform_ops->deinit)
+               dsi->platform_ops->deinit(dsi);
+
        pm_runtime_disable(&pdev->dev);
 
        return 0;
@@ -1308,6 +1294,9 @@ static int cdns_dsi_drm_remove(struct platform_device *pdev)
 
 static const struct of_device_id cdns_dsi_of_match[] = {
        { .compatible = "cdns,dsi" },
+#ifdef CONFIG_DRM_CDNS_DSI_J721E
+       { .compatible = "ti,j721e-dsi", .data = &dsi_ti_j721e_ops, },
+#endif
        { },
 };
 MODULE_DEVICE_TABLE(of, cdns_dsi_of_match);
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h b/drivers/gpu/drm/bridge/cadence/cdns-dsi-core.h
new file mode 100644 (file)
index 0000000..ca7ea2d
--- /dev/null
@@ -0,0 +1,84 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Copyright: 2017 Cadence Design Systems, Inc.
+ *
+ * Author: Boris Brezillon <boris.brezillon@bootlin.com>
+ */
+
+#ifndef __CDNS_DSI_H__
+#define __CDNS_DSI_H__
+
+#include <drm/drm_bridge.h>
+#include <drm/drm_mipi_dsi.h>
+#include <drm/drm_panel.h>
+
+#include <linux/bits.h>
+#include <linux/completion.h>
+#include <linux/phy/phy.h>
+
+struct clk;
+struct reset_control;
+
+struct cdns_dsi_output {
+       struct mipi_dsi_device *dev;
+       struct drm_panel *panel;
+       struct drm_bridge *bridge;
+       union phy_configure_opts phy_opts;
+};
+
+enum cdns_dsi_input_id {
+       CDNS_SDI_INPUT,
+       CDNS_DPI_INPUT,
+       CDNS_DSC_INPUT,
+};
+
+struct cdns_dsi_cfg {
+       unsigned int hfp;
+       unsigned int hsa;
+       unsigned int hbp;
+       unsigned int hact;
+       unsigned int htotal;
+};
+
+struct cdns_dsi_input {
+       enum cdns_dsi_input_id id;
+       struct drm_bridge bridge;
+};
+
+struct cdns_dsi;
+
+/**
+ * struct cdns_dsi_platform_ops - CDNS DSI Platform operations
+ * @init: Called in the CDNS DSI probe
+ * @deinit: Called in the CDNS DSI remove
+ * @enable: Called at the beginning of CDNS DSI bridge enable
+ * @disable: Called at the end of CDNS DSI bridge disable
+ */
+struct cdns_dsi_platform_ops {
+       int (*init)(struct cdns_dsi *dsi);
+       void (*deinit)(struct cdns_dsi *dsi);
+       void (*enable)(struct cdns_dsi *dsi);
+       void (*disable)(struct cdns_dsi *dsi);
+};
+
+struct cdns_dsi {
+       struct mipi_dsi_host base;
+       void __iomem *regs;
+#ifdef CONFIG_DRM_CDNS_DSI_J721E
+       void __iomem *j721e_regs;
+#endif
+       const struct cdns_dsi_platform_ops *platform_ops;
+       struct cdns_dsi_input input;
+       struct cdns_dsi_output output;
+       unsigned int direct_cmd_fifo_depth;
+       unsigned int rx_fifo_depth;
+       struct completion direct_cmd_comp;
+       struct clk *dsi_p_clk;
+       struct reset_control *dsi_p_rst;
+       struct clk *dsi_sys_clk;
+       bool link_initialized;
+       bool phy_initialized;
+       struct phy *dphy;
+};
+
+#endif /* !__CDNS_DSI_H__ */
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.c b/drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.c
new file mode 100644 (file)
index 0000000..b654d4b
--- /dev/null
@@ -0,0 +1,51 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * TI j721e Cadence DSI wrapper
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
+ * Author: Rahul T R <r-ravikumar@ti.com>
+ */
+
+#include <linux/io.h>
+#include <linux/platform_device.h>
+
+#include "cdns-dsi-j721e.h"
+
+#define DSI_WRAP_REVISION              0x0
+#define DSI_WRAP_DPI_CONTROL           0x4
+#define DSI_WRAP_DSC_CONTROL           0x8
+#define DSI_WRAP_DPI_SECURE            0xc
+#define DSI_WRAP_DSI_0_ASF_STATUS      0x10
+
+#define DSI_WRAP_DPI_0_EN              BIT(0)
+#define DSI_WRAP_DSI2_MUX_SEL          BIT(4)
+
+static int cdns_dsi_j721e_init(struct cdns_dsi *dsi)
+{
+       struct platform_device *pdev = to_platform_device(dsi->base.dev);
+
+       dsi->j721e_regs = devm_platform_ioremap_resource(pdev, 1);
+       return PTR_ERR_OR_ZERO(dsi->j721e_regs);
+}
+
+static void cdns_dsi_j721e_enable(struct cdns_dsi *dsi)
+{
+       /*
+        * Enable DPI0 as its input. DSS0 DPI2 is connected
+        * to DSI DPI0. This is the only supported configuration on
+        * J721E.
+        */
+       writel(DSI_WRAP_DPI_0_EN, dsi->j721e_regs + DSI_WRAP_DPI_CONTROL);
+}
+
+static void cdns_dsi_j721e_disable(struct cdns_dsi *dsi)
+{
+       /* Put everything to defaults  */
+       writel(0, dsi->j721e_regs + DSI_WRAP_DPI_CONTROL);
+}
+
+const struct cdns_dsi_platform_ops dsi_ti_j721e_ops = {
+       .init = cdns_dsi_j721e_init,
+       .enable = cdns_dsi_j721e_enable,
+       .disable = cdns_dsi_j721e_disable,
+};
diff --git a/drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.h b/drivers/gpu/drm/bridge/cadence/cdns-dsi-j721e.h
new file mode 100644 (file)
index 0000000..275e5e8
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * TI j721e Cadence DSI wrapper
+ *
+ * Copyright (C) 2022 Texas Instruments Incorporated - http://www.ti.com/
+ * Author: Rahul T R <r-ravikumar@ti.com>
+ */
+
+#ifndef __CDNS_DSI_J721E_H__
+#define __CDNS_DSI_J721E_H__
+
+#include "cdns-dsi-core.h"
+
+extern const struct cdns_dsi_platform_ops dsi_ti_j721e_ops;
+
+#endif /* !__CDNS_DSI_J721E_H__ */
index 31442a9225029e7ffd6377edd06a2d5c4d518a19..f6822dfa380545c3118bb0ad01f0edcfe7d05d0f 100644 (file)
@@ -43,7 +43,6 @@
 #include <drm/drm_atomic_state_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_connector.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_print.h>
index f9e0f8d99268073a70681478e6777e5e632b59be..9bcba8fc57e74d31d3cf9de6d8f23cd1b5c2838a 100644 (file)
@@ -66,6 +66,14 @@ static inline struct fsl_ldb *to_fsl_ldb(struct drm_bridge *bridge)
        return container_of(bridge, struct fsl_ldb, bridge);
 }
 
+static unsigned long fsl_ldb_link_frequency(struct fsl_ldb *fsl_ldb, int clock)
+{
+       if (fsl_ldb->lvds_dual_link)
+               return clock * 3500;
+       else
+               return clock * 7000;
+}
+
 static int fsl_ldb_attach(struct drm_bridge *bridge,
                          enum drm_bridge_attach_flags flags)
 {
@@ -85,6 +93,8 @@ static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
        const struct drm_display_mode *mode;
        struct drm_connector *connector;
        struct drm_crtc *crtc;
+       unsigned long configured_link_freq;
+       unsigned long requested_link_freq;
        bool lvds_format_24bpp;
        bool lvds_format_jeida;
        u32 reg;
@@ -128,10 +138,15 @@ static void fsl_ldb_atomic_enable(struct drm_bridge *bridge,
        crtc_state = drm_atomic_get_new_crtc_state(state, crtc);
        mode = &crtc_state->adjusted_mode;
 
-       if (fsl_ldb->lvds_dual_link)
-               clk_set_rate(fsl_ldb->clk, mode->clock * 3500);
-       else
-               clk_set_rate(fsl_ldb->clk, mode->clock * 7000);
+       requested_link_freq = fsl_ldb_link_frequency(fsl_ldb, mode->clock);
+       clk_set_rate(fsl_ldb->clk, requested_link_freq);
+
+       configured_link_freq = clk_get_rate(fsl_ldb->clk);
+       if (configured_link_freq != requested_link_freq)
+               dev_warn(fsl_ldb->dev, "Configured LDB clock (%lu Hz) does not match requested LVDS clock: %lu Hz",
+                        configured_link_freq,
+                        requested_link_freq);
+
        clk_prepare_enable(fsl_ldb->clk);
 
        /* Program LDB_CTRL */
index 9cda2df21b882a150e2ed6963f4c110caf127894..bc451b2a77c28377c6b21bbb167ba0877ba561e7 100644 (file)
@@ -26,7 +26,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
index b348608716273446ed311cd0832ff135c554fa52..a2d723d6a4be84bbebb2e3917e35c9bbe9e008e1 100644 (file)
@@ -22,7 +22,6 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_modes.h>
 #include <drm/drm_print.h>
index 3ce4e495aee5083461928eb2daa35d9d20076810..a25d21a7d5c19c1a1c3db0f40d11d90e10a330f1 100644 (file)
@@ -19,6 +19,7 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_mipi_dsi.h>
+#include <drm/drm_of.h>
 #include <drm/drm_print.h>
 #include <drm/drm_probe_helper.h>
 
@@ -33,7 +34,7 @@
 struct lt9611 {
        struct device *dev;
        struct drm_bridge bridge;
-       struct drm_connector connector;
+       struct drm_bridge *next_bridge;
 
        struct regmap *regmap;
 
@@ -58,7 +59,6 @@ struct lt9611 {
        enum drm_connector_status status;
 
        u8 edid_buf[EDID_SEG_SIZE];
-       u32 vic;
 };
 
 #define LT9611_PAGE_CONTROL    0xff
@@ -84,34 +84,11 @@ static const struct regmap_config lt9611_regmap_config = {
        .num_ranges = ARRAY_SIZE(lt9611_ranges),
 };
 
-struct lt9611_mode {
-       u16 hdisplay;
-       u16 vdisplay;
-       u8 vrefresh;
-       u8 lanes;
-       u8 intfs;
-};
-
-static struct lt9611_mode lt9611_modes[] = {
-       { 3840, 2160, 30, 4, 2 }, /* 3840x2160 24bit 30Hz 4Lane 2ports */
-       { 1920, 1080, 60, 4, 1 }, /* 1080P 24bit 60Hz 4lane 1port */
-       { 1920, 1080, 30, 3, 1 }, /* 1080P 24bit 30Hz 3lane 1port */
-       { 1920, 1080, 24, 3, 1 },
-       { 720, 480, 60, 4, 1 },
-       { 720, 576, 50, 2, 1 },
-       { 640, 480, 60, 2, 1 },
-};
-
 static struct lt9611 *bridge_to_lt9611(struct drm_bridge *bridge)
 {
        return container_of(bridge, struct lt9611, bridge);
 }
 
-static struct lt9611 *connector_to_lt9611(struct drm_connector *connector)
-{
-       return container_of(connector, struct lt9611, connector);
-}
-
 static int lt9611_mipi_input_analog(struct lt9611 *lt9611)
 {
        const struct reg_sequence reg_cfg[] = {
@@ -141,7 +118,7 @@ static int lt9611_mipi_input_digital(struct lt9611 *lt9611,
                { 0x8306, 0x0a },
        };
 
-       if (mode->hdisplay == 3840)
+       if (lt9611->dsi1_node)
                reg_cfg[1].def = 0x03;
 
        return regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
@@ -159,12 +136,12 @@ static void lt9611_mipi_video_setup(struct lt9611 *lt9611,
        hactive = mode->hdisplay;
        hsync_len = mode->hsync_end - mode->hsync_start;
        hfront_porch = mode->hsync_start - mode->hdisplay;
-       hsync_porch = hsync_len + mode->htotal - mode->hsync_end;
+       hsync_porch = mode->htotal - mode->hsync_start;
 
        vactive = mode->vdisplay;
        vsync_len = mode->vsync_end - mode->vsync_start;
        vfront_porch = mode->vsync_start - mode->vdisplay;
-       vsync_porch = vsync_len + mode->vtotal - mode->vsync_end;
+       vsync_porch = mode->vtotal - mode->vsync_start;
 
        regmap_write(lt9611->regmap, 0x830d, (u8)(v_total / 256));
        regmap_write(lt9611->regmap, 0x830e, (u8)(v_total % 256));
@@ -187,12 +164,14 @@ static void lt9611_mipi_video_setup(struct lt9611 *lt9611,
 
        regmap_write(lt9611->regmap, 0x8319, (u8)(hfront_porch % 256));
 
-       regmap_write(lt9611->regmap, 0x831a, (u8)(hsync_porch / 256));
+       regmap_write(lt9611->regmap, 0x831a, (u8)(hsync_porch / 256) |
+                                               ((hfront_porch / 256) << 4));
        regmap_write(lt9611->regmap, 0x831b, (u8)(hsync_porch % 256));
 }
 
-static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode)
+static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int postdiv)
 {
+       unsigned int pcr_m = mode->clock * 5 * postdiv / 27000;
        const struct reg_sequence reg_cfg[] = {
                { 0x830b, 0x01 },
                { 0x830c, 0x10 },
@@ -207,45 +186,40 @@ static void lt9611_pcr_setup(struct lt9611 *lt9611, const struct drm_display_mod
 
                /* stage 2 */
                { 0x834a, 0x40 },
-               { 0x831d, 0x10 },
 
                /* MK limit */
                { 0x832d, 0x38 },
                { 0x8331, 0x08 },
        };
-       const struct reg_sequence reg_cfg2[] = {
-               { 0x830b, 0x03 },
-               { 0x830c, 0xd0 },
-               { 0x8348, 0x03 },
-               { 0x8349, 0xe0 },
-               { 0x8324, 0x72 },
-               { 0x8325, 0x00 },
-               { 0x832a, 0x01 },
-               { 0x834a, 0x10 },
-               { 0x831d, 0x10 },
-               { 0x8326, 0x37 },
-       };
+       u8 pol = 0x10;
 
-       regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
+       if (mode->flags & DRM_MODE_FLAG_NHSYNC)
+               pol |= 0x2;
+       if (mode->flags & DRM_MODE_FLAG_NVSYNC)
+               pol |= 0x1;
+       regmap_write(lt9611->regmap, 0x831d, pol);
 
-       switch (mode->hdisplay) {
-       case 640:
-               regmap_write(lt9611->regmap, 0x8326, 0x14);
-               break;
-       case 1920:
-               regmap_write(lt9611->regmap, 0x8326, 0x37);
-               break;
-       case 3840:
-               regmap_multi_reg_write(lt9611->regmap, reg_cfg2, ARRAY_SIZE(reg_cfg2));
-               break;
+       regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
+       if (lt9611->dsi1_node) {
+               unsigned int hact = mode->hdisplay;
+
+               hact >>= 2;
+               hact += 0x50;
+               hact = min(hact, 0x3e0U);
+               regmap_write(lt9611->regmap, 0x830b, hact / 256);
+               regmap_write(lt9611->regmap, 0x830c, hact % 256);
+               regmap_write(lt9611->regmap, 0x8348, hact / 256);
+               regmap_write(lt9611->regmap, 0x8349, hact % 256);
        }
 
+       regmap_write(lt9611->regmap, 0x8326, pcr_m);
+
        /* pcr rst */
        regmap_write(lt9611->regmap, 0x8011, 0x5a);
        regmap_write(lt9611->regmap, 0x8011, 0xfa);
 }
 
-static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode)
+static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode *mode, unsigned int *postdiv)
 {
        unsigned int pclk = mode->clock;
        const struct reg_sequence reg_cfg[] = {
@@ -264,12 +238,16 @@ static int lt9611_pll_setup(struct lt9611 *lt9611, const struct drm_display_mode
 
        regmap_multi_reg_write(lt9611->regmap, reg_cfg, ARRAY_SIZE(reg_cfg));
 
-       if (pclk > 150000)
+       if (pclk > 150000) {
                regmap_write(lt9611->regmap, 0x812d, 0x88);
-       else if (pclk > 70000)
+               *postdiv = 1;
+       } else if (pclk > 70000) {
                regmap_write(lt9611->regmap, 0x812d, 0x99);
-       else
+               *postdiv = 2;
+       } else {
                regmap_write(lt9611->regmap, 0x812d, 0xaa);
+               *postdiv = 4;
+       }
 
        /*
         * first divide pclk by 2 first
@@ -354,13 +332,55 @@ end:
        return temp;
 }
 
-static void lt9611_hdmi_tx_digital(struct lt9611 *lt9611)
+static void lt9611_hdmi_set_infoframes(struct lt9611 *lt9611,
+                                      struct drm_connector *connector,
+                                      struct drm_display_mode *mode)
 {
-       regmap_write(lt9611->regmap, 0x8443, 0x46 - lt9611->vic);
-       regmap_write(lt9611->regmap, 0x8447, lt9611->vic);
-       regmap_write(lt9611->regmap, 0x843d, 0x0a); /* UD1 infoframe */
+       union hdmi_infoframe infoframe;
+       ssize_t len;
+       u8 iframes = 0x0a; /* UD1 infoframe */
+       u8 buf[32];
+       int ret;
+       int i;
 
-       regmap_write(lt9611->regmap, 0x82d6, 0x8c);
+       ret = drm_hdmi_avi_infoframe_from_display_mode(&infoframe.avi,
+                                                      connector,
+                                                      mode);
+       if (ret < 0)
+               goto out;
+
+       len = hdmi_infoframe_pack(&infoframe, buf, sizeof(buf));
+       if (len < 0)
+               goto out;
+
+       for (i = 0; i < len; i++)
+               regmap_write(lt9611->regmap, 0x8440 + i, buf[i]);
+
+       ret = drm_hdmi_vendor_infoframe_from_display_mode(&infoframe.vendor.hdmi,
+                                                         connector,
+                                                         mode);
+       if (ret < 0)
+               goto out;
+
+       len = hdmi_infoframe_pack(&infoframe, buf, sizeof(buf));
+       if (len < 0)
+               goto out;
+
+       for (i = 0; i < len; i++)
+               regmap_write(lt9611->regmap, 0x8474 + i, buf[i]);
+
+       iframes |= 0x20;
+
+out:
+       regmap_write(lt9611->regmap, 0x843d, iframes); /* UD1 infoframe */
+}
+
+static void lt9611_hdmi_tx_digital(struct lt9611 *lt9611, bool is_hdmi)
+{
+       if (is_hdmi)
+               regmap_write(lt9611->regmap, 0x82d6, 0x8c);
+       else
+               regmap_write(lt9611->regmap, 0x82d6, 0x0c);
        regmap_write(lt9611->regmap, 0x82d7, 0x04);
 }
 
@@ -449,12 +469,11 @@ static void lt9611_sleep_setup(struct lt9611 *lt9611)
                { 0x8023, 0x01 },
                { 0x8157, 0x03 }, /* set addr pin as output */
                { 0x8149, 0x0b },
-               { 0x8151, 0x30 }, /* disable IRQ */
+
                { 0x8102, 0x48 }, /* MIPI Rx power down */
                { 0x8123, 0x80 },
                { 0x8130, 0x00 },
-               { 0x8100, 0x01 }, /* bandgap power down */
-               { 0x8101, 0x00 }, /* system clk power down */
+               { 0x8011, 0x0a },
        };
 
        regmap_multi_reg_write(lt9611->regmap,
@@ -565,24 +584,9 @@ static int lt9611_regulator_enable(struct lt9611 *lt9611)
        return 0;
 }
 
-static struct lt9611_mode *lt9611_find_mode(const struct drm_display_mode *mode)
-{
-       int i;
-
-       for (i = 0; i < ARRAY_SIZE(lt9611_modes); i++) {
-               if (lt9611_modes[i].hdisplay == mode->hdisplay &&
-                   lt9611_modes[i].vdisplay == mode->vdisplay &&
-                   lt9611_modes[i].vrefresh == drm_mode_vrefresh(mode)) {
-                       return &lt9611_modes[i];
-               }
-       }
-
-       return NULL;
-}
-
-/* connector funcs */
-static enum drm_connector_status __lt9611_detect(struct lt9611 *lt9611)
+static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
 {
+       struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
        unsigned int reg_val = 0;
        int connected = 0;
 
@@ -595,12 +599,6 @@ static enum drm_connector_status __lt9611_detect(struct lt9611 *lt9611)
        return lt9611->status;
 }
 
-static enum drm_connector_status
-lt9611_connector_detect(struct drm_connector *connector, bool force)
-{
-       return __lt9611_detect(connector_to_lt9611(connector));
-}
-
 static int lt9611_read_edid(struct lt9611 *lt9611)
 {
        unsigned int temp;
@@ -682,36 +680,37 @@ lt9611_get_edid_block(void *data, u8 *buf, unsigned int block, size_t len)
        return 0;
 }
 
-static int lt9611_connector_get_modes(struct drm_connector *connector)
-{
-       struct lt9611 *lt9611 = connector_to_lt9611(connector);
-       unsigned int count;
-       struct edid *edid;
-
-       lt9611_power_on(lt9611);
-       edid = drm_do_get_edid(connector, lt9611_get_edid_block, lt9611);
-       drm_connector_update_edid_property(connector, edid);
-       count = drm_add_edid_modes(connector, edid);
-       kfree(edid);
-
-       return count;
-}
-
-static enum drm_mode_status
-lt9611_connector_mode_valid(struct drm_connector *connector,
-                           struct drm_display_mode *mode)
-{
-       struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
-
-       return lt9611_mode ? MODE_OK : MODE_BAD;
-}
-
 /* bridge funcs */
 static void
 lt9611_bridge_atomic_enable(struct drm_bridge *bridge,
                            struct drm_bridge_state *old_bridge_state)
 {
        struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
+       struct drm_atomic_state *state = old_bridge_state->base.state;
+       struct drm_connector *connector;
+       struct drm_connector_state *conn_state;
+       struct drm_crtc_state *crtc_state;
+       struct drm_display_mode *mode;
+       unsigned int postdiv;
+
+       connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder);
+       if (WARN_ON(!connector))
+               return;
+
+       conn_state = drm_atomic_get_new_connector_state(state, connector);
+       if (WARN_ON(!conn_state))
+               return;
+
+       crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc);
+       if (WARN_ON(!crtc_state))
+               return;
+
+       mode = &crtc_state->adjusted_mode;
+
+       lt9611_mipi_input_digital(lt9611, mode);
+       lt9611_pll_setup(lt9611, mode, &postdiv);
+       lt9611_mipi_video_setup(lt9611, mode);
+       lt9611_pcr_setup(lt9611, mode, postdiv);
 
        if (lt9611_power_on(lt9611)) {
                dev_err(lt9611->dev, "power on failed\n");
@@ -719,7 +718,8 @@ lt9611_bridge_atomic_enable(struct drm_bridge *bridge,
        }
 
        lt9611_mipi_input_analog(lt9611);
-       lt9611_hdmi_tx_digital(lt9611);
+       lt9611_hdmi_set_infoframes(lt9611, connector, mode);
+       lt9611_hdmi_tx_digital(lt9611, connector->display_info.is_hdmi);
        lt9611_hdmi_tx_phy(lt9611);
 
        msleep(500);
@@ -750,25 +750,10 @@ lt9611_bridge_atomic_disable(struct drm_bridge *bridge,
        }
 }
 
-static struct
-drm_connector_helper_funcs lt9611_bridge_connector_helper_funcs = {
-       .get_modes = lt9611_connector_get_modes,
-       .mode_valid = lt9611_connector_mode_valid,
-};
-
-static const struct drm_connector_funcs lt9611_bridge_connector_funcs = {
-       .fill_modes = drm_helper_probe_single_connector_modes,
-       .detect = lt9611_connector_detect,
-       .destroy = drm_connector_cleanup,
-       .reset = drm_atomic_helper_connector_reset,
-       .atomic_duplicate_state = drm_atomic_helper_connector_duplicate_state,
-       .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
-};
-
 static struct mipi_dsi_device *lt9611_attach_dsi(struct lt9611 *lt9611,
                                                 struct device_node *dsi_node)
 {
-       const struct mipi_dsi_device_info info = { "lt9611", 0, NULL };
+       const struct mipi_dsi_device_info info = { "lt9611", 0, lt9611->dev->of_node};
        struct mipi_dsi_device *dsi;
        struct mipi_dsi_host *host;
        struct device *dev = lt9611->dev;
@@ -800,70 +785,54 @@ static struct mipi_dsi_device *lt9611_attach_dsi(struct lt9611 *lt9611,
        return dsi;
 }
 
-static int lt9611_connector_init(struct drm_bridge *bridge, struct lt9611 *lt9611)
-{
-       int ret;
-
-       ret = drm_connector_init(bridge->dev, &lt9611->connector,
-                                &lt9611_bridge_connector_funcs,
-                                DRM_MODE_CONNECTOR_HDMIA);
-       if (ret) {
-               DRM_ERROR("Failed to initialize connector with drm\n");
-               return ret;
-       }
-
-       drm_connector_helper_add(&lt9611->connector,
-                                &lt9611_bridge_connector_helper_funcs);
-
-       if (!bridge->encoder) {
-               DRM_ERROR("Parent encoder object not found");
-               return -ENODEV;
-       }
-
-       drm_connector_attach_encoder(&lt9611->connector, bridge->encoder);
-
-       return 0;
-}
-
 static int lt9611_bridge_attach(struct drm_bridge *bridge,
                                enum drm_bridge_attach_flags flags)
 {
        struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
-       int ret;
 
-       if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
-               ret = lt9611_connector_init(bridge, lt9611);
-               if (ret < 0)
-                       return ret;
-       }
-
-       return 0;
+       return drm_bridge_attach(bridge->encoder, lt9611->next_bridge,
+                                bridge, flags);
 }
 
 static enum drm_mode_status lt9611_bridge_mode_valid(struct drm_bridge *bridge,
                                                     const struct drm_display_info *info,
                                                     const struct drm_display_mode *mode)
 {
-       struct lt9611_mode *lt9611_mode = lt9611_find_mode(mode);
        struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
 
-       if (!lt9611_mode)
-               return MODE_BAD;
-       else if (lt9611_mode->intfs > 1 && !lt9611->dsi1)
+       if (mode->hdisplay > 3840)
+               return MODE_BAD_HVALUE;
+
+       if (mode->vdisplay > 2160)
+               return MODE_BAD_VVALUE;
+
+       if (mode->hdisplay == 3840 &&
+           mode->vdisplay == 2160 &&
+           drm_mode_vrefresh(mode) > 30)
+               return MODE_CLOCK_HIGH;
+
+       if (mode->hdisplay > 2000 && !lt9611->dsi1_node)
                return MODE_PANEL;
        else
                return MODE_OK;
 }
 
-static void lt9611_bridge_pre_enable(struct drm_bridge *bridge)
+static void lt9611_bridge_atomic_pre_enable(struct drm_bridge *bridge,
+                                           struct drm_bridge_state *old_bridge_state)
 {
        struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
+       static const struct reg_sequence reg_cfg[] = {
+               { 0x8102, 0x12 },
+               { 0x8123, 0x40 },
+               { 0x8130, 0xea },
+               { 0x8011, 0xfa },
+       };
 
        if (!lt9611->sleep)
                return;
 
-       lt9611_reset(lt9611);
-       regmap_write(lt9611->regmap, 0x80ee, 0x01);
+       regmap_multi_reg_write(lt9611->regmap,
+                              reg_cfg, ARRAY_SIZE(reg_cfg));
 
        lt9611->sleep = false;
 }
@@ -877,33 +846,6 @@ lt9611_bridge_atomic_post_disable(struct drm_bridge *bridge,
        lt9611_sleep_setup(lt9611);
 }
 
-static void lt9611_bridge_mode_set(struct drm_bridge *bridge,
-                                  const struct drm_display_mode *mode,
-                                  const struct drm_display_mode *adj_mode)
-{
-       struct lt9611 *lt9611 = bridge_to_lt9611(bridge);
-       struct hdmi_avi_infoframe avi_frame;
-       int ret;
-
-       lt9611_bridge_pre_enable(bridge);
-
-       lt9611_mipi_input_digital(lt9611, mode);
-       lt9611_pll_setup(lt9611, mode);
-       lt9611_mipi_video_setup(lt9611, mode);
-       lt9611_pcr_setup(lt9611, mode);
-
-       ret = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
-                                                      &lt9611->connector,
-                                                      mode);
-       if (!ret)
-               lt9611->vic = avi_frame.video_code;
-}
-
-static enum drm_connector_status lt9611_bridge_detect(struct drm_bridge *bridge)
-{
-       return __lt9611_detect(bridge_to_lt9611(bridge));
-}
-
 static struct edid *lt9611_bridge_get_edid(struct drm_bridge *bridge,
                                           struct drm_connector *connector)
 {
@@ -949,11 +891,11 @@ lt9611_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
 static const struct drm_bridge_funcs lt9611_bridge_funcs = {
        .attach = lt9611_bridge_attach,
        .mode_valid = lt9611_bridge_mode_valid,
-       .mode_set = lt9611_bridge_mode_set,
        .detect = lt9611_bridge_detect,
        .get_edid = lt9611_bridge_get_edid,
        .hpd_enable = lt9611_bridge_hpd_enable,
 
+       .atomic_pre_enable = lt9611_bridge_atomic_pre_enable,
        .atomic_enable = lt9611_bridge_atomic_enable,
        .atomic_disable = lt9611_bridge_atomic_disable,
        .atomic_post_disable = lt9611_bridge_atomic_post_disable,
@@ -976,7 +918,7 @@ static int lt9611_parse_dt(struct device *dev,
 
        lt9611->ac_mode = of_property_read_bool(dev->of_node, "lt,ac-mode");
 
-       return 0;
+       return drm_of_find_panel_or_bridge(dev->of_node, 2, -1, NULL, &lt9611->next_bridge);
 }
 
 static int lt9611_gpio_init(struct lt9611 *lt9611)
index d212ff7f7a87d351b68346c5397147e911c936fd..ef66461e7f7c4cf6d892af361a84b510ae203086 100644 (file)
@@ -239,12 +239,12 @@ static void sii902x_reset(struct sii902x *sii902x)
        if (!sii902x->reset_gpio)
                return;
 
-       gpiod_set_value(sii902x->reset_gpio, 1);
+       gpiod_set_value_cansleep(sii902x->reset_gpio, 1);
 
        /* The datasheet says treset-min = 100us. Make it 150us to be sure. */
        usleep_range(150, 200);
 
-       gpiod_set_value(sii902x->reset_gpio, 0);
+       gpiod_set_value_cansleep(sii902x->reset_gpio, 0);
 }
 
 static enum drm_connector_status sii902x_detect(struct sii902x *sii902x)
@@ -1116,7 +1116,8 @@ static int sii902x_probe(struct i2c_client *client)
                sii902x->next_bridge = of_drm_find_bridge(remote);
                of_node_put(remote);
                if (!sii902x->next_bridge)
-                       return -EPROBE_DEFER;
+                       return dev_err_probe(dev, -EPROBE_DEFER,
+                                            "Failed to find remote bridge\n");
        }
 
        mutex_init(&sii902x->mutex);
index a4725efe812df448d18510530eae925a2f2b2993..6d16ec45ea6145984f47e45d90e8a301739a6845 100644 (file)
@@ -1264,10 +1264,10 @@ static int tc_dsi_rx_enable(struct tc_data *tc)
        u32 value;
        int ret;
 
-       regmap_write(tc->regmap, PPI_D0S_CLRSIPOCOUNT, 5);
-       regmap_write(tc->regmap, PPI_D1S_CLRSIPOCOUNT, 5);
-       regmap_write(tc->regmap, PPI_D2S_CLRSIPOCOUNT, 5);
-       regmap_write(tc->regmap, PPI_D3S_CLRSIPOCOUNT, 5);
+       regmap_write(tc->regmap, PPI_D0S_CLRSIPOCOUNT, 25);
+       regmap_write(tc->regmap, PPI_D1S_CLRSIPOCOUNT, 25);
+       regmap_write(tc->regmap, PPI_D2S_CLRSIPOCOUNT, 25);
+       regmap_write(tc->regmap, PPI_D3S_CLRSIPOCOUNT, 25);
        regmap_write(tc->regmap, PPI_D0S_ATMR, 0);
        regmap_write(tc->regmap, PPI_D1S_ATMR, 0);
        regmap_write(tc->regmap, PPI_TX_RX_TA, TTA_GET | TTA_SURE);
index 839b8832b9b5452d059cab621b7bae30d058d96b..7c0cbe84611b9c23536fa9e39e4b155d7ac9604b 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/slab.h>
 
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_of.h>
index 91b5e1207c472463c8dba039e9f2420f951b0b88..19316994ddd11412e8202c37fde6190304e53a06 100644 (file)
@@ -23,7 +23,6 @@
 #include <drm/display/drm_dp_helper.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_mipi_dsi.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
index fcca21e8efac0c9463d4f253fe74712366cecab5..86700560fea28d3b3d5f6bad439772797db278be 100644 (file)
@@ -423,8 +423,7 @@ int drm_legacy_addmap_ioctl(struct drm_device *dev, void *data,
        if (!(capable(CAP_SYS_ADMIN) || map->type == _DRM_AGP || map->type == _DRM_SHM))
                return -EPERM;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        err = drm_addmap_core(dev, map->offset, map->size, map->type,
@@ -469,8 +468,7 @@ int drm_legacy_getmap_ioctl(struct drm_device *dev, void *data,
        int idx;
        int i;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        idx = map->offset;
@@ -570,8 +568,7 @@ EXPORT_SYMBOL(drm_legacy_rmmap_locked);
 
 void drm_legacy_rmmap(struct drm_device *dev, struct drm_local_map *map)
 {
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return;
 
        mutex_lock(&dev->struct_mutex);
@@ -628,8 +625,7 @@ int drm_legacy_rmmap_ioctl(struct drm_device *dev, void *data,
        struct drm_map_list *r_list;
        int ret;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        mutex_lock(&dev->struct_mutex);
index c6e6a3e7219a6084bad566d95f7e54e2fc8b8e6d..a0fc779e5e1e8a14ab48f9c7f43ff9419b022e2b 100644 (file)
@@ -59,8 +59,7 @@ struct drm_ctx_list {
  */
 void drm_legacy_ctxbitmap_free(struct drm_device * dev, int ctx_handle)
 {
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return;
 
        mutex_lock(&dev->struct_mutex);
@@ -97,8 +96,7 @@ static int drm_legacy_ctxbitmap_next(struct drm_device * dev)
  */
 void drm_legacy_ctxbitmap_init(struct drm_device * dev)
 {
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return;
 
        idr_init(&dev->ctx_idr);
@@ -114,8 +112,7 @@ void drm_legacy_ctxbitmap_init(struct drm_device * dev)
  */
 void drm_legacy_ctxbitmap_cleanup(struct drm_device * dev)
 {
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return;
 
        mutex_lock(&dev->struct_mutex);
@@ -136,8 +133,7 @@ void drm_legacy_ctxbitmap_flush(struct drm_device *dev, struct drm_file *file)
 {
        struct drm_ctx_list *pos, *tmp;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return;
 
        mutex_lock(&dev->ctxlist_mutex);
@@ -182,8 +178,7 @@ int drm_legacy_getsareactx(struct drm_device *dev, void *data,
        struct drm_local_map *map;
        struct drm_map_list *_entry;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        mutex_lock(&dev->struct_mutex);
@@ -230,8 +225,7 @@ int drm_legacy_setsareactx(struct drm_device *dev, void *data,
        struct drm_local_map *map = NULL;
        struct drm_map_list *r_list = NULL;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        mutex_lock(&dev->struct_mutex);
@@ -335,8 +329,7 @@ int drm_legacy_resctx(struct drm_device *dev, void *data,
        struct drm_ctx ctx;
        int i;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        if (res->count >= DRM_RESERVED_CONTEXTS) {
@@ -370,8 +363,7 @@ int drm_legacy_addctx(struct drm_device *dev, void *data,
        struct drm_ctx *ctx = data;
        int tmp_handle;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        tmp_handle = drm_legacy_ctxbitmap_next(dev);
@@ -419,8 +411,7 @@ int drm_legacy_getctx(struct drm_device *dev, void *data,
 {
        struct drm_ctx *ctx = data;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        /* This is 0, because we don't handle any context flags */
@@ -445,8 +436,7 @@ int drm_legacy_switchctx(struct drm_device *dev, void *data,
 {
        struct drm_ctx *ctx = data;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        DRM_DEBUG("%d\n", ctx->handle);
@@ -469,8 +459,7 @@ int drm_legacy_newctx(struct drm_device *dev, void *data,
 {
        struct drm_ctx *ctx = data;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        DRM_DEBUG("%d\n", ctx->handle);
@@ -495,8 +484,7 @@ int drm_legacy_rmctx(struct drm_device *dev, void *data,
 {
        struct drm_ctx *ctx = data;
 
-       if (!drm_core_check_feature(dev, DRIVER_KMS_LEGACY_CONTEXT) &&
-           !drm_core_check_feature(dev, DRIVER_LEGACY))
+       if (!drm_core_check_feature(dev, DRIVER_LEGACY))
                return -EOPNOTSUPP;
 
        DRM_DEBUG("%d\n", ctx->handle);
index 4276317061285322e4705040dce38cdbd7b7d19b..367fb8b2d5fab38a6a881f51074afc9f25c6f445 100644 (file)
@@ -473,8 +473,8 @@ EXPORT_SYMBOL(drm_fb_helper_init);
  * drm_fb_helper_alloc_info - allocate fb_info and some of its members
  * @fb_helper: driver-allocated fbdev helper
  *
- * A helper to alloc fb_info and the members cmap and apertures. Called
- * by the driver within the fb_probe fb_helper callback function. Drivers do not
+ * A helper to alloc fb_info and the member cmap. Called by the driver
+ * within the fb_probe fb_helper callback function. Drivers do not
  * need to release the allocated fb_info structure themselves, this is
  * automatically done when calling drm_fb_helper_fini().
  *
@@ -496,27 +496,11 @@ struct fb_info *drm_fb_helper_alloc_info(struct drm_fb_helper *fb_helper)
        if (ret)
                goto err_release;
 
-       /*
-        * TODO: We really should be smarter here and alloc an aperture
-        * for each IORESOURCE_MEM resource helper->dev->dev has and also
-        * init the ranges of the appertures based on the resources.
-        * Note some drivers currently count on there being only 1 empty
-        * aperture and fill this themselves, these will need to be dealt
-        * with somehow when fixing this.
-        */
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto err_free_cmap;
-       }
-
        fb_helper->info = info;
        info->skip_vt_switch = true;
 
        return info;
 
-err_free_cmap:
-       fb_dealloc_cmap(&info->cmap);
 err_release:
        framebuffer_release(info);
        return ERR_PTR(ret);
index 08ab75303a0015cb5efbb292bf552a485afc4ae3..150fe155506809598e663251696673b4d584f914 100644 (file)
@@ -6,7 +6,7 @@
 #include <linux/uaccess.h>
 
 #include <drm/drm_auth.h>
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_crtc.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_file.h>
 #include <drm/drm_lease.h>
index 497ef4b6a90a4dbe724d60899774973022276eb0..4bc15fbd009d866e9240bd708074c1acc28750ee 100644 (file)
@@ -1224,6 +1224,58 @@ int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
 }
 EXPORT_SYMBOL(mipi_dsi_dcs_get_display_brightness);
 
+/**
+ * mipi_dsi_dcs_set_display_brightness_large() - sets the 16-bit brightness value
+ *    of the display
+ * @dsi: DSI peripheral device
+ * @brightness: brightness value
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int mipi_dsi_dcs_set_display_brightness_large(struct mipi_dsi_device *dsi,
+                                            u16 brightness)
+{
+       u8 payload[2] = { brightness >> 8, brightness & 0xff };
+       ssize_t err;
+
+       err = mipi_dsi_dcs_write(dsi, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
+                                payload, sizeof(payload));
+       if (err < 0)
+               return err;
+
+       return 0;
+}
+EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness_large);
+
+/**
+ * mipi_dsi_dcs_get_display_brightness_large() - gets the current 16-bit
+ *    brightness value of the display
+ * @dsi: DSI peripheral device
+ * @brightness: brightness value
+ *
+ * Return: 0 on success or a negative error code on failure.
+ */
+int mipi_dsi_dcs_get_display_brightness_large(struct mipi_dsi_device *dsi,
+                                            u16 *brightness)
+{
+       u8 brightness_be[2];
+       ssize_t err;
+
+       err = mipi_dsi_dcs_read(dsi, MIPI_DCS_GET_DISPLAY_BRIGHTNESS,
+                               brightness_be, sizeof(brightness_be));
+       if (err <= 0) {
+               if (err == 0)
+                       err = -ENODATA;
+
+               return err;
+       }
+
+       *brightness = (brightness_be[0] << 8) | brightness_be[1];
+
+       return 0;
+}
+EXPORT_SYMBOL(mipi_dsi_dcs_get_display_brightness_large);
+
 static int mipi_dsi_drv_probe(struct device *dev)
 {
        struct mipi_dsi_driver *drv = to_mipi_dsi_driver(dev->driver);
index be030f4a5311bd1cf92e26b3a51905475dc60d11..40d482a0117868e8858625a84a67d92303079928 100644 (file)
  */
 
 #include <linux/ctype.h>
+#include <linux/export.h>
+#include <linux/fb.h> /* for KHZ2PICOS() */
 #include <linux/list.h>
 #include <linux/list_sort.h>
-#include <linux/export.h>
-#include <linux/fb.h>
+#include <linux/of.h>
 
 #include <video/of_display_timing.h>
 #include <video/of_videomode.h>
index ba6a9136a065c956eed3a029b5766bfb1c8b89d7..c91e454eba097942c708db2d66edc0a972d7a2ba 100644 (file)
@@ -28,7 +28,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_atomic_uapi.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_encoder.h>
index 577a4987b19377def124645f2ff1ab32f38887ff..8711a7a5b8daeb6d60b4be9f9c029d3896556f07 100644 (file)
@@ -7,6 +7,8 @@
  * Authors: Eric Knopp
  */
 
+#include <linux/backlight.h>
+
 #include <acpi/video.h>
 
 #include "psb_drv.h"
index 3065596257e9a0cd78dbc30bd0946db9be4650bc..3e83299113e358469d94eb1ec61e45253c9fc618 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/delay.h>
 
 #include <drm/drm.h>
+#include <drm/drm_crtc_helper.h>
 
 #include "cdv_device.h"
 #include "gma_device.h"
index 7ff1e51411501e92ec978324f13ddfd5bf9c5e07..5a0acd914f769a970f3be12176dfd0bcbd8cee17 100644 (file)
@@ -28,6 +28,8 @@
 #include <linux/i2c.h>
 #include <linux/pm_runtime.h>
 
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "cdv_device.h"
index 0c3ddcdc29dccc30f3133c34a50549cc250cd5ad..bbd0abdd83821ab5df8f4773ef77922e8152e3da 100644 (file)
@@ -10,6 +10,7 @@
 #include <linux/i2c.h>
 
 #include <drm/drm_crtc.h>
+#include <drm/drm_modeset_helper_vtables.h>
 
 #include "cdv_device.h"
 #include "framebuffer.h"
index 53b967282d6a969a0b6dfd63e59acdc8663ccd50..8992a95076f29e548d7576b066fb1c75ac1b46ee 100644 (file)
@@ -33,6 +33,7 @@
 #include <drm/drm_crtc.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "gma_display.h"
index 29ef45f14169afa7d4d4f59faa479a64a727753f..2d95e04712911afcb2a1c03ce88428daf71dbb74 100644 (file)
@@ -28,7 +28,9 @@
 
 #include <drm/drm.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "cdv_device.h"
index be6efcaaa3b3f2b3e2173bac715b58dafad6916b..f08a6803dc184965aedc2dd8ade8d11c0723fa10 100644 (file)
@@ -12,6 +12,8 @@
 #include <linux/i2c.h>
 #include <linux/pm_runtime.h>
 
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "cdv_device.h"
index 8d5a37b8f110077ed739afe1e0e3aff720a985c5..52ae3ade9a61ad0759caaf6515ce7ea8997f970d 100644 (file)
 
 #include <drm/drm.h>
 #include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_modeset_helper.h>
 
 #include "framebuffer.h"
 #include "gem.h"
@@ -297,11 +299,6 @@ static int psbfb_create(struct drm_fb_helper *fb_helper,
        info->screen_base = dev_priv->vram_addr + backing->offset;
        info->screen_size = size;
 
-       if (dev_priv->gtt.stolen_size) {
-               info->apertures->ranges[0].base = dev_priv->fb_base;
-               info->apertures->ranges[0].size = dev_priv->gtt.stolen_size;
-       }
-
        drm_fb_helper_fill_info(info, fb_helper, sizes);
 
        info->fix.mmio_start = pci_resource_start(pdev, 0);
index fe7b8436f87a36101a3ae8031f271491d7b0de8a..f65e90d890f44287204c366b053d8c264208d185 100644 (file)
 #include <linux/highmem.h>
 
 #include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 
 #include "framebuffer.h"
index 64761f46b4347175edeb9f5084d9ba597827f37c..de8ccfe9890ff072c4915b3daeb51574d7162f29 100644 (file)
@@ -9,6 +9,7 @@
 
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_modeset_helper_vtables.h>
 
 #include "framebuffer.h"
 #include "gem.h"
index 95b7cb099e638604c26da39bfea5e19ba8e3628f..ed8626c73541c13b1c04da26c096cf94f80524a6 100644 (file)
@@ -27,7 +27,9 @@
 #include <linux/delay.h>
 
 #include <drm/drm.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "psb_drv.h"
index 75b4eb1c8884d7c75a44a4e3cdf9eb1fe5482dba..d974d0c60d2a4ab2a0acffec13c66a65de7554b4 100644 (file)
@@ -14,6 +14,7 @@
 #include <asm/intel-mid.h>
 
 #include <drm/drm_edid.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "intel_bios.h"
index 3c294c38bdb4ddf2a7d517666a4bce775a05967a..dcfcd7b89d4a1dfe9fb5092b7aa63a111785b7fc 100644 (file)
@@ -6,6 +6,7 @@
  **************************************************************************/
 
 #include <drm/drm.h>
+#include <drm/drm_crtc_helper.h>
 
 #include "gma_device.h"
 #include "intel_bios.h"
index 531c1781a8fb466f3a0e8bcfc9cb707ea8966b66..ff46e88c47688d36f2fd2f3f6c86b48ccb917d51 100644 (file)
@@ -9,6 +9,9 @@
 #include <linux/delay.h>
 #include <linux/i2c.h>
 
+#include <drm/drm_modeset_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
+
 #include "framebuffer.h"
 #include "gem.h"
 #include "gma_display.h"
index 8a1111fe714b5a40afa4fa0ab27d074f38bcbb3a..0bb85494e3dad2725a7e9432015da8ee0154f143 100644 (file)
@@ -9,7 +9,6 @@
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_vblank.h>
index 7ee6c8ce103b86b0137dce14f6d87c569971e42a..8486de230ec91bef379c7bb9ee61dc1b98c62712 100644 (file)
@@ -11,6 +11,8 @@
 #include <linux/i2c.h>
 #include <linux/pm_runtime.h>
 
+#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_simple_kms_helper.h>
 
 #include "intel_bios.h"
index bdced46dd333282b18b1111fc908097769976fe2..d6fd5d72621609f40612a0ece610970b82707193 100644 (file)
@@ -33,7 +33,9 @@
 #include <linux/slab.h>
 
 #include <drm/drm_crtc.h>
+#include <drm/drm_crtc_helper.h>
 #include <drm/drm_edid.h>
+#include <drm/drm_modeset_helper_vtables.h>
 
 #include "psb_drv.h"
 #include "psb_intel_drv.h"
index 923389f220202ce6cf437d4a1aecd29904c58189..521bdf656cca2df257f0c38acbe21dce756636e0 100644 (file)
@@ -26,6 +26,8 @@
 
 #include <linux/module.h>
 
+#include <drm/drm_crtc_helper.h>
+
 #include "ch7006_priv.h"
 
 /* DRM encoder functions */
index 986b04599906549e92145adf91e2d89f79abb8da..052bdc48a339df47073ab305f224f96c8630d66c 100644 (file)
@@ -27,7 +27,6 @@
 #ifndef __DRM_I2C_CH7006_PRIV_H__
 #define __DRM_I2C_CH7006_PRIV_H__
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_encoder_slave.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/i2c/ch7006.h>
diff --git a/drivers/gpu/drm/i810/Makefile b/drivers/gpu/drm/i810/Makefile
deleted file mode 100644 (file)
index c181f85..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-i810-y := i810_drv.o i810_dma.o
-
-obj-$(CONFIG_DRM_I810) += i810.o
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c
deleted file mode 100644 (file)
index 9fb4dd6..0000000
+++ /dev/null
@@ -1,1266 +0,0 @@
-/* i810_dma.c -- DMA support for the i810 -*- linux-c -*-
- * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
- *         Jeff Hartmann <jhartmann@valinux.com>
- *          Keith Whitwell <keith@tungstengraphics.com>
- *
- */
-
-#include <linux/delay.h>
-#include <linux/mman.h>
-#include <linux/pci.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_ioctl.h>
-#include <drm/drm_print.h>
-#include <drm/i810_drm.h>
-
-#include "i810_drv.h"
-
-#define I810_BUF_FREE          2
-#define I810_BUF_CLIENT                1
-#define I810_BUF_HARDWARE      0
-
-#define I810_BUF_UNMAPPED 0
-#define I810_BUF_MAPPED   1
-
-static struct drm_buf *i810_freelist_get(struct drm_device * dev)
-{
-       struct drm_device_dma *dma = dev->dma;
-       int i;
-       int used;
-
-       /* Linear search might not be the best solution */
-
-       for (i = 0; i < dma->buf_count; i++) {
-               struct drm_buf *buf = dma->buflist[i];
-               drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-               /* In use is already a pointer */
-               used = cmpxchg(buf_priv->in_use, I810_BUF_FREE,
-                              I810_BUF_CLIENT);
-               if (used == I810_BUF_FREE)
-                       return buf;
-       }
-       return NULL;
-}
-
-/* This should only be called if the buffer is not sent to the hardware
- * yet, the hardware updates in use for us once its on the ring buffer.
- */
-
-static int i810_freelist_put(struct drm_device *dev, struct drm_buf *buf)
-{
-       drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-       int used;
-
-       /* In use is already a pointer */
-       used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT, I810_BUF_FREE);
-       if (used != I810_BUF_CLIENT) {
-               DRM_ERROR("Freeing buffer thats not in use : %d\n", buf->idx);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int i810_mmap_buffers(struct file *filp, struct vm_area_struct *vma)
-{
-       struct drm_file *priv = filp->private_data;
-       struct drm_device *dev;
-       drm_i810_private_t *dev_priv;
-       struct drm_buf *buf;
-       drm_i810_buf_priv_t *buf_priv;
-
-       dev = priv->minor->dev;
-       dev_priv = dev->dev_private;
-       buf = dev_priv->mmap_buffer;
-       buf_priv = buf->dev_private;
-
-       vma->vm_flags |= VM_DONTCOPY;
-
-       buf_priv->currently_mapped = I810_BUF_MAPPED;
-
-       if (io_remap_pfn_range(vma, vma->vm_start,
-                              vma->vm_pgoff,
-                              vma->vm_end - vma->vm_start, vma->vm_page_prot))
-               return -EAGAIN;
-       return 0;
-}
-
-static const struct file_operations i810_buffer_fops = {
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = i810_mmap_buffers,
-       .compat_ioctl = drm_compat_ioctl,
-       .llseek = noop_llseek,
-};
-
-static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv)
-{
-       struct drm_device *dev = file_priv->minor->dev;
-       drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       const struct file_operations *old_fops;
-       int retcode = 0;
-
-       if (buf_priv->currently_mapped == I810_BUF_MAPPED)
-               return -EINVAL;
-
-       /* This is all entirely broken */
-       old_fops = file_priv->filp->f_op;
-       file_priv->filp->f_op = &i810_buffer_fops;
-       dev_priv->mmap_buffer = buf;
-       buf_priv->virtual = (void *)vm_mmap(file_priv->filp, 0, buf->total,
-                                           PROT_READ | PROT_WRITE,
-                                           MAP_SHARED, buf->bus_address);
-       dev_priv->mmap_buffer = NULL;
-       file_priv->filp->f_op = old_fops;
-       if (IS_ERR(buf_priv->virtual)) {
-               /* Real error */
-               DRM_ERROR("mmap error\n");
-               retcode = PTR_ERR(buf_priv->virtual);
-               buf_priv->virtual = NULL;
-       }
-
-       return retcode;
-}
-
-static int i810_unmap_buffer(struct drm_buf *buf)
-{
-       drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-       int retcode = 0;
-
-       if (buf_priv->currently_mapped != I810_BUF_MAPPED)
-               return -EINVAL;
-
-       retcode = vm_munmap((unsigned long)buf_priv->virtual,
-                           (size_t) buf->total);
-
-       buf_priv->currently_mapped = I810_BUF_UNMAPPED;
-       buf_priv->virtual = NULL;
-
-       return retcode;
-}
-
-static int i810_dma_get_buffer(struct drm_device *dev, drm_i810_dma_t *d,
-                              struct drm_file *file_priv)
-{
-       struct drm_buf *buf;
-       drm_i810_buf_priv_t *buf_priv;
-       int retcode = 0;
-
-       buf = i810_freelist_get(dev);
-       if (!buf) {
-               retcode = -ENOMEM;
-               DRM_DEBUG("retcode=%d\n", retcode);
-               return retcode;
-       }
-
-       retcode = i810_map_buffer(buf, file_priv);
-       if (retcode) {
-               i810_freelist_put(dev, buf);
-               DRM_ERROR("mapbuf failed, retcode %d\n", retcode);
-               return retcode;
-       }
-       buf->file_priv = file_priv;
-       buf_priv = buf->dev_private;
-       d->granted = 1;
-       d->request_idx = buf->idx;
-       d->request_size = buf->total;
-       d->virtual = buf_priv->virtual;
-
-       return retcode;
-}
-
-static int i810_dma_cleanup(struct drm_device *dev)
-{
-       struct drm_device_dma *dma = dev->dma;
-
-       /* Make sure interrupts are disabled here because the uninstall ioctl
-        * may not have been called from userspace and after dev_private
-        * is freed, it's too late.
-        */
-       if (drm_core_check_feature(dev, DRIVER_HAVE_IRQ) && dev->irq_enabled)
-               drm_legacy_irq_uninstall(dev);
-
-       if (dev->dev_private) {
-               int i;
-               drm_i810_private_t *dev_priv =
-                   (drm_i810_private_t *) dev->dev_private;
-
-               if (dev_priv->ring.virtual_start)
-                       drm_legacy_ioremapfree(&dev_priv->ring.map, dev);
-               if (dev_priv->hw_status_page) {
-                       dma_free_coherent(dev->dev, PAGE_SIZE,
-                                         dev_priv->hw_status_page,
-                                         dev_priv->dma_status_page);
-               }
-               kfree(dev->dev_private);
-               dev->dev_private = NULL;
-
-               for (i = 0; i < dma->buf_count; i++) {
-                       struct drm_buf *buf = dma->buflist[i];
-                       drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-
-                       if (buf_priv->kernel_virtual && buf->total)
-                               drm_legacy_ioremapfree(&buf_priv->map, dev);
-               }
-       }
-       return 0;
-}
-
-static int i810_wait_ring(struct drm_device *dev, int n)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_ring_buffer_t *ring = &(dev_priv->ring);
-       int iters = 0;
-       unsigned long end;
-       unsigned int last_head = I810_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
-
-       end = jiffies + (HZ * 3);
-       while (ring->space < n) {
-               ring->head = I810_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
-               ring->space = ring->head - (ring->tail + 8);
-               if (ring->space < 0)
-                       ring->space += ring->Size;
-
-               if (ring->head != last_head) {
-                       end = jiffies + (HZ * 3);
-                       last_head = ring->head;
-               }
-
-               iters++;
-               if (time_before(end, jiffies)) {
-                       DRM_ERROR("space: %d wanted %d\n", ring->space, n);
-                       DRM_ERROR("lockup\n");
-                       goto out_wait_ring;
-               }
-               udelay(1);
-       }
-
-out_wait_ring:
-       return iters;
-}
-
-static void i810_kernel_lost_context(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_ring_buffer_t *ring = &(dev_priv->ring);
-
-       ring->head = I810_READ(LP_RING + RING_HEAD) & HEAD_ADDR;
-       ring->tail = I810_READ(LP_RING + RING_TAIL);
-       ring->space = ring->head - (ring->tail + 8);
-       if (ring->space < 0)
-               ring->space += ring->Size;
-}
-
-static int i810_freelist_init(struct drm_device *dev, drm_i810_private_t *dev_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       int my_idx = 24;
-       u32 *hw_status = (u32 *) (dev_priv->hw_status_page + my_idx);
-       int i;
-
-       if (dma->buf_count > 1019) {
-               /* Not enough space in the status page for the freelist */
-               return -EINVAL;
-       }
-
-       for (i = 0; i < dma->buf_count; i++) {
-               struct drm_buf *buf = dma->buflist[i];
-               drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-
-               buf_priv->in_use = hw_status++;
-               buf_priv->my_use_idx = my_idx;
-               my_idx += 4;
-
-               *buf_priv->in_use = I810_BUF_FREE;
-
-               buf_priv->map.offset = buf->bus_address;
-               buf_priv->map.size = buf->total;
-               buf_priv->map.type = _DRM_AGP;
-               buf_priv->map.flags = 0;
-               buf_priv->map.mtrr = 0;
-
-               drm_legacy_ioremap(&buf_priv->map, dev);
-               buf_priv->kernel_virtual = buf_priv->map.handle;
-
-       }
-       return 0;
-}
-
-static int i810_dma_initialize(struct drm_device *dev,
-                              drm_i810_private_t *dev_priv,
-                              drm_i810_init_t *init)
-{
-       struct drm_map_list *r_list;
-       memset(dev_priv, 0, sizeof(drm_i810_private_t));
-
-       list_for_each_entry(r_list, &dev->maplist, head) {
-               if (r_list->map &&
-                   r_list->map->type == _DRM_SHM &&
-                   r_list->map->flags & _DRM_CONTAINS_LOCK) {
-                       dev_priv->sarea_map = r_list->map;
-                       break;
-               }
-       }
-       if (!dev_priv->sarea_map) {
-               dev->dev_private = (void *)dev_priv;
-               i810_dma_cleanup(dev);
-               DRM_ERROR("can not find sarea!\n");
-               return -EINVAL;
-       }
-       dev_priv->mmio_map = drm_legacy_findmap(dev, init->mmio_offset);
-       if (!dev_priv->mmio_map) {
-               dev->dev_private = (void *)dev_priv;
-               i810_dma_cleanup(dev);
-               DRM_ERROR("can not find mmio map!\n");
-               return -EINVAL;
-       }
-       dev->agp_buffer_token = init->buffers_offset;
-       dev->agp_buffer_map = drm_legacy_findmap(dev, init->buffers_offset);
-       if (!dev->agp_buffer_map) {
-               dev->dev_private = (void *)dev_priv;
-               i810_dma_cleanup(dev);
-               DRM_ERROR("can not find dma buffer map!\n");
-               return -EINVAL;
-       }
-
-       dev_priv->sarea_priv = (drm_i810_sarea_t *)
-           ((u8 *) dev_priv->sarea_map->handle + init->sarea_priv_offset);
-
-       dev_priv->ring.Start = init->ring_start;
-       dev_priv->ring.End = init->ring_end;
-       dev_priv->ring.Size = init->ring_size;
-
-       dev_priv->ring.map.offset = dev->agp->base + init->ring_start;
-       dev_priv->ring.map.size = init->ring_size;
-       dev_priv->ring.map.type = _DRM_AGP;
-       dev_priv->ring.map.flags = 0;
-       dev_priv->ring.map.mtrr = 0;
-
-       drm_legacy_ioremap(&dev_priv->ring.map, dev);
-
-       if (dev_priv->ring.map.handle == NULL) {
-               dev->dev_private = (void *)dev_priv;
-               i810_dma_cleanup(dev);
-               DRM_ERROR("can not ioremap virtual address for"
-                         " ring buffer\n");
-               return -ENOMEM;
-       }
-
-       dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
-
-       dev_priv->ring.tail_mask = dev_priv->ring.Size - 1;
-
-       dev_priv->w = init->w;
-       dev_priv->h = init->h;
-       dev_priv->pitch = init->pitch;
-       dev_priv->back_offset = init->back_offset;
-       dev_priv->depth_offset = init->depth_offset;
-       dev_priv->front_offset = init->front_offset;
-
-       dev_priv->overlay_offset = init->overlay_offset;
-       dev_priv->overlay_physical = init->overlay_physical;
-
-       dev_priv->front_di1 = init->front_offset | init->pitch_bits;
-       dev_priv->back_di1 = init->back_offset | init->pitch_bits;
-       dev_priv->zi1 = init->depth_offset | init->pitch_bits;
-
-       /* Program Hardware Status Page */
-       dev_priv->hw_status_page =
-               dma_alloc_coherent(dev->dev, PAGE_SIZE,
-                                  &dev_priv->dma_status_page, GFP_KERNEL);
-       if (!dev_priv->hw_status_page) {
-               dev->dev_private = (void *)dev_priv;
-               i810_dma_cleanup(dev);
-               DRM_ERROR("Can not allocate hardware status page\n");
-               return -ENOMEM;
-       }
-       DRM_DEBUG("hw status page @ %p\n", dev_priv->hw_status_page);
-
-       I810_WRITE(0x02080, dev_priv->dma_status_page);
-       DRM_DEBUG("Enabled hardware status page\n");
-
-       /* Now we need to init our freelist */
-       if (i810_freelist_init(dev, dev_priv) != 0) {
-               dev->dev_private = (void *)dev_priv;
-               i810_dma_cleanup(dev);
-               DRM_ERROR("Not enough space in the status page for"
-                         " the freelist\n");
-               return -ENOMEM;
-       }
-       dev->dev_private = (void *)dev_priv;
-
-       return 0;
-}
-
-static int i810_dma_init(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv;
-       drm_i810_init_t *init = data;
-       int retcode = 0;
-
-       switch (init->func) {
-       case I810_INIT_DMA_1_4:
-               DRM_INFO("Using v1.4 init.\n");
-               dev_priv = kmalloc(sizeof(drm_i810_private_t), GFP_KERNEL);
-               if (dev_priv == NULL)
-                       return -ENOMEM;
-               retcode = i810_dma_initialize(dev, dev_priv, init);
-               break;
-
-       case I810_CLEANUP_DMA:
-               DRM_INFO("DMA Cleanup\n");
-               retcode = i810_dma_cleanup(dev);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       return retcode;
-}
-
-/* Most efficient way to verify state for the i810 is as it is
- * emitted.  Non-conformant state is silently dropped.
- *
- * Use 'volatile' & local var tmp to force the emitted values to be
- * identical to the verified ones.
- */
-static void i810EmitContextVerified(struct drm_device *dev,
-                                   volatile unsigned int *code)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       int i, j = 0;
-       unsigned int tmp;
-       RING_LOCALS;
-
-       BEGIN_LP_RING(I810_CTX_SETUP_SIZE);
-
-       OUT_RING(GFX_OP_COLOR_FACTOR);
-       OUT_RING(code[I810_CTXREG_CF1]);
-
-       OUT_RING(GFX_OP_STIPPLE);
-       OUT_RING(code[I810_CTXREG_ST1]);
-
-       for (i = 4; i < I810_CTX_SETUP_SIZE; i++) {
-               tmp = code[i];
-
-               if ((tmp & (7 << 29)) == (3 << 29) &&
-                   (tmp & (0x1f << 24)) < (0x1d << 24)) {
-                       OUT_RING(tmp);
-                       j++;
-               } else
-                       printk("constext state dropped!!!\n");
-       }
-
-       if (j & 1)
-               OUT_RING(0);
-
-       ADVANCE_LP_RING();
-}
-
-static void i810EmitTexVerified(struct drm_device *dev, volatile unsigned int *code)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       int i, j = 0;
-       unsigned int tmp;
-       RING_LOCALS;
-
-       BEGIN_LP_RING(I810_TEX_SETUP_SIZE);
-
-       OUT_RING(GFX_OP_MAP_INFO);
-       OUT_RING(code[I810_TEXREG_MI1]);
-       OUT_RING(code[I810_TEXREG_MI2]);
-       OUT_RING(code[I810_TEXREG_MI3]);
-
-       for (i = 4; i < I810_TEX_SETUP_SIZE; i++) {
-               tmp = code[i];
-
-               if ((tmp & (7 << 29)) == (3 << 29) &&
-                   (tmp & (0x1f << 24)) < (0x1d << 24)) {
-                       OUT_RING(tmp);
-                       j++;
-               } else
-                       printk("texture state dropped!!!\n");
-       }
-
-       if (j & 1)
-               OUT_RING(0);
-
-       ADVANCE_LP_RING();
-}
-
-/* Need to do some additional checking when setting the dest buffer.
- */
-static void i810EmitDestVerified(struct drm_device *dev,
-                                volatile unsigned int *code)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       unsigned int tmp;
-       RING_LOCALS;
-
-       BEGIN_LP_RING(I810_DEST_SETUP_SIZE + 2);
-
-       tmp = code[I810_DESTREG_DI1];
-       if (tmp == dev_priv->front_di1 || tmp == dev_priv->back_di1) {
-               OUT_RING(CMD_OP_DESTBUFFER_INFO);
-               OUT_RING(tmp);
-       } else
-               DRM_DEBUG("bad di1 %x (allow %x or %x)\n",
-                         tmp, dev_priv->front_di1, dev_priv->back_di1);
-
-       /* invarient:
-        */
-       OUT_RING(CMD_OP_Z_BUFFER_INFO);
-       OUT_RING(dev_priv->zi1);
-
-       OUT_RING(GFX_OP_DESTBUFFER_VARS);
-       OUT_RING(code[I810_DESTREG_DV1]);
-
-       OUT_RING(GFX_OP_DRAWRECT_INFO);
-       OUT_RING(code[I810_DESTREG_DR1]);
-       OUT_RING(code[I810_DESTREG_DR2]);
-       OUT_RING(code[I810_DESTREG_DR3]);
-       OUT_RING(code[I810_DESTREG_DR4]);
-       OUT_RING(0);
-
-       ADVANCE_LP_RING();
-}
-
-static void i810EmitState(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int dirty = sarea_priv->dirty;
-
-       DRM_DEBUG("%x\n", dirty);
-
-       if (dirty & I810_UPLOAD_BUFFERS) {
-               i810EmitDestVerified(dev, sarea_priv->BufferState);
-               sarea_priv->dirty &= ~I810_UPLOAD_BUFFERS;
-       }
-
-       if (dirty & I810_UPLOAD_CTX) {
-               i810EmitContextVerified(dev, sarea_priv->ContextState);
-               sarea_priv->dirty &= ~I810_UPLOAD_CTX;
-       }
-
-       if (dirty & I810_UPLOAD_TEX0) {
-               i810EmitTexVerified(dev, sarea_priv->TexState[0]);
-               sarea_priv->dirty &= ~I810_UPLOAD_TEX0;
-       }
-
-       if (dirty & I810_UPLOAD_TEX1) {
-               i810EmitTexVerified(dev, sarea_priv->TexState[1]);
-               sarea_priv->dirty &= ~I810_UPLOAD_TEX1;
-       }
-}
-
-/* need to verify
- */
-static void i810_dma_dispatch_clear(struct drm_device *dev, int flags,
-                                   unsigned int clear_color,
-                                   unsigned int clear_zval)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       int nbox = sarea_priv->nbox;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       int pitch = dev_priv->pitch;
-       int cpp = 2;
-       int i;
-       RING_LOCALS;
-
-       if (dev_priv->current_page == 1) {
-               unsigned int tmp = flags;
-
-               flags &= ~(I810_FRONT | I810_BACK);
-               if (tmp & I810_FRONT)
-                       flags |= I810_BACK;
-               if (tmp & I810_BACK)
-                       flags |= I810_FRONT;
-       }
-
-       i810_kernel_lost_context(dev);
-
-       if (nbox > I810_NR_SAREA_CLIPRECTS)
-               nbox = I810_NR_SAREA_CLIPRECTS;
-
-       for (i = 0; i < nbox; i++, pbox++) {
-               unsigned int x = pbox->x1;
-               unsigned int y = pbox->y1;
-               unsigned int width = (pbox->x2 - x) * cpp;
-               unsigned int height = pbox->y2 - y;
-               unsigned int start = y * pitch + x * cpp;
-
-               if (pbox->x1 > pbox->x2 ||
-                   pbox->y1 > pbox->y2 ||
-                   pbox->x2 > dev_priv->w || pbox->y2 > dev_priv->h)
-                       continue;
-
-               if (flags & I810_FRONT) {
-                       BEGIN_LP_RING(6);
-                       OUT_RING(BR00_BITBLT_CLIENT | BR00_OP_COLOR_BLT | 0x3);
-                       OUT_RING(BR13_SOLID_PATTERN | (0xF0 << 16) | pitch);
-                       OUT_RING((height << 16) | width);
-                       OUT_RING(start);
-                       OUT_RING(clear_color);
-                       OUT_RING(0);
-                       ADVANCE_LP_RING();
-               }
-
-               if (flags & I810_BACK) {
-                       BEGIN_LP_RING(6);
-                       OUT_RING(BR00_BITBLT_CLIENT | BR00_OP_COLOR_BLT | 0x3);
-                       OUT_RING(BR13_SOLID_PATTERN | (0xF0 << 16) | pitch);
-                       OUT_RING((height << 16) | width);
-                       OUT_RING(dev_priv->back_offset + start);
-                       OUT_RING(clear_color);
-                       OUT_RING(0);
-                       ADVANCE_LP_RING();
-               }
-
-               if (flags & I810_DEPTH) {
-                       BEGIN_LP_RING(6);
-                       OUT_RING(BR00_BITBLT_CLIENT | BR00_OP_COLOR_BLT | 0x3);
-                       OUT_RING(BR13_SOLID_PATTERN | (0xF0 << 16) | pitch);
-                       OUT_RING((height << 16) | width);
-                       OUT_RING(dev_priv->depth_offset + start);
-                       OUT_RING(clear_zval);
-                       OUT_RING(0);
-                       ADVANCE_LP_RING();
-               }
-       }
-}
-
-static void i810_dma_dispatch_swap(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       int nbox = sarea_priv->nbox;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       int pitch = dev_priv->pitch;
-       int cpp = 2;
-       int i;
-       RING_LOCALS;
-
-       DRM_DEBUG("swapbuffers\n");
-
-       i810_kernel_lost_context(dev);
-
-       if (nbox > I810_NR_SAREA_CLIPRECTS)
-               nbox = I810_NR_SAREA_CLIPRECTS;
-
-       for (i = 0; i < nbox; i++, pbox++) {
-               unsigned int w = pbox->x2 - pbox->x1;
-               unsigned int h = pbox->y2 - pbox->y1;
-               unsigned int dst = pbox->x1 * cpp + pbox->y1 * pitch;
-               unsigned int start = dst;
-
-               if (pbox->x1 > pbox->x2 ||
-                   pbox->y1 > pbox->y2 ||
-                   pbox->x2 > dev_priv->w || pbox->y2 > dev_priv->h)
-                       continue;
-
-               BEGIN_LP_RING(6);
-               OUT_RING(BR00_BITBLT_CLIENT | BR00_OP_SRC_COPY_BLT | 0x4);
-               OUT_RING(pitch | (0xCC << 16));
-               OUT_RING((h << 16) | (w * cpp));
-               if (dev_priv->current_page == 0)
-                       OUT_RING(dev_priv->front_offset + start);
-               else
-                       OUT_RING(dev_priv->back_offset + start);
-               OUT_RING(pitch);
-               if (dev_priv->current_page == 0)
-                       OUT_RING(dev_priv->back_offset + start);
-               else
-                       OUT_RING(dev_priv->front_offset + start);
-               ADVANCE_LP_RING();
-       }
-}
-
-static void i810_dma_dispatch_vertex(struct drm_device *dev,
-                                    struct drm_buf *buf, int discard, int used)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-       drm_i810_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       struct drm_clip_rect *box = sarea_priv->boxes;
-       int nbox = sarea_priv->nbox;
-       unsigned long address = (unsigned long)buf->bus_address;
-       unsigned long start = address - dev->agp->base;
-       int i = 0;
-       RING_LOCALS;
-
-       i810_kernel_lost_context(dev);
-
-       if (nbox > I810_NR_SAREA_CLIPRECTS)
-               nbox = I810_NR_SAREA_CLIPRECTS;
-
-       if (used < 0 || used > 4 * 1024)
-               used = 0;
-
-       if (sarea_priv->dirty)
-               i810EmitState(dev);
-
-       if (buf_priv->currently_mapped == I810_BUF_MAPPED) {
-               unsigned int prim = (sarea_priv->vertex_prim & PR_MASK);
-
-               *(u32 *) buf_priv->kernel_virtual =
-                   ((GFX_OP_PRIMITIVE | prim | ((used / 4) - 2)));
-
-               if (used & 4) {
-                       *(u32 *) ((char *) buf_priv->kernel_virtual + used) = 0;
-                       used += 4;
-               }
-
-               i810_unmap_buffer(buf);
-       }
-
-       if (used) {
-               do {
-                       if (i < nbox) {
-                               BEGIN_LP_RING(4);
-                               OUT_RING(GFX_OP_SCISSOR | SC_UPDATE_SCISSOR |
-                                        SC_ENABLE);
-                               OUT_RING(GFX_OP_SCISSOR_INFO);
-                               OUT_RING(box[i].x1 | (box[i].y1 << 16));
-                               OUT_RING((box[i].x2 -
-                                         1) | ((box[i].y2 - 1) << 16));
-                               ADVANCE_LP_RING();
-                       }
-
-                       BEGIN_LP_RING(4);
-                       OUT_RING(CMD_OP_BATCH_BUFFER);
-                       OUT_RING(start | BB1_PROTECTED);
-                       OUT_RING(start + used - 4);
-                       OUT_RING(0);
-                       ADVANCE_LP_RING();
-
-               } while (++i < nbox);
-       }
-
-       if (discard) {
-               dev_priv->counter++;
-
-               (void)cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
-                             I810_BUF_HARDWARE);
-
-               BEGIN_LP_RING(8);
-               OUT_RING(CMD_STORE_DWORD_IDX);
-               OUT_RING(20);
-               OUT_RING(dev_priv->counter);
-               OUT_RING(CMD_STORE_DWORD_IDX);
-               OUT_RING(buf_priv->my_use_idx);
-               OUT_RING(I810_BUF_FREE);
-               OUT_RING(CMD_REPORT_HEAD);
-               OUT_RING(0);
-               ADVANCE_LP_RING();
-       }
-}
-
-static void i810_dma_dispatch_flip(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       int pitch = dev_priv->pitch;
-       RING_LOCALS;
-
-       DRM_DEBUG("page=%d pfCurrentPage=%d\n",
-                 dev_priv->current_page,
-                 dev_priv->sarea_priv->pf_current_page);
-
-       i810_kernel_lost_context(dev);
-
-       BEGIN_LP_RING(2);
-       OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE);
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-
-       BEGIN_LP_RING(I810_DEST_SETUP_SIZE + 2);
-       /* On i815 at least ASYNC is buggy */
-       /* pitch<<5 is from 11.2.8 p158,
-          its the pitch / 8 then left shifted 8,
-          so (pitch >> 3) << 8 */
-       OUT_RING(CMD_OP_FRONTBUFFER_INFO | (pitch << 5) /*| ASYNC_FLIP */ );
-       if (dev_priv->current_page == 0) {
-               OUT_RING(dev_priv->back_offset);
-               dev_priv->current_page = 1;
-       } else {
-               OUT_RING(dev_priv->front_offset);
-               dev_priv->current_page = 0;
-       }
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-
-       BEGIN_LP_RING(2);
-       OUT_RING(CMD_OP_WAIT_FOR_EVENT | WAIT_FOR_PLANE_A_FLIP);
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-
-       /* Increment the frame counter.  The client-side 3D driver must
-        * throttle the framerate by waiting for this value before
-        * performing the swapbuffer ioctl.
-        */
-       dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
-
-}
-
-static void i810_dma_quiescent(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       RING_LOCALS;
-
-       i810_kernel_lost_context(dev);
-
-       BEGIN_LP_RING(4);
-       OUT_RING(INST_PARSER_CLIENT | INST_OP_FLUSH | INST_FLUSH_MAP_CACHE);
-       OUT_RING(CMD_REPORT_HEAD);
-       OUT_RING(0);
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-
-       i810_wait_ring(dev, dev_priv->ring.Size - 8);
-}
-
-static void i810_flush_queue(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       int i;
-       RING_LOCALS;
-
-       i810_kernel_lost_context(dev);
-
-       BEGIN_LP_RING(2);
-       OUT_RING(CMD_REPORT_HEAD);
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-
-       i810_wait_ring(dev, dev_priv->ring.Size - 8);
-
-       for (i = 0; i < dma->buf_count; i++) {
-               struct drm_buf *buf = dma->buflist[i];
-               drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-
-               int used = cmpxchg(buf_priv->in_use, I810_BUF_HARDWARE,
-                                  I810_BUF_FREE);
-
-               if (used == I810_BUF_HARDWARE)
-                       DRM_DEBUG("reclaimed from HARDWARE\n");
-               if (used == I810_BUF_CLIENT)
-                       DRM_DEBUG("still on client\n");
-       }
-
-       return;
-}
-
-/* Must be called with the lock held */
-void i810_driver_reclaim_buffers(struct drm_device *dev,
-                                struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       int i;
-
-       if (!dma)
-               return;
-       if (!dev->dev_private)
-               return;
-       if (!dma->buflist)
-               return;
-
-       i810_flush_queue(dev);
-
-       for (i = 0; i < dma->buf_count; i++) {
-               struct drm_buf *buf = dma->buflist[i];
-               drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-
-               if (buf->file_priv == file_priv && buf_priv) {
-                       int used = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT,
-                                          I810_BUF_FREE);
-
-                       if (used == I810_BUF_CLIENT)
-                               DRM_DEBUG("reclaimed from client\n");
-                       if (buf_priv->currently_mapped == I810_BUF_MAPPED)
-                               buf_priv->currently_mapped = I810_BUF_UNMAPPED;
-               }
-       }
-}
-
-static int i810_flush_ioctl(struct drm_device *dev, void *data,
-                           struct drm_file *file_priv)
-{
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       i810_flush_queue(dev);
-       return 0;
-}
-
-static int i810_dma_vertex(struct drm_device *dev, void *data,
-                          struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-       u32 *hw_status = dev_priv->hw_status_page;
-       drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
-           dev_priv->sarea_priv;
-       drm_i810_vertex_t *vertex = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DRM_DEBUG("idx %d used %d discard %d\n",
-                 vertex->idx, vertex->used, vertex->discard);
-
-       if (vertex->idx < 0 || vertex->idx >= dma->buf_count)
-               return -EINVAL;
-
-       i810_dma_dispatch_vertex(dev,
-                                dma->buflist[vertex->idx],
-                                vertex->discard, vertex->used);
-
-       sarea_priv->last_enqueue = dev_priv->counter - 1;
-       sarea_priv->last_dispatch = (int)hw_status[5];
-
-       return 0;
-}
-
-static int i810_clear_bufs(struct drm_device *dev, void *data,
-                          struct drm_file *file_priv)
-{
-       drm_i810_clear_t *clear = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       /* GH: Someone's doing nasty things... */
-       if (!dev->dev_private)
-               return -EINVAL;
-
-       i810_dma_dispatch_clear(dev, clear->flags,
-                               clear->clear_color, clear->clear_depth);
-       return 0;
-}
-
-static int i810_swap_bufs(struct drm_device *dev, void *data,
-                         struct drm_file *file_priv)
-{
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       i810_dma_dispatch_swap(dev);
-       return 0;
-}
-
-static int i810_getage(struct drm_device *dev, void *data,
-                      struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-       u32 *hw_status = dev_priv->hw_status_page;
-       drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
-           dev_priv->sarea_priv;
-
-       sarea_priv->last_dispatch = (int)hw_status[5];
-       return 0;
-}
-
-static int i810_getbuf(struct drm_device *dev, void *data,
-                      struct drm_file *file_priv)
-{
-       int retcode = 0;
-       drm_i810_dma_t *d = data;
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-       u32 *hw_status = dev_priv->hw_status_page;
-       drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
-           dev_priv->sarea_priv;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       d->granted = 0;
-
-       retcode = i810_dma_get_buffer(dev, d, file_priv);
-
-       DRM_DEBUG("i810_dma: %d returning %d, granted = %d\n",
-                 task_pid_nr(current), retcode, d->granted);
-
-       sarea_priv->last_dispatch = (int)hw_status[5];
-
-       return retcode;
-}
-
-static int i810_copybuf(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv)
-{
-       /* Never copy - 2.4.x doesn't need it */
-       return 0;
-}
-
-static int i810_docopy(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv)
-{
-       /* Never copy - 2.4.x doesn't need it */
-       return 0;
-}
-
-static void i810_dma_dispatch_mc(struct drm_device *dev, struct drm_buf *buf, int used,
-                                unsigned int last_render)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-       drm_i810_buf_priv_t *buf_priv = buf->dev_private;
-       drm_i810_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned long address = (unsigned long)buf->bus_address;
-       unsigned long start = address - dev->agp->base;
-       int u;
-       RING_LOCALS;
-
-       i810_kernel_lost_context(dev);
-
-       u = cmpxchg(buf_priv->in_use, I810_BUF_CLIENT, I810_BUF_HARDWARE);
-       if (u != I810_BUF_CLIENT)
-               DRM_DEBUG("MC found buffer that isn't mine!\n");
-
-       if (used < 0 || used > 4 * 1024)
-               used = 0;
-
-       sarea_priv->dirty = 0x7f;
-
-       DRM_DEBUG("addr 0x%lx, used 0x%x\n", address, used);
-
-       dev_priv->counter++;
-       DRM_DEBUG("dispatch counter : %ld\n", dev_priv->counter);
-       DRM_DEBUG("start : %lx\n", start);
-       DRM_DEBUG("used : %d\n", used);
-       DRM_DEBUG("start + used - 4 : %ld\n", start + used - 4);
-
-       if (buf_priv->currently_mapped == I810_BUF_MAPPED) {
-               if (used & 4) {
-                       *(u32 *) ((char *) buf_priv->virtual + used) = 0;
-                       used += 4;
-               }
-
-               i810_unmap_buffer(buf);
-       }
-       BEGIN_LP_RING(4);
-       OUT_RING(CMD_OP_BATCH_BUFFER);
-       OUT_RING(start | BB1_PROTECTED);
-       OUT_RING(start + used - 4);
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-
-       BEGIN_LP_RING(8);
-       OUT_RING(CMD_STORE_DWORD_IDX);
-       OUT_RING(buf_priv->my_use_idx);
-       OUT_RING(I810_BUF_FREE);
-       OUT_RING(0);
-
-       OUT_RING(CMD_STORE_DWORD_IDX);
-       OUT_RING(16);
-       OUT_RING(last_render);
-       OUT_RING(0);
-       ADVANCE_LP_RING();
-}
-
-static int i810_dma_mc(struct drm_device *dev, void *data,
-                      struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-       u32 *hw_status = dev_priv->hw_status_page;
-       drm_i810_sarea_t *sarea_priv = (drm_i810_sarea_t *)
-           dev_priv->sarea_priv;
-       drm_i810_mc_t *mc = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (mc->idx >= dma->buf_count || mc->idx < 0)
-               return -EINVAL;
-
-       i810_dma_dispatch_mc(dev, dma->buflist[mc->idx], mc->used,
-                            mc->last_render);
-
-       sarea_priv->last_enqueue = dev_priv->counter - 1;
-       sarea_priv->last_dispatch = (int)hw_status[5];
-
-       return 0;
-}
-
-static int i810_rstatus(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-
-       return (int)(((u32 *) (dev_priv->hw_status_page))[4]);
-}
-
-static int i810_ov0_info(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-       drm_i810_overlay_t *ov = data;
-
-       ov->offset = dev_priv->overlay_offset;
-       ov->physical = dev_priv->overlay_physical;
-
-       return 0;
-}
-
-static int i810_fstatus(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-       return I810_READ(0x30008);
-}
-
-static int i810_ov0_flip(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv = (drm_i810_private_t *) dev->dev_private;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       /* Tell the overlay to update */
-       I810_WRITE(0x30000, dev_priv->overlay_physical | 0x80000000);
-
-       return 0;
-}
-
-/* Not sure why this isn't set all the time:
- */
-static void i810_do_init_pageflip(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-
-       DRM_DEBUG("\n");
-       dev_priv->page_flipping = 1;
-       dev_priv->current_page = 0;
-       dev_priv->sarea_priv->pf_current_page = dev_priv->current_page;
-}
-
-static int i810_do_cleanup_pageflip(struct drm_device *dev)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-
-       DRM_DEBUG("\n");
-       if (dev_priv->current_page != 0)
-               i810_dma_dispatch_flip(dev);
-
-       dev_priv->page_flipping = 0;
-       return 0;
-}
-
-static int i810_flip_bufs(struct drm_device *dev, void *data,
-                         struct drm_file *file_priv)
-{
-       drm_i810_private_t *dev_priv = dev->dev_private;
-
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (!dev_priv->page_flipping)
-               i810_do_init_pageflip(dev);
-
-       i810_dma_dispatch_flip(dev);
-       return 0;
-}
-
-int i810_driver_load(struct drm_device *dev, unsigned long flags)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-
-       dev->agp = drm_legacy_agp_init(dev);
-       if (dev->agp) {
-               dev->agp->agp_mtrr = arch_phys_wc_add(
-                       dev->agp->agp_info.aper_base,
-                       dev->agp->agp_info.aper_size *
-                       1024 * 1024);
-       }
-
-       /* Our userspace depends upon the agp mapping support. */
-       if (!dev->agp)
-               return -EINVAL;
-
-       pci_set_master(pdev);
-
-       return 0;
-}
-
-void i810_driver_lastclose(struct drm_device *dev)
-{
-       i810_dma_cleanup(dev);
-}
-
-void i810_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
-{
-       if (dev->dev_private) {
-               drm_i810_private_t *dev_priv = dev->dev_private;
-               if (dev_priv->page_flipping)
-                       i810_do_cleanup_pageflip(dev);
-       }
-
-       if (file_priv->master && file_priv->master->lock.hw_lock) {
-               drm_legacy_idlelock_take(&file_priv->master->lock);
-               i810_driver_reclaim_buffers(dev, file_priv);
-               drm_legacy_idlelock_release(&file_priv->master->lock);
-       } else {
-               /* master disappeared, clean up stuff anyway and hope nothing
-                * goes wrong */
-               i810_driver_reclaim_buffers(dev, file_priv);
-       }
-
-}
-
-int i810_driver_dma_quiescent(struct drm_device *dev)
-{
-       i810_dma_quiescent(dev);
-       return 0;
-}
-
-const struct drm_ioctl_desc i810_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(I810_INIT, i810_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_VERTEX, i810_dma_vertex, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_CLEAR, i810_clear_bufs, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_FLUSH, i810_flush_ioctl, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_GETAGE, i810_getage, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_GETBUF, i810_getbuf, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_SWAP, i810_swap_bufs, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_COPY, i810_copybuf, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_DOCOPY, i810_docopy, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_OV0INFO, i810_ov0_info, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_FSTATUS, i810_fstatus, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_OV0FLIP, i810_ov0_flip, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_MC, i810_dma_mc, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_RSTATUS, i810_rstatus, DRM_AUTH|DRM_UNLOCKED),
-       DRM_IOCTL_DEF_DRV(I810_FLIP, i810_flip_bufs, DRM_AUTH|DRM_UNLOCKED),
-};
-
-int i810_max_ioctl = ARRAY_SIZE(i810_ioctls);
diff --git a/drivers/gpu/drm/i810/i810_drv.c b/drivers/gpu/drm/i810/i810_drv.c
deleted file mode 100644 (file)
index 0e53a06..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/* i810_drv.c -- I810 driver -*- linux-c -*-
- * Created: Mon Dec 13 01:56:22 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Rickard E. (Rik) Faith <faith@valinux.com>
- *    Jeff Hartmann <jhartmann@valinux.com>
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include "i810_drv.h"
-
-#include <linux/module.h>
-#include <linux/pci.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_pciids.h>
-#include <drm/i810_drm.h>
-
-
-static struct pci_device_id pciidlist[] = {
-       i810_PCI_IDS
-};
-
-static const struct file_operations i810_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-       .compat_ioctl = drm_compat_ioctl,
-       .llseek = noop_llseek,
-};
-
-static struct drm_driver driver = {
-       .driver_features = DRIVER_USE_AGP | DRIVER_HAVE_DMA | DRIVER_LEGACY,
-       .dev_priv_size = sizeof(drm_i810_buf_priv_t),
-       .load = i810_driver_load,
-       .lastclose = i810_driver_lastclose,
-       .preclose = i810_driver_preclose,
-       .dma_quiescent = i810_driver_dma_quiescent,
-       .ioctls = i810_ioctls,
-       .fops = &i810_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-static struct pci_driver i810_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init i810_init(void)
-{
-       if (num_possible_cpus() > 1) {
-               pr_err("drm/i810 does not support SMP\n");
-               return -EINVAL;
-       }
-       driver.num_ioctls = i810_max_ioctl;
-       return drm_legacy_pci_init(&driver, &i810_pci_driver);
-}
-
-static void __exit i810_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &i810_pci_driver);
-}
-
-module_init(i810_init);
-module_exit(i810_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/i810/i810_drv.h b/drivers/gpu/drm/i810/i810_drv.h
deleted file mode 100644 (file)
index 9df3981..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-/* i810_drv.h -- Private header for the Matrox g200/g400 driver -*- linux-c -*-
- * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors: Rickard E. (Rik) Faith <faith@valinux.com>
- *         Jeff Hartmann <jhartmann@valinux.com>
- *
- */
-
-#ifndef _I810_DRV_H_
-#define _I810_DRV_H_
-
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/i810_drm.h>
-
-/* General customization:
- */
-
-#define DRIVER_AUTHOR          "VA Linux Systems Inc."
-
-#define DRIVER_NAME            "i810"
-#define DRIVER_DESC            "Intel i810"
-#define DRIVER_DATE            "20030605"
-
-/* Interface history
- *
- * 1.1   - XFree86 4.1
- * 1.2   - XvMC interfaces
- *       - XFree86 4.2
- * 1.2.1 - Disable copying code (leave stub ioctls for backwards compatibility)
- *       - Remove requirement for interrupt (leave stubs again)
- * 1.3   - Add page flipping.
- * 1.4   - fix DRM interface
- */
-#define DRIVER_MAJOR           1
-#define DRIVER_MINOR           4
-#define DRIVER_PATCHLEVEL      0
-
-typedef struct drm_i810_buf_priv {
-       u32 *in_use;
-       int my_use_idx;
-       int currently_mapped;
-       void *virtual;
-       void *kernel_virtual;
-       drm_local_map_t map;
-} drm_i810_buf_priv_t;
-
-typedef struct _drm_i810_ring_buffer {
-       int tail_mask;
-       unsigned long Start;
-       unsigned long End;
-       unsigned long Size;
-       u8 *virtual_start;
-       int head;
-       int tail;
-       int space;
-       drm_local_map_t map;
-} drm_i810_ring_buffer_t;
-
-typedef struct drm_i810_private {
-       struct drm_local_map *sarea_map;
-       struct drm_local_map *mmio_map;
-
-       drm_i810_sarea_t *sarea_priv;
-       drm_i810_ring_buffer_t ring;
-
-       void *hw_status_page;
-       unsigned long counter;
-
-       dma_addr_t dma_status_page;
-
-       struct drm_buf *mmap_buffer;
-
-       u32 front_di1, back_di1, zi1;
-
-       int back_offset;
-       int depth_offset;
-       int overlay_offset;
-       int overlay_physical;
-       int w, h;
-       int pitch;
-       int back_pitch;
-       int depth_pitch;
-
-       int do_boxes;
-       int dma_used;
-
-       int current_page;
-       int page_flipping;
-
-       wait_queue_head_t irq_queue;
-       atomic_t irq_received;
-       atomic_t irq_emitted;
-
-       int front_offset;
-} drm_i810_private_t;
-
-                               /* i810_dma.c */
-extern int i810_driver_dma_quiescent(struct drm_device *dev);
-void i810_driver_reclaim_buffers(struct drm_device *dev,
-                                struct drm_file *file_priv);
-extern int i810_driver_load(struct drm_device *, unsigned long flags);
-extern void i810_driver_lastclose(struct drm_device *dev);
-extern void i810_driver_preclose(struct drm_device *dev,
-                                struct drm_file *file_priv);
-
-extern long i810_ioctl(struct file *file, unsigned int cmd, unsigned long arg);
-extern const struct drm_ioctl_desc i810_ioctls[];
-extern int i810_max_ioctl;
-
-#define I810_BASE(reg)         ((unsigned long) \
-                               dev_priv->mmio_map->handle)
-#define I810_ADDR(reg)         (I810_BASE(reg) + reg)
-#define I810_DEREF(reg)                (*(__volatile__ int *)I810_ADDR(reg))
-#define I810_READ(reg)         I810_DEREF(reg)
-#define I810_WRITE(reg, val)   do { I810_DEREF(reg) = val; } while (0)
-#define I810_DEREF16(reg)      (*(__volatile__ u16 *)I810_ADDR(reg))
-#define I810_READ16(reg)       I810_DEREF16(reg)
-#define I810_WRITE16(reg, val) do { I810_DEREF16(reg) = val; } while (0)
-
-#define I810_VERBOSE 0
-#define RING_LOCALS    unsigned int outring, ringmask; \
-                       volatile char *virt;
-
-#define BEGIN_LP_RING(n) do {                                  \
-       if (I810_VERBOSE)                                       \
-               DRM_DEBUG("BEGIN_LP_RING(%d)\n", n);            \
-       if (dev_priv->ring.space < n*4)                         \
-               i810_wait_ring(dev, n*4);                       \
-       dev_priv->ring.space -= n*4;                            \
-       outring = dev_priv->ring.tail;                          \
-       ringmask = dev_priv->ring.tail_mask;                    \
-       virt = dev_priv->ring.virtual_start;                    \
-} while (0)
-
-#define ADVANCE_LP_RING() do {                                 \
-       if (I810_VERBOSE)                                       \
-               DRM_DEBUG("ADVANCE_LP_RING\n");                 \
-       dev_priv->ring.tail = outring;                          \
-       I810_WRITE(LP_RING + RING_TAIL, outring);               \
-} while (0)
-
-#define OUT_RING(n) do {                                       \
-       if (I810_VERBOSE)                                       \
-               DRM_DEBUG("   OUT_RING %x\n", (int)(n));        \
-       *(volatile unsigned int *)(virt + outring) = n;         \
-       outring += 4;                                           \
-       outring &= ringmask;                                    \
-} while (0)
-
-#define GFX_OP_USER_INTERRUPT          ((0<<29)|(2<<23))
-#define GFX_OP_BREAKPOINT_INTERRUPT    ((0<<29)|(1<<23))
-#define CMD_REPORT_HEAD                        (7<<23)
-#define CMD_STORE_DWORD_IDX            ((0x21<<23) | 0x1)
-#define CMD_OP_BATCH_BUFFER  ((0x0<<29)|(0x30<<23)|0x1)
-
-#define INST_PARSER_CLIENT   0x00000000
-#define INST_OP_FLUSH        0x02000000
-#define INST_FLUSH_MAP_CACHE 0x00000001
-
-#define BB1_START_ADDR_MASK   (~0x7)
-#define BB1_PROTECTED         (1<<0)
-#define BB1_UNPROTECTED       (0<<0)
-#define BB2_END_ADDR_MASK     (~0x7)
-
-#define I810REG_HWSTAM         0x02098
-#define I810REG_INT_IDENTITY_R 0x020a4
-#define I810REG_INT_MASK_R     0x020a8
-#define I810REG_INT_ENABLE_R   0x020a0
-
-#define LP_RING                        0x2030
-#define HP_RING                        0x2040
-#define RING_TAIL              0x00
-#define TAIL_ADDR              0x000FFFF8
-#define RING_HEAD              0x04
-#define HEAD_WRAP_COUNT                0xFFE00000
-#define HEAD_WRAP_ONE          0x00200000
-#define HEAD_ADDR              0x001FFFFC
-#define RING_START             0x08
-#define START_ADDR             0x00FFFFF8
-#define RING_LEN               0x0C
-#define RING_NR_PAGES          0x000FF000
-#define RING_REPORT_MASK       0x00000006
-#define RING_REPORT_64K                0x00000002
-#define RING_REPORT_128K       0x00000004
-#define RING_NO_REPORT         0x00000000
-#define RING_VALID_MASK                0x00000001
-#define RING_VALID             0x00000001
-#define RING_INVALID           0x00000000
-
-#define GFX_OP_SCISSOR         ((0x3<<29)|(0x1c<<24)|(0x10<<19))
-#define SC_UPDATE_SCISSOR       (0x1<<1)
-#define SC_ENABLE_MASK          (0x1<<0)
-#define SC_ENABLE               (0x1<<0)
-
-#define GFX_OP_SCISSOR_INFO    ((0x3<<29)|(0x1d<<24)|(0x81<<16)|(0x1))
-#define SCI_YMIN_MASK      (0xffff<<16)
-#define SCI_XMIN_MASK      (0xffff<<0)
-#define SCI_YMAX_MASK      (0xffff<<16)
-#define SCI_XMAX_MASK      (0xffff<<0)
-
-#define GFX_OP_COLOR_FACTOR      ((0x3<<29)|(0x1d<<24)|(0x1<<16)|0x0)
-#define GFX_OP_STIPPLE           ((0x3<<29)|(0x1d<<24)|(0x83<<16))
-#define GFX_OP_MAP_INFO          ((0x3<<29)|(0x1d<<24)|0x2)
-#define GFX_OP_DESTBUFFER_VARS   ((0x3<<29)|(0x1d<<24)|(0x85<<16)|0x0)
-#define GFX_OP_DRAWRECT_INFO     ((0x3<<29)|(0x1d<<24)|(0x80<<16)|(0x3))
-#define GFX_OP_PRIMITIVE         ((0x3<<29)|(0x1f<<24))
-
-#define CMD_OP_Z_BUFFER_INFO     ((0x0<<29)|(0x16<<23))
-#define CMD_OP_DESTBUFFER_INFO   ((0x0<<29)|(0x15<<23))
-#define CMD_OP_FRONTBUFFER_INFO  ((0x0<<29)|(0x14<<23))
-#define CMD_OP_WAIT_FOR_EVENT    ((0x0<<29)|(0x03<<23))
-
-#define BR00_BITBLT_CLIENT   0x40000000
-#define BR00_OP_COLOR_BLT    0x10000000
-#define BR00_OP_SRC_COPY_BLT 0x10C00000
-#define BR13_SOLID_PATTERN   0x80000000
-
-#define WAIT_FOR_PLANE_A_SCANLINES (1<<1)
-#define WAIT_FOR_PLANE_A_FLIP      (1<<2)
-#define WAIT_FOR_VBLANK (1<<3)
-
-#endif
index 03ed4607a46d2181dded13e42398ddfffa38b944..bbdb98d7c96e01ec45e004be48e3625fdb4459d5 100644 (file)
@@ -267,23 +267,16 @@ static int intelfb_create(struct drm_fb_helper *helper,
 
        info->fbops = &intelfb_ops;
 
-       /* setup aperture base/size for vesafb takeover */
        obj = intel_fb_obj(&intel_fb->base);
        if (i915_gem_object_is_lmem(obj)) {
                struct intel_memory_region *mem = obj->mm.region;
 
-               info->apertures->ranges[0].base = mem->io_start;
-               info->apertures->ranges[0].size = mem->io_size;
-
                /* Use fbdev's framebuffer from lmem for discrete */
                info->fix.smem_start =
                        (unsigned long)(mem->io_start +
                                        i915_gem_object_get_dma_address(obj, 0));
                info->fix.smem_len = obj->base.size;
        } else {
-               info->apertures->ranges[0].base = ggtt->gmadr.start;
-               info->apertures->ranges[0].size = ggtt->mappable_end;
-
                /* Our framebuffer is the entirety of fbdev's system memory */
                info->fix.smem_start =
                        (unsigned long)(ggtt->gmadr.start + i915_ggtt_offset(vma));
index 3d5af44bf92d5bd7e985943d98da1c18bd481a16..5ec75e9ba499ae4abc493b4312fae383b3a3fe0a 100644 (file)
@@ -26,7 +26,6 @@
 #include <drm/drm_bridge_connector.h>
 #include <drm/drm_color_mgmt.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_encoder.h>
index 06613ffeaaf85eb401a45cb70a6e7dd313832ba3..647872f65bff98cfb35822b78e6fa004fa69ebf0 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_print.h>
 #include <drm/drm_vblank.h>
 #include <drm/drm_modeset_helper_vtables.h>
index d172a302f902404405ff730414e42d3225cf4231..9e0562aa2bcb5ab4e2cbd71940ef4c147a7aa5ad 100644 (file)
@@ -7,7 +7,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_blend.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
index 815cebb4c4ca168c212b85c08cd4c1799248f0e5..689049d395c0d4a4ceaf757748c16a6f1caa1ce7 100644 (file)
@@ -9,7 +9,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
 #include <drm/drm_connector.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_gem_dma_helper.h>
index 9971950ebd4ee8c41b701c878213e1cc25385b23..3cf04b70bd2712765785edf71f37368c55f78162 100644 (file)
@@ -8,7 +8,6 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
diff --git a/drivers/gpu/drm/mga/Makefile b/drivers/gpu/drm/mga/Makefile
deleted file mode 100644 (file)
index db07c7f..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-mga-y := mga_drv.o mga_dma.o mga_state.o mga_warp.o mga_irq.o
-
-mga-$(CONFIG_COMPAT) += mga_ioc32.o
-
-obj-$(CONFIG_DRM_MGA)  += mga.o
-
diff --git a/drivers/gpu/drm/mga/mga_dma.c b/drivers/gpu/drm/mga/mga_dma.c
deleted file mode 100644 (file)
index 331c2f0..0000000
+++ /dev/null
@@ -1,1168 +0,0 @@
-/* mga_dma.c -- DMA support for mga g200/g400 -*- linux-c -*-
- * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * \file mga_dma.c
- * DMA support for MGA G200 / G400.
- *
- * \author Rickard E. (Rik) Faith <faith@valinux.com>
- * \author Jeff Hartmann <jhartmann@valinux.com>
- * \author Keith Whitwell <keith@tungstengraphics.com>
- * \author Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/delay.h>
-
-#include "mga_drv.h"
-
-#define MGA_DEFAULT_USEC_TIMEOUT       10000
-#define MGA_FREELIST_DEBUG             0
-
-#define MINIMAL_CLEANUP 0
-#define FULL_CLEANUP 1
-static int mga_do_cleanup_dma(struct drm_device *dev, int full_cleanup);
-
-/* ================================================================
- * Engine control
- */
-
-int mga_do_wait_for_idle(drm_mga_private_t *dev_priv)
-{
-       u32 status = 0;
-       int i;
-       DRM_DEBUG("\n");
-
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               status = MGA_READ(MGA_STATUS) & MGA_ENGINE_IDLE_MASK;
-               if (status == MGA_ENDPRDMASTS) {
-                       MGA_WRITE8(MGA_CRTC_INDEX, 0);
-                       return 0;
-               }
-               udelay(1);
-       }
-
-#if MGA_DMA_DEBUG
-       DRM_ERROR("failed!\n");
-       DRM_INFO("   status=0x%08x\n", status);
-#endif
-       return -EBUSY;
-}
-
-static int mga_do_dma_reset(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_primary_buffer_t *primary = &dev_priv->prim;
-
-       DRM_DEBUG("\n");
-
-       /* The primary DMA stream should look like new right about now.
-        */
-       primary->tail = 0;
-       primary->space = primary->size;
-       primary->last_flush = 0;
-
-       sarea_priv->last_wrap = 0;
-
-       /* FIXME: Reset counters, buffer ages etc...
-        */
-
-       /* FIXME: What else do we need to reinitialize?  WARP stuff?
-        */
-
-       return 0;
-}
-
-/* ================================================================
- * Primary DMA stream
- */
-
-void mga_do_dma_flush(drm_mga_private_t *dev_priv)
-{
-       drm_mga_primary_buffer_t *primary = &dev_priv->prim;
-       u32 head, tail;
-       u32 status = 0;
-       int i;
-       DMA_LOCALS;
-       DRM_DEBUG("\n");
-
-       /* We need to wait so that we can do an safe flush */
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               status = MGA_READ(MGA_STATUS) & MGA_ENGINE_IDLE_MASK;
-               if (status == MGA_ENDPRDMASTS)
-                       break;
-               udelay(1);
-       }
-
-       if (primary->tail == primary->last_flush) {
-               DRM_DEBUG("   bailing out...\n");
-               return;
-       }
-
-       tail = primary->tail + dev_priv->primary->offset;
-
-       /* We need to pad the stream between flushes, as the card
-        * actually (partially?) reads the first of these commands.
-        * See page 4-16 in the G400 manual, middle of the page or so.
-        */
-       BEGIN_DMA(1);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-       ADVANCE_DMA();
-
-       primary->last_flush = primary->tail;
-
-       head = MGA_READ(MGA_PRIMADDRESS);
-
-       if (head <= tail)
-               primary->space = primary->size - primary->tail;
-       else
-               primary->space = head - tail;
-
-       DRM_DEBUG("   head = 0x%06lx\n", (unsigned long)(head - dev_priv->primary->offset));
-       DRM_DEBUG("   tail = 0x%06lx\n", (unsigned long)(tail - dev_priv->primary->offset));
-       DRM_DEBUG("  space = 0x%06x\n", primary->space);
-
-       mga_flush_write_combine();
-       MGA_WRITE(MGA_PRIMEND, tail | dev_priv->dma_access);
-
-       DRM_DEBUG("done.\n");
-}
-
-void mga_do_dma_wrap_start(drm_mga_private_t *dev_priv)
-{
-       drm_mga_primary_buffer_t *primary = &dev_priv->prim;
-       u32 head, tail;
-       DMA_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_DMA_WRAP();
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-       ADVANCE_DMA();
-
-       tail = primary->tail + dev_priv->primary->offset;
-
-       primary->tail = 0;
-       primary->last_flush = 0;
-       primary->last_wrap++;
-
-       head = MGA_READ(MGA_PRIMADDRESS);
-
-       if (head == dev_priv->primary->offset)
-               primary->space = primary->size;
-       else
-               primary->space = head - dev_priv->primary->offset;
-
-       DRM_DEBUG("   head = 0x%06lx\n", (unsigned long)(head - dev_priv->primary->offset));
-       DRM_DEBUG("   tail = 0x%06x\n", primary->tail);
-       DRM_DEBUG("   wrap = %d\n", primary->last_wrap);
-       DRM_DEBUG("  space = 0x%06x\n", primary->space);
-
-       mga_flush_write_combine();
-       MGA_WRITE(MGA_PRIMEND, tail | dev_priv->dma_access);
-
-       set_bit(0, &primary->wrapped);
-       DRM_DEBUG("done.\n");
-}
-
-void mga_do_dma_wrap_end(drm_mga_private_t *dev_priv)
-{
-       drm_mga_primary_buffer_t *primary = &dev_priv->prim;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       u32 head = dev_priv->primary->offset;
-       DRM_DEBUG("\n");
-
-       sarea_priv->last_wrap++;
-       DRM_DEBUG("   wrap = %d\n", sarea_priv->last_wrap);
-
-       mga_flush_write_combine();
-       MGA_WRITE(MGA_PRIMADDRESS, head | MGA_DMA_GENERAL);
-
-       clear_bit(0, &primary->wrapped);
-       DRM_DEBUG("done.\n");
-}
-
-/* ================================================================
- * Freelist management
- */
-
-#define MGA_BUFFER_USED                (~0)
-#define MGA_BUFFER_FREE                0
-
-#if MGA_FREELIST_DEBUG
-static void mga_freelist_print(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_freelist_t *entry;
-
-       DRM_INFO("\n");
-       DRM_INFO("current dispatch: last=0x%x done=0x%x\n",
-                dev_priv->sarea_priv->last_dispatch,
-                (unsigned int)(MGA_READ(MGA_PRIMADDRESS) -
-                               dev_priv->primary->offset));
-       DRM_INFO("current freelist:\n");
-
-       for (entry = dev_priv->head->next; entry; entry = entry->next) {
-               DRM_INFO("   %p   idx=%2d  age=0x%x 0x%06lx\n",
-                        entry, entry->buf->idx, entry->age.head,
-                        (unsigned long)(entry->age.head - dev_priv->primary->offset));
-       }
-       DRM_INFO("\n");
-}
-#endif
-
-static int mga_freelist_init(struct drm_device *dev, drm_mga_private_t *dev_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_mga_buf_priv_t *buf_priv;
-       drm_mga_freelist_t *entry;
-       int i;
-       DRM_DEBUG("count=%d\n", dma->buf_count);
-
-       dev_priv->head = kzalloc(sizeof(drm_mga_freelist_t), GFP_KERNEL);
-       if (dev_priv->head == NULL)
-               return -ENOMEM;
-
-       SET_AGE(&dev_priv->head->age, MGA_BUFFER_USED, 0);
-
-       for (i = 0; i < dma->buf_count; i++) {
-               buf = dma->buflist[i];
-               buf_priv = buf->dev_private;
-
-               entry = kzalloc(sizeof(drm_mga_freelist_t), GFP_KERNEL);
-               if (entry == NULL)
-                       return -ENOMEM;
-
-               entry->next = dev_priv->head->next;
-               entry->prev = dev_priv->head;
-               SET_AGE(&entry->age, MGA_BUFFER_FREE, 0);
-               entry->buf = buf;
-
-               if (dev_priv->head->next != NULL)
-                       dev_priv->head->next->prev = entry;
-               if (entry->next == NULL)
-                       dev_priv->tail = entry;
-
-               buf_priv->list_entry = entry;
-               buf_priv->discard = 0;
-               buf_priv->dispatched = 0;
-
-               dev_priv->head->next = entry;
-       }
-
-       return 0;
-}
-
-static void mga_freelist_cleanup(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_freelist_t *entry;
-       drm_mga_freelist_t *next;
-       DRM_DEBUG("\n");
-
-       entry = dev_priv->head;
-       while (entry) {
-               next = entry->next;
-               kfree(entry);
-               entry = next;
-       }
-
-       dev_priv->head = dev_priv->tail = NULL;
-}
-
-#if 0
-/* FIXME: Still needed?
- */
-static void mga_freelist_reset(struct drm_device *dev)
-{
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_mga_buf_priv_t *buf_priv;
-       int i;
-
-       for (i = 0; i < dma->buf_count; i++) {
-               buf = dma->buflist[i];
-               buf_priv = buf->dev_private;
-               SET_AGE(&buf_priv->list_entry->age, MGA_BUFFER_FREE, 0);
-       }
-}
-#endif
-
-static struct drm_buf *mga_freelist_get(struct drm_device * dev)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_freelist_t *next;
-       drm_mga_freelist_t *prev;
-       drm_mga_freelist_t *tail = dev_priv->tail;
-       u32 head, wrap;
-       DRM_DEBUG("\n");
-
-       head = MGA_READ(MGA_PRIMADDRESS);
-       wrap = dev_priv->sarea_priv->last_wrap;
-
-       DRM_DEBUG("   tail=0x%06lx %d\n",
-                 tail->age.head ?
-                 (unsigned long)(tail->age.head - dev_priv->primary->offset) : 0,
-                 tail->age.wrap);
-       DRM_DEBUG("   head=0x%06lx %d\n",
-                 (unsigned long)(head - dev_priv->primary->offset), wrap);
-
-       if (TEST_AGE(&tail->age, head, wrap)) {
-               prev = dev_priv->tail->prev;
-               next = dev_priv->tail;
-               prev->next = NULL;
-               next->prev = next->next = NULL;
-               dev_priv->tail = prev;
-               SET_AGE(&next->age, MGA_BUFFER_USED, 0);
-               return next->buf;
-       }
-
-       DRM_DEBUG("returning NULL!\n");
-       return NULL;
-}
-
-int mga_freelist_put(struct drm_device *dev, struct drm_buf *buf)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_buf_priv_t *buf_priv = buf->dev_private;
-       drm_mga_freelist_t *head, *entry, *prev;
-
-       DRM_DEBUG("age=0x%06lx wrap=%d\n",
-                 (unsigned long)(buf_priv->list_entry->age.head -
-                                 dev_priv->primary->offset),
-                 buf_priv->list_entry->age.wrap);
-
-       entry = buf_priv->list_entry;
-       head = dev_priv->head;
-
-       if (buf_priv->list_entry->age.head == MGA_BUFFER_USED) {
-               SET_AGE(&entry->age, MGA_BUFFER_FREE, 0);
-               prev = dev_priv->tail;
-               prev->next = entry;
-               entry->prev = prev;
-               entry->next = NULL;
-       } else {
-               prev = head->next;
-               head->next = entry;
-               prev->prev = entry;
-               entry->prev = head;
-               entry->next = prev;
-       }
-
-       return 0;
-}
-
-/* ================================================================
- * DMA initialization, cleanup
- */
-
-int mga_driver_load(struct drm_device *dev, unsigned long flags)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       drm_mga_private_t *dev_priv;
-       int ret;
-
-       /* There are PCI versions of the G450.  These cards have the
-        * same PCI ID as the AGP G450, but have an additional PCI-to-PCI
-        * bridge chip.  We detect these cards, which are not currently
-        * supported by this driver, by looking at the device ID of the
-        * bus the "card" is on.  If vendor is 0x3388 (Hint Corp) and the
-        * device is 0x0021 (HB6 Universal PCI-PCI bridge), we reject the
-        * device.
-        */
-       if ((pdev->device == 0x0525) && pdev->bus->self
-           && (pdev->bus->self->vendor == 0x3388)
-           && (pdev->bus->self->device == 0x0021)
-           && dev->agp) {
-               /* FIXME: This should be quirked in the pci core, but oh well
-                * the hw probably stopped existing. */
-               arch_phys_wc_del(dev->agp->agp_mtrr);
-               kfree(dev->agp);
-               dev->agp = NULL;
-       }
-       dev_priv = kzalloc(sizeof(drm_mga_private_t), GFP_KERNEL);
-       if (!dev_priv)
-               return -ENOMEM;
-
-       dev->dev_private = (void *)dev_priv;
-
-       dev_priv->usec_timeout = MGA_DEFAULT_USEC_TIMEOUT;
-       dev_priv->chipset = flags;
-
-       pci_set_master(pdev);
-
-       dev_priv->mmio_base = pci_resource_start(pdev, 1);
-       dev_priv->mmio_size = pci_resource_len(pdev, 1);
-
-       ret = drm_vblank_init(dev, 1);
-
-       if (ret) {
-               (void) mga_driver_unload(dev);
-               return ret;
-       }
-
-       return 0;
-}
-
-#if IS_ENABLED(CONFIG_AGP)
-/*
- * Bootstrap the driver for AGP DMA.
- *
- * \todo
- * Investigate whether there is any benefit to storing the WARP microcode in
- * AGP memory.  If not, the microcode may as well always be put in PCI
- * memory.
- *
- * \todo
- * This routine needs to set dma_bs->agp_mode to the mode actually configured
- * in the hardware.  Looking just at the Linux AGP driver code, I don't see
- * an easy way to determine this.
- *
- * \sa mga_do_dma_bootstrap, mga_do_pci_dma_bootstrap
- */
-static int mga_do_agp_dma_bootstrap(struct drm_device *dev,
-                                   drm_mga_dma_bootstrap_t *dma_bs)
-{
-       drm_mga_private_t *const dev_priv =
-           (drm_mga_private_t *) dev->dev_private;
-       unsigned int warp_size = MGA_WARP_UCODE_SIZE;
-       int err;
-       unsigned offset;
-       const unsigned secondary_size = dma_bs->secondary_bin_count
-           * dma_bs->secondary_bin_size;
-       const unsigned agp_size = (dma_bs->agp_size << 20);
-       struct drm_buf_desc req;
-       struct drm_agp_mode mode;
-       struct drm_agp_info info;
-       struct drm_agp_buffer agp_req;
-       struct drm_agp_binding bind_req;
-
-       /* Acquire AGP. */
-       err = drm_legacy_agp_acquire(dev);
-       if (err) {
-               DRM_ERROR("Unable to acquire AGP: %d\n", err);
-               return err;
-       }
-
-       err = drm_legacy_agp_info(dev, &info);
-       if (err) {
-               DRM_ERROR("Unable to get AGP info: %d\n", err);
-               return err;
-       }
-
-       mode.mode = (info.mode & ~0x07) | dma_bs->agp_mode;
-       err = drm_legacy_agp_enable(dev, mode);
-       if (err) {
-               DRM_ERROR("Unable to enable AGP (mode = 0x%lx)\n", mode.mode);
-               return err;
-       }
-
-       /* In addition to the usual AGP mode configuration, the G200 AGP cards
-        * need to have the AGP mode "manually" set.
-        */
-
-       if (dev_priv->chipset == MGA_CARD_TYPE_G200) {
-               if (mode.mode & 0x02)
-                       MGA_WRITE(MGA_AGP_PLL, MGA_AGP2XPLL_ENABLE);
-               else
-                       MGA_WRITE(MGA_AGP_PLL, MGA_AGP2XPLL_DISABLE);
-       }
-
-       /* Allocate and bind AGP memory. */
-       agp_req.size = agp_size;
-       agp_req.type = 0;
-       err = drm_legacy_agp_alloc(dev, &agp_req);
-       if (err) {
-               dev_priv->agp_size = 0;
-               DRM_ERROR("Unable to allocate %uMB AGP memory\n",
-                         dma_bs->agp_size);
-               return err;
-       }
-
-       dev_priv->agp_size = agp_size;
-       dev_priv->agp_handle = agp_req.handle;
-
-       bind_req.handle = agp_req.handle;
-       bind_req.offset = 0;
-       err = drm_legacy_agp_bind(dev, &bind_req);
-       if (err) {
-               DRM_ERROR("Unable to bind AGP memory: %d\n", err);
-               return err;
-       }
-
-       /* Make drm_legacy_addbufs happy by not trying to create a mapping for
-        * less than a page.
-        */
-       if (warp_size < PAGE_SIZE)
-               warp_size = PAGE_SIZE;
-
-       offset = 0;
-       err = drm_legacy_addmap(dev, offset, warp_size,
-                               _DRM_AGP, _DRM_READ_ONLY, &dev_priv->warp);
-       if (err) {
-               DRM_ERROR("Unable to map WARP microcode: %d\n", err);
-               return err;
-       }
-
-       offset += warp_size;
-       err = drm_legacy_addmap(dev, offset, dma_bs->primary_size,
-                               _DRM_AGP, _DRM_READ_ONLY, &dev_priv->primary);
-       if (err) {
-               DRM_ERROR("Unable to map primary DMA region: %d\n", err);
-               return err;
-       }
-
-       offset += dma_bs->primary_size;
-       err = drm_legacy_addmap(dev, offset, secondary_size,
-                               _DRM_AGP, 0, &dev->agp_buffer_map);
-       if (err) {
-               DRM_ERROR("Unable to map secondary DMA region: %d\n", err);
-               return err;
-       }
-
-       (void)memset(&req, 0, sizeof(req));
-       req.count = dma_bs->secondary_bin_count;
-       req.size = dma_bs->secondary_bin_size;
-       req.flags = _DRM_AGP_BUFFER;
-       req.agp_start = offset;
-
-       err = drm_legacy_addbufs_agp(dev, &req);
-       if (err) {
-               DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err);
-               return err;
-       }
-
-       {
-               struct drm_map_list *_entry;
-               unsigned long agp_token = 0;
-
-               list_for_each_entry(_entry, &dev->maplist, head) {
-                       if (_entry->map == dev->agp_buffer_map)
-                               agp_token = _entry->user_token;
-               }
-               if (!agp_token)
-                       return -EFAULT;
-
-               dev->agp_buffer_token = agp_token;
-       }
-
-       offset += secondary_size;
-       err = drm_legacy_addmap(dev, offset, agp_size - offset,
-                               _DRM_AGP, 0, &dev_priv->agp_textures);
-       if (err) {
-               DRM_ERROR("Unable to map AGP texture region %d\n", err);
-               return err;
-       }
-
-       drm_legacy_ioremap(dev_priv->warp, dev);
-       drm_legacy_ioremap(dev_priv->primary, dev);
-       drm_legacy_ioremap(dev->agp_buffer_map, dev);
-
-       if (!dev_priv->warp->handle ||
-           !dev_priv->primary->handle || !dev->agp_buffer_map->handle) {
-               DRM_ERROR("failed to ioremap agp regions! (%p, %p, %p)\n",
-                         dev_priv->warp->handle, dev_priv->primary->handle,
-                         dev->agp_buffer_map->handle);
-               return -ENOMEM;
-       }
-
-       dev_priv->dma_access = MGA_PAGPXFER;
-       dev_priv->wagp_enable = MGA_WAGP_ENABLE;
-
-       DRM_INFO("Initialized card for AGP DMA.\n");
-       return 0;
-}
-#else
-static int mga_do_agp_dma_bootstrap(struct drm_device *dev,
-                                   drm_mga_dma_bootstrap_t *dma_bs)
-{
-       return -EINVAL;
-}
-#endif
-
-/*
- * Bootstrap the driver for PCI DMA.
- *
- * \todo
- * The algorithm for decreasing the size of the primary DMA buffer could be
- * better.  The size should be rounded up to the nearest page size, then
- * decrease the request size by a single page each pass through the loop.
- *
- * \todo
- * Determine whether the maximum address passed to drm_pci_alloc is correct.
- * The same goes for drm_legacy_addbufs_pci.
- *
- * \sa mga_do_dma_bootstrap, mga_do_agp_dma_bootstrap
- */
-static int mga_do_pci_dma_bootstrap(struct drm_device *dev,
-                                   drm_mga_dma_bootstrap_t *dma_bs)
-{
-       drm_mga_private_t *const dev_priv =
-           (drm_mga_private_t *) dev->dev_private;
-       unsigned int warp_size = MGA_WARP_UCODE_SIZE;
-       unsigned int primary_size;
-       unsigned int bin_count;
-       int err;
-       struct drm_buf_desc req;
-
-       if (dev->dma == NULL) {
-               DRM_ERROR("dev->dma is NULL\n");
-               return -EFAULT;
-       }
-
-       /* Make drm_legacy_addbufs happy by not trying to create a mapping for
-        * less than a page.
-        */
-       if (warp_size < PAGE_SIZE)
-               warp_size = PAGE_SIZE;
-
-       /* The proper alignment is 0x100 for this mapping */
-       err = drm_legacy_addmap(dev, 0, warp_size, _DRM_CONSISTENT,
-                               _DRM_READ_ONLY, &dev_priv->warp);
-       if (err != 0) {
-               DRM_ERROR("Unable to create mapping for WARP microcode: %d\n",
-                         err);
-               return err;
-       }
-
-       /* Other than the bottom two bits being used to encode other
-        * information, there don't appear to be any restrictions on the
-        * alignment of the primary or secondary DMA buffers.
-        */
-
-       for (primary_size = dma_bs->primary_size; primary_size != 0;
-            primary_size >>= 1) {
-               /* The proper alignment for this mapping is 0x04 */
-               err = drm_legacy_addmap(dev, 0, primary_size, _DRM_CONSISTENT,
-                                       _DRM_READ_ONLY, &dev_priv->primary);
-               if (!err)
-                       break;
-       }
-
-       if (err != 0) {
-               DRM_ERROR("Unable to allocate primary DMA region: %d\n", err);
-               return -ENOMEM;
-       }
-
-       if (dev_priv->primary->size != dma_bs->primary_size) {
-               DRM_INFO("Primary DMA buffer size reduced from %u to %u.\n",
-                        dma_bs->primary_size,
-                        (unsigned)dev_priv->primary->size);
-               dma_bs->primary_size = dev_priv->primary->size;
-       }
-
-       for (bin_count = dma_bs->secondary_bin_count; bin_count > 0;
-            bin_count--) {
-               (void)memset(&req, 0, sizeof(req));
-               req.count = bin_count;
-               req.size = dma_bs->secondary_bin_size;
-
-               err = drm_legacy_addbufs_pci(dev, &req);
-               if (!err)
-                       break;
-       }
-
-       if (bin_count == 0) {
-               DRM_ERROR("Unable to add secondary DMA buffers: %d\n", err);
-               return err;
-       }
-
-       if (bin_count != dma_bs->secondary_bin_count) {
-               DRM_INFO("Secondary PCI DMA buffer bin count reduced from %u "
-                        "to %u.\n", dma_bs->secondary_bin_count, bin_count);
-
-               dma_bs->secondary_bin_count = bin_count;
-       }
-
-       dev_priv->dma_access = 0;
-       dev_priv->wagp_enable = 0;
-
-       dma_bs->agp_mode = 0;
-
-       DRM_INFO("Initialized card for PCI DMA.\n");
-       return 0;
-}
-
-static int mga_do_dma_bootstrap(struct drm_device *dev,
-                               drm_mga_dma_bootstrap_t *dma_bs)
-{
-       const int is_agp = (dma_bs->agp_mode != 0) && dev->agp;
-       int err;
-       drm_mga_private_t *const dev_priv =
-           (drm_mga_private_t *) dev->dev_private;
-
-       dev_priv->used_new_dma_init = 1;
-
-       /* The first steps are the same for both PCI and AGP based DMA.  Map
-        * the cards MMIO registers and map a status page.
-        */
-       err = drm_legacy_addmap(dev, dev_priv->mmio_base, dev_priv->mmio_size,
-                               _DRM_REGISTERS, _DRM_READ_ONLY,
-                               &dev_priv->mmio);
-       if (err) {
-               DRM_ERROR("Unable to map MMIO region: %d\n", err);
-               return err;
-       }
-
-       err = drm_legacy_addmap(dev, 0, SAREA_MAX, _DRM_SHM,
-                               _DRM_READ_ONLY | _DRM_LOCKED | _DRM_KERNEL,
-                        &dev_priv->status);
-       if (err) {
-               DRM_ERROR("Unable to map status region: %d\n", err);
-               return err;
-       }
-
-       /* The DMA initialization procedure is slightly different for PCI and
-        * AGP cards.  AGP cards just allocate a large block of AGP memory and
-        * carve off portions of it for internal uses.  The remaining memory
-        * is returned to user-mode to be used for AGP textures.
-        */
-       if (is_agp)
-               err = mga_do_agp_dma_bootstrap(dev, dma_bs);
-
-       /* If we attempted to initialize the card for AGP DMA but failed,
-        * clean-up any mess that may have been created.
-        */
-
-       if (err)
-               mga_do_cleanup_dma(dev, MINIMAL_CLEANUP);
-
-       /* Not only do we want to try and initialized PCI cards for PCI DMA,
-        * but we also try to initialized AGP cards that could not be
-        * initialized for AGP DMA.  This covers the case where we have an AGP
-        * card in a system with an unsupported AGP chipset.  In that case the
-        * card will be detected as AGP, but we won't be able to allocate any
-        * AGP memory, etc.
-        */
-
-       if (!is_agp || err)
-               err = mga_do_pci_dma_bootstrap(dev, dma_bs);
-
-       return err;
-}
-
-int mga_dma_bootstrap(struct drm_device *dev, void *data,
-                     struct drm_file *file_priv)
-{
-       drm_mga_dma_bootstrap_t *bootstrap = data;
-       int err;
-       static const int modes[] = { 0, 1, 2, 2, 4, 4, 4, 4 };
-       const drm_mga_private_t *const dev_priv =
-               (drm_mga_private_t *) dev->dev_private;
-
-       err = mga_do_dma_bootstrap(dev, bootstrap);
-       if (err) {
-               mga_do_cleanup_dma(dev, FULL_CLEANUP);
-               return err;
-       }
-
-       if (dev_priv->agp_textures != NULL) {
-               bootstrap->texture_handle = dev_priv->agp_textures->offset;
-               bootstrap->texture_size = dev_priv->agp_textures->size;
-       } else {
-               bootstrap->texture_handle = 0;
-               bootstrap->texture_size = 0;
-       }
-
-       bootstrap->agp_mode = modes[bootstrap->agp_mode & 0x07];
-
-       return err;
-}
-
-static int mga_do_init_dma(struct drm_device *dev, drm_mga_init_t *init)
-{
-       drm_mga_private_t *dev_priv;
-       int ret;
-       DRM_DEBUG("\n");
-
-       dev_priv = dev->dev_private;
-
-       if (init->sgram)
-               dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_BLK;
-       else
-               dev_priv->clear_cmd = MGA_DWGCTL_CLEAR | MGA_ATYPE_RSTR;
-       dev_priv->maccess = init->maccess;
-
-       dev_priv->fb_cpp = init->fb_cpp;
-       dev_priv->front_offset = init->front_offset;
-       dev_priv->front_pitch = init->front_pitch;
-       dev_priv->back_offset = init->back_offset;
-       dev_priv->back_pitch = init->back_pitch;
-
-       dev_priv->depth_cpp = init->depth_cpp;
-       dev_priv->depth_offset = init->depth_offset;
-       dev_priv->depth_pitch = init->depth_pitch;
-
-       /* FIXME: Need to support AGP textures...
-        */
-       dev_priv->texture_offset = init->texture_offset[0];
-       dev_priv->texture_size = init->texture_size[0];
-
-       dev_priv->sarea = drm_legacy_getsarea(dev);
-       if (!dev_priv->sarea) {
-               DRM_ERROR("failed to find sarea!\n");
-               return -EINVAL;
-       }
-
-       if (!dev_priv->used_new_dma_init) {
-
-               dev_priv->dma_access = MGA_PAGPXFER;
-               dev_priv->wagp_enable = MGA_WAGP_ENABLE;
-
-               dev_priv->status = drm_legacy_findmap(dev, init->status_offset);
-               if (!dev_priv->status) {
-                       DRM_ERROR("failed to find status page!\n");
-                       return -EINVAL;
-               }
-               dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
-               if (!dev_priv->mmio) {
-                       DRM_ERROR("failed to find mmio region!\n");
-                       return -EINVAL;
-               }
-               dev_priv->warp = drm_legacy_findmap(dev, init->warp_offset);
-               if (!dev_priv->warp) {
-                       DRM_ERROR("failed to find warp microcode region!\n");
-                       return -EINVAL;
-               }
-               dev_priv->primary = drm_legacy_findmap(dev, init->primary_offset);
-               if (!dev_priv->primary) {
-                       DRM_ERROR("failed to find primary dma region!\n");
-                       return -EINVAL;
-               }
-               dev->agp_buffer_token = init->buffers_offset;
-               dev->agp_buffer_map =
-                   drm_legacy_findmap(dev, init->buffers_offset);
-               if (!dev->agp_buffer_map) {
-                       DRM_ERROR("failed to find dma buffer region!\n");
-                       return -EINVAL;
-               }
-
-               drm_legacy_ioremap(dev_priv->warp, dev);
-               drm_legacy_ioremap(dev_priv->primary, dev);
-               drm_legacy_ioremap(dev->agp_buffer_map, dev);
-       }
-
-       dev_priv->sarea_priv =
-           (drm_mga_sarea_t *) ((u8 *) dev_priv->sarea->handle +
-                                init->sarea_priv_offset);
-
-       if (!dev_priv->warp->handle ||
-           !dev_priv->primary->handle ||
-           ((dev_priv->dma_access != 0) &&
-            ((dev->agp_buffer_map == NULL) ||
-             (dev->agp_buffer_map->handle == NULL)))) {
-               DRM_ERROR("failed to ioremap agp regions!\n");
-               return -ENOMEM;
-       }
-
-       ret = mga_warp_install_microcode(dev_priv);
-       if (ret < 0) {
-               DRM_ERROR("failed to install WARP ucode!: %d\n", ret);
-               return ret;
-       }
-
-       ret = mga_warp_init(dev_priv);
-       if (ret < 0) {
-               DRM_ERROR("failed to init WARP engine!: %d\n", ret);
-               return ret;
-       }
-
-       dev_priv->prim.status = (u32 *) dev_priv->status->handle;
-
-       mga_do_wait_for_idle(dev_priv);
-
-       /* Init the primary DMA registers.
-        */
-       MGA_WRITE(MGA_PRIMADDRESS, dev_priv->primary->offset | MGA_DMA_GENERAL);
-#if 0
-       MGA_WRITE(MGA_PRIMPTR, virt_to_bus((void *)dev_priv->prim.status) | MGA_PRIMPTREN0 |    /* Soft trap, SECEND, SETUPEND */
-                 MGA_PRIMPTREN1);      /* DWGSYNC */
-#endif
-
-       dev_priv->prim.start = (u8 *) dev_priv->primary->handle;
-       dev_priv->prim.end = ((u8 *) dev_priv->primary->handle
-                             + dev_priv->primary->size);
-       dev_priv->prim.size = dev_priv->primary->size;
-
-       dev_priv->prim.tail = 0;
-       dev_priv->prim.space = dev_priv->prim.size;
-       dev_priv->prim.wrapped = 0;
-
-       dev_priv->prim.last_flush = 0;
-       dev_priv->prim.last_wrap = 0;
-
-       dev_priv->prim.high_mark = 256 * DMA_BLOCK_SIZE;
-
-       dev_priv->prim.status[0] = dev_priv->primary->offset;
-       dev_priv->prim.status[1] = 0;
-
-       dev_priv->sarea_priv->last_wrap = 0;
-       dev_priv->sarea_priv->last_frame.head = 0;
-       dev_priv->sarea_priv->last_frame.wrap = 0;
-
-       if (mga_freelist_init(dev, dev_priv) < 0) {
-               DRM_ERROR("could not initialize freelist\n");
-               return -ENOMEM;
-       }
-
-       return 0;
-}
-
-static int mga_do_cleanup_dma(struct drm_device *dev, int full_cleanup)
-{
-       int err = 0;
-       DRM_DEBUG("\n");
-
-       /* Make sure interrupts are disabled here because the uninstall ioctl
-        * may not have been called from userspace and after dev_private
-        * is freed, it's too late.
-        */
-       if (dev->irq_enabled)
-               drm_legacy_irq_uninstall(dev);
-
-       if (dev->dev_private) {
-               drm_mga_private_t *dev_priv = dev->dev_private;
-
-               if ((dev_priv->warp != NULL)
-                   && (dev_priv->warp->type != _DRM_CONSISTENT))
-                       drm_legacy_ioremapfree(dev_priv->warp, dev);
-
-               if ((dev_priv->primary != NULL)
-                   && (dev_priv->primary->type != _DRM_CONSISTENT))
-                       drm_legacy_ioremapfree(dev_priv->primary, dev);
-
-               if (dev->agp_buffer_map != NULL)
-                       drm_legacy_ioremapfree(dev->agp_buffer_map, dev);
-
-               if (dev_priv->used_new_dma_init) {
-#if IS_ENABLED(CONFIG_AGP)
-                       if (dev_priv->agp_handle != 0) {
-                               struct drm_agp_binding unbind_req;
-                               struct drm_agp_buffer free_req;
-
-                               unbind_req.handle = dev_priv->agp_handle;
-                               drm_legacy_agp_unbind(dev, &unbind_req);
-
-                               free_req.handle = dev_priv->agp_handle;
-                               drm_legacy_agp_free(dev, &free_req);
-
-                               dev_priv->agp_textures = NULL;
-                               dev_priv->agp_size = 0;
-                               dev_priv->agp_handle = 0;
-                       }
-
-                       if ((dev->agp != NULL) && dev->agp->acquired)
-                               err = drm_legacy_agp_release(dev);
-#endif
-               }
-
-               dev_priv->warp = NULL;
-               dev_priv->primary = NULL;
-               dev_priv->sarea = NULL;
-               dev_priv->sarea_priv = NULL;
-               dev->agp_buffer_map = NULL;
-
-               if (full_cleanup) {
-                       dev_priv->mmio = NULL;
-                       dev_priv->status = NULL;
-                       dev_priv->used_new_dma_init = 0;
-               }
-
-               memset(&dev_priv->prim, 0, sizeof(dev_priv->prim));
-               dev_priv->warp_pipe = 0;
-               memset(dev_priv->warp_pipe_phys, 0,
-                      sizeof(dev_priv->warp_pipe_phys));
-
-               if (dev_priv->head != NULL)
-                       mga_freelist_cleanup(dev);
-       }
-
-       return err;
-}
-
-int mga_dma_init(struct drm_device *dev, void *data,
-                struct drm_file *file_priv)
-{
-       drm_mga_init_t *init = data;
-       int err;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       switch (init->func) {
-       case MGA_INIT_DMA:
-               err = mga_do_init_dma(dev, init);
-               if (err)
-                       (void)mga_do_cleanup_dma(dev, FULL_CLEANUP);
-               return err;
-       case MGA_CLEANUP_DMA:
-               return mga_do_cleanup_dma(dev, FULL_CLEANUP);
-       }
-
-       return -EINVAL;
-}
-
-/* ================================================================
- * Primary DMA stream management
- */
-
-int mga_dma_flush(struct drm_device *dev, void *data,
-                 struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-       struct drm_lock *lock = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DRM_DEBUG("%s%s%s\n",
-                 (lock->flags & _DRM_LOCK_FLUSH) ? "flush, " : "",
-                 (lock->flags & _DRM_LOCK_FLUSH_ALL) ? "flush all, " : "",
-                 (lock->flags & _DRM_LOCK_QUIESCENT) ? "idle, " : "");
-
-       WRAP_WAIT_WITH_RETURN(dev_priv);
-
-       if (lock->flags & (_DRM_LOCK_FLUSH | _DRM_LOCK_FLUSH_ALL))
-               mga_do_dma_flush(dev_priv);
-
-       if (lock->flags & _DRM_LOCK_QUIESCENT) {
-#if MGA_DMA_DEBUG
-               int ret = mga_do_wait_for_idle(dev_priv);
-               if (ret < 0)
-                       DRM_INFO("-EBUSY\n");
-               return ret;
-#else
-               return mga_do_wait_for_idle(dev_priv);
-#endif
-       } else {
-               return 0;
-       }
-}
-
-int mga_dma_reset(struct drm_device *dev, void *data,
-                 struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       return mga_do_dma_reset(dev_priv);
-}
-
-/* ================================================================
- * DMA buffer management
- */
-
-static int mga_dma_get_buffers(struct drm_device *dev,
-                              struct drm_file *file_priv, struct drm_dma *d)
-{
-       struct drm_buf *buf;
-       int i;
-
-       for (i = d->granted_count; i < d->request_count; i++) {
-               buf = mga_freelist_get(dev);
-               if (!buf)
-                       return -EAGAIN;
-
-               buf->file_priv = file_priv;
-
-               if (copy_to_user(&d->request_indices[i],
-                                    &buf->idx, sizeof(buf->idx)))
-                       return -EFAULT;
-               if (copy_to_user(&d->request_sizes[i],
-                                    &buf->total, sizeof(buf->total)))
-                       return -EFAULT;
-
-               d->granted_count++;
-       }
-       return 0;
-}
-
-int mga_dma_buffers(struct drm_device *dev, void *data,
-                   struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-       struct drm_dma *d = data;
-       int ret = 0;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       /* Please don't send us buffers.
-        */
-       if (d->send_count != 0) {
-               DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
-                         task_pid_nr(current), d->send_count);
-               return -EINVAL;
-       }
-
-       /* We'll send you buffers.
-        */
-       if (d->request_count < 0 || d->request_count > dma->buf_count) {
-               DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
-                         task_pid_nr(current), d->request_count,
-                         dma->buf_count);
-               return -EINVAL;
-       }
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       d->granted_count = 0;
-
-       if (d->request_count)
-               ret = mga_dma_get_buffers(dev, file_priv, d);
-
-       return ret;
-}
-
-/*
- * Called just before the module is unloaded.
- */
-void mga_driver_unload(struct drm_device *dev)
-{
-       kfree(dev->dev_private);
-       dev->dev_private = NULL;
-}
-
-/*
- * Called when the last opener of the device is closed.
- */
-void mga_driver_lastclose(struct drm_device *dev)
-{
-       mga_do_cleanup_dma(dev, FULL_CLEANUP);
-}
-
-int mga_driver_dma_quiescent(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       return mga_do_wait_for_idle(dev_priv);
-}
diff --git a/drivers/gpu/drm/mga/mga_drv.c b/drivers/gpu/drm/mga/mga_drv.c
deleted file mode 100644 (file)
index 71128e6..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/* mga_drv.c -- Matrox G200/G400 driver -*- linux-c -*-
- * Created: Mon Dec 13 01:56:22 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Rickard E. (Rik) Faith <faith@valinux.com>
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/module.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_pciids.h>
-
-#include "mga_drv.h"
-
-static struct pci_device_id pciidlist[] = {
-       mga_PCI_IDS
-};
-
-static const struct file_operations mga_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-#ifdef CONFIG_COMPAT
-       .compat_ioctl = mga_compat_ioctl,
-#endif
-       .llseek = noop_llseek,
-};
-
-static struct drm_driver driver = {
-       .driver_features =
-           DRIVER_USE_AGP | DRIVER_PCI_DMA | DRIVER_LEGACY |
-           DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ,
-       .dev_priv_size = sizeof(drm_mga_buf_priv_t),
-       .load = mga_driver_load,
-       .unload = mga_driver_unload,
-       .lastclose = mga_driver_lastclose,
-       .dma_quiescent = mga_driver_dma_quiescent,
-       .get_vblank_counter = mga_get_vblank_counter,
-       .enable_vblank = mga_enable_vblank,
-       .disable_vblank = mga_disable_vblank,
-       .irq_preinstall = mga_driver_irq_preinstall,
-       .irq_postinstall = mga_driver_irq_postinstall,
-       .irq_uninstall = mga_driver_irq_uninstall,
-       .irq_handler = mga_driver_irq_handler,
-       .ioctls = mga_ioctls,
-       .dma_ioctl = mga_dma_buffers,
-       .fops = &mga_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-static struct pci_driver mga_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init mga_init(void)
-{
-       driver.num_ioctls = mga_max_ioctl;
-       return drm_legacy_pci_init(&driver, &mga_pci_driver);
-}
-
-static void __exit mga_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &mga_pci_driver);
-}
-
-module_init(mga_init);
-module_exit(mga_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/mga/mga_drv.h b/drivers/gpu/drm/mga/mga_drv.h
deleted file mode 100644 (file)
index f61401c..0000000
+++ /dev/null
@@ -1,685 +0,0 @@
-/* mga_drv.h -- Private header for the Matrox G200/G400 driver -*- linux-c -*-
- * Created: Mon Dec 13 01:50:01 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#ifndef __MGA_DRV_H__
-#define __MGA_DRV_H__
-
-#include <linux/irqreturn.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_file.h>
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/drm_print.h>
-#include <drm/drm_sarea.h>
-#include <drm/drm_vblank.h>
-#include <drm/mga_drm.h>
-
-/* General customization:
- */
-
-#define DRIVER_AUTHOR          "Gareth Hughes, VA Linux Systems Inc."
-
-#define DRIVER_NAME            "mga"
-#define DRIVER_DESC            "Matrox G200/G400"
-#define DRIVER_DATE            "20051102"
-
-#define DRIVER_MAJOR           3
-#define DRIVER_MINOR           2
-#define DRIVER_PATCHLEVEL      1
-
-typedef struct drm_mga_primary_buffer {
-       u8 *start;
-       u8 *end;
-       int size;
-
-       u32 tail;
-       int space;
-       volatile long wrapped;
-
-       volatile u32 *status;
-
-       u32 last_flush;
-       u32 last_wrap;
-
-       u32 high_mark;
-} drm_mga_primary_buffer_t;
-
-typedef struct drm_mga_freelist {
-       struct drm_mga_freelist *next;
-       struct drm_mga_freelist *prev;
-       drm_mga_age_t age;
-       struct drm_buf *buf;
-} drm_mga_freelist_t;
-
-typedef struct {
-       drm_mga_freelist_t *list_entry;
-       int discard;
-       int dispatched;
-} drm_mga_buf_priv_t;
-
-typedef struct drm_mga_private {
-       drm_mga_primary_buffer_t prim;
-       drm_mga_sarea_t *sarea_priv;
-
-       drm_mga_freelist_t *head;
-       drm_mga_freelist_t *tail;
-
-       unsigned int warp_pipe;
-       unsigned long warp_pipe_phys[MGA_MAX_WARP_PIPES];
-
-       int chipset;
-       int usec_timeout;
-
-       /**
-        * If set, the new DMA initialization sequence was used.  This is
-        * primarilly used to select how the driver should uninitialized its
-        * internal DMA structures.
-        */
-       int used_new_dma_init;
-
-       /**
-        * If AGP memory is used for DMA buffers, this will be the value
-        * \c MGA_PAGPXFER.  Otherwise, it will be zero (for a PCI transfer).
-        */
-       u32 dma_access;
-
-       /**
-        * If AGP memory is used for DMA buffers, this will be the value
-        * \c MGA_WAGP_ENABLE.  Otherwise, it will be zero (for a PCI
-        * transfer).
-        */
-       u32 wagp_enable;
-
-       /**
-        * \name MMIO region parameters.
-        *
-        * \sa drm_mga_private_t::mmio
-        */
-       /*@{ */
-       resource_size_t mmio_base;         /**< Bus address of base of MMIO. */
-       resource_size_t mmio_size;         /**< Size of the MMIO region. */
-       /*@} */
-
-       u32 clear_cmd;
-       u32 maccess;
-
-       atomic_t vbl_received;          /**< Number of vblanks received. */
-       wait_queue_head_t fence_queue;
-       atomic_t last_fence_retired;
-       u32 next_fence_to_post;
-
-       unsigned int fb_cpp;
-       unsigned int front_offset;
-       unsigned int front_pitch;
-       unsigned int back_offset;
-       unsigned int back_pitch;
-
-       unsigned int depth_cpp;
-       unsigned int depth_offset;
-       unsigned int depth_pitch;
-
-       unsigned int texture_offset;
-       unsigned int texture_size;
-
-       drm_local_map_t *sarea;
-       drm_local_map_t *mmio;
-       drm_local_map_t *status;
-       drm_local_map_t *warp;
-       drm_local_map_t *primary;
-       drm_local_map_t *agp_textures;
-
-       unsigned long agp_handle;
-       unsigned int agp_size;
-} drm_mga_private_t;
-
-extern const struct drm_ioctl_desc mga_ioctls[];
-extern int mga_max_ioctl;
-
-                               /* mga_dma.c */
-extern int mga_dma_bootstrap(struct drm_device *dev, void *data,
-                            struct drm_file *file_priv);
-extern int mga_dma_init(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv);
-extern int mga_getparam(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv);
-extern int mga_dma_flush(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv);
-extern int mga_dma_reset(struct drm_device *dev, void *data,
-                        struct drm_file *file_priv);
-extern int mga_dma_buffers(struct drm_device *dev, void *data,
-                          struct drm_file *file_priv);
-extern int mga_driver_load(struct drm_device *dev, unsigned long flags);
-extern void mga_driver_unload(struct drm_device *dev);
-extern void mga_driver_lastclose(struct drm_device *dev);
-extern int mga_driver_dma_quiescent(struct drm_device *dev);
-
-extern int mga_do_wait_for_idle(drm_mga_private_t *dev_priv);
-
-extern void mga_do_dma_flush(drm_mga_private_t *dev_priv);
-extern void mga_do_dma_wrap_start(drm_mga_private_t *dev_priv);
-extern void mga_do_dma_wrap_end(drm_mga_private_t *dev_priv);
-
-extern int mga_freelist_put(struct drm_device *dev, struct drm_buf *buf);
-
-                               /* mga_warp.c */
-extern int mga_warp_install_microcode(drm_mga_private_t *dev_priv);
-extern int mga_warp_init(drm_mga_private_t *dev_priv);
-
-                               /* mga_irq.c */
-extern int mga_enable_vblank(struct drm_device *dev, unsigned int pipe);
-extern void mga_disable_vblank(struct drm_device *dev, unsigned int pipe);
-extern u32 mga_get_vblank_counter(struct drm_device *dev, unsigned int pipe);
-extern void mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence);
-extern int mga_driver_vblank_wait(struct drm_device *dev, unsigned int *sequence);
-extern irqreturn_t mga_driver_irq_handler(int irq, void *arg);
-extern void mga_driver_irq_preinstall(struct drm_device *dev);
-extern int mga_driver_irq_postinstall(struct drm_device *dev);
-extern void mga_driver_irq_uninstall(struct drm_device *dev);
-extern long mga_compat_ioctl(struct file *filp, unsigned int cmd,
-                            unsigned long arg);
-
-#define mga_flush_write_combine()      wmb()
-
-#define MGA_READ8(reg) \
-       readb(((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define MGA_READ(reg) \
-       readl(((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define MGA_WRITE8(reg, val) \
-       writeb(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define MGA_WRITE(reg, val) \
-       writel(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
-
-#define DWGREG0                0x1c00
-#define DWGREG0_END    0x1dff
-#define DWGREG1                0x2c00
-#define DWGREG1_END    0x2dff
-
-#define ISREG0(r)      (r >= DWGREG0 && r <= DWGREG0_END)
-#define DMAREG0(r)     (u8)((r - DWGREG0) >> 2)
-#define DMAREG1(r)     (u8)(((r - DWGREG1) >> 2) | 0x80)
-#define DMAREG(r)      (ISREG0(r) ? DMAREG0(r) : DMAREG1(r))
-
-/* ================================================================
- * Helper macross...
- */
-
-#define MGA_EMIT_STATE(dev_priv, dirty)                                        \
-do {                                                                   \
-       if ((dirty) & ~MGA_UPLOAD_CLIPRECTS) {                          \
-               if (dev_priv->chipset >= MGA_CARD_TYPE_G400)            \
-                       mga_g400_emit_state(dev_priv);                  \
-               else                                                    \
-                       mga_g200_emit_state(dev_priv);                  \
-       }                                                               \
-} while (0)
-
-#define WRAP_TEST_WITH_RETURN(dev_priv)                                        \
-do {                                                                   \
-       if (test_bit(0, &dev_priv->prim.wrapped)) {                     \
-               if (mga_is_idle(dev_priv)) {                            \
-                       mga_do_dma_wrap_end(dev_priv);                  \
-               } else if (dev_priv->prim.space <                       \
-                          dev_priv->prim.high_mark) {                  \
-                       if (MGA_DMA_DEBUG)                              \
-                               DRM_INFO("wrap...\n");                  \
-                       return -EBUSY;                                  \
-               }                                                       \
-       }                                                               \
-} while (0)
-
-#define WRAP_WAIT_WITH_RETURN(dev_priv)                                        \
-do {                                                                   \
-       if (test_bit(0, &dev_priv->prim.wrapped)) {                     \
-               if (mga_do_wait_for_idle(dev_priv) < 0) {               \
-                       if (MGA_DMA_DEBUG)                              \
-                               DRM_INFO("wrap...\n");                  \
-                       return -EBUSY;                                  \
-               }                                                       \
-               mga_do_dma_wrap_end(dev_priv);                          \
-       }                                                               \
-} while (0)
-
-/* ================================================================
- * Primary DMA command stream
- */
-
-#define MGA_VERBOSE    0
-
-#define DMA_LOCALS     unsigned int write; volatile u8 *prim;
-
-#define DMA_BLOCK_SIZE (5 * sizeof(u32))
-
-#define BEGIN_DMA(n)                                                   \
-do {                                                                   \
-       if (MGA_VERBOSE) {                                              \
-               DRM_INFO("BEGIN_DMA(%d)\n", (n));                       \
-               DRM_INFO("   space=0x%x req=0x%zx\n",                   \
-                        dev_priv->prim.space, (n) * DMA_BLOCK_SIZE);   \
-       }                                                               \
-       prim = dev_priv->prim.start;                                    \
-       write = dev_priv->prim.tail;                                    \
-} while (0)
-
-#define BEGIN_DMA_WRAP()                                               \
-do {                                                                   \
-       if (MGA_VERBOSE) {                                              \
-               DRM_INFO("BEGIN_DMA()\n");                              \
-               DRM_INFO("   space=0x%x\n", dev_priv->prim.space);      \
-       }                                                               \
-       prim = dev_priv->prim.start;                                    \
-       write = dev_priv->prim.tail;                                    \
-} while (0)
-
-#define ADVANCE_DMA()                                                  \
-do {                                                                   \
-       dev_priv->prim.tail = write;                                    \
-       if (MGA_VERBOSE)                                                \
-               DRM_INFO("ADVANCE_DMA() tail=0x%05x sp=0x%x\n",         \
-                        write, dev_priv->prim.space);                  \
-} while (0)
-
-#define FLUSH_DMA()                                                    \
-do {                                                                   \
-       if (0) {                                                        \
-               DRM_INFO("\n");                                         \
-               DRM_INFO("   tail=0x%06x head=0x%06lx\n",               \
-                        dev_priv->prim.tail,                           \
-                        (unsigned long)(MGA_READ(MGA_PRIMADDRESS) -    \
-                                        dev_priv->primary->offset));   \
-       }                                                               \
-       if (!test_bit(0, &dev_priv->prim.wrapped)) {                    \
-               if (dev_priv->prim.space < dev_priv->prim.high_mark)    \
-                       mga_do_dma_wrap_start(dev_priv);                \
-               else                                                    \
-                       mga_do_dma_flush(dev_priv);                     \
-       }                                                               \
-} while (0)
-
-/* Never use this, always use DMA_BLOCK(...) for primary DMA output.
- */
-#define DMA_WRITE(offset, val)                                         \
-do {                                                                   \
-       if (MGA_VERBOSE)                                                \
-               DRM_INFO("   DMA_WRITE( 0x%08x ) at 0x%04zx\n",         \
-                        (u32)(val), write + (offset) * sizeof(u32));   \
-       *(volatile u32 *)(prim + write + (offset) * sizeof(u32)) = val; \
-} while (0)
-
-#define DMA_BLOCK(reg0, val0, reg1, val1, reg2, val2, reg3, val3)      \
-do {                                                                   \
-       DMA_WRITE(0, ((DMAREG(reg0) << 0) |                             \
-                     (DMAREG(reg1) << 8) |                             \
-                     (DMAREG(reg2) << 16) |                            \
-                     (DMAREG(reg3) << 24)));                           \
-       DMA_WRITE(1, val0);                                             \
-       DMA_WRITE(2, val1);                                             \
-       DMA_WRITE(3, val2);                                             \
-       DMA_WRITE(4, val3);                                             \
-       write += DMA_BLOCK_SIZE;                                        \
-} while (0)
-
-/* Buffer aging via primary DMA stream head pointer.
- */
-
-#define SET_AGE(age, h, w)                                             \
-do {                                                                   \
-       (age)->head = h;                                                \
-       (age)->wrap = w;                                                \
-} while (0)
-
-#define TEST_AGE(age, h, w)            ((age)->wrap < w ||             \
-                                        ((age)->wrap == w &&           \
-                                         (age)->head < h))
-
-#define AGE_BUFFER(buf_priv)                                           \
-do {                                                                   \
-       drm_mga_freelist_t *entry = (buf_priv)->list_entry;             \
-       if ((buf_priv)->dispatched) {                                   \
-               entry->age.head = (dev_priv->prim.tail +                \
-                                  dev_priv->primary->offset);          \
-               entry->age.wrap = dev_priv->sarea_priv->last_wrap;      \
-       } else {                                                        \
-               entry->age.head = 0;                                    \
-               entry->age.wrap = 0;                                    \
-       }                                                               \
-} while (0)
-
-#define MGA_ENGINE_IDLE_MASK           (MGA_SOFTRAPEN |                \
-                                        MGA_DWGENGSTS |                \
-                                        MGA_ENDPRDMASTS)
-#define MGA_DMA_IDLE_MASK              (MGA_SOFTRAPEN |                \
-                                        MGA_ENDPRDMASTS)
-
-#define MGA_DMA_DEBUG                  0
-
-/* A reduced set of the mga registers.
- */
-#define MGA_CRTC_INDEX                 0x1fd4
-#define MGA_CRTC_DATA                  0x1fd5
-
-/* CRTC11 */
-#define MGA_VINTCLR                    (1 << 4)
-#define MGA_VINTEN                     (1 << 5)
-
-#define MGA_ALPHACTRL                  0x2c7c
-#define MGA_AR0                                0x1c60
-#define MGA_AR1                                0x1c64
-#define MGA_AR2                                0x1c68
-#define MGA_AR3                                0x1c6c
-#define MGA_AR4                                0x1c70
-#define MGA_AR5                                0x1c74
-#define MGA_AR6                                0x1c78
-
-#define MGA_CXBNDRY                    0x1c80
-#define MGA_CXLEFT                     0x1ca0
-#define MGA_CXRIGHT                    0x1ca4
-
-#define MGA_DMAPAD                     0x1c54
-#define MGA_DSTORG                     0x2cb8
-#define MGA_DWGCTL                     0x1c00
-#      define MGA_OPCOD_MASK                   (15 << 0)
-#      define MGA_OPCOD_TRAP                   (4 << 0)
-#      define MGA_OPCOD_TEXTURE_TRAP           (6 << 0)
-#      define MGA_OPCOD_BITBLT                 (8 << 0)
-#      define MGA_OPCOD_ILOAD                  (9 << 0)
-#      define MGA_ATYPE_MASK                   (7 << 4)
-#      define MGA_ATYPE_RPL                    (0 << 4)
-#      define MGA_ATYPE_RSTR                   (1 << 4)
-#      define MGA_ATYPE_ZI                     (3 << 4)
-#      define MGA_ATYPE_BLK                    (4 << 4)
-#      define MGA_ATYPE_I                      (7 << 4)
-#      define MGA_LINEAR                       (1 << 7)
-#      define MGA_ZMODE_MASK                   (7 << 8)
-#      define MGA_ZMODE_NOZCMP                 (0 << 8)
-#      define MGA_ZMODE_ZE                     (2 << 8)
-#      define MGA_ZMODE_ZNE                    (3 << 8)
-#      define MGA_ZMODE_ZLT                    (4 << 8)
-#      define MGA_ZMODE_ZLTE                   (5 << 8)
-#      define MGA_ZMODE_ZGT                    (6 << 8)
-#      define MGA_ZMODE_ZGTE                   (7 << 8)
-#      define MGA_SOLID                        (1 << 11)
-#      define MGA_ARZERO                       (1 << 12)
-#      define MGA_SGNZERO                      (1 << 13)
-#      define MGA_SHIFTZERO                    (1 << 14)
-#      define MGA_BOP_MASK                     (15 << 16)
-#      define MGA_BOP_ZERO                     (0 << 16)
-#      define MGA_BOP_DST                      (10 << 16)
-#      define MGA_BOP_SRC                      (12 << 16)
-#      define MGA_BOP_ONE                      (15 << 16)
-#      define MGA_TRANS_SHIFT                  20
-#      define MGA_TRANS_MASK                   (15 << 20)
-#      define MGA_BLTMOD_MASK                  (15 << 25)
-#      define MGA_BLTMOD_BMONOLEF              (0 << 25)
-#      define MGA_BLTMOD_BMONOWF               (4 << 25)
-#      define MGA_BLTMOD_PLAN                  (1 << 25)
-#      define MGA_BLTMOD_BFCOL                 (2 << 25)
-#      define MGA_BLTMOD_BU32BGR               (3 << 25)
-#      define MGA_BLTMOD_BU32RGB               (7 << 25)
-#      define MGA_BLTMOD_BU24BGR               (11 << 25)
-#      define MGA_BLTMOD_BU24RGB               (15 << 25)
-#      define MGA_PATTERN                      (1 << 29)
-#      define MGA_TRANSC                       (1 << 30)
-#      define MGA_CLIPDIS                      (1 << 31)
-#define MGA_DWGSYNC                    0x2c4c
-
-#define MGA_FCOL                       0x1c24
-#define MGA_FIFOSTATUS                 0x1e10
-#define MGA_FOGCOL                     0x1cf4
-#define MGA_FXBNDRY                    0x1c84
-#define MGA_FXLEFT                     0x1ca8
-#define MGA_FXRIGHT                    0x1cac
-
-#define MGA_ICLEAR                     0x1e18
-#      define MGA_SOFTRAPICLR                  (1 << 0)
-#      define MGA_VLINEICLR                    (1 << 5)
-#define MGA_IEN                                0x1e1c
-#      define MGA_SOFTRAPIEN                   (1 << 0)
-#      define MGA_VLINEIEN                     (1 << 5)
-
-#define MGA_LEN                                0x1c5c
-
-#define MGA_MACCESS                    0x1c04
-
-#define MGA_PITCH                      0x1c8c
-#define MGA_PLNWT                      0x1c1c
-#define MGA_PRIMADDRESS                        0x1e58
-#      define MGA_DMA_GENERAL                  (0 << 0)
-#      define MGA_DMA_BLIT                     (1 << 0)
-#      define MGA_DMA_VECTOR                   (2 << 0)
-#      define MGA_DMA_VERTEX                   (3 << 0)
-#define MGA_PRIMEND                    0x1e5c
-#      define MGA_PRIMNOSTART                  (1 << 0)
-#      define MGA_PAGPXFER                     (1 << 1)
-#define MGA_PRIMPTR                    0x1e50
-#      define MGA_PRIMPTREN0                   (1 << 0)
-#      define MGA_PRIMPTREN1                   (1 << 1)
-
-#define MGA_RST                                0x1e40
-#      define MGA_SOFTRESET                    (1 << 0)
-#      define MGA_SOFTEXTRST                   (1 << 1)
-
-#define MGA_SECADDRESS                 0x2c40
-#define MGA_SECEND                     0x2c44
-#define MGA_SETUPADDRESS               0x2cd0
-#define MGA_SETUPEND                   0x2cd4
-#define MGA_SGN                                0x1c58
-#define MGA_SOFTRAP                    0x2c48
-#define MGA_SRCORG                     0x2cb4
-#      define MGA_SRMMAP_MASK                  (1 << 0)
-#      define MGA_SRCMAP_FB                    (0 << 0)
-#      define MGA_SRCMAP_SYSMEM                (1 << 0)
-#      define MGA_SRCACC_MASK                  (1 << 1)
-#      define MGA_SRCACC_PCI                   (0 << 1)
-#      define MGA_SRCACC_AGP                   (1 << 1)
-#define MGA_STATUS                     0x1e14
-#      define MGA_SOFTRAPEN                    (1 << 0)
-#      define MGA_VSYNCPEN                     (1 << 4)
-#      define MGA_VLINEPEN                     (1 << 5)
-#      define MGA_DWGENGSTS                    (1 << 16)
-#      define MGA_ENDPRDMASTS                  (1 << 17)
-#define MGA_STENCIL                    0x2cc8
-#define MGA_STENCILCTL                 0x2ccc
-
-#define MGA_TDUALSTAGE0                        0x2cf8
-#define MGA_TDUALSTAGE1                        0x2cfc
-#define MGA_TEXBORDERCOL               0x2c5c
-#define MGA_TEXCTL                     0x2c30
-#define MGA_TEXCTL2                    0x2c3c
-#      define MGA_DUALTEX                      (1 << 7)
-#      define MGA_G400_TC2_MAGIC               (1 << 15)
-#      define MGA_MAP1_ENABLE                  (1 << 31)
-#define MGA_TEXFILTER                  0x2c58
-#define MGA_TEXHEIGHT                  0x2c2c
-#define MGA_TEXORG                     0x2c24
-#      define MGA_TEXORGMAP_MASK               (1 << 0)
-#      define MGA_TEXORGMAP_FB                 (0 << 0)
-#      define MGA_TEXORGMAP_SYSMEM             (1 << 0)
-#      define MGA_TEXORGACC_MASK               (1 << 1)
-#      define MGA_TEXORGACC_PCI                (0 << 1)
-#      define MGA_TEXORGACC_AGP                (1 << 1)
-#define MGA_TEXORG1                    0x2ca4
-#define MGA_TEXORG2                    0x2ca8
-#define MGA_TEXORG3                    0x2cac
-#define MGA_TEXORG4                    0x2cb0
-#define MGA_TEXTRANS                   0x2c34
-#define MGA_TEXTRANSHIGH               0x2c38
-#define MGA_TEXWIDTH                   0x2c28
-
-#define MGA_WACCEPTSEQ                 0x1dd4
-#define MGA_WCODEADDR                  0x1e6c
-#define MGA_WFLAG                      0x1dc4
-#define MGA_WFLAG1                     0x1de0
-#define MGA_WFLAGNB                    0x1e64
-#define MGA_WFLAGNB1                   0x1e08
-#define MGA_WGETMSB                    0x1dc8
-#define MGA_WIADDR                     0x1dc0
-#define MGA_WIADDR2                    0x1dd8
-#      define MGA_WMODE_SUSPEND                (0 << 0)
-#      define MGA_WMODE_RESUME                 (1 << 0)
-#      define MGA_WMODE_JUMP                   (2 << 0)
-#      define MGA_WMODE_START                  (3 << 0)
-#      define MGA_WAGP_ENABLE                  (1 << 2)
-#define MGA_WMISC                      0x1e70
-#      define MGA_WUCODECACHE_ENABLE           (1 << 0)
-#      define MGA_WMASTER_ENABLE               (1 << 1)
-#      define MGA_WCACHEFLUSH_ENABLE           (1 << 3)
-#define MGA_WVRTXSZ                    0x1dcc
-
-#define MGA_YBOT                       0x1c9c
-#define MGA_YDST                       0x1c90
-#define MGA_YDSTLEN                    0x1c88
-#define MGA_YDSTORG                    0x1c94
-#define MGA_YTOP                       0x1c98
-
-#define MGA_ZORG                       0x1c0c
-
-/* This finishes the current batch of commands
- */
-#define MGA_EXEC                       0x0100
-
-/* AGP PLL encoding (for G200 only).
- */
-#define MGA_AGP_PLL                    0x1e4c
-#      define MGA_AGP2XPLL_DISABLE             (0 << 0)
-#      define MGA_AGP2XPLL_ENABLE              (1 << 0)
-
-/* Warp registers
- */
-#define MGA_WR0                                0x2d00
-#define MGA_WR1                                0x2d04
-#define MGA_WR2                                0x2d08
-#define MGA_WR3                                0x2d0c
-#define MGA_WR4                                0x2d10
-#define MGA_WR5                                0x2d14
-#define MGA_WR6                                0x2d18
-#define MGA_WR7                                0x2d1c
-#define MGA_WR8                                0x2d20
-#define MGA_WR9                                0x2d24
-#define MGA_WR10                       0x2d28
-#define MGA_WR11                       0x2d2c
-#define MGA_WR12                       0x2d30
-#define MGA_WR13                       0x2d34
-#define MGA_WR14                       0x2d38
-#define MGA_WR15                       0x2d3c
-#define MGA_WR16                       0x2d40
-#define MGA_WR17                       0x2d44
-#define MGA_WR18                       0x2d48
-#define MGA_WR19                       0x2d4c
-#define MGA_WR20                       0x2d50
-#define MGA_WR21                       0x2d54
-#define MGA_WR22                       0x2d58
-#define MGA_WR23                       0x2d5c
-#define MGA_WR24                       0x2d60
-#define MGA_WR25                       0x2d64
-#define MGA_WR26                       0x2d68
-#define MGA_WR27                       0x2d6c
-#define MGA_WR28                       0x2d70
-#define MGA_WR29                       0x2d74
-#define MGA_WR30                       0x2d78
-#define MGA_WR31                       0x2d7c
-#define MGA_WR32                       0x2d80
-#define MGA_WR33                       0x2d84
-#define MGA_WR34                       0x2d88
-#define MGA_WR35                       0x2d8c
-#define MGA_WR36                       0x2d90
-#define MGA_WR37                       0x2d94
-#define MGA_WR38                       0x2d98
-#define MGA_WR39                       0x2d9c
-#define MGA_WR40                       0x2da0
-#define MGA_WR41                       0x2da4
-#define MGA_WR42                       0x2da8
-#define MGA_WR43                       0x2dac
-#define MGA_WR44                       0x2db0
-#define MGA_WR45                       0x2db4
-#define MGA_WR46                       0x2db8
-#define MGA_WR47                       0x2dbc
-#define MGA_WR48                       0x2dc0
-#define MGA_WR49                       0x2dc4
-#define MGA_WR50                       0x2dc8
-#define MGA_WR51                       0x2dcc
-#define MGA_WR52                       0x2dd0
-#define MGA_WR53                       0x2dd4
-#define MGA_WR54                       0x2dd8
-#define MGA_WR55                       0x2ddc
-#define MGA_WR56                       0x2de0
-#define MGA_WR57                       0x2de4
-#define MGA_WR58                       0x2de8
-#define MGA_WR59                       0x2dec
-#define MGA_WR60                       0x2df0
-#define MGA_WR61                       0x2df4
-#define MGA_WR62                       0x2df8
-#define MGA_WR63                       0x2dfc
-#      define MGA_G400_WR_MAGIC                (1 << 6)
-#      define MGA_G400_WR56_MAGIC              0x46480000      /* 12800.0f */
-
-#define MGA_ILOAD_ALIGN                64
-#define MGA_ILOAD_MASK         (MGA_ILOAD_ALIGN - 1)
-
-#define MGA_DWGCTL_FLUSH       (MGA_OPCOD_TEXTURE_TRAP |               \
-                                MGA_ATYPE_I |                          \
-                                MGA_ZMODE_NOZCMP |                     \
-                                MGA_ARZERO |                           \
-                                MGA_SGNZERO |                          \
-                                MGA_BOP_SRC |                          \
-                                (15 << MGA_TRANS_SHIFT))
-
-#define MGA_DWGCTL_CLEAR       (MGA_OPCOD_TRAP |                       \
-                                MGA_ZMODE_NOZCMP |                     \
-                                MGA_SOLID |                            \
-                                MGA_ARZERO |                           \
-                                MGA_SGNZERO |                          \
-                                MGA_SHIFTZERO |                        \
-                                MGA_BOP_SRC |                          \
-                                (0 << MGA_TRANS_SHIFT) |               \
-                                MGA_BLTMOD_BMONOLEF |                  \
-                                MGA_TRANSC |                           \
-                                MGA_CLIPDIS)
-
-#define MGA_DWGCTL_COPY                (MGA_OPCOD_BITBLT |                     \
-                                MGA_ATYPE_RPL |                        \
-                                MGA_SGNZERO |                          \
-                                MGA_SHIFTZERO |                        \
-                                MGA_BOP_SRC |                          \
-                                (0 << MGA_TRANS_SHIFT) |               \
-                                MGA_BLTMOD_BFCOL |                     \
-                                MGA_CLIPDIS)
-
-/* Simple idle test.
- */
-static __inline__ int mga_is_idle(drm_mga_private_t *dev_priv)
-{
-       u32 status = MGA_READ(MGA_STATUS) & MGA_ENGINE_IDLE_MASK;
-       return (status == MGA_ENDPRDMASTS);
-}
-
-#endif
diff --git a/drivers/gpu/drm/mga/mga_ioc32.c b/drivers/gpu/drm/mga/mga_ioc32.c
deleted file mode 100644 (file)
index 8944729..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * \file mga_ioc32.c
- *
- * 32-bit ioctl compatibility routines for the MGA DRM.
- *
- * \author Dave Airlie <airlied@linux.ie> with code from patches by Egbert Eich
- *
- *
- * Copyright (C) Paul Mackerras 2005
- * Copyright (C) Egbert Eich 2003,2004
- * Copyright (C) Dave Airlie 2005
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/compat.h>
-
-#include "mga_drv.h"
-
-typedef struct drm32_mga_init {
-       int func;
-       u32 sarea_priv_offset;
-       struct_group(always32bit,
-               int chipset;
-               int sgram;
-               unsigned int maccess;
-               unsigned int fb_cpp;
-               unsigned int front_offset, front_pitch;
-               unsigned int back_offset, back_pitch;
-               unsigned int depth_cpp;
-               unsigned int depth_offset, depth_pitch;
-               unsigned int texture_offset[MGA_NR_TEX_HEAPS];
-               unsigned int texture_size[MGA_NR_TEX_HEAPS];
-       );
-       u32 fb_offset;
-       u32 mmio_offset;
-       u32 status_offset;
-       u32 warp_offset;
-       u32 primary_offset;
-       u32 buffers_offset;
-} drm_mga_init32_t;
-
-static int compat_mga_init(struct file *file, unsigned int cmd,
-                          unsigned long arg)
-{
-       drm_mga_init32_t init32;
-       drm_mga_init_t init;
-
-       if (copy_from_user(&init32, (void __user *)arg, sizeof(init32)))
-               return -EFAULT;
-
-       init.func = init32.func;
-       init.sarea_priv_offset = init32.sarea_priv_offset;
-       memcpy(&init.always32bit, &init32.always32bit,
-              sizeof(init32.always32bit));
-       init.fb_offset = init32.fb_offset;
-       init.mmio_offset = init32.mmio_offset;
-       init.status_offset = init32.status_offset;
-       init.warp_offset = init32.warp_offset;
-       init.primary_offset = init32.primary_offset;
-       init.buffers_offset = init32.buffers_offset;
-
-       return drm_ioctl_kernel(file, mga_dma_init, &init,
-                               DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
-}
-
-typedef struct drm_mga_getparam32 {
-       int param;
-       u32 value;
-} drm_mga_getparam32_t;
-
-static int compat_mga_getparam(struct file *file, unsigned int cmd,
-                              unsigned long arg)
-{
-       drm_mga_getparam32_t getparam32;
-       drm_mga_getparam_t getparam;
-
-       if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32)))
-               return -EFAULT;
-
-       getparam.param = getparam32.param;
-       getparam.value = compat_ptr(getparam32.value);
-       return drm_ioctl_kernel(file, mga_getparam, &getparam, DRM_AUTH);
-}
-
-typedef struct drm_mga_drm_bootstrap32 {
-       u32 texture_handle;
-       u32 texture_size;
-       u32 primary_size;
-       u32 secondary_bin_count;
-       u32 secondary_bin_size;
-       u32 agp_mode;
-       u8 agp_size;
-} drm_mga_dma_bootstrap32_t;
-
-static int compat_mga_dma_bootstrap(struct file *file, unsigned int cmd,
-                                   unsigned long arg)
-{
-       drm_mga_dma_bootstrap32_t dma_bootstrap32;
-       drm_mga_dma_bootstrap_t dma_bootstrap;
-       int err;
-
-       if (copy_from_user(&dma_bootstrap32, (void __user *)arg,
-                          sizeof(dma_bootstrap32)))
-               return -EFAULT;
-
-       dma_bootstrap.texture_handle = dma_bootstrap32.texture_handle;
-       dma_bootstrap.texture_size = dma_bootstrap32.texture_size;
-       dma_bootstrap.primary_size = dma_bootstrap32.primary_size;
-       dma_bootstrap.secondary_bin_count = dma_bootstrap32.secondary_bin_count;
-       dma_bootstrap.secondary_bin_size = dma_bootstrap32.secondary_bin_size;
-       dma_bootstrap.agp_mode = dma_bootstrap32.agp_mode;
-       dma_bootstrap.agp_size = dma_bootstrap32.agp_size;
-
-       err = drm_ioctl_kernel(file, mga_dma_bootstrap, &dma_bootstrap,
-                               DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
-       if (err)
-               return err;
-
-       dma_bootstrap32.texture_handle = dma_bootstrap.texture_handle;
-       dma_bootstrap32.texture_size = dma_bootstrap.texture_size;
-       dma_bootstrap32.primary_size = dma_bootstrap.primary_size;
-       dma_bootstrap32.secondary_bin_count = dma_bootstrap.secondary_bin_count;
-       dma_bootstrap32.secondary_bin_size = dma_bootstrap.secondary_bin_size;
-       dma_bootstrap32.agp_mode = dma_bootstrap.agp_mode;
-       dma_bootstrap32.agp_size = dma_bootstrap.agp_size;
-       if (copy_to_user((void __user *)arg, &dma_bootstrap32,
-                        sizeof(dma_bootstrap32)))
-               return -EFAULT;
-
-       return 0;
-}
-
-static struct {
-       drm_ioctl_compat_t *fn;
-       char *name;
-} mga_compat_ioctls[] = {
-#define DRM_IOCTL32_DEF(n, f)[DRM_##n] = {.fn = f, .name = #n}
-       DRM_IOCTL32_DEF(MGA_INIT, compat_mga_init),
-       DRM_IOCTL32_DEF(MGA_GETPARAM, compat_mga_getparam),
-       DRM_IOCTL32_DEF(MGA_DMA_BOOTSTRAP, compat_mga_dma_bootstrap),
-};
-
-/**
- * mga_compat_ioctl - Called whenever a 32-bit process running under
- *                    a 64-bit kernel performs an ioctl on /dev/dri/card<n>.
- *
- * @filp: file pointer.
- * @cmd:  command.
- * @arg:  user argument.
- * return: zero on success or negative number on failure.
- */
-long mga_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
-       unsigned int nr = DRM_IOCTL_NR(cmd);
-       struct drm_file *file_priv = filp->private_data;
-       drm_ioctl_compat_t *fn = NULL;
-       int ret;
-
-       if (nr < DRM_COMMAND_BASE)
-               return drm_compat_ioctl(filp, cmd, arg);
-
-       if (nr >= DRM_COMMAND_BASE + ARRAY_SIZE(mga_compat_ioctls))
-               return drm_ioctl(filp, cmd, arg);
-
-       fn = mga_compat_ioctls[nr - DRM_COMMAND_BASE].fn;
-       if (!fn)
-               return drm_ioctl(filp, cmd, arg);
-
-       DRM_DEBUG("pid=%d, dev=0x%lx, auth=%d, %s\n",
-                 task_pid_nr(current),
-                 (long)old_encode_dev(file_priv->minor->kdev->devt),
-                 file_priv->authenticated,
-                 mga_compat_ioctls[nr - DRM_COMMAND_BASE].name);
-       ret = (*fn) (filp, cmd, arg);
-       if (ret)
-               DRM_DEBUG("ret = %d\n", ret);
-       return ret;
-}
diff --git a/drivers/gpu/drm/mga/mga_irq.c b/drivers/gpu/drm/mga/mga_irq.c
deleted file mode 100644 (file)
index a7e6ffc..0000000
+++ /dev/null
@@ -1,169 +0,0 @@
-/* mga_irq.c -- IRQ handling for radeon -*- linux-c -*-
- */
-/*
- * Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
- *
- * The Weather Channel (TM) funded Tungsten Graphics to develop the
- * initial release of the Radeon 8500 driver under the XFree86 license.
- * This notice must be preserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Keith Whitwell <keith@tungstengraphics.com>
- *    Eric Anholt <anholt@FreeBSD.org>
- */
-
-#include "mga_drv.h"
-
-u32 mga_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
-{
-       const drm_mga_private_t *const dev_priv =
-               (drm_mga_private_t *) dev->dev_private;
-
-       if (pipe != 0)
-               return 0;
-
-       return atomic_read(&dev_priv->vbl_received);
-}
-
-
-irqreturn_t mga_driver_irq_handler(int irq, void *arg)
-{
-       struct drm_device *dev = (struct drm_device *) arg;
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-       int status;
-       int handled = 0;
-
-       status = MGA_READ(MGA_STATUS);
-
-       /* VBLANK interrupt */
-       if (status & MGA_VLINEPEN) {
-               MGA_WRITE(MGA_ICLEAR, MGA_VLINEICLR);
-               atomic_inc(&dev_priv->vbl_received);
-               drm_handle_vblank(dev, 0);
-               handled = 1;
-       }
-
-       /* SOFTRAP interrupt */
-       if (status & MGA_SOFTRAPEN) {
-               const u32 prim_start = MGA_READ(MGA_PRIMADDRESS);
-               const u32 prim_end = MGA_READ(MGA_PRIMEND);
-
-
-               MGA_WRITE(MGA_ICLEAR, MGA_SOFTRAPICLR);
-
-               /* In addition to clearing the interrupt-pending bit, we
-                * have to write to MGA_PRIMEND to re-start the DMA operation.
-                */
-               if ((prim_start & ~0x03) != (prim_end & ~0x03))
-                       MGA_WRITE(MGA_PRIMEND, prim_end);
-
-               atomic_inc(&dev_priv->last_fence_retired);
-               wake_up(&dev_priv->fence_queue);
-               handled = 1;
-       }
-
-       if (handled)
-               return IRQ_HANDLED;
-       return IRQ_NONE;
-}
-
-int mga_enable_vblank(struct drm_device *dev, unsigned int pipe)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-
-       if (pipe != 0) {
-               DRM_ERROR("tried to enable vblank on non-existent crtc %u\n",
-                         pipe);
-               return 0;
-       }
-
-       MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN);
-       return 0;
-}
-
-
-void mga_disable_vblank(struct drm_device *dev, unsigned int pipe)
-{
-       if (pipe != 0) {
-               DRM_ERROR("tried to disable vblank on non-existent crtc %u\n",
-                         pipe);
-       }
-
-       /* Do *NOT* disable the vertical refresh interrupt.  MGA doesn't have
-        * a nice hardware counter that tracks the number of refreshes when
-        * the interrupt is disabled, and the kernel doesn't know the refresh
-        * rate to calculate an estimate.
-        */
-       /* MGA_WRITE(MGA_IEN, MGA_VLINEIEN | MGA_SOFTRAPEN); */
-}
-
-void mga_driver_fence_wait(struct drm_device *dev, unsigned int *sequence)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-       unsigned int cur_fence;
-
-       /* Assume that the user has missed the current sequence number
-        * by about a day rather than she wants to wait for years
-        * using fences.
-        */
-       wait_event_timeout(dev_priv->fence_queue,
-                   (((cur_fence = atomic_read(&dev_priv->last_fence_retired))
-                     - *sequence) <= (1 << 23)),
-                   msecs_to_jiffies(3000));
-
-       *sequence = cur_fence;
-}
-
-void mga_driver_irq_preinstall(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-
-       /* Disable *all* interrupts */
-       MGA_WRITE(MGA_IEN, 0);
-       /* Clear bits if they're already high */
-       MGA_WRITE(MGA_ICLEAR, ~0);
-}
-
-int mga_driver_irq_postinstall(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-
-       init_waitqueue_head(&dev_priv->fence_queue);
-
-       /* Turn on soft trap interrupt.  Vertical blank interrupts are enabled
-        * in mga_enable_vblank.
-        */
-       MGA_WRITE(MGA_IEN, MGA_SOFTRAPEN);
-       return 0;
-}
-
-void mga_driver_irq_uninstall(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = (drm_mga_private_t *) dev->dev_private;
-       if (!dev_priv)
-               return;
-
-       /* Disable *all* interrupts */
-       MGA_WRITE(MGA_IEN, 0);
-
-       dev->irq_enabled = false;
-}
diff --git a/drivers/gpu/drm/mga/mga_state.c b/drivers/gpu/drm/mga/mga_state.c
deleted file mode 100644 (file)
index 5b7247b..0000000
+++ /dev/null
@@ -1,1099 +0,0 @@
-/* mga_state.c -- State support for MGA G200/G400 -*- linux-c -*-
- * Created: Thu Jan 27 02:53:43 2000 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Jeff Hartmann <jhartmann@valinux.com>
- *    Keith Whitwell <keith@tungstengraphics.com>
- *
- * Rewritten by:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include "mga_drv.h"
-
-/* ================================================================
- * DMA hardware state programming functions
- */
-
-static void mga_emit_clip_rect(drm_mga_private_t *dev_priv,
-                              struct drm_clip_rect *box)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-       unsigned int pitch = dev_priv->front_pitch;
-       DMA_LOCALS;
-
-       BEGIN_DMA(2);
-
-       /* Force reset of DWGCTL on G400 (eliminates clip disable bit).
-        */
-       if (dev_priv->chipset >= MGA_CARD_TYPE_G400) {
-               DMA_BLOCK(MGA_DWGCTL, ctx->dwgctl,
-                         MGA_LEN + MGA_EXEC, 0x80000000,
-                         MGA_DWGCTL, ctx->dwgctl,
-                         MGA_LEN + MGA_EXEC, 0x80000000);
-       }
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_CXBNDRY, ((box->x2 - 1) << 16) | box->x1,
-                 MGA_YTOP, box->y1 * pitch, MGA_YBOT, (box->y2 - 1) * pitch);
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g200_emit_context(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-       DMA_LOCALS;
-
-       BEGIN_DMA(3);
-
-       DMA_BLOCK(MGA_DSTORG, ctx->dstorg,
-                 MGA_MACCESS, ctx->maccess,
-                 MGA_PLNWT, ctx->plnwt, MGA_DWGCTL, ctx->dwgctl);
-
-       DMA_BLOCK(MGA_ALPHACTRL, ctx->alphactrl,
-                 MGA_FOGCOL, ctx->fogcolor,
-                 MGA_WFLAG, ctx->wflag, MGA_ZORG, dev_priv->depth_offset);
-
-       DMA_BLOCK(MGA_FCOL, ctx->fcol,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g400_emit_context(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-       DMA_LOCALS;
-
-       BEGIN_DMA(4);
-
-       DMA_BLOCK(MGA_DSTORG, ctx->dstorg,
-                 MGA_MACCESS, ctx->maccess,
-                 MGA_PLNWT, ctx->plnwt, MGA_DWGCTL, ctx->dwgctl);
-
-       DMA_BLOCK(MGA_ALPHACTRL, ctx->alphactrl,
-                 MGA_FOGCOL, ctx->fogcolor,
-                 MGA_WFLAG, ctx->wflag, MGA_ZORG, dev_priv->depth_offset);
-
-       DMA_BLOCK(MGA_WFLAG1, ctx->wflag,
-                 MGA_TDUALSTAGE0, ctx->tdualstage0,
-                 MGA_TDUALSTAGE1, ctx->tdualstage1, MGA_FCOL, ctx->fcol);
-
-       DMA_BLOCK(MGA_STENCIL, ctx->stencil,
-                 MGA_STENCILCTL, ctx->stencilctl,
-                 MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g200_emit_tex0(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0];
-       DMA_LOCALS;
-
-       BEGIN_DMA(4);
-
-       DMA_BLOCK(MGA_TEXCTL2, tex->texctl2,
-                 MGA_TEXCTL, tex->texctl,
-                 MGA_TEXFILTER, tex->texfilter,
-                 MGA_TEXBORDERCOL, tex->texbordercol);
-
-       DMA_BLOCK(MGA_TEXORG, tex->texorg,
-                 MGA_TEXORG1, tex->texorg1,
-                 MGA_TEXORG2, tex->texorg2, MGA_TEXORG3, tex->texorg3);
-
-       DMA_BLOCK(MGA_TEXORG4, tex->texorg4,
-                 MGA_TEXWIDTH, tex->texwidth,
-                 MGA_TEXHEIGHT, tex->texheight, MGA_WR24, tex->texwidth);
-
-       DMA_BLOCK(MGA_WR34, tex->texheight,
-                 MGA_TEXTRANS, 0x0000ffff,
-                 MGA_TEXTRANSHIGH, 0x0000ffff, MGA_DMAPAD, 0x00000000);
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g400_emit_tex0(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[0];
-       DMA_LOCALS;
-
-/*     printk("mga_g400_emit_tex0 %x %x %x\n", tex->texorg, */
-/*            tex->texctl, tex->texctl2); */
-
-       BEGIN_DMA(6);
-
-       DMA_BLOCK(MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC,
-                 MGA_TEXCTL, tex->texctl,
-                 MGA_TEXFILTER, tex->texfilter,
-                 MGA_TEXBORDERCOL, tex->texbordercol);
-
-       DMA_BLOCK(MGA_TEXORG, tex->texorg,
-                 MGA_TEXORG1, tex->texorg1,
-                 MGA_TEXORG2, tex->texorg2, MGA_TEXORG3, tex->texorg3);
-
-       DMA_BLOCK(MGA_TEXORG4, tex->texorg4,
-                 MGA_TEXWIDTH, tex->texwidth,
-                 MGA_TEXHEIGHT, tex->texheight, MGA_WR49, 0x00000000);
-
-       DMA_BLOCK(MGA_WR57, 0x00000000,
-                 MGA_WR53, 0x00000000,
-                 MGA_WR61, 0x00000000, MGA_WR52, MGA_G400_WR_MAGIC);
-
-       DMA_BLOCK(MGA_WR60, MGA_G400_WR_MAGIC,
-                 MGA_WR54, tex->texwidth | MGA_G400_WR_MAGIC,
-                 MGA_WR62, tex->texheight | MGA_G400_WR_MAGIC,
-                 MGA_DMAPAD, 0x00000000);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_TEXTRANS, 0x0000ffff, MGA_TEXTRANSHIGH, 0x0000ffff);
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g400_emit_tex1(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[1];
-       DMA_LOCALS;
-
-/*     printk("mga_g400_emit_tex1 %x %x %x\n", tex->texorg,  */
-/*            tex->texctl, tex->texctl2); */
-
-       BEGIN_DMA(5);
-
-       DMA_BLOCK(MGA_TEXCTL2, (tex->texctl2 |
-                               MGA_MAP1_ENABLE |
-                               MGA_G400_TC2_MAGIC),
-                 MGA_TEXCTL, tex->texctl,
-                 MGA_TEXFILTER, tex->texfilter,
-                 MGA_TEXBORDERCOL, tex->texbordercol);
-
-       DMA_BLOCK(MGA_TEXORG, tex->texorg,
-                 MGA_TEXORG1, tex->texorg1,
-                 MGA_TEXORG2, tex->texorg2, MGA_TEXORG3, tex->texorg3);
-
-       DMA_BLOCK(MGA_TEXORG4, tex->texorg4,
-                 MGA_TEXWIDTH, tex->texwidth,
-                 MGA_TEXHEIGHT, tex->texheight, MGA_WR49, 0x00000000);
-
-       DMA_BLOCK(MGA_WR57, 0x00000000,
-                 MGA_WR53, 0x00000000,
-                 MGA_WR61, 0x00000000,
-                 MGA_WR52, tex->texwidth | MGA_G400_WR_MAGIC);
-
-       DMA_BLOCK(MGA_WR60, tex->texheight | MGA_G400_WR_MAGIC,
-                 MGA_TEXTRANS, 0x0000ffff,
-                 MGA_TEXTRANSHIGH, 0x0000ffff,
-                 MGA_TEXCTL2, tex->texctl2 | MGA_G400_TC2_MAGIC);
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g200_emit_pipe(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int pipe = sarea_priv->warp_pipe;
-       DMA_LOCALS;
-
-       BEGIN_DMA(3);
-
-       DMA_BLOCK(MGA_WIADDR, MGA_WMODE_SUSPEND,
-                 MGA_WVRTXSZ, 0x00000007,
-                 MGA_WFLAG, 0x00000000, MGA_WR24, 0x00000000);
-
-       DMA_BLOCK(MGA_WR25, 0x00000100,
-                 MGA_WR34, 0x00000000,
-                 MGA_WR42, 0x0000ffff, MGA_WR60, 0x0000ffff);
-
-       /* Padding required due to hardware bug.
-        */
-       DMA_BLOCK(MGA_DMAPAD, 0xffffffff,
-                 MGA_DMAPAD, 0xffffffff,
-                 MGA_DMAPAD, 0xffffffff,
-                 MGA_WIADDR, (dev_priv->warp_pipe_phys[pipe] |
-                              MGA_WMODE_START | dev_priv->wagp_enable));
-
-       ADVANCE_DMA();
-}
-
-static __inline__ void mga_g400_emit_pipe(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int pipe = sarea_priv->warp_pipe;
-       DMA_LOCALS;
-
-/*     printk("mga_g400_emit_pipe %x\n", pipe); */
-
-       BEGIN_DMA(10);
-
-       DMA_BLOCK(MGA_WIADDR2, MGA_WMODE_SUSPEND,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-       if (pipe & MGA_T2) {
-               DMA_BLOCK(MGA_WVRTXSZ, 0x00001e09,
-                         MGA_DMAPAD, 0x00000000,
-                         MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-               DMA_BLOCK(MGA_WACCEPTSEQ, 0x00000000,
-                         MGA_WACCEPTSEQ, 0x00000000,
-                         MGA_WACCEPTSEQ, 0x00000000,
-                         MGA_WACCEPTSEQ, 0x1e000000);
-       } else {
-               if (dev_priv->warp_pipe & MGA_T2) {
-                       /* Flush the WARP pipe */
-                       DMA_BLOCK(MGA_YDST, 0x00000000,
-                                 MGA_FXLEFT, 0x00000000,
-                                 MGA_FXRIGHT, 0x00000001,
-                                 MGA_DWGCTL, MGA_DWGCTL_FLUSH);
-
-                       DMA_BLOCK(MGA_LEN + MGA_EXEC, 0x00000001,
-                                 MGA_DWGSYNC, 0x00007000,
-                                 MGA_TEXCTL2, MGA_G400_TC2_MAGIC,
-                                 MGA_LEN + MGA_EXEC, 0x00000000);
-
-                       DMA_BLOCK(MGA_TEXCTL2, (MGA_DUALTEX |
-                                               MGA_G400_TC2_MAGIC),
-                                 MGA_LEN + MGA_EXEC, 0x00000000,
-                                 MGA_TEXCTL2, MGA_G400_TC2_MAGIC,
-                                 MGA_DMAPAD, 0x00000000);
-               }
-
-               DMA_BLOCK(MGA_WVRTXSZ, 0x00001807,
-                         MGA_DMAPAD, 0x00000000,
-                         MGA_DMAPAD, 0x00000000, MGA_DMAPAD, 0x00000000);
-
-               DMA_BLOCK(MGA_WACCEPTSEQ, 0x00000000,
-                         MGA_WACCEPTSEQ, 0x00000000,
-                         MGA_WACCEPTSEQ, 0x00000000,
-                         MGA_WACCEPTSEQ, 0x18000000);
-       }
-
-       DMA_BLOCK(MGA_WFLAG, 0x00000000,
-                 MGA_WFLAG1, 0x00000000,
-                 MGA_WR56, MGA_G400_WR56_MAGIC, MGA_DMAPAD, 0x00000000);
-
-       DMA_BLOCK(MGA_WR49, 0x00000000, /* tex0              */
-                 MGA_WR57, 0x00000000, /* tex0              */
-                 MGA_WR53, 0x00000000, /* tex1              */
-                 MGA_WR61, 0x00000000);        /* tex1              */
-
-       DMA_BLOCK(MGA_WR54, MGA_G400_WR_MAGIC,  /* tex0 width        */
-                 MGA_WR62, MGA_G400_WR_MAGIC,  /* tex0 height       */
-                 MGA_WR52, MGA_G400_WR_MAGIC,  /* tex1 width        */
-                 MGA_WR60, MGA_G400_WR_MAGIC); /* tex1 height       */
-
-       /* Padding required due to hardware bug */
-       DMA_BLOCK(MGA_DMAPAD, 0xffffffff,
-                 MGA_DMAPAD, 0xffffffff,
-                 MGA_DMAPAD, 0xffffffff,
-                 MGA_WIADDR2, (dev_priv->warp_pipe_phys[pipe] |
-                               MGA_WMODE_START | dev_priv->wagp_enable));
-
-       ADVANCE_DMA();
-}
-
-static void mga_g200_emit_state(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int dirty = sarea_priv->dirty;
-
-       if (sarea_priv->warp_pipe != dev_priv->warp_pipe) {
-               mga_g200_emit_pipe(dev_priv);
-               dev_priv->warp_pipe = sarea_priv->warp_pipe;
-       }
-
-       if (dirty & MGA_UPLOAD_CONTEXT) {
-               mga_g200_emit_context(dev_priv);
-               sarea_priv->dirty &= ~MGA_UPLOAD_CONTEXT;
-       }
-
-       if (dirty & MGA_UPLOAD_TEX0) {
-               mga_g200_emit_tex0(dev_priv);
-               sarea_priv->dirty &= ~MGA_UPLOAD_TEX0;
-       }
-}
-
-static void mga_g400_emit_state(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int dirty = sarea_priv->dirty;
-       int multitex = sarea_priv->warp_pipe & MGA_T2;
-
-       if (sarea_priv->warp_pipe != dev_priv->warp_pipe) {
-               mga_g400_emit_pipe(dev_priv);
-               dev_priv->warp_pipe = sarea_priv->warp_pipe;
-       }
-
-       if (dirty & MGA_UPLOAD_CONTEXT) {
-               mga_g400_emit_context(dev_priv);
-               sarea_priv->dirty &= ~MGA_UPLOAD_CONTEXT;
-       }
-
-       if (dirty & MGA_UPLOAD_TEX0) {
-               mga_g400_emit_tex0(dev_priv);
-               sarea_priv->dirty &= ~MGA_UPLOAD_TEX0;
-       }
-
-       if ((dirty & MGA_UPLOAD_TEX1) && multitex) {
-               mga_g400_emit_tex1(dev_priv);
-               sarea_priv->dirty &= ~MGA_UPLOAD_TEX1;
-       }
-}
-
-/* ================================================================
- * SAREA state verification
- */
-
-/* Disallow all write destinations except the front and backbuffer.
- */
-static int mga_verify_context(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-
-       if (ctx->dstorg != dev_priv->front_offset &&
-           ctx->dstorg != dev_priv->back_offset) {
-               DRM_ERROR("*** bad DSTORG: %x (front %x, back %x)\n\n",
-                         ctx->dstorg, dev_priv->front_offset,
-                         dev_priv->back_offset);
-               ctx->dstorg = 0;
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-/* Disallow texture reads from PCI space.
- */
-static int mga_verify_tex(drm_mga_private_t *dev_priv, int unit)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_texture_regs_t *tex = &sarea_priv->tex_state[unit];
-       unsigned int org;
-
-       org = tex->texorg & (MGA_TEXORGMAP_MASK | MGA_TEXORGACC_MASK);
-
-       if (org == (MGA_TEXORGMAP_SYSMEM | MGA_TEXORGACC_PCI)) {
-               DRM_ERROR("*** bad TEXORG: 0x%x, unit %d\n", tex->texorg, unit);
-               tex->texorg = 0;
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int mga_verify_state(drm_mga_private_t *dev_priv)
-{
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int dirty = sarea_priv->dirty;
-       int ret = 0;
-
-       if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS)
-               sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
-
-       if (dirty & MGA_UPLOAD_CONTEXT)
-               ret |= mga_verify_context(dev_priv);
-
-       if (dirty & MGA_UPLOAD_TEX0)
-               ret |= mga_verify_tex(dev_priv, 0);
-
-       if (dev_priv->chipset >= MGA_CARD_TYPE_G400) {
-               if (dirty & MGA_UPLOAD_TEX1)
-                       ret |= mga_verify_tex(dev_priv, 1);
-
-               if (dirty & MGA_UPLOAD_PIPE)
-                       ret |= (sarea_priv->warp_pipe > MGA_MAX_G400_PIPES);
-       } else {
-               if (dirty & MGA_UPLOAD_PIPE)
-                       ret |= (sarea_priv->warp_pipe > MGA_MAX_G200_PIPES);
-       }
-
-       return (ret == 0);
-}
-
-static int mga_verify_iload(drm_mga_private_t *dev_priv,
-                           unsigned int dstorg, unsigned int length)
-{
-       if (dstorg < dev_priv->texture_offset ||
-           dstorg + length > (dev_priv->texture_offset +
-                              dev_priv->texture_size)) {
-               DRM_ERROR("*** bad iload DSTORG: 0x%x\n", dstorg);
-               return -EINVAL;
-       }
-
-       if (length & MGA_ILOAD_MASK) {
-               DRM_ERROR("*** bad iload length: 0x%x\n",
-                         length & MGA_ILOAD_MASK);
-               return -EINVAL;
-       }
-
-       return 0;
-}
-
-static int mga_verify_blit(drm_mga_private_t *dev_priv,
-                          unsigned int srcorg, unsigned int dstorg)
-{
-       if ((srcorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM) ||
-           (dstorg & 0x3) == (MGA_SRCACC_PCI | MGA_SRCMAP_SYSMEM)) {
-               DRM_ERROR("*** bad blit: src=0x%x dst=0x%x\n", srcorg, dstorg);
-               return -EINVAL;
-       }
-       return 0;
-}
-
-/* ================================================================
- *
- */
-
-static void mga_dma_dispatch_clear(struct drm_device *dev, drm_mga_clear_t *clear)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       int nbox = sarea_priv->nbox;
-       int i;
-       DMA_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_DMA(1);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DWGSYNC, 0x00007100, MGA_DWGSYNC, 0x00007000);
-
-       ADVANCE_DMA();
-
-       for (i = 0; i < nbox; i++) {
-               struct drm_clip_rect *box = &pbox[i];
-               u32 height = box->y2 - box->y1;
-
-               DRM_DEBUG("   from=%d,%d to=%d,%d\n",
-                         box->x1, box->y1, box->x2, box->y2);
-
-               if (clear->flags & MGA_FRONT) {
-                       BEGIN_DMA(2);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_PLNWT, clear->color_mask,
-                                 MGA_YDSTLEN, (box->y1 << 16) | height,
-                                 MGA_FXBNDRY, (box->x2 << 16) | box->x1);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_FCOL, clear->clear_color,
-                                 MGA_DSTORG, dev_priv->front_offset,
-                                 MGA_DWGCTL + MGA_EXEC, dev_priv->clear_cmd);
-
-                       ADVANCE_DMA();
-               }
-
-               if (clear->flags & MGA_BACK) {
-                       BEGIN_DMA(2);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_PLNWT, clear->color_mask,
-                                 MGA_YDSTLEN, (box->y1 << 16) | height,
-                                 MGA_FXBNDRY, (box->x2 << 16) | box->x1);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_FCOL, clear->clear_color,
-                                 MGA_DSTORG, dev_priv->back_offset,
-                                 MGA_DWGCTL + MGA_EXEC, dev_priv->clear_cmd);
-
-                       ADVANCE_DMA();
-               }
-
-               if (clear->flags & MGA_DEPTH) {
-                       BEGIN_DMA(2);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_PLNWT, clear->depth_mask,
-                                 MGA_YDSTLEN, (box->y1 << 16) | height,
-                                 MGA_FXBNDRY, (box->x2 << 16) | box->x1);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_FCOL, clear->clear_depth,
-                                 MGA_DSTORG, dev_priv->depth_offset,
-                                 MGA_DWGCTL + MGA_EXEC, dev_priv->clear_cmd);
-
-                       ADVANCE_DMA();
-               }
-
-       }
-
-       BEGIN_DMA(1);
-
-       /* Force reset of DWGCTL */
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_PLNWT, ctx->plnwt, MGA_DWGCTL, ctx->dwgctl);
-
-       ADVANCE_DMA();
-
-       FLUSH_DMA();
-}
-
-static void mga_dma_dispatch_swap(struct drm_device *dev)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       int nbox = sarea_priv->nbox;
-       int i;
-       DMA_LOCALS;
-       DRM_DEBUG("\n");
-
-       sarea_priv->last_frame.head = dev_priv->prim.tail;
-       sarea_priv->last_frame.wrap = dev_priv->prim.last_wrap;
-
-       BEGIN_DMA(4 + nbox);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DWGSYNC, 0x00007100, MGA_DWGSYNC, 0x00007000);
-
-       DMA_BLOCK(MGA_DSTORG, dev_priv->front_offset,
-                 MGA_MACCESS, dev_priv->maccess,
-                 MGA_SRCORG, dev_priv->back_offset,
-                 MGA_AR5, dev_priv->front_pitch);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_PLNWT, 0xffffffff, MGA_DWGCTL, MGA_DWGCTL_COPY);
-
-       for (i = 0; i < nbox; i++) {
-               struct drm_clip_rect *box = &pbox[i];
-               u32 height = box->y2 - box->y1;
-               u32 start = box->y1 * dev_priv->front_pitch;
-
-               DRM_DEBUG("   from=%d,%d to=%d,%d\n",
-                         box->x1, box->y1, box->x2, box->y2);
-
-               DMA_BLOCK(MGA_AR0, start + box->x2 - 1,
-                         MGA_AR3, start + box->x1,
-                         MGA_FXBNDRY, ((box->x2 - 1) << 16) | box->x1,
-                         MGA_YDSTLEN + MGA_EXEC, (box->y1 << 16) | height);
-       }
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_PLNWT, ctx->plnwt,
-                 MGA_SRCORG, dev_priv->front_offset, MGA_DWGCTL, ctx->dwgctl);
-
-       ADVANCE_DMA();
-
-       FLUSH_DMA();
-
-       DRM_DEBUG("... done.\n");
-}
-
-static void mga_dma_dispatch_vertex(struct drm_device *dev, struct drm_buf *buf)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_buf_priv_t *buf_priv = buf->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       u32 address = (u32) buf->bus_address;
-       u32 length = (u32) buf->used;
-       int i = 0;
-       DMA_LOCALS;
-       DRM_DEBUG("buf=%d used=%d\n", buf->idx, buf->used);
-
-       if (buf->used) {
-               buf_priv->dispatched = 1;
-
-               MGA_EMIT_STATE(dev_priv, sarea_priv->dirty);
-
-               do {
-                       if (i < sarea_priv->nbox) {
-                               mga_emit_clip_rect(dev_priv,
-                                                  &sarea_priv->boxes[i]);
-                       }
-
-                       BEGIN_DMA(1);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_DMAPAD, 0x00000000,
-                                 MGA_SECADDRESS, (address |
-                                                  MGA_DMA_VERTEX),
-                                 MGA_SECEND, ((address + length) |
-                                              dev_priv->dma_access));
-
-                       ADVANCE_DMA();
-               } while (++i < sarea_priv->nbox);
-       }
-
-       if (buf_priv->discard) {
-               AGE_BUFFER(buf_priv);
-               buf->pending = 0;
-               buf->used = 0;
-               buf_priv->dispatched = 0;
-
-               mga_freelist_put(dev, buf);
-       }
-
-       FLUSH_DMA();
-}
-
-static void mga_dma_dispatch_indices(struct drm_device *dev, struct drm_buf *buf,
-                                    unsigned int start, unsigned int end)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_buf_priv_t *buf_priv = buf->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       u32 address = (u32) buf->bus_address;
-       int i = 0;
-       DMA_LOCALS;
-       DRM_DEBUG("buf=%d start=%d end=%d\n", buf->idx, start, end);
-
-       if (start != end) {
-               buf_priv->dispatched = 1;
-
-               MGA_EMIT_STATE(dev_priv, sarea_priv->dirty);
-
-               do {
-                       if (i < sarea_priv->nbox) {
-                               mga_emit_clip_rect(dev_priv,
-                                                  &sarea_priv->boxes[i]);
-                       }
-
-                       BEGIN_DMA(1);
-
-                       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                                 MGA_DMAPAD, 0x00000000,
-                                 MGA_SETUPADDRESS, address + start,
-                                 MGA_SETUPEND, ((address + end) |
-                                                dev_priv->dma_access));
-
-                       ADVANCE_DMA();
-               } while (++i < sarea_priv->nbox);
-       }
-
-       if (buf_priv->discard) {
-               AGE_BUFFER(buf_priv);
-               buf->pending = 0;
-               buf->used = 0;
-               buf_priv->dispatched = 0;
-
-               mga_freelist_put(dev, buf);
-       }
-
-       FLUSH_DMA();
-}
-
-/* This copies a 64 byte aligned agp region to the frambuffer with a
- * standard blit, the ioctl needs to do checking.
- */
-static void mga_dma_dispatch_iload(struct drm_device *dev, struct drm_buf *buf,
-                                  unsigned int dstorg, unsigned int length)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_buf_priv_t *buf_priv = buf->dev_private;
-       drm_mga_context_regs_t *ctx = &dev_priv->sarea_priv->context_state;
-       u32 srcorg =
-           buf->bus_address | dev_priv->dma_access | MGA_SRCMAP_SYSMEM;
-       u32 y2;
-       DMA_LOCALS;
-       DRM_DEBUG("buf=%d used=%d\n", buf->idx, buf->used);
-
-       y2 = length / 64;
-
-       BEGIN_DMA(5);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DWGSYNC, 0x00007100, MGA_DWGSYNC, 0x00007000);
-
-       DMA_BLOCK(MGA_DSTORG, dstorg,
-                 MGA_MACCESS, 0x00000000, MGA_SRCORG, srcorg, MGA_AR5, 64);
-
-       DMA_BLOCK(MGA_PITCH, 64,
-                 MGA_PLNWT, 0xffffffff,
-                 MGA_DMAPAD, 0x00000000, MGA_DWGCTL, MGA_DWGCTL_COPY);
-
-       DMA_BLOCK(MGA_AR0, 63,
-                 MGA_AR3, 0,
-                 MGA_FXBNDRY, (63 << 16) | 0, MGA_YDSTLEN + MGA_EXEC, y2);
-
-       DMA_BLOCK(MGA_PLNWT, ctx->plnwt,
-                 MGA_SRCORG, dev_priv->front_offset,
-                 MGA_PITCH, dev_priv->front_pitch, MGA_DWGSYNC, 0x00007000);
-
-       ADVANCE_DMA();
-
-       AGE_BUFFER(buf_priv);
-
-       buf->pending = 0;
-       buf->used = 0;
-       buf_priv->dispatched = 0;
-
-       mga_freelist_put(dev, buf);
-
-       FLUSH_DMA();
-}
-
-static void mga_dma_dispatch_blit(struct drm_device *dev, drm_mga_blit_t *blit)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_context_regs_t *ctx = &sarea_priv->context_state;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       int nbox = sarea_priv->nbox;
-       u32 scandir = 0, i;
-       DMA_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_DMA(4 + nbox);
-
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DWGSYNC, 0x00007100, MGA_DWGSYNC, 0x00007000);
-
-       DMA_BLOCK(MGA_DWGCTL, MGA_DWGCTL_COPY,
-                 MGA_PLNWT, blit->planemask,
-                 MGA_SRCORG, blit->srcorg, MGA_DSTORG, blit->dstorg);
-
-       DMA_BLOCK(MGA_SGN, scandir,
-                 MGA_MACCESS, dev_priv->maccess,
-                 MGA_AR5, blit->ydir * blit->src_pitch,
-                 MGA_PITCH, blit->dst_pitch);
-
-       for (i = 0; i < nbox; i++) {
-               int srcx = pbox[i].x1 + blit->delta_sx;
-               int srcy = pbox[i].y1 + blit->delta_sy;
-               int dstx = pbox[i].x1 + blit->delta_dx;
-               int dsty = pbox[i].y1 + blit->delta_dy;
-               int h = pbox[i].y2 - pbox[i].y1;
-               int w = pbox[i].x2 - pbox[i].x1 - 1;
-               int start;
-
-               if (blit->ydir == -1)
-                       srcy = blit->height - srcy - 1;
-
-               start = srcy * blit->src_pitch + srcx;
-
-               DMA_BLOCK(MGA_AR0, start + w,
-                         MGA_AR3, start,
-                         MGA_FXBNDRY, ((dstx + w) << 16) | (dstx & 0xffff),
-                         MGA_YDSTLEN + MGA_EXEC, (dsty << 16) | h);
-       }
-
-       /* Do something to flush AGP?
-        */
-
-       /* Force reset of DWGCTL */
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_PLNWT, ctx->plnwt,
-                 MGA_PITCH, dev_priv->front_pitch, MGA_DWGCTL, ctx->dwgctl);
-
-       ADVANCE_DMA();
-}
-
-/* ================================================================
- *
- */
-
-static int mga_dma_clear(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_clear_t *clear = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS)
-               sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       mga_dma_dispatch_clear(dev, clear);
-
-       /* Make sure we restore the 3D state next time.
-        */
-       dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
-
-       return 0;
-}
-
-static int mga_dma_swap(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS)
-               sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       mga_dma_dispatch_swap(dev);
-
-       /* Make sure we restore the 3D state next time.
-        */
-       dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
-
-       return 0;
-}
-
-static int mga_dma_vertex(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_mga_buf_priv_t *buf_priv;
-       drm_mga_vertex_t *vertex = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (vertex->idx < 0 || vertex->idx > dma->buf_count)
-               return -EINVAL;
-       buf = dma->buflist[vertex->idx];
-       buf_priv = buf->dev_private;
-
-       buf->used = vertex->used;
-       buf_priv->discard = vertex->discard;
-
-       if (!mga_verify_state(dev_priv)) {
-               if (vertex->discard) {
-                       if (buf_priv->dispatched == 1)
-                               AGE_BUFFER(buf_priv);
-                       buf_priv->dispatched = 0;
-                       mga_freelist_put(dev, buf);
-               }
-               return -EINVAL;
-       }
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       mga_dma_dispatch_vertex(dev, buf);
-
-       return 0;
-}
-
-static int mga_dma_indices(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_mga_buf_priv_t *buf_priv;
-       drm_mga_indices_t *indices = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (indices->idx < 0 || indices->idx > dma->buf_count)
-               return -EINVAL;
-
-       buf = dma->buflist[indices->idx];
-       buf_priv = buf->dev_private;
-
-       buf_priv->discard = indices->discard;
-
-       if (!mga_verify_state(dev_priv)) {
-               if (indices->discard) {
-                       if (buf_priv->dispatched == 1)
-                               AGE_BUFFER(buf_priv);
-                       buf_priv->dispatched = 0;
-                       mga_freelist_put(dev, buf);
-               }
-               return -EINVAL;
-       }
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       mga_dma_dispatch_indices(dev, buf, indices->start, indices->end);
-
-       return 0;
-}
-
-static int mga_dma_iload(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       struct drm_buf *buf;
-       drm_mga_iload_t *iload = data;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-#if 0
-       if (mga_do_wait_for_idle(dev_priv) < 0) {
-               if (MGA_DMA_DEBUG)
-                       DRM_INFO("-EBUSY\n");
-               return -EBUSY;
-       }
-#endif
-       if (iload->idx < 0 || iload->idx > dma->buf_count)
-               return -EINVAL;
-
-       buf = dma->buflist[iload->idx];
-
-       if (mga_verify_iload(dev_priv, iload->dstorg, iload->length)) {
-               mga_freelist_put(dev, buf);
-               return -EINVAL;
-       }
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       mga_dma_dispatch_iload(dev, buf, iload->dstorg, iload->length);
-
-       /* Make sure we restore the 3D state next time.
-        */
-       dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
-
-       return 0;
-}
-
-static int mga_dma_blit(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_mga_blit_t *blit = data;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (sarea_priv->nbox > MGA_NR_SAREA_CLIPRECTS)
-               sarea_priv->nbox = MGA_NR_SAREA_CLIPRECTS;
-
-       if (mga_verify_blit(dev_priv, blit->srcorg, blit->dstorg))
-               return -EINVAL;
-
-       WRAP_TEST_WITH_RETURN(dev_priv);
-
-       mga_dma_dispatch_blit(dev, blit);
-
-       /* Make sure we restore the 3D state next time.
-        */
-       dev_priv->sarea_priv->dirty |= MGA_UPLOAD_CONTEXT;
-
-       return 0;
-}
-
-int mga_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       drm_mga_getparam_t *param = data;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       int value;
-
-       if (!dev_priv) {
-               DRM_ERROR("called with no initialization\n");
-               return -EINVAL;
-       }
-
-       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
-
-       switch (param->param) {
-       case MGA_PARAM_IRQ_NR:
-               value = pdev->irq;
-               break;
-       case MGA_PARAM_CARD_TYPE:
-               value = dev_priv->chipset;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       if (copy_to_user(param->value, &value, sizeof(int))) {
-               DRM_ERROR("copy_to_user\n");
-               return -EFAULT;
-       }
-
-       return 0;
-}
-
-static int mga_set_fence(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       u32 *fence = data;
-       DMA_LOCALS;
-
-       if (!dev_priv) {
-               DRM_ERROR("called with no initialization\n");
-               return -EINVAL;
-       }
-
-       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
-
-       /* I would normal do this assignment in the declaration of fence,
-        * but dev_priv may be NULL.
-        */
-
-       *fence = dev_priv->next_fence_to_post;
-       dev_priv->next_fence_to_post++;
-
-       BEGIN_DMA(1);
-       DMA_BLOCK(MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000,
-                 MGA_DMAPAD, 0x00000000, MGA_SOFTRAP, 0x00000000);
-       ADVANCE_DMA();
-
-       return 0;
-}
-
-static int mga_wait_fence(struct drm_device *dev, void *data, struct drm_file *
-file_priv)
-{
-       drm_mga_private_t *dev_priv = dev->dev_private;
-       u32 *fence = data;
-
-       if (!dev_priv) {
-               DRM_ERROR("called with no initialization\n");
-               return -EINVAL;
-       }
-
-       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
-
-       mga_driver_fence_wait(dev, fence);
-       return 0;
-}
-
-const struct drm_ioctl_desc mga_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(MGA_INIT, mga_dma_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(MGA_FLUSH, mga_dma_flush, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_RESET, mga_dma_reset, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_SWAP, mga_dma_swap, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_CLEAR, mga_dma_clear, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_VERTEX, mga_dma_vertex, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_INDICES, mga_dma_indices, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_ILOAD, mga_dma_iload, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_BLIT, mga_dma_blit, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_GETPARAM, mga_getparam, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_SET_FENCE, mga_set_fence, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_WAIT_FENCE, mga_wait_fence, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(MGA_DMA_BOOTSTRAP, mga_dma_bootstrap, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-};
-
-int mga_max_ioctl = ARRAY_SIZE(mga_ioctls);
diff --git a/drivers/gpu/drm/mga/mga_warp.c b/drivers/gpu/drm/mga/mga_warp.c
deleted file mode 100644 (file)
index b5ef1d2..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-/* mga_warp.c -- Matrox G200/G400 WARP engine management -*- linux-c -*-
- * Created: Thu Jan 11 21:29:32 2001 by gareth@valinux.com
- *
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/firmware.h>
-#include <linux/ihex.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-
-#include "mga_drv.h"
-
-#define FIRMWARE_G200 "matrox/g200_warp.fw"
-#define FIRMWARE_G400 "matrox/g400_warp.fw"
-
-MODULE_FIRMWARE(FIRMWARE_G200);
-MODULE_FIRMWARE(FIRMWARE_G400);
-
-#define MGA_WARP_CODE_ALIGN            256     /* in bytes */
-
-#define WARP_UCODE_SIZE(size)          ALIGN(size, MGA_WARP_CODE_ALIGN)
-
-int mga_warp_install_microcode(drm_mga_private_t *dev_priv)
-{
-       unsigned char *vcbase = dev_priv->warp->handle;
-       unsigned long pcbase = dev_priv->warp->offset;
-       const char *firmware_name;
-       struct platform_device *pdev;
-       const struct firmware *fw = NULL;
-       const struct ihex_binrec *rec;
-       unsigned int size;
-       int n_pipes, where;
-       int rc = 0;
-
-       switch (dev_priv->chipset) {
-       case MGA_CARD_TYPE_G400:
-       case MGA_CARD_TYPE_G550:
-               firmware_name = FIRMWARE_G400;
-               n_pipes = MGA_MAX_G400_PIPES;
-               break;
-       case MGA_CARD_TYPE_G200:
-               firmware_name = FIRMWARE_G200;
-               n_pipes = MGA_MAX_G200_PIPES;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       pdev = platform_device_register_simple("mga_warp", 0, NULL, 0);
-       if (IS_ERR(pdev)) {
-               DRM_ERROR("mga: Failed to register microcode\n");
-               return PTR_ERR(pdev);
-       }
-       rc = request_ihex_firmware(&fw, firmware_name, &pdev->dev);
-       platform_device_unregister(pdev);
-       if (rc) {
-               DRM_ERROR("mga: Failed to load microcode \"%s\"\n",
-                         firmware_name);
-               return rc;
-       }
-
-       size = 0;
-       where = 0;
-       for (rec = (const struct ihex_binrec *)fw->data;
-            rec;
-            rec = ihex_next_binrec(rec)) {
-               size += WARP_UCODE_SIZE(be16_to_cpu(rec->len));
-               where++;
-       }
-
-       if (where != n_pipes) {
-               DRM_ERROR("mga: Invalid microcode \"%s\"\n", firmware_name);
-               rc = -EINVAL;
-               goto out;
-       }
-       size = PAGE_ALIGN(size);
-       DRM_DEBUG("MGA ucode size = %d bytes\n", size);
-       if (size > dev_priv->warp->size) {
-               DRM_ERROR("microcode too large! (%u > %lu)\n",
-                         size, dev_priv->warp->size);
-               rc = -ENOMEM;
-               goto out;
-       }
-
-       memset(dev_priv->warp_pipe_phys, 0, sizeof(dev_priv->warp_pipe_phys));
-
-       where = 0;
-       for (rec = (const struct ihex_binrec *)fw->data;
-            rec;
-            rec = ihex_next_binrec(rec)) {
-               unsigned int src_size, dst_size;
-
-               DRM_DEBUG(" pcbase = 0x%08lx  vcbase = %p\n", pcbase, vcbase);
-               dev_priv->warp_pipe_phys[where] = pcbase;
-               src_size = be16_to_cpu(rec->len);
-               dst_size = WARP_UCODE_SIZE(src_size);
-               memcpy(vcbase, rec->data, src_size);
-               pcbase += dst_size;
-               vcbase += dst_size;
-               where++;
-       }
-
-out:
-       release_firmware(fw);
-       return rc;
-}
-
-#define WMISC_EXPECTED         (MGA_WUCODECACHE_ENABLE | MGA_WMASTER_ENABLE)
-
-int mga_warp_init(drm_mga_private_t *dev_priv)
-{
-       u32 wmisc;
-
-       /* FIXME: Get rid of these damned magic numbers...
-        */
-       switch (dev_priv->chipset) {
-       case MGA_CARD_TYPE_G400:
-       case MGA_CARD_TYPE_G550:
-               MGA_WRITE(MGA_WIADDR2, MGA_WMODE_SUSPEND);
-               MGA_WRITE(MGA_WGETMSB, 0x00000E00);
-               MGA_WRITE(MGA_WVRTXSZ, 0x00001807);
-               MGA_WRITE(MGA_WACCEPTSEQ, 0x18000000);
-               break;
-       case MGA_CARD_TYPE_G200:
-               MGA_WRITE(MGA_WIADDR, MGA_WMODE_SUSPEND);
-               MGA_WRITE(MGA_WGETMSB, 0x1606);
-               MGA_WRITE(MGA_WVRTXSZ, 7);
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       MGA_WRITE(MGA_WMISC, (MGA_WUCODECACHE_ENABLE |
-                             MGA_WMASTER_ENABLE | MGA_WCACHEFLUSH_ENABLE));
-       wmisc = MGA_READ(MGA_WMISC);
-       if (wmisc != WMISC_EXPECTED) {
-               DRM_ERROR("WARP engine config failed! 0x%x != 0x%x\n",
-                         wmisc, WMISC_EXPECTED);
-               return -EINVAL;
-       }
-
-       return 0;
-}
index a0bb3987bf6379069dc92ae5667350b100a59014..a70bd65e1400760e46fef5097547df256b2f5d51 100644 (file)
@@ -26,18 +26,6 @@ config DRM_NOUVEAU
        help
          Choose this option for open-source NVIDIA support.
 
-config NOUVEAU_LEGACY_CTX_SUPPORT
-       bool "Nouveau legacy context support"
-       depends on DRM_NOUVEAU
-       select DRM_LEGACY
-       default y
-       help
-         There was a version of the nouveau DDX that relied on legacy
-         ctx ioctls not erroring out. But that was back in time a long
-         ways, so offer a way to disable it now. For uapi compat with
-         old nouveau ddx this should be on by default, but modern distros
-         should consider turning it off.
-
 config NOUVEAU_PLATFORM_DRIVER
        bool "Nouveau (NVIDIA) SoC GPUs"
        depends on DRM_NOUVEAU && ARCH_TEGRA
index 0e0f117bc70b164588ee9f92c3fd393aa9deb079..a6f2e681bde98a655c57eec251b3c7f28c977ce4 100644 (file)
@@ -23,8 +23,8 @@
  * DEALINGS IN THE SOFTWARE.
  */
 #include <drm/drm_crtc_helper.h>
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_plane_helper.h>
 #include <drm/drm_vblank.h>
 
index 22d10f328559740c1d65914bfd15b1933d96a38c..d6b8e0cce2ac91f162dbacd9e789ae98c215f131 100644 (file)
@@ -24,7 +24,7 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 
 #include "nouveau_drv.h"
 #include "nouveau_encoder.h"
index ce3d8c6ef000a4623dca525820f5b46f6401e8b2..d5b129dc623b464abd45d418f14af672f1b9da08 100644 (file)
@@ -24,8 +24,8 @@
  * DEALINGS IN THE SOFTWARE.
  */
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fourcc.h>
+#include <drm/drm_modeset_helper_vtables.h>
 
 #include "nouveau_drv.h"
 #include "nouveau_reg.h"
index 2f6d2b6711ab25c2fcd999732f21f9c413d038e7..a3fedd2268546d3d8c562f92b9dfcd1a7086082a 100644 (file)
@@ -24,7 +24,6 @@
  *
  */
 
-#include <drm/drm_crtc_helper.h>
 #include "nouveau_drv.h"
 #include "nouveau_encoder.h"
 #include "nouveau_crtc.h"
index 3ba7b59580d59efeab05d316d6eb0913e23716b7..de3ea731d6e6184f7fa69d4a13cffde5b6a253cc 100644 (file)
@@ -30,7 +30,7 @@
 #include "nouveau_connector.h"
 #include "nouveau_crtc.h"
 #include "hw.h"
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 
 #include <drm/i2c/ch7006.h>
 
index e5480dab55e312eeeac527deac99c037d2381a3e..670c9739e5e18cb65850dab4a5f3ffffd936b881 100644 (file)
@@ -25,6 +25,7 @@
  */
 
 #include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
 #include "nouveau_drv.h"
 #include "nouveau_reg.h"
index f006e56e1e08bd461a07494d55968a1f0c7c50a7..5f490fbf18772137c8048ce03604a8849dd06759 100644 (file)
@@ -32,7 +32,6 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_vblank.h>
 #include "nouveau_connector.h"
 
index 8c4cd08a7b5f8d7fff1204c2f2b0856aac1d3ac4..8b58b668fc0c4c46e7e263e0815b4e17352d45e1 100644 (file)
@@ -52,7 +52,7 @@ struct nvfw_hs_load_header_v2 {
        struct {
                u32 offset;
                u32 size;
-       } app[0];
+       } app[];
 };
 
 const struct nvfw_hs_load_header_v2 *nvfw_hs_load_header_v2(struct nvkm_subdev *, const void *);
index 335fa91ca4ad71b8089050b18590d1f4a1ad652e..288eebc70a67fefc958a678b9fbaab45bcf7b54d 100644 (file)
@@ -922,6 +922,7 @@ static void nouveau_bo_move_ntfy(struct ttm_buffer_object *bo,
        struct nouveau_mem *mem = new_reg ? nouveau_mem(new_reg) : NULL;
        struct nouveau_bo *nvbo = nouveau_bo(bo);
        struct nouveau_vma *vma;
+       long ret;
 
        /* ttm can now (stupidly) pass the driver bos it didn't create... */
        if (bo->destroy != nouveau_bo_del_ttm)
@@ -936,7 +937,10 @@ static void nouveau_bo_move_ntfy(struct ttm_buffer_object *bo,
                }
        } else {
                list_for_each_entry(vma, &nvbo->vma_list, head) {
-                       WARN_ON(ttm_bo_wait(bo, false, false));
+                       ret = dma_resv_wait_timeout(bo->base.resv,
+                                                   DMA_RESV_USAGE_BOOKKEEP,
+                                                   false, 15 * HZ);
+                       WARN_ON(ret <= 0);
                        nouveau_vma_unmap(vma);
                }
        }
index 80f154b6adabd684495f739a9c17c5b629049c57..cc7c5b4a05fd875413593686ff42470017e8e50f 100644 (file)
@@ -31,9 +31,7 @@
 #include <linux/dynamic_debug.h>
 
 #include <drm/drm_aperture.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_ttm_helper.h>
 #include <drm/drm_ioctl.h>
@@ -1221,13 +1219,9 @@ nouveau_driver_fops = {
 
 static struct drm_driver
 driver_stub = {
-       .driver_features =
-               DRIVER_GEM | DRIVER_MODESET | DRIVER_RENDER
-#if defined(CONFIG_NOUVEAU_LEGACY_CTX_SUPPORT)
-               | DRIVER_KMS_LEGACY_CONTEXT
-#endif
-               ,
-
+       .driver_features = DRIVER_GEM |
+                          DRIVER_MODESET |
+                          DRIVER_RENDER,
        .open = nouveau_drm_open,
        .postclose = nouveau_drm_postclose,
        .lastclose = nouveau_vga_lastclose,
index ac5793c96957d8fd9fbc03f57cb3caaa3534098f..f77e44958037e02459940f3d9413a957e391b293 100644 (file)
@@ -645,7 +645,7 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
                                struct drm_nouveau_gem_pushbuf_reloc *reloc,
                                struct drm_nouveau_gem_pushbuf_bo *bo)
 {
-       int ret = 0;
+       long ret = 0;
        unsigned i;
 
        for (i = 0; i < req->nr_relocs; i++) {
@@ -703,9 +703,14 @@ nouveau_gem_pushbuf_reloc_apply(struct nouveau_cli *cli,
                                data |= r->vor;
                }
 
-               ret = ttm_bo_wait(&nvbo->bo, false, false);
+               ret = dma_resv_wait_timeout(nvbo->bo.base.resv,
+                                           DMA_RESV_USAGE_BOOKKEEP,
+                                           false, 15 * HZ);
+               if (ret == 0)
+                       ret = -EBUSY;
                if (ret) {
-                       NV_PRINTK(err, cli, "reloc wait_idle failed: %d\n", ret);
+                       NV_PRINTK(err, cli, "reloc wait_idle failed: %ld\n",
+                                 ret);
                        break;
                }
 
index 789393b942911f142685e05bc4e778277289eac3..f8bf0ec26844d65747032addf2c4a72ee361df00 100644 (file)
@@ -2,7 +2,6 @@
 #include <linux/vgaarb.h>
 #include <linux/vga_switcheroo.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_helper.h>
 
 #include "nouveau_drv.h"
index cf571796fd26e6ccc1648053b8305eccea90762f..d6b4934fa0fd64683f81149032228abb34b8c761 100644 (file)
@@ -605,7 +605,7 @@ int omap_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
 }
 
 /**
- * omap_gem_dumb_map   -       buffer mapping for dumb interface
+ * omap_gem_dumb_map_offset - create an offset for a dumb buffer
  * @file: our drm client file
  * @dev: drm device
  * @handle: GEM handle to the object (from dumb_create)
index 4aca14dab9270b822831ac3a310b5ede5aa6c5a5..a6f0bbc879d2c882997aa0a0b087aa6bd367ce62 100644 (file)
@@ -99,7 +99,7 @@ int omap_irq_enable_framedone(struct drm_crtc *crtc, bool enable)
 }
 
 /**
- * enable_vblank - enable vblank interrupt events
+ * omap_irq_enable_vblank - enable vblank interrupt events
  * @crtc: DRM CRTC
  *
  * Enable vblank interrupts for @crtc.  If the device doesn't have
@@ -129,7 +129,7 @@ int omap_irq_enable_vblank(struct drm_crtc *crtc)
 }
 
 /**
- * disable_vblank - disable vblank interrupt events
+ * omap_irq_disable_vblank - disable vblank interrupt events
  * @crtc: DRM CRTC
  *
  * Disable vblank interrupts for @crtc.  If the device doesn't have
index dd79928f54825f90a2f4798dee12a7bd395cd7de..8f2046caaa6b2581a7d26a4818a11aa1762d539d 100644 (file)
@@ -742,6 +742,7 @@ config DRM_PANEL_VISIONOX_VTDR6130
        tristate "Visionox VTDR6130"
        depends on OF
        depends on DRM_MIPI_DSI
+       depends on BACKLIGHT_CLASS_DEVICE
        help
          Say Y here if you want to enable support for Visionox
          VTDR6130 1080x2400 AMOLED DSI panel.
index cbb68caa36f267690ae9e737773bd15f6256785c..1ec696adf9ded5ec90a2206e62482b1f7b2284e6 100644 (file)
@@ -7,7 +7,6 @@
 #include <linux/device.h>
 #include <linux/err.h>
 #include <linux/errno.h>
-#include <linux/fb.h>
 #include <linux/kernel.h>
 #include <linux/module.h>
 #include <linux/of_device.h>
index 1ef1cfd01c77d804dd58fc25328dbcd98a1469ef..11d6ca276c1e767cfb977a3326a6b5f8df3ace42 100644 (file)
@@ -43,7 +43,6 @@
 
 #include <linux/delay.h>
 #include <linux/err.h>
-#include <linux/fb.h>
 #include <linux/i2c.h>
 #include <linux/media-bus-format.h>
 #include <linux/module.h>
index a8a98c91b13c716275f11ff2835253c688da0f98..2ef5ea5eaeeb2062372c594d077bd070975119ed 100644 (file)
 #include <linux/device.h>
 #include <linux/err.h>
 #include <linux/errno.h>
-#include <linux/fb.h>
 #include <linux/kernel.h>
 #include <linux/media-bus-format.h>
 #include <linux/module.h>
+#include <linux/of.h>
 
 #include <linux/gpio/consumer.h>
 #include <linux/regulator/consumer.h>
index 9db49a028930e441efc067d416e190552ead7ed7..1ebb79e3103c19d1c282c66e99e738bf7a87c77b 100644 (file)
@@ -10,7 +10,6 @@
 #include <linux/of.h>
 #include <linux/of_device.h>
 #include <linux/regulator/consumer.h>
-#include <linux/swab.h>
 #include <linux/backlight.h>
 
 #include <video/mipi_display.h>
@@ -213,13 +212,9 @@ static int sofef00_panel_bl_update_status(struct backlight_device *bl)
 {
        struct mipi_dsi_device *dsi = bl_get_data(bl);
        int err;
-       u16 brightness;
+       u16 brightness = (u16)backlight_get_brightness(bl);
 
-       brightness = (u16)backlight_get_brightness(bl);
-       // This panel needs the high and low bytes swapped for the brightness value
-       brightness = __swab16(brightness);
-
-       err = mipi_dsi_dcs_set_display_brightness(dsi, brightness);
+       err = mipi_dsi_dcs_set_display_brightness_large(dsi, brightness);
        if (err < 0)
                return err;
 
index f9a6abc1e121509c47e1cd1fe91bedaccd4c5d94..1092075b31a5f985ffdc5500145af0fb02ad66e8 100644 (file)
@@ -243,12 +243,9 @@ static int visionox_vtdr6130_bl_update_status(struct backlight_device *bl)
 {
        struct mipi_dsi_device *dsi = bl_get_data(bl);
        u16 brightness = backlight_get_brightness(bl);
-       /* Panel needs big-endian order of brightness value */
-       u8 payload[2] = { brightness >> 8, brightness & 0xff };
        int ret;
 
-       ret = mipi_dsi_dcs_write(dsi, MIPI_DCS_SET_DISPLAY_BRIGHTNESS,
-                                payload, sizeof(payload));
+       mipi_dsi_dcs_set_display_brightness_large(dsi, brightness);
        if (ret < 0)
                return ret;
 
diff --git a/drivers/gpu/drm/r128/Makefile b/drivers/gpu/drm/r128/Makefile
deleted file mode 100644 (file)
index c07a069..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-r128-y   := r128_drv.o r128_cce.o r128_state.o r128_irq.o ati_pcigart.o
-
-r128-$(CONFIG_COMPAT)   += r128_ioc32.o
-
-obj-$(CONFIG_DRM_R128) += r128.o
diff --git a/drivers/gpu/drm/r128/ati_pcigart.c b/drivers/gpu/drm/r128/ati_pcigart.c
deleted file mode 100644 (file)
index dde0501..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- * \file ati_pcigart.c
- * ATI PCI GART support
- *
- * \author Gareth Hughes <gareth@valinux.com>
- */
-
-/*
- * Created: Wed Dec 13 21:52:19 2000 by gareth@valinux.com
- *
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include <linux/export.h>
-#include <linux/pci.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_legacy.h>
-#include <drm/drm_print.h>
-
-#include "ati_pcigart.h"
-
-# define ATI_PCIGART_PAGE_SIZE         4096    /**< PCI GART page size */
-
-static int drm_ati_alloc_pcigart_table(struct drm_device *dev,
-                                      struct drm_ati_pcigart_info *gart_info)
-{
-       drm_dma_handle_t *dmah = kmalloc(sizeof(drm_dma_handle_t), GFP_KERNEL);
-
-       if (!dmah)
-               return -ENOMEM;
-
-       dmah->size = gart_info->table_size;
-       dmah->vaddr = dma_alloc_coherent(dev->dev,
-                                        dmah->size,
-                                        &dmah->busaddr,
-                                        GFP_KERNEL);
-
-       if (!dmah->vaddr) {
-               kfree(dmah);
-               return -ENOMEM;
-       }
-
-       gart_info->table_handle = dmah;
-       return 0;
-}
-
-static void drm_ati_free_pcigart_table(struct drm_device *dev,
-                                      struct drm_ati_pcigart_info *gart_info)
-{
-       drm_dma_handle_t *dmah = gart_info->table_handle;
-
-       dma_free_coherent(dev->dev, dmah->size, dmah->vaddr, dmah->busaddr);
-       kfree(dmah);
-
-       gart_info->table_handle = NULL;
-}
-
-int drm_ati_pcigart_cleanup(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info)
-{
-       struct drm_sg_mem *entry = dev->sg;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       unsigned long pages;
-       int i;
-       int max_pages;
-
-       /* we need to support large memory configurations */
-       if (!entry) {
-               DRM_ERROR("no scatter/gather memory!\n");
-               return 0;
-       }
-
-       if (gart_info->bus_addr) {
-
-               max_pages = (gart_info->table_size / sizeof(u32));
-               pages = (entry->pages <= max_pages)
-                 ? entry->pages : max_pages;
-
-               for (i = 0; i < pages; i++) {
-                       if (!entry->busaddr[i])
-                               break;
-                       dma_unmap_page(&pdev->dev, entry->busaddr[i],
-                                      PAGE_SIZE, DMA_BIDIRECTIONAL);
-               }
-
-               if (gart_info->gart_table_location == DRM_ATI_GART_MAIN)
-                       gart_info->bus_addr = 0;
-       }
-
-       if (gart_info->gart_table_location == DRM_ATI_GART_MAIN &&
-           gart_info->table_handle) {
-               drm_ati_free_pcigart_table(dev, gart_info);
-       }
-
-       return 1;
-}
-
-int drm_ati_pcigart_init(struct drm_device *dev, struct drm_ati_pcigart_info *gart_info)
-{
-       struct drm_local_map *map = &gart_info->mapping;
-       struct drm_sg_mem *entry = dev->sg;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       void *address = NULL;
-       unsigned long pages;
-       u32 *pci_gart = NULL, page_base, gart_idx;
-       dma_addr_t bus_address = 0;
-       int i, j, ret = -ENOMEM;
-       int max_ati_pages, max_real_pages;
-
-       if (!entry) {
-               DRM_ERROR("no scatter/gather memory!\n");
-               goto done;
-       }
-
-       if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
-               DRM_DEBUG("PCI: no table in VRAM: using normal RAM\n");
-
-               if (dma_set_mask(&pdev->dev, gart_info->table_mask)) {
-                       DRM_ERROR("fail to set dma mask to 0x%Lx\n",
-                                 (unsigned long long)gart_info->table_mask);
-                       ret = -EFAULT;
-                       goto done;
-               }
-
-               ret = drm_ati_alloc_pcigart_table(dev, gart_info);
-               if (ret) {
-                       DRM_ERROR("cannot allocate PCI GART page!\n");
-                       goto done;
-               }
-
-               pci_gart = gart_info->table_handle->vaddr;
-               address = gart_info->table_handle->vaddr;
-               bus_address = gart_info->table_handle->busaddr;
-       } else {
-               address = gart_info->addr;
-               bus_address = gart_info->bus_addr;
-               DRM_DEBUG("PCI: Gart Table: VRAM %08LX mapped at %08lX\n",
-                         (unsigned long long)bus_address,
-                         (unsigned long)address);
-       }
-
-
-       max_ati_pages = (gart_info->table_size / sizeof(u32));
-       max_real_pages = max_ati_pages / (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE);
-       pages = (entry->pages <= max_real_pages)
-           ? entry->pages : max_real_pages;
-
-       if (gart_info->gart_table_location == DRM_ATI_GART_MAIN) {
-               memset(pci_gart, 0, max_ati_pages * sizeof(u32));
-       } else {
-               memset_io((void __iomem *)map->handle, 0, max_ati_pages * sizeof(u32));
-       }
-
-       gart_idx = 0;
-       for (i = 0; i < pages; i++) {
-               /* we need to support large memory configurations */
-               entry->busaddr[i] = dma_map_page(&pdev->dev, entry->pagelist[i],
-                                                0, PAGE_SIZE, DMA_BIDIRECTIONAL);
-               if (dma_mapping_error(&pdev->dev, entry->busaddr[i])) {
-                       DRM_ERROR("unable to map PCIGART pages!\n");
-                       drm_ati_pcigart_cleanup(dev, gart_info);
-                       address = NULL;
-                       bus_address = 0;
-                       ret = -ENOMEM;
-                       goto done;
-               }
-               page_base = (u32) entry->busaddr[i];
-
-               for (j = 0; j < (PAGE_SIZE / ATI_PCIGART_PAGE_SIZE); j++) {
-                       u32 offset;
-                       u32 val;
-
-                       switch(gart_info->gart_reg_if) {
-                       case DRM_ATI_GART_IGP:
-                               val = page_base | 0xc;
-                               break;
-                       case DRM_ATI_GART_PCIE:
-                               val = (page_base >> 8) | 0xc;
-                               break;
-                       default:
-                       case DRM_ATI_GART_PCI:
-                               val = page_base;
-                               break;
-                       }
-                       if (gart_info->gart_table_location ==
-                           DRM_ATI_GART_MAIN) {
-                               pci_gart[gart_idx] = cpu_to_le32(val);
-                       } else {
-                               offset = gart_idx * sizeof(u32);
-                               writel(val, (void __iomem *)map->handle + offset);
-                       }
-                       gart_idx++;
-                       page_base += ATI_PCIGART_PAGE_SIZE;
-               }
-       }
-       ret = 0;
-
-#ifdef CONFIG_X86
-       wbinvd();
-#else
-       mb();
-#endif
-
-      done:
-       gart_info->addr = address;
-       gart_info->bus_addr = bus_address;
-       return ret;
-}
diff --git a/drivers/gpu/drm/r128/ati_pcigart.h b/drivers/gpu/drm/r128/ati_pcigart.h
deleted file mode 100644 (file)
index a728a13..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef DRM_ATI_PCIGART_H
-#define DRM_ATI_PCIGART_H
-
-#include <drm/drm_legacy.h>
-
-/* location of GART table */
-#define DRM_ATI_GART_MAIN 1
-#define DRM_ATI_GART_FB   2
-
-#define DRM_ATI_GART_PCI 1
-#define DRM_ATI_GART_PCIE 2
-#define DRM_ATI_GART_IGP 3
-
-struct drm_ati_pcigart_info {
-       int gart_table_location;
-       int gart_reg_if;
-       void *addr;
-       dma_addr_t bus_addr;
-       dma_addr_t table_mask;
-       struct drm_dma_handle *table_handle;
-       struct drm_local_map mapping;
-       int table_size;
-};
-
-extern int drm_ati_pcigart_init(struct drm_device *dev,
-                               struct drm_ati_pcigart_info * gart_info);
-extern int drm_ati_pcigart_cleanup(struct drm_device *dev,
-                                  struct drm_ati_pcigart_info * gart_info);
-
-#endif
diff --git a/drivers/gpu/drm/r128/r128_cce.c b/drivers/gpu/drm/r128/r128_cce.c
deleted file mode 100644 (file)
index c04d84a..0000000
+++ /dev/null
@@ -1,944 +0,0 @@
-/* r128_cce.c -- ATI Rage 128 driver -*- linux-c -*-
- * Created: Wed Apr  5 19:24:19 2000 by kevin@precisioninsight.com
- */
-/*
- * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/delay.h>
-#include <linux/dma-mapping.h>
-#include <linux/firmware.h>
-#include <linux/module.h>
-#include <linux/platform_device.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_file.h>
-#include <drm/drm_legacy.h>
-#include <drm/drm_print.h>
-#include <drm/r128_drm.h>
-
-#include "r128_drv.h"
-
-#define R128_FIFO_DEBUG                0
-
-#define FIRMWARE_NAME          "r128/r128_cce.bin"
-
-MODULE_FIRMWARE(FIRMWARE_NAME);
-
-static int R128_READ_PLL(struct drm_device *dev, int addr)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-
-       R128_WRITE8(R128_CLOCK_CNTL_INDEX, addr & 0x1f);
-       return R128_READ(R128_CLOCK_CNTL_DATA);
-}
-
-#if R128_FIFO_DEBUG
-static void r128_status(drm_r128_private_t *dev_priv)
-{
-       printk("GUI_STAT           = 0x%08x\n",
-              (unsigned int)R128_READ(R128_GUI_STAT));
-       printk("PM4_STAT           = 0x%08x\n",
-              (unsigned int)R128_READ(R128_PM4_STAT));
-       printk("PM4_BUFFER_DL_WPTR = 0x%08x\n",
-              (unsigned int)R128_READ(R128_PM4_BUFFER_DL_WPTR));
-       printk("PM4_BUFFER_DL_RPTR = 0x%08x\n",
-              (unsigned int)R128_READ(R128_PM4_BUFFER_DL_RPTR));
-       printk("PM4_MICRO_CNTL     = 0x%08x\n",
-              (unsigned int)R128_READ(R128_PM4_MICRO_CNTL));
-       printk("PM4_BUFFER_CNTL    = 0x%08x\n",
-              (unsigned int)R128_READ(R128_PM4_BUFFER_CNTL));
-}
-#endif
-
-/* ================================================================
- * Engine, FIFO control
- */
-
-static int r128_do_pixcache_flush(drm_r128_private_t *dev_priv)
-{
-       u32 tmp;
-       int i;
-
-       tmp = R128_READ(R128_PC_NGUI_CTLSTAT) | R128_PC_FLUSH_ALL;
-       R128_WRITE(R128_PC_NGUI_CTLSTAT, tmp);
-
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               if (!(R128_READ(R128_PC_NGUI_CTLSTAT) & R128_PC_BUSY))
-                       return 0;
-               udelay(1);
-       }
-
-#if R128_FIFO_DEBUG
-       DRM_ERROR("failed!\n");
-#endif
-       return -EBUSY;
-}
-
-static int r128_do_wait_for_fifo(drm_r128_private_t *dev_priv, int entries)
-{
-       int i;
-
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               int slots = R128_READ(R128_GUI_STAT) & R128_GUI_FIFOCNT_MASK;
-               if (slots >= entries)
-                       return 0;
-               udelay(1);
-       }
-
-#if R128_FIFO_DEBUG
-       DRM_ERROR("failed!\n");
-#endif
-       return -EBUSY;
-}
-
-static int r128_do_wait_for_idle(drm_r128_private_t *dev_priv)
-{
-       int i, ret;
-
-       ret = r128_do_wait_for_fifo(dev_priv, 64);
-       if (ret)
-               return ret;
-
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               if (!(R128_READ(R128_GUI_STAT) & R128_GUI_ACTIVE)) {
-                       r128_do_pixcache_flush(dev_priv);
-                       return 0;
-               }
-               udelay(1);
-       }
-
-#if R128_FIFO_DEBUG
-       DRM_ERROR("failed!\n");
-#endif
-       return -EBUSY;
-}
-
-/* ================================================================
- * CCE control, initialization
- */
-
-/* Load the microcode for the CCE */
-static int r128_cce_load_microcode(drm_r128_private_t *dev_priv)
-{
-       struct platform_device *pdev;
-       const struct firmware *fw;
-       const __be32 *fw_data;
-       int rc, i;
-
-       DRM_DEBUG("\n");
-
-       pdev = platform_device_register_simple("r128_cce", 0, NULL, 0);
-       if (IS_ERR(pdev)) {
-               pr_err("r128_cce: Failed to register firmware\n");
-               return PTR_ERR(pdev);
-       }
-       rc = request_firmware(&fw, FIRMWARE_NAME, &pdev->dev);
-       platform_device_unregister(pdev);
-       if (rc) {
-               pr_err("r128_cce: Failed to load firmware \"%s\"\n",
-                      FIRMWARE_NAME);
-               return rc;
-       }
-
-       if (fw->size != 256 * 8) {
-               pr_err("r128_cce: Bogus length %zu in firmware \"%s\"\n",
-                      fw->size, FIRMWARE_NAME);
-               rc = -EINVAL;
-               goto out_release;
-       }
-
-       r128_do_wait_for_idle(dev_priv);
-
-       fw_data = (const __be32 *)fw->data;
-       R128_WRITE(R128_PM4_MICROCODE_ADDR, 0);
-       for (i = 0; i < 256; i++) {
-               R128_WRITE(R128_PM4_MICROCODE_DATAH,
-                          be32_to_cpup(&fw_data[i * 2]));
-               R128_WRITE(R128_PM4_MICROCODE_DATAL,
-                          be32_to_cpup(&fw_data[i * 2 + 1]));
-       }
-
-out_release:
-       release_firmware(fw);
-       return rc;
-}
-
-/* Flush any pending commands to the CCE.  This should only be used just
- * prior to a wait for idle, as it informs the engine that the command
- * stream is ending.
- */
-static void r128_do_cce_flush(drm_r128_private_t *dev_priv)
-{
-       u32 tmp;
-
-       tmp = R128_READ(R128_PM4_BUFFER_DL_WPTR) | R128_PM4_BUFFER_DL_DONE;
-       R128_WRITE(R128_PM4_BUFFER_DL_WPTR, tmp);
-}
-
-/* Wait for the CCE to go idle.
- */
-int r128_do_cce_idle(drm_r128_private_t *dev_priv)
-{
-       int i;
-
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               if (GET_RING_HEAD(dev_priv) == dev_priv->ring.tail) {
-                       int pm4stat = R128_READ(R128_PM4_STAT);
-                       if (((pm4stat & R128_PM4_FIFOCNT_MASK) >=
-                            dev_priv->cce_fifo_size) &&
-                           !(pm4stat & (R128_PM4_BUSY |
-                                        R128_PM4_GUI_ACTIVE))) {
-                               return r128_do_pixcache_flush(dev_priv);
-                       }
-               }
-               udelay(1);
-       }
-
-#if R128_FIFO_DEBUG
-       DRM_ERROR("failed!\n");
-       r128_status(dev_priv);
-#endif
-       return -EBUSY;
-}
-
-/* Start the Concurrent Command Engine.
- */
-static void r128_do_cce_start(drm_r128_private_t *dev_priv)
-{
-       r128_do_wait_for_idle(dev_priv);
-
-       R128_WRITE(R128_PM4_BUFFER_CNTL,
-                  dev_priv->cce_mode | dev_priv->ring.size_l2qw
-                  | R128_PM4_BUFFER_CNTL_NOUPDATE);
-       R128_READ(R128_PM4_BUFFER_ADDR);        /* as per the sample code */
-       R128_WRITE(R128_PM4_MICRO_CNTL, R128_PM4_MICRO_FREERUN);
-
-       dev_priv->cce_running = 1;
-}
-
-/* Reset the Concurrent Command Engine.  This will not flush any pending
- * commands, so you must wait for the CCE command stream to complete
- * before calling this routine.
- */
-static void r128_do_cce_reset(drm_r128_private_t *dev_priv)
-{
-       R128_WRITE(R128_PM4_BUFFER_DL_WPTR, 0);
-       R128_WRITE(R128_PM4_BUFFER_DL_RPTR, 0);
-       dev_priv->ring.tail = 0;
-}
-
-/* Stop the Concurrent Command Engine.  This will not flush any pending
- * commands, so you must flush the command stream and wait for the CCE
- * to go idle before calling this routine.
- */
-static void r128_do_cce_stop(drm_r128_private_t *dev_priv)
-{
-       R128_WRITE(R128_PM4_MICRO_CNTL, 0);
-       R128_WRITE(R128_PM4_BUFFER_CNTL,
-                  R128_PM4_NONPM4 | R128_PM4_BUFFER_CNTL_NOUPDATE);
-
-       dev_priv->cce_running = 0;
-}
-
-/* Reset the engine.  This will stop the CCE if it is running.
- */
-static int r128_do_engine_reset(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       u32 clock_cntl_index, mclk_cntl, gen_reset_cntl;
-
-       r128_do_pixcache_flush(dev_priv);
-
-       clock_cntl_index = R128_READ(R128_CLOCK_CNTL_INDEX);
-       mclk_cntl = R128_READ_PLL(dev, R128_MCLK_CNTL);
-
-       R128_WRITE_PLL(R128_MCLK_CNTL,
-                      mclk_cntl | R128_FORCE_GCP | R128_FORCE_PIPE3D_CP);
-
-       gen_reset_cntl = R128_READ(R128_GEN_RESET_CNTL);
-
-       /* Taken from the sample code - do not change */
-       R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl | R128_SOFT_RESET_GUI);
-       R128_READ(R128_GEN_RESET_CNTL);
-       R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl & ~R128_SOFT_RESET_GUI);
-       R128_READ(R128_GEN_RESET_CNTL);
-
-       R128_WRITE_PLL(R128_MCLK_CNTL, mclk_cntl);
-       R128_WRITE(R128_CLOCK_CNTL_INDEX, clock_cntl_index);
-       R128_WRITE(R128_GEN_RESET_CNTL, gen_reset_cntl);
-
-       /* Reset the CCE ring */
-       r128_do_cce_reset(dev_priv);
-
-       /* The CCE is no longer running after an engine reset */
-       dev_priv->cce_running = 0;
-
-       /* Reset any pending vertex, indirect buffers */
-       r128_freelist_reset(dev);
-
-       return 0;
-}
-
-static void r128_cce_init_ring_buffer(struct drm_device *dev,
-                                     drm_r128_private_t *dev_priv)
-{
-       u32 ring_start;
-       u32 tmp;
-
-       DRM_DEBUG("\n");
-
-       /* The manual (p. 2) says this address is in "VM space".  This
-        * means it's an offset from the start of AGP space.
-        */
-#if IS_ENABLED(CONFIG_AGP)
-       if (!dev_priv->is_pci)
-               ring_start = dev_priv->cce_ring->offset - dev->agp->base;
-       else
-#endif
-               ring_start = dev_priv->cce_ring->offset -
-                   (unsigned long)dev->sg->virtual;
-
-       R128_WRITE(R128_PM4_BUFFER_OFFSET, ring_start | R128_AGP_OFFSET);
-
-       R128_WRITE(R128_PM4_BUFFER_DL_WPTR, 0);
-       R128_WRITE(R128_PM4_BUFFER_DL_RPTR, 0);
-
-       /* Set watermark control */
-       R128_WRITE(R128_PM4_BUFFER_WM_CNTL,
-                  ((R128_WATERMARK_L / 4) << R128_WMA_SHIFT)
-                  | ((R128_WATERMARK_M / 4) << R128_WMB_SHIFT)
-                  | ((R128_WATERMARK_N / 4) << R128_WMC_SHIFT)
-                  | ((R128_WATERMARK_K / 64) << R128_WB_WM_SHIFT));
-
-       /* Force read.  Why?  Because it's in the examples... */
-       R128_READ(R128_PM4_BUFFER_ADDR);
-
-       /* Turn on bus mastering */
-       tmp = R128_READ(R128_BUS_CNTL) & ~R128_BUS_MASTER_DIS;
-       R128_WRITE(R128_BUS_CNTL, tmp);
-}
-
-static int r128_do_init_cce(struct drm_device *dev, drm_r128_init_t *init)
-{
-       drm_r128_private_t *dev_priv;
-       int rc;
-
-       DRM_DEBUG("\n");
-
-       if (dev->dev_private) {
-               DRM_DEBUG("called when already initialized\n");
-               return -EINVAL;
-       }
-
-       dev_priv = kzalloc(sizeof(drm_r128_private_t), GFP_KERNEL);
-       if (dev_priv == NULL)
-               return -ENOMEM;
-
-       dev_priv->is_pci = init->is_pci;
-
-       if (dev_priv->is_pci && !dev->sg) {
-               DRM_ERROR("PCI GART memory not allocated!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-
-       dev_priv->usec_timeout = init->usec_timeout;
-       if (dev_priv->usec_timeout < 1 ||
-           dev_priv->usec_timeout > R128_MAX_USEC_TIMEOUT) {
-               DRM_DEBUG("TIMEOUT problem!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-
-       dev_priv->cce_mode = init->cce_mode;
-
-       /* GH: Simple idle check.
-        */
-       atomic_set(&dev_priv->idle_count, 0);
-
-       /* We don't support anything other than bus-mastering ring mode,
-        * but the ring can be in either AGP or PCI space for the ring
-        * read pointer.
-        */
-       if ((init->cce_mode != R128_PM4_192BM) &&
-           (init->cce_mode != R128_PM4_128BM_64INDBM) &&
-           (init->cce_mode != R128_PM4_64BM_128INDBM) &&
-           (init->cce_mode != R128_PM4_64BM_64VCBM_64INDBM)) {
-               DRM_DEBUG("Bad cce_mode!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-
-       switch (init->cce_mode) {
-       case R128_PM4_NONPM4:
-               dev_priv->cce_fifo_size = 0;
-               break;
-       case R128_PM4_192PIO:
-       case R128_PM4_192BM:
-               dev_priv->cce_fifo_size = 192;
-               break;
-       case R128_PM4_128PIO_64INDBM:
-       case R128_PM4_128BM_64INDBM:
-               dev_priv->cce_fifo_size = 128;
-               break;
-       case R128_PM4_64PIO_128INDBM:
-       case R128_PM4_64BM_128INDBM:
-       case R128_PM4_64PIO_64VCBM_64INDBM:
-       case R128_PM4_64BM_64VCBM_64INDBM:
-       case R128_PM4_64PIO_64VCPIO_64INDPIO:
-               dev_priv->cce_fifo_size = 64;
-               break;
-       }
-
-       switch (init->fb_bpp) {
-       case 16:
-               dev_priv->color_fmt = R128_DATATYPE_RGB565;
-               break;
-       case 32:
-       default:
-               dev_priv->color_fmt = R128_DATATYPE_ARGB8888;
-               break;
-       }
-       dev_priv->front_offset = init->front_offset;
-       dev_priv->front_pitch = init->front_pitch;
-       dev_priv->back_offset = init->back_offset;
-       dev_priv->back_pitch = init->back_pitch;
-
-       switch (init->depth_bpp) {
-       case 16:
-               dev_priv->depth_fmt = R128_DATATYPE_RGB565;
-               break;
-       case 24:
-       case 32:
-       default:
-               dev_priv->depth_fmt = R128_DATATYPE_ARGB8888;
-               break;
-       }
-       dev_priv->depth_offset = init->depth_offset;
-       dev_priv->depth_pitch = init->depth_pitch;
-       dev_priv->span_offset = init->span_offset;
-
-       dev_priv->front_pitch_offset_c = (((dev_priv->front_pitch / 8) << 21) |
-                                         (dev_priv->front_offset >> 5));
-       dev_priv->back_pitch_offset_c = (((dev_priv->back_pitch / 8) << 21) |
-                                        (dev_priv->back_offset >> 5));
-       dev_priv->depth_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |
-                                         (dev_priv->depth_offset >> 5) |
-                                         R128_DST_TILE);
-       dev_priv->span_pitch_offset_c = (((dev_priv->depth_pitch / 8) << 21) |
-                                        (dev_priv->span_offset >> 5));
-
-       dev_priv->sarea = drm_legacy_getsarea(dev);
-       if (!dev_priv->sarea) {
-               DRM_ERROR("could not find sarea!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-
-       dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
-       if (!dev_priv->mmio) {
-               DRM_ERROR("could not find mmio region!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-       dev_priv->cce_ring = drm_legacy_findmap(dev, init->ring_offset);
-       if (!dev_priv->cce_ring) {
-               DRM_ERROR("could not find cce ring region!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-       dev_priv->ring_rptr = drm_legacy_findmap(dev, init->ring_rptr_offset);
-       if (!dev_priv->ring_rptr) {
-               DRM_ERROR("could not find ring read pointer!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-       dev->agp_buffer_token = init->buffers_offset;
-       dev->agp_buffer_map = drm_legacy_findmap(dev, init->buffers_offset);
-       if (!dev->agp_buffer_map) {
-               DRM_ERROR("could not find dma buffer region!\n");
-               dev->dev_private = (void *)dev_priv;
-               r128_do_cleanup_cce(dev);
-               return -EINVAL;
-       }
-
-       if (!dev_priv->is_pci) {
-               dev_priv->agp_textures =
-                   drm_legacy_findmap(dev, init->agp_textures_offset);
-               if (!dev_priv->agp_textures) {
-                       DRM_ERROR("could not find agp texture region!\n");
-                       dev->dev_private = (void *)dev_priv;
-                       r128_do_cleanup_cce(dev);
-                       return -EINVAL;
-               }
-       }
-
-       dev_priv->sarea_priv =
-           (drm_r128_sarea_t *) ((u8 *) dev_priv->sarea->handle +
-                                 init->sarea_priv_offset);
-
-#if IS_ENABLED(CONFIG_AGP)
-       if (!dev_priv->is_pci) {
-               drm_legacy_ioremap_wc(dev_priv->cce_ring, dev);
-               drm_legacy_ioremap_wc(dev_priv->ring_rptr, dev);
-               drm_legacy_ioremap_wc(dev->agp_buffer_map, dev);
-               if (!dev_priv->cce_ring->handle ||
-                   !dev_priv->ring_rptr->handle ||
-                   !dev->agp_buffer_map->handle) {
-                       DRM_ERROR("Could not ioremap agp regions!\n");
-                       dev->dev_private = (void *)dev_priv;
-                       r128_do_cleanup_cce(dev);
-                       return -ENOMEM;
-               }
-       } else
-#endif
-       {
-               dev_priv->cce_ring->handle =
-                       (void *)(unsigned long)dev_priv->cce_ring->offset;
-               dev_priv->ring_rptr->handle =
-                       (void *)(unsigned long)dev_priv->ring_rptr->offset;
-               dev->agp_buffer_map->handle =
-                       (void *)(unsigned long)dev->agp_buffer_map->offset;
-       }
-
-#if IS_ENABLED(CONFIG_AGP)
-       if (!dev_priv->is_pci)
-               dev_priv->cce_buffers_offset = dev->agp->base;
-       else
-#endif
-               dev_priv->cce_buffers_offset = (unsigned long)dev->sg->virtual;
-
-       dev_priv->ring.start = (u32 *) dev_priv->cce_ring->handle;
-       dev_priv->ring.end = ((u32 *) dev_priv->cce_ring->handle
-                             + init->ring_size / sizeof(u32));
-       dev_priv->ring.size = init->ring_size;
-       dev_priv->ring.size_l2qw = order_base_2(init->ring_size / 8);
-
-       dev_priv->ring.tail_mask = (dev_priv->ring.size / sizeof(u32)) - 1;
-
-       dev_priv->ring.high_mark = 128;
-
-       dev_priv->sarea_priv->last_frame = 0;
-       R128_WRITE(R128_LAST_FRAME_REG, dev_priv->sarea_priv->last_frame);
-
-       dev_priv->sarea_priv->last_dispatch = 0;
-       R128_WRITE(R128_LAST_DISPATCH_REG, dev_priv->sarea_priv->last_dispatch);
-
-#if IS_ENABLED(CONFIG_AGP)
-       if (dev_priv->is_pci) {
-#endif
-               dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
-               dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
-               dev_priv->gart_info.table_size = R128_PCIGART_TABLE_SIZE;
-               dev_priv->gart_info.addr = NULL;
-               dev_priv->gart_info.bus_addr = 0;
-               dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
-               rc = drm_ati_pcigart_init(dev, &dev_priv->gart_info);
-               if (rc) {
-                       DRM_ERROR("failed to init PCI GART!\n");
-                       dev->dev_private = (void *)dev_priv;
-                       r128_do_cleanup_cce(dev);
-                       return rc;
-               }
-               R128_WRITE(R128_PCI_GART_PAGE, dev_priv->gart_info.bus_addr);
-#if IS_ENABLED(CONFIG_AGP)
-       }
-#endif
-
-       r128_cce_init_ring_buffer(dev, dev_priv);
-       rc = r128_cce_load_microcode(dev_priv);
-
-       dev->dev_private = (void *)dev_priv;
-
-       r128_do_engine_reset(dev);
-
-       if (rc) {
-               DRM_ERROR("Failed to load firmware!\n");
-               r128_do_cleanup_cce(dev);
-       }
-
-       return rc;
-}
-
-int r128_do_cleanup_cce(struct drm_device *dev)
-{
-
-       /* Make sure interrupts are disabled here because the uninstall ioctl
-        * may not have been called from userspace and after dev_private
-        * is freed, it's too late.
-        */
-       if (dev->irq_enabled)
-               drm_legacy_irq_uninstall(dev);
-
-       if (dev->dev_private) {
-               drm_r128_private_t *dev_priv = dev->dev_private;
-
-#if IS_ENABLED(CONFIG_AGP)
-               if (!dev_priv->is_pci) {
-                       if (dev_priv->cce_ring != NULL)
-                               drm_legacy_ioremapfree(dev_priv->cce_ring, dev);
-                       if (dev_priv->ring_rptr != NULL)
-                               drm_legacy_ioremapfree(dev_priv->ring_rptr, dev);
-                       if (dev->agp_buffer_map != NULL) {
-                               drm_legacy_ioremapfree(dev->agp_buffer_map, dev);
-                               dev->agp_buffer_map = NULL;
-                       }
-               } else
-#endif
-               {
-                       if (dev_priv->gart_info.bus_addr)
-                               if (!drm_ati_pcigart_cleanup(dev,
-                                                       &dev_priv->gart_info))
-                                       DRM_ERROR
-                                           ("failed to cleanup PCI GART!\n");
-               }
-
-               kfree(dev->dev_private);
-               dev->dev_private = NULL;
-       }
-
-       return 0;
-}
-
-int r128_cce_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_init_t *init = data;
-
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       switch (init->func) {
-       case R128_INIT_CCE:
-               return r128_do_init_cce(dev, init);
-       case R128_CLEANUP_CCE:
-               return r128_do_cleanup_cce(dev);
-       }
-
-       return -EINVAL;
-}
-
-int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       if (dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4) {
-               DRM_DEBUG("while CCE running\n");
-               return 0;
-       }
-
-       r128_do_cce_start(dev_priv);
-
-       return 0;
-}
-
-/* Stop the CCE.  The engine must have been idled before calling this
- * routine.
- */
-int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_cce_stop_t *stop = data;
-       int ret;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       /* Flush any pending CCE commands.  This ensures any outstanding
-        * commands are exectuted by the engine before we turn it off.
-        */
-       if (stop->flush)
-               r128_do_cce_flush(dev_priv);
-
-       /* If we fail to make the engine go idle, we return an error
-        * code so that the DRM ioctl wrapper can try again.
-        */
-       if (stop->idle) {
-               ret = r128_do_cce_idle(dev_priv);
-               if (ret)
-                       return ret;
-       }
-
-       /* Finally, we can turn off the CCE.  If the engine isn't idle,
-        * we will get some dropped triangles as they won't be fully
-        * rendered before the CCE is shut down.
-        */
-       r128_do_cce_stop(dev_priv);
-
-       /* Reset the engine */
-       r128_do_engine_reset(dev);
-
-       return 0;
-}
-
-/* Just reset the CCE ring.  Called as part of an X Server engine reset.
- */
-int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       r128_do_cce_reset(dev_priv);
-
-       /* The CCE is no longer running after an engine reset */
-       dev_priv->cce_running = 0;
-
-       return 0;
-}
-
-int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       if (dev_priv->cce_running)
-               r128_do_cce_flush(dev_priv);
-
-       return r128_do_cce_idle(dev_priv);
-}
-
-int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev->dev_private);
-
-       return r128_do_engine_reset(dev);
-}
-
-int r128_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       return -EINVAL;
-}
-
-/* ================================================================
- * Freelist management
- */
-#define R128_BUFFER_USED       0xffffffff
-#define R128_BUFFER_FREE       0
-
-#if 0
-static int r128_freelist_init(struct drm_device *dev)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       struct drm_buf *buf;
-       drm_r128_buf_priv_t *buf_priv;
-       drm_r128_freelist_t *entry;
-       int i;
-
-       dev_priv->head = kzalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL);
-       if (dev_priv->head == NULL)
-               return -ENOMEM;
-
-       dev_priv->head->age = R128_BUFFER_USED;
-
-       for (i = 0; i < dma->buf_count; i++) {
-               buf = dma->buflist[i];
-               buf_priv = buf->dev_private;
-
-               entry = kmalloc(sizeof(drm_r128_freelist_t), GFP_KERNEL);
-               if (!entry)
-                       return -ENOMEM;
-
-               entry->age = R128_BUFFER_FREE;
-               entry->buf = buf;
-               entry->prev = dev_priv->head;
-               entry->next = dev_priv->head->next;
-               if (!entry->next)
-                       dev_priv->tail = entry;
-
-               buf_priv->discard = 0;
-               buf_priv->dispatched = 0;
-               buf_priv->list_entry = entry;
-
-               dev_priv->head->next = entry;
-
-               if (dev_priv->head->next)
-                       dev_priv->head->next->prev = entry;
-       }
-
-       return 0;
-
-}
-#endif
-
-static struct drm_buf *r128_freelist_get(struct drm_device * dev)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_buf_priv_t *buf_priv;
-       struct drm_buf *buf;
-       int i, t;
-
-       /* FIXME: Optimize -- use freelist code */
-
-       for (i = 0; i < dma->buf_count; i++) {
-               buf = dma->buflist[i];
-               buf_priv = buf->dev_private;
-               if (!buf->file_priv)
-                       return buf;
-       }
-
-       for (t = 0; t < dev_priv->usec_timeout; t++) {
-               u32 done_age = R128_READ(R128_LAST_DISPATCH_REG);
-
-               for (i = 0; i < dma->buf_count; i++) {
-                       buf = dma->buflist[i];
-                       buf_priv = buf->dev_private;
-                       if (buf->pending && buf_priv->age <= done_age) {
-                               /* The buffer has been processed, so it
-                                * can now be used.
-                                */
-                               buf->pending = 0;
-                               return buf;
-                       }
-               }
-               udelay(1);
-       }
-
-       DRM_DEBUG("returning NULL!\n");
-       return NULL;
-}
-
-void r128_freelist_reset(struct drm_device *dev)
-{
-       struct drm_device_dma *dma = dev->dma;
-       int i;
-
-       for (i = 0; i < dma->buf_count; i++) {
-               struct drm_buf *buf = dma->buflist[i];
-               drm_r128_buf_priv_t *buf_priv = buf->dev_private;
-               buf_priv->age = 0;
-       }
-}
-
-/* ================================================================
- * CCE command submission
- */
-
-int r128_wait_ring(drm_r128_private_t *dev_priv, int n)
-{
-       drm_r128_ring_buffer_t *ring = &dev_priv->ring;
-       int i;
-
-       for (i = 0; i < dev_priv->usec_timeout; i++) {
-               r128_update_ring_snapshot(dev_priv);
-               if (ring->space >= n)
-                       return 0;
-               udelay(1);
-       }
-
-       /* FIXME: This is being ignored... */
-       DRM_ERROR("failed!\n");
-       return -EBUSY;
-}
-
-static int r128_cce_get_buffers(struct drm_device *dev,
-                               struct drm_file *file_priv,
-                               struct drm_dma *d)
-{
-       int i;
-       struct drm_buf *buf;
-
-       for (i = d->granted_count; i < d->request_count; i++) {
-               buf = r128_freelist_get(dev);
-               if (!buf)
-                       return -EAGAIN;
-
-               buf->file_priv = file_priv;
-
-               if (copy_to_user(&d->request_indices[i], &buf->idx,
-                                    sizeof(buf->idx)))
-                       return -EFAULT;
-               if (copy_to_user(&d->request_sizes[i], &buf->total,
-                                    sizeof(buf->total)))
-                       return -EFAULT;
-
-               d->granted_count++;
-       }
-       return 0;
-}
-
-int r128_cce_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       int ret = 0;
-       struct drm_dma *d = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       /* Please don't send us buffers.
-        */
-       if (d->send_count != 0) {
-               DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
-                         task_pid_nr(current), d->send_count);
-               return -EINVAL;
-       }
-
-       /* We'll send you buffers.
-        */
-       if (d->request_count < 0 || d->request_count > dma->buf_count) {
-               DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
-                         task_pid_nr(current), d->request_count, dma->buf_count);
-               return -EINVAL;
-       }
-
-       d->granted_count = 0;
-
-       if (d->request_count)
-               ret = r128_cce_get_buffers(dev, file_priv, d);
-
-       return ret;
-}
diff --git a/drivers/gpu/drm/r128/r128_drv.c b/drivers/gpu/drm/r128/r128_drv.c
deleted file mode 100644 (file)
index e35a3a1..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/* r128_drv.c -- ATI Rage 128 driver -*- linux-c -*-
- * Created: Mon Dec 13 09:47:27 1999 by faith@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Rickard E. (Rik) Faith <faith@valinux.com>
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/module.h>
-#include <linux/pci.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_pciids.h>
-#include <drm/drm_vblank.h>
-#include <drm/r128_drm.h>
-
-#include "r128_drv.h"
-
-static struct pci_device_id pciidlist[] = {
-       r128_PCI_IDS
-};
-
-static const struct file_operations r128_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-#ifdef CONFIG_COMPAT
-       .compat_ioctl = r128_compat_ioctl,
-#endif
-       .llseek = noop_llseek,
-};
-
-static struct drm_driver driver = {
-       .driver_features =
-           DRIVER_USE_AGP | DRIVER_PCI_DMA | DRIVER_SG | DRIVER_LEGACY |
-           DRIVER_HAVE_DMA | DRIVER_HAVE_IRQ,
-       .dev_priv_size = sizeof(drm_r128_buf_priv_t),
-       .load = r128_driver_load,
-       .preclose = r128_driver_preclose,
-       .lastclose = r128_driver_lastclose,
-       .get_vblank_counter = r128_get_vblank_counter,
-       .enable_vblank = r128_enable_vblank,
-       .disable_vblank = r128_disable_vblank,
-       .irq_preinstall = r128_driver_irq_preinstall,
-       .irq_postinstall = r128_driver_irq_postinstall,
-       .irq_uninstall = r128_driver_irq_uninstall,
-       .irq_handler = r128_driver_irq_handler,
-       .ioctls = r128_ioctls,
-       .dma_ioctl = r128_cce_buffers,
-       .fops = &r128_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-int r128_driver_load(struct drm_device *dev, unsigned long flags)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-
-       pci_set_master(pdev);
-       return drm_vblank_init(dev, 1);
-}
-
-static struct pci_driver r128_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init r128_init(void)
-{
-       driver.num_ioctls = r128_max_ioctl;
-
-       return drm_legacy_pci_init(&driver, &r128_pci_driver);
-}
-
-static void __exit r128_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &r128_pci_driver);
-}
-
-module_init(r128_init);
-module_exit(r128_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/r128/r128_drv.h b/drivers/gpu/drm/r128/r128_drv.h
deleted file mode 100644 (file)
index 970e192..0000000
+++ /dev/null
@@ -1,544 +0,0 @@
-/* r128_drv.h -- Private header for r128 driver -*- linux-c -*-
- * Created: Mon Dec 13 09:51:11 1999 by faith@precisioninsight.com
- */
-/*
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Rickard E. (Rik) Faith <faith@valinux.com>
- *    Kevin E. Martin <martin@valinux.com>
- *    Gareth Hughes <gareth@valinux.com>
- *    Michel Dänzer <daenzerm@student.ethz.ch>
- */
-
-#ifndef __R128_DRV_H__
-#define __R128_DRV_H__
-
-#include <linux/delay.h>
-#include <linux/io.h>
-#include <linux/irqreturn.h>
-
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/r128_drm.h>
-
-#include "ati_pcigart.h"
-
-/* General customization:
- */
-#define DRIVER_AUTHOR          "Gareth Hughes, VA Linux Systems Inc."
-
-#define DRIVER_NAME            "r128"
-#define DRIVER_DESC            "ATI Rage 128"
-#define DRIVER_DATE            "20030725"
-
-/* Interface history:
- *
- * ??  - ??
- * 2.4 - Add support for ycbcr textures (no new ioctls)
- * 2.5 - Add FLIP ioctl, disable FULLSCREEN.
- */
-#define DRIVER_MAJOR           2
-#define DRIVER_MINOR           5
-#define DRIVER_PATCHLEVEL      0
-
-#define GET_RING_HEAD(dev_priv)                R128_READ(R128_PM4_BUFFER_DL_RPTR)
-
-typedef struct drm_r128_freelist {
-       unsigned int age;
-       struct drm_buf *buf;
-       struct drm_r128_freelist *next;
-       struct drm_r128_freelist *prev;
-} drm_r128_freelist_t;
-
-typedef struct drm_r128_ring_buffer {
-       u32 *start;
-       u32 *end;
-       int size;
-       int size_l2qw;
-
-       u32 tail;
-       u32 tail_mask;
-       int space;
-
-       int high_mark;
-} drm_r128_ring_buffer_t;
-
-typedef struct drm_r128_private {
-       drm_r128_ring_buffer_t ring;
-       drm_r128_sarea_t *sarea_priv;
-
-       int cce_mode;
-       int cce_fifo_size;
-       int cce_running;
-
-       drm_r128_freelist_t *head;
-       drm_r128_freelist_t *tail;
-
-       int usec_timeout;
-       int is_pci;
-       unsigned long cce_buffers_offset;
-
-       atomic_t idle_count;
-
-       int page_flipping;
-       int current_page;
-       u32 crtc_offset;
-       u32 crtc_offset_cntl;
-
-       atomic_t vbl_received;
-
-       u32 color_fmt;
-       unsigned int front_offset;
-       unsigned int front_pitch;
-       unsigned int back_offset;
-       unsigned int back_pitch;
-
-       u32 depth_fmt;
-       unsigned int depth_offset;
-       unsigned int depth_pitch;
-       unsigned int span_offset;
-
-       u32 front_pitch_offset_c;
-       u32 back_pitch_offset_c;
-       u32 depth_pitch_offset_c;
-       u32 span_pitch_offset_c;
-
-       drm_local_map_t *sarea;
-       drm_local_map_t *mmio;
-       drm_local_map_t *cce_ring;
-       drm_local_map_t *ring_rptr;
-       drm_local_map_t *agp_textures;
-       struct drm_ati_pcigart_info gart_info;
-} drm_r128_private_t;
-
-typedef struct drm_r128_buf_priv {
-       u32 age;
-       int prim;
-       int discard;
-       int dispatched;
-       drm_r128_freelist_t *list_entry;
-} drm_r128_buf_priv_t;
-
-extern const struct drm_ioctl_desc r128_ioctls[];
-extern int r128_max_ioctl;
-
-                               /* r128_cce.c */
-extern int r128_cce_init(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_cce_start(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_cce_stop(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_cce_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_cce_idle(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_engine_reset(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_fullscreen(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_cce_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv);
-
-extern int r128_cce_stipple(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_cce_depth(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int r128_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv);
-
-extern void r128_freelist_reset(struct drm_device *dev);
-
-extern int r128_wait_ring(drm_r128_private_t *dev_priv, int n);
-
-extern int r128_do_cce_idle(drm_r128_private_t *dev_priv);
-extern int r128_do_cleanup_cce(struct drm_device *dev);
-
-extern int r128_enable_vblank(struct drm_device *dev, unsigned int pipe);
-extern void r128_disable_vblank(struct drm_device *dev, unsigned int pipe);
-extern u32 r128_get_vblank_counter(struct drm_device *dev, unsigned int pipe);
-extern irqreturn_t r128_driver_irq_handler(int irq, void *arg);
-extern void r128_driver_irq_preinstall(struct drm_device *dev);
-extern int r128_driver_irq_postinstall(struct drm_device *dev);
-extern void r128_driver_irq_uninstall(struct drm_device *dev);
-extern void r128_driver_lastclose(struct drm_device *dev);
-extern int r128_driver_load(struct drm_device *dev, unsigned long flags);
-extern void r128_driver_preclose(struct drm_device *dev,
-                                struct drm_file *file_priv);
-
-extern long r128_compat_ioctl(struct file *filp, unsigned int cmd,
-                             unsigned long arg);
-
-/* Register definitions, register access macros and drmAddMap constants
- * for Rage 128 kernel driver.
- */
-
-#define R128_AUX_SC_CNTL               0x1660
-#      define R128_AUX1_SC_EN                  (1 << 0)
-#      define R128_AUX1_SC_MODE_OR             (0 << 1)
-#      define R128_AUX1_SC_MODE_NAND           (1 << 1)
-#      define R128_AUX2_SC_EN                  (1 << 2)
-#      define R128_AUX2_SC_MODE_OR             (0 << 3)
-#      define R128_AUX2_SC_MODE_NAND           (1 << 3)
-#      define R128_AUX3_SC_EN                  (1 << 4)
-#      define R128_AUX3_SC_MODE_OR             (0 << 5)
-#      define R128_AUX3_SC_MODE_NAND           (1 << 5)
-#define R128_AUX1_SC_LEFT              0x1664
-#define R128_AUX1_SC_RIGHT             0x1668
-#define R128_AUX1_SC_TOP               0x166c
-#define R128_AUX1_SC_BOTTOM            0x1670
-#define R128_AUX2_SC_LEFT              0x1674
-#define R128_AUX2_SC_RIGHT             0x1678
-#define R128_AUX2_SC_TOP               0x167c
-#define R128_AUX2_SC_BOTTOM            0x1680
-#define R128_AUX3_SC_LEFT              0x1684
-#define R128_AUX3_SC_RIGHT             0x1688
-#define R128_AUX3_SC_TOP               0x168c
-#define R128_AUX3_SC_BOTTOM            0x1690
-
-#define R128_BRUSH_DATA0               0x1480
-#define R128_BUS_CNTL                  0x0030
-#      define R128_BUS_MASTER_DIS              (1 << 6)
-
-#define R128_CLOCK_CNTL_INDEX          0x0008
-#define R128_CLOCK_CNTL_DATA           0x000c
-#      define R128_PLL_WR_EN                   (1 << 7)
-#define R128_CONSTANT_COLOR_C          0x1d34
-#define R128_CRTC_OFFSET               0x0224
-#define R128_CRTC_OFFSET_CNTL          0x0228
-#      define R128_CRTC_OFFSET_FLIP_CNTL       (1 << 16)
-
-#define R128_DP_GUI_MASTER_CNTL                0x146c
-#       define R128_GMC_SRC_PITCH_OFFSET_CNTL  (1    <<  0)
-#       define R128_GMC_DST_PITCH_OFFSET_CNTL  (1    <<  1)
-#      define R128_GMC_BRUSH_SOLID_COLOR       (13   <<  4)
-#      define R128_GMC_BRUSH_NONE              (15   <<  4)
-#      define R128_GMC_DST_16BPP               (4    <<  8)
-#      define R128_GMC_DST_24BPP               (5    <<  8)
-#      define R128_GMC_DST_32BPP               (6    <<  8)
-#       define R128_GMC_DST_DATATYPE_SHIFT     8
-#      define R128_GMC_SRC_DATATYPE_COLOR      (3    << 12)
-#      define R128_DP_SRC_SOURCE_MEMORY        (2    << 24)
-#      define R128_DP_SRC_SOURCE_HOST_DATA     (3    << 24)
-#      define R128_GMC_CLR_CMP_CNTL_DIS        (1    << 28)
-#      define R128_GMC_AUX_CLIP_DIS            (1    << 29)
-#      define R128_GMC_WR_MSK_DIS              (1    << 30)
-#      define R128_ROP3_S                      0x00cc0000
-#      define R128_ROP3_P                      0x00f00000
-#define R128_DP_WRITE_MASK             0x16cc
-#define R128_DST_PITCH_OFFSET_C                0x1c80
-#      define R128_DST_TILE                    (1 << 31)
-
-#define R128_GEN_INT_CNTL              0x0040
-#      define R128_CRTC_VBLANK_INT_EN          (1 <<  0)
-#define R128_GEN_INT_STATUS            0x0044
-#      define R128_CRTC_VBLANK_INT             (1 <<  0)
-#      define R128_CRTC_VBLANK_INT_AK          (1 <<  0)
-#define R128_GEN_RESET_CNTL            0x00f0
-#      define R128_SOFT_RESET_GUI              (1 <<  0)
-
-#define R128_GUI_SCRATCH_REG0          0x15e0
-#define R128_GUI_SCRATCH_REG1          0x15e4
-#define R128_GUI_SCRATCH_REG2          0x15e8
-#define R128_GUI_SCRATCH_REG3          0x15ec
-#define R128_GUI_SCRATCH_REG4          0x15f0
-#define R128_GUI_SCRATCH_REG5          0x15f4
-
-#define R128_GUI_STAT                  0x1740
-#      define R128_GUI_FIFOCNT_MASK            0x0fff
-#      define R128_GUI_ACTIVE                  (1 << 31)
-
-#define R128_MCLK_CNTL                 0x000f
-#      define R128_FORCE_GCP                   (1 << 16)
-#      define R128_FORCE_PIPE3D_CP             (1 << 17)
-#      define R128_FORCE_RCP                   (1 << 18)
-
-#define R128_PC_GUI_CTLSTAT            0x1748
-#define R128_PC_NGUI_CTLSTAT           0x0184
-#      define R128_PC_FLUSH_GUI                (3 << 0)
-#      define R128_PC_RI_GUI                   (1 << 2)
-#      define R128_PC_FLUSH_ALL                0x00ff
-#      define R128_PC_BUSY                     (1 << 31)
-
-#define R128_PCI_GART_PAGE             0x017c
-#define R128_PRIM_TEX_CNTL_C           0x1cb0
-
-#define R128_SCALE_3D_CNTL             0x1a00
-#define R128_SEC_TEX_CNTL_C            0x1d00
-#define R128_SEC_TEXTURE_BORDER_COLOR_C        0x1d3c
-#define R128_SETUP_CNTL                        0x1bc4
-#define R128_STEN_REF_MASK_C           0x1d40
-
-#define R128_TEX_CNTL_C                        0x1c9c
-#      define R128_TEX_CACHE_FLUSH             (1 << 23)
-
-#define R128_WAIT_UNTIL                        0x1720
-#      define R128_EVENT_CRTC_OFFSET           (1 << 0)
-#define R128_WINDOW_XY_OFFSET          0x1bcc
-
-/* CCE registers
- */
-#define R128_PM4_BUFFER_OFFSET         0x0700
-#define R128_PM4_BUFFER_CNTL           0x0704
-#      define R128_PM4_MASK                    (15 << 28)
-#      define R128_PM4_NONPM4                  (0  << 28)
-#      define R128_PM4_192PIO                  (1  << 28)
-#      define R128_PM4_192BM                   (2  << 28)
-#      define R128_PM4_128PIO_64INDBM          (3  << 28)
-#      define R128_PM4_128BM_64INDBM           (4  << 28)
-#      define R128_PM4_64PIO_128INDBM          (5  << 28)
-#      define R128_PM4_64BM_128INDBM           (6  << 28)
-#      define R128_PM4_64PIO_64VCBM_64INDBM    (7  << 28)
-#      define R128_PM4_64BM_64VCBM_64INDBM     (8U  << 28)
-#      define R128_PM4_64PIO_64VCPIO_64INDPIO  (15U << 28)
-#      define R128_PM4_BUFFER_CNTL_NOUPDATE    (1  << 27)
-
-#define R128_PM4_BUFFER_WM_CNTL                0x0708
-#      define R128_WMA_SHIFT                   0
-#      define R128_WMB_SHIFT                   8
-#      define R128_WMC_SHIFT                   16
-#      define R128_WB_WM_SHIFT                 24
-
-#define R128_PM4_BUFFER_DL_RPTR_ADDR   0x070c
-#define R128_PM4_BUFFER_DL_RPTR                0x0710
-#define R128_PM4_BUFFER_DL_WPTR                0x0714
-#      define R128_PM4_BUFFER_DL_DONE          (1 << 31)
-
-#define R128_PM4_VC_FPU_SETUP          0x071c
-
-#define R128_PM4_IW_INDOFF             0x0738
-#define R128_PM4_IW_INDSIZE            0x073c
-
-#define R128_PM4_STAT                  0x07b8
-#      define R128_PM4_FIFOCNT_MASK            0x0fff
-#      define R128_PM4_BUSY                    (1 << 16)
-#      define R128_PM4_GUI_ACTIVE              (1 << 31)
-
-#define R128_PM4_MICROCODE_ADDR                0x07d4
-#define R128_PM4_MICROCODE_RADDR       0x07d8
-#define R128_PM4_MICROCODE_DATAH       0x07dc
-#define R128_PM4_MICROCODE_DATAL       0x07e0
-
-#define R128_PM4_BUFFER_ADDR           0x07f0
-#define R128_PM4_MICRO_CNTL            0x07fc
-#      define R128_PM4_MICRO_FREERUN           (1 << 30)
-
-#define R128_PM4_FIFO_DATA_EVEN                0x1000
-#define R128_PM4_FIFO_DATA_ODD         0x1004
-
-/* CCE command packets
- */
-#define R128_CCE_PACKET0               0x00000000
-#define R128_CCE_PACKET1               0x40000000
-#define R128_CCE_PACKET2               0x80000000
-#define R128_CCE_PACKET3               0xC0000000
-#      define R128_CNTL_HOSTDATA_BLT           0x00009400
-#      define R128_CNTL_PAINT_MULTI            0x00009A00
-#      define R128_CNTL_BITBLT_MULTI           0x00009B00
-#      define R128_3D_RNDR_GEN_INDX_PRIM       0x00002300
-
-#define R128_CCE_PACKET_MASK           0xC0000000
-#define R128_CCE_PACKET_COUNT_MASK     0x3fff0000
-#define R128_CCE_PACKET0_REG_MASK      0x000007ff
-#define R128_CCE_PACKET1_REG0_MASK     0x000007ff
-#define R128_CCE_PACKET1_REG1_MASK     0x003ff800
-
-#define R128_CCE_VC_CNTL_PRIM_TYPE_NONE                0x00000000
-#define R128_CCE_VC_CNTL_PRIM_TYPE_POINT       0x00000001
-#define R128_CCE_VC_CNTL_PRIM_TYPE_LINE                0x00000002
-#define R128_CCE_VC_CNTL_PRIM_TYPE_POLY_LINE   0x00000003
-#define R128_CCE_VC_CNTL_PRIM_TYPE_TRI_LIST    0x00000004
-#define R128_CCE_VC_CNTL_PRIM_TYPE_TRI_FAN     0x00000005
-#define R128_CCE_VC_CNTL_PRIM_TYPE_TRI_STRIP   0x00000006
-#define R128_CCE_VC_CNTL_PRIM_TYPE_TRI_TYPE2   0x00000007
-#define R128_CCE_VC_CNTL_PRIM_WALK_IND         0x00000010
-#define R128_CCE_VC_CNTL_PRIM_WALK_LIST                0x00000020
-#define R128_CCE_VC_CNTL_PRIM_WALK_RING                0x00000030
-#define R128_CCE_VC_CNTL_NUM_SHIFT             16
-
-#define R128_DATATYPE_VQ               0
-#define R128_DATATYPE_CI4              1
-#define R128_DATATYPE_CI8              2
-#define R128_DATATYPE_ARGB1555         3
-#define R128_DATATYPE_RGB565           4
-#define R128_DATATYPE_RGB888           5
-#define R128_DATATYPE_ARGB8888         6
-#define R128_DATATYPE_RGB332           7
-#define R128_DATATYPE_Y8               8
-#define R128_DATATYPE_RGB8             9
-#define R128_DATATYPE_CI16             10
-#define R128_DATATYPE_YVYU422          11
-#define R128_DATATYPE_VYUY422          12
-#define R128_DATATYPE_AYUV444          14
-#define R128_DATATYPE_ARGB4444         15
-
-/* Constants */
-#define R128_AGP_OFFSET                        0x02000000
-
-#define R128_WATERMARK_L               16
-#define R128_WATERMARK_M               8
-#define R128_WATERMARK_N               8
-#define R128_WATERMARK_K               128
-
-#define R128_MAX_USEC_TIMEOUT          100000  /* 100 ms */
-
-#define R128_LAST_FRAME_REG            R128_GUI_SCRATCH_REG0
-#define R128_LAST_DISPATCH_REG         R128_GUI_SCRATCH_REG1
-#define R128_MAX_VB_AGE                        0x7fffffff
-#define R128_MAX_VB_VERTS              (0xffff)
-
-#define R128_RING_HIGH_MARK            128
-
-#define R128_PERFORMANCE_BOXES         0
-
-#define R128_PCIGART_TABLE_SIZE         32768
-
-#define R128_READ(reg)         readl(((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define R128_WRITE(reg, val)   writel(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define R128_READ8(reg)                readb(((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define R128_WRITE8(reg, val)  writeb(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
-
-#define R128_WRITE_PLL(addr, val)                                      \
-do {                                                                   \
-       R128_WRITE8(R128_CLOCK_CNTL_INDEX,                              \
-                   ((addr) & 0x1f) | R128_PLL_WR_EN);                  \
-       R128_WRITE(R128_CLOCK_CNTL_DATA, (val));                        \
-} while (0)
-
-#define CCE_PACKET0(reg, n)            (R128_CCE_PACKET0 |             \
-                                        ((n) << 16) | ((reg) >> 2))
-#define CCE_PACKET1(reg0, reg1)                (R128_CCE_PACKET1 |             \
-                                        (((reg1) >> 2) << 11) | ((reg0) >> 2))
-#define CCE_PACKET2()                  (R128_CCE_PACKET2)
-#define CCE_PACKET3(pkt, n)            (R128_CCE_PACKET3 |             \
-                                        (pkt) | ((n) << 16))
-
-static __inline__ void r128_update_ring_snapshot(drm_r128_private_t *dev_priv)
-{
-       drm_r128_ring_buffer_t *ring = &dev_priv->ring;
-       ring->space = (GET_RING_HEAD(dev_priv) - ring->tail) * sizeof(u32);
-       if (ring->space <= 0)
-               ring->space += ring->size;
-}
-
-/* ================================================================
- * Misc helper macros
- */
-
-#define DEV_INIT_TEST_WITH_RETURN(_dev_priv)                           \
-do {                                                                   \
-       if (!_dev_priv) {                                               \
-               DRM_ERROR("called with no initialization\n");           \
-               return -EINVAL;                                         \
-       }                                                               \
-} while (0)
-
-#define RING_SPACE_TEST_WITH_RETURN(dev_priv)                          \
-do {                                                                   \
-       drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i;          \
-       if (ring->space < ring->high_mark) {                            \
-               for (i = 0 ; i < dev_priv->usec_timeout ; i++) {        \
-                       r128_update_ring_snapshot(dev_priv);            \
-                       if (ring->space >= ring->high_mark)             \
-                               goto __ring_space_done;                 \
-                       udelay(1);                                      \
-               }                                                       \
-               DRM_ERROR("ring space check failed!\n");                \
-               return -EBUSY;                                          \
-       }                                                               \
- __ring_space_done:                                                    \
-       ;                                                               \
-} while (0)
-
-#define VB_AGE_TEST_WITH_RETURN(dev_priv)                              \
-do {                                                                   \
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;            \
-       if (sarea_priv->last_dispatch >= R128_MAX_VB_AGE) {             \
-               int __ret = r128_do_cce_idle(dev_priv);                 \
-               if (__ret)                                              \
-                       return __ret;                                   \
-               sarea_priv->last_dispatch = 0;                          \
-               r128_freelist_reset(dev);                               \
-       }                                                               \
-} while (0)
-
-#define R128_WAIT_UNTIL_PAGE_FLIPPED() do {                            \
-       OUT_RING(CCE_PACKET0(R128_WAIT_UNTIL, 0));                      \
-       OUT_RING(R128_EVENT_CRTC_OFFSET);                               \
-} while (0)
-
-/* ================================================================
- * Ring control
- */
-
-#define R128_VERBOSE   0
-
-#define RING_LOCALS                                                    \
-       int write, _nr; unsigned int tail_mask; volatile u32 *ring;
-
-#define BEGIN_RING(n) do {                                             \
-       if (R128_VERBOSE)                                               \
-               DRM_INFO("BEGIN_RING(%d)\n", (n));                      \
-       if (dev_priv->ring.space <= (n) * sizeof(u32)) {                \
-               COMMIT_RING();                                          \
-               r128_wait_ring(dev_priv, (n) * sizeof(u32));            \
-       }                                                               \
-       _nr = n; dev_priv->ring.space -= (n) * sizeof(u32);             \
-       ring = dev_priv->ring.start;                                    \
-       write = dev_priv->ring.tail;                                    \
-       tail_mask = dev_priv->ring.tail_mask;                           \
-} while (0)
-
-/* You can set this to zero if you want.  If the card locks up, you'll
- * need to keep this set.  It works around a bug in early revs of the
- * Rage 128 chipset, where the CCE would read 32 dwords past the end of
- * the ring buffer before wrapping around.
- */
-#define R128_BROKEN_CCE        1
-
-#define ADVANCE_RING() do {                                            \
-       if (R128_VERBOSE)                                               \
-               DRM_INFO("ADVANCE_RING() wr=0x%06x tail=0x%06x\n",      \
-                        write, dev_priv->ring.tail);                   \
-       if (R128_BROKEN_CCE && write < 32)                              \
-               memcpy(dev_priv->ring.end,                              \
-                      dev_priv->ring.start,                            \
-                      write * sizeof(u32));                            \
-       if (((dev_priv->ring.tail + _nr) & tail_mask) != write)         \
-               DRM_ERROR(                                              \
-                       "ADVANCE_RING(): mismatch: nr: %x write: %x line: %d\n",        \
-                       ((dev_priv->ring.tail + _nr) & tail_mask),      \
-                       write, __LINE__);                               \
-       else                                                            \
-               dev_priv->ring.tail = write;                            \
-} while (0)
-
-#define COMMIT_RING() do {                                             \
-       if (R128_VERBOSE)                                               \
-               DRM_INFO("COMMIT_RING() tail=0x%06x\n",                 \
-                        dev_priv->ring.tail);                          \
-       mb();                                           \
-       R128_WRITE(R128_PM4_BUFFER_DL_WPTR, dev_priv->ring.tail);       \
-       R128_READ(R128_PM4_BUFFER_DL_WPTR);                             \
-} while (0)
-
-#define OUT_RING(x) do {                                               \
-       if (R128_VERBOSE)                                               \
-               DRM_INFO("   OUT_RING( 0x%08x ) at 0x%x\n",             \
-                        (unsigned int)(x), write);                     \
-       ring[write++] = cpu_to_le32(x);                                 \
-       write &= tail_mask;                                             \
-} while (0)
-
-#endif                         /* __R128_DRV_H__ */
diff --git a/drivers/gpu/drm/r128/r128_ioc32.c b/drivers/gpu/drm/r128/r128_ioc32.c
deleted file mode 100644 (file)
index cdeb1db..0000000
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * \file r128_ioc32.c
- *
- * 32-bit ioctl compatibility routines for the R128 DRM.
- *
- * \author Dave Airlie <airlied@linux.ie> with code from patches by Egbert Eich
- *
- * Copyright (C) Paul Mackerras 2005
- * Copyright (C) Egbert Eich 2003,2004
- * Copyright (C) Dave Airlie 2005
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
- * IN THE SOFTWARE.
- */
-
-#include <linux/compat.h>
-
-#include <drm/r128_drm.h>
-
-#include "r128_drv.h"
-
-typedef struct drm_r128_init32 {
-       int func;
-       unsigned int sarea_priv_offset;
-       int is_pci;
-       int cce_mode;
-       int cce_secure;
-       int ring_size;
-       int usec_timeout;
-
-       unsigned int fb_bpp;
-       unsigned int front_offset, front_pitch;
-       unsigned int back_offset, back_pitch;
-       unsigned int depth_bpp;
-       unsigned int depth_offset, depth_pitch;
-       unsigned int span_offset;
-
-       unsigned int fb_offset;
-       unsigned int mmio_offset;
-       unsigned int ring_offset;
-       unsigned int ring_rptr_offset;
-       unsigned int buffers_offset;
-       unsigned int agp_textures_offset;
-} drm_r128_init32_t;
-
-static int compat_r128_init(struct file *file, unsigned int cmd,
-                           unsigned long arg)
-{
-       drm_r128_init32_t init32;
-       drm_r128_init_t init;
-
-       if (copy_from_user(&init32, (void __user *)arg, sizeof(init32)))
-               return -EFAULT;
-
-       init.func = init32.func;
-       init.sarea_priv_offset = init32.sarea_priv_offset;
-       init.is_pci = init32.is_pci;
-       init.cce_mode = init32.cce_mode;
-       init.cce_secure = init32.cce_secure;
-       init.ring_size = init32.ring_size;
-       init.usec_timeout = init32.usec_timeout;
-       init.fb_bpp = init32.fb_bpp;
-       init.front_offset = init32.front_offset;
-       init.front_pitch = init32.front_pitch;
-       init.back_offset = init32.back_offset;
-       init.back_pitch = init32.back_pitch;
-       init.depth_bpp = init32.depth_bpp;
-       init.depth_offset = init32.depth_offset;
-       init.depth_pitch = init32.depth_pitch;
-       init.span_offset = init32.span_offset;
-       init.fb_offset = init32.fb_offset;
-       init.mmio_offset = init32.mmio_offset;
-       init.ring_offset = init32.ring_offset;
-       init.ring_rptr_offset = init32.ring_rptr_offset;
-       init.buffers_offset = init32.buffers_offset;
-       init.agp_textures_offset = init32.agp_textures_offset;
-
-       return drm_ioctl_kernel(file, r128_cce_init, &init,
-                       DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY);
-}
-
-typedef struct drm_r128_depth32 {
-       int func;
-       int n;
-       u32 x;
-       u32 y;
-       u32 buffer;
-       u32 mask;
-} drm_r128_depth32_t;
-
-static int compat_r128_depth(struct file *file, unsigned int cmd,
-                            unsigned long arg)
-{
-       drm_r128_depth32_t depth32;
-       drm_r128_depth_t depth;
-
-       if (copy_from_user(&depth32, (void __user *)arg, sizeof(depth32)))
-               return -EFAULT;
-
-       depth.func = depth32.func;
-       depth.n = depth32.n;
-       depth.x = compat_ptr(depth32.x);
-       depth.y = compat_ptr(depth32.y);
-       depth.buffer = compat_ptr(depth32.buffer);
-       depth.mask = compat_ptr(depth32.mask);
-
-       return drm_ioctl_kernel(file, r128_cce_depth, &depth, DRM_AUTH);
-}
-
-typedef struct drm_r128_stipple32 {
-       u32 mask;
-} drm_r128_stipple32_t;
-
-static int compat_r128_stipple(struct file *file, unsigned int cmd,
-                              unsigned long arg)
-{
-       drm_r128_stipple32_t stipple32;
-       drm_r128_stipple_t stipple;
-
-       if (copy_from_user(&stipple32, (void __user *)arg, sizeof(stipple32)))
-               return -EFAULT;
-
-       stipple.mask = compat_ptr(stipple32.mask);
-
-       return drm_ioctl_kernel(file, r128_cce_stipple, &stipple, DRM_AUTH);
-}
-
-typedef struct drm_r128_getparam32 {
-       int param;
-       u32 value;
-} drm_r128_getparam32_t;
-
-static int compat_r128_getparam(struct file *file, unsigned int cmd,
-                               unsigned long arg)
-{
-       drm_r128_getparam32_t getparam32;
-       drm_r128_getparam_t getparam;
-
-       if (copy_from_user(&getparam32, (void __user *)arg, sizeof(getparam32)))
-               return -EFAULT;
-
-       getparam.param = getparam32.param;
-       getparam.value = compat_ptr(getparam32.value);
-
-       return drm_ioctl_kernel(file, r128_getparam, &getparam, DRM_AUTH);
-}
-
-drm_ioctl_compat_t *r128_compat_ioctls[] = {
-       [DRM_R128_INIT] = compat_r128_init,
-       [DRM_R128_DEPTH] = compat_r128_depth,
-       [DRM_R128_STIPPLE] = compat_r128_stipple,
-       [DRM_R128_GETPARAM] = compat_r128_getparam,
-};
-
-/**
- * r128_compat_ioctl - Called whenever a 32-bit process running under
- *                     a 64-bit kernel performs an ioctl on /dev/dri/card<n>.
- *
- * @filp: file pointer.
- * @cmd: command.
- * @arg: user argument.
- * return: zero on success or negative number on failure.
- */
-long r128_compat_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
-{
-       unsigned int nr = DRM_IOCTL_NR(cmd);
-       drm_ioctl_compat_t *fn = NULL;
-       int ret;
-
-       if (nr < DRM_COMMAND_BASE)
-               return drm_compat_ioctl(filp, cmd, arg);
-
-       if (nr < DRM_COMMAND_BASE + ARRAY_SIZE(r128_compat_ioctls))
-               fn = r128_compat_ioctls[nr - DRM_COMMAND_BASE];
-
-       if (fn != NULL)
-               ret = (*fn) (filp, cmd, arg);
-       else
-               ret = drm_ioctl(filp, cmd, arg);
-
-       return ret;
-}
diff --git a/drivers/gpu/drm/r128/r128_irq.c b/drivers/gpu/drm/r128/r128_irq.c
deleted file mode 100644 (file)
index d84e9c9..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-/* r128_irq.c -- IRQ handling for radeon -*- linux-c -*- */
-/*
- * Copyright (C) The Weather Channel, Inc.  2002.  All Rights Reserved.
- *
- * The Weather Channel (TM) funded Tungsten Graphics to develop the
- * initial release of the Radeon 8500 driver under the XFree86 license.
- * This notice must be preserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Keith Whitwell <keith@tungstengraphics.com>
- *    Eric Anholt <anholt@FreeBSD.org>
- */
-
-#include <drm/drm_device.h>
-#include <drm/drm_print.h>
-#include <drm/drm_vblank.h>
-#include <drm/r128_drm.h>
-
-#include "r128_drv.h"
-
-u32 r128_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
-{
-       const drm_r128_private_t *dev_priv = dev->dev_private;
-
-       if (pipe != 0)
-               return 0;
-
-       return atomic_read(&dev_priv->vbl_received);
-}
-
-irqreturn_t r128_driver_irq_handler(int irq, void *arg)
-{
-       struct drm_device *dev = (struct drm_device *) arg;
-       drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
-       int status;
-
-       status = R128_READ(R128_GEN_INT_STATUS);
-
-       /* VBLANK interrupt */
-       if (status & R128_CRTC_VBLANK_INT) {
-               R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
-               atomic_inc(&dev_priv->vbl_received);
-               drm_handle_vblank(dev, 0);
-               return IRQ_HANDLED;
-       }
-       return IRQ_NONE;
-}
-
-int r128_enable_vblank(struct drm_device *dev, unsigned int pipe)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-
-       if (pipe != 0) {
-               DRM_ERROR("%s:  bad crtc %u\n", __func__, pipe);
-               return -EINVAL;
-       }
-
-       R128_WRITE(R128_GEN_INT_CNTL, R128_CRTC_VBLANK_INT_EN);
-       return 0;
-}
-
-void r128_disable_vblank(struct drm_device *dev, unsigned int pipe)
-{
-       if (pipe != 0)
-               DRM_ERROR("%s:  bad crtc %u\n", __func__, pipe);
-
-       /*
-        * FIXME: implement proper interrupt disable by using the vblank
-        * counter register (if available)
-        *
-        * R128_WRITE(R128_GEN_INT_CNTL,
-        *            R128_READ(R128_GEN_INT_CNTL) & ~R128_CRTC_VBLANK_INT_EN);
-        */
-}
-
-void r128_driver_irq_preinstall(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
-
-       /* Disable *all* interrupts */
-       R128_WRITE(R128_GEN_INT_CNTL, 0);
-       /* Clear vblank bit if it's already high */
-       R128_WRITE(R128_GEN_INT_STATUS, R128_CRTC_VBLANK_INT_AK);
-}
-
-int r128_driver_irq_postinstall(struct drm_device *dev)
-{
-       return 0;
-}
-
-void r128_driver_irq_uninstall(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = (drm_r128_private_t *) dev->dev_private;
-       if (!dev_priv)
-               return;
-
-       /* Disable *all* interrupts */
-       R128_WRITE(R128_GEN_INT_CNTL, 0);
-}
diff --git a/drivers/gpu/drm/r128/r128_state.c b/drivers/gpu/drm/r128/r128_state.c
deleted file mode 100644 (file)
index ac13fc2..0000000
+++ /dev/null
@@ -1,1641 +0,0 @@
-/* r128_state.c -- State support for r128 -*- linux-c -*-
- * Created: Thu Jan 27 02:53:43 2000 by gareth@valinux.com
- */
-/*
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_file.h>
-#include <drm/drm_print.h>
-#include <drm/r128_drm.h>
-
-#include "r128_drv.h"
-
-/* ================================================================
- * CCE hardware state programming functions
- */
-
-static void r128_emit_clip_rects(drm_r128_private_t *dev_priv,
-                                struct drm_clip_rect *boxes, int count)
-{
-       u32 aux_sc_cntl = 0x00000000;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING((count < 3 ? count : 3) * 5 + 2);
-
-       if (count >= 1) {
-               OUT_RING(CCE_PACKET0(R128_AUX1_SC_LEFT, 3));
-               OUT_RING(boxes[0].x1);
-               OUT_RING(boxes[0].x2 - 1);
-               OUT_RING(boxes[0].y1);
-               OUT_RING(boxes[0].y2 - 1);
-
-               aux_sc_cntl |= (R128_AUX1_SC_EN | R128_AUX1_SC_MODE_OR);
-       }
-       if (count >= 2) {
-               OUT_RING(CCE_PACKET0(R128_AUX2_SC_LEFT, 3));
-               OUT_RING(boxes[1].x1);
-               OUT_RING(boxes[1].x2 - 1);
-               OUT_RING(boxes[1].y1);
-               OUT_RING(boxes[1].y2 - 1);
-
-               aux_sc_cntl |= (R128_AUX2_SC_EN | R128_AUX2_SC_MODE_OR);
-       }
-       if (count >= 3) {
-               OUT_RING(CCE_PACKET0(R128_AUX3_SC_LEFT, 3));
-               OUT_RING(boxes[2].x1);
-               OUT_RING(boxes[2].x2 - 1);
-               OUT_RING(boxes[2].y1);
-               OUT_RING(boxes[2].y2 - 1);
-
-               aux_sc_cntl |= (R128_AUX3_SC_EN | R128_AUX3_SC_MODE_OR);
-       }
-
-       OUT_RING(CCE_PACKET0(R128_AUX_SC_CNTL, 0));
-       OUT_RING(aux_sc_cntl);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_core(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_context_regs_t *ctx = &sarea_priv->context_state;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(2);
-
-       OUT_RING(CCE_PACKET0(R128_SCALE_3D_CNTL, 0));
-       OUT_RING(ctx->scale_3d_cntl);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_context(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_context_regs_t *ctx = &sarea_priv->context_state;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(13);
-
-       OUT_RING(CCE_PACKET0(R128_DST_PITCH_OFFSET_C, 11));
-       OUT_RING(ctx->dst_pitch_offset_c);
-       OUT_RING(ctx->dp_gui_master_cntl_c);
-       OUT_RING(ctx->sc_top_left_c);
-       OUT_RING(ctx->sc_bottom_right_c);
-       OUT_RING(ctx->z_offset_c);
-       OUT_RING(ctx->z_pitch_c);
-       OUT_RING(ctx->z_sten_cntl_c);
-       OUT_RING(ctx->tex_cntl_c);
-       OUT_RING(ctx->misc_3d_state_cntl_reg);
-       OUT_RING(ctx->texture_clr_cmp_clr_c);
-       OUT_RING(ctx->texture_clr_cmp_msk_c);
-       OUT_RING(ctx->fog_color_c);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_setup(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_context_regs_t *ctx = &sarea_priv->context_state;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(3);
-
-       OUT_RING(CCE_PACKET1(R128_SETUP_CNTL, R128_PM4_VC_FPU_SETUP));
-       OUT_RING(ctx->setup_cntl);
-       OUT_RING(ctx->pm4_vc_fpu_setup);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_masks(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_context_regs_t *ctx = &sarea_priv->context_state;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(5);
-
-       OUT_RING(CCE_PACKET0(R128_DP_WRITE_MASK, 0));
-       OUT_RING(ctx->dp_write_mask);
-
-       OUT_RING(CCE_PACKET0(R128_STEN_REF_MASK_C, 1));
-       OUT_RING(ctx->sten_ref_mask_c);
-       OUT_RING(ctx->plane_3d_mask_c);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_window(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_context_regs_t *ctx = &sarea_priv->context_state;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(2);
-
-       OUT_RING(CCE_PACKET0(R128_WINDOW_XY_OFFSET, 0));
-       OUT_RING(ctx->window_xy_offset);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_tex0(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_context_regs_t *ctx = &sarea_priv->context_state;
-       drm_r128_texture_regs_t *tex = &sarea_priv->tex_state[0];
-       int i;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(7 + R128_MAX_TEXTURE_LEVELS);
-
-       OUT_RING(CCE_PACKET0(R128_PRIM_TEX_CNTL_C,
-                            2 + R128_MAX_TEXTURE_LEVELS));
-       OUT_RING(tex->tex_cntl);
-       OUT_RING(tex->tex_combine_cntl);
-       OUT_RING(ctx->tex_size_pitch_c);
-       for (i = 0; i < R128_MAX_TEXTURE_LEVELS; i++)
-               OUT_RING(tex->tex_offset[i]);
-
-       OUT_RING(CCE_PACKET0(R128_CONSTANT_COLOR_C, 1));
-       OUT_RING(ctx->constant_color_c);
-       OUT_RING(tex->tex_border_color);
-
-       ADVANCE_RING();
-}
-
-static __inline__ void r128_emit_tex1(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       drm_r128_texture_regs_t *tex = &sarea_priv->tex_state[1];
-       int i;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(5 + R128_MAX_TEXTURE_LEVELS);
-
-       OUT_RING(CCE_PACKET0(R128_SEC_TEX_CNTL_C, 1 + R128_MAX_TEXTURE_LEVELS));
-       OUT_RING(tex->tex_cntl);
-       OUT_RING(tex->tex_combine_cntl);
-       for (i = 0; i < R128_MAX_TEXTURE_LEVELS; i++)
-               OUT_RING(tex->tex_offset[i]);
-
-       OUT_RING(CCE_PACKET0(R128_SEC_TEXTURE_BORDER_COLOR_C, 0));
-       OUT_RING(tex->tex_border_color);
-
-       ADVANCE_RING();
-}
-
-static void r128_emit_state(drm_r128_private_t *dev_priv)
-{
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       unsigned int dirty = sarea_priv->dirty;
-
-       DRM_DEBUG("dirty=0x%08x\n", dirty);
-
-       if (dirty & R128_UPLOAD_CORE) {
-               r128_emit_core(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_CORE;
-       }
-
-       if (dirty & R128_UPLOAD_CONTEXT) {
-               r128_emit_context(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_CONTEXT;
-       }
-
-       if (dirty & R128_UPLOAD_SETUP) {
-               r128_emit_setup(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_SETUP;
-       }
-
-       if (dirty & R128_UPLOAD_MASKS) {
-               r128_emit_masks(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_MASKS;
-       }
-
-       if (dirty & R128_UPLOAD_WINDOW) {
-               r128_emit_window(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_WINDOW;
-       }
-
-       if (dirty & R128_UPLOAD_TEX0) {
-               r128_emit_tex0(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_TEX0;
-       }
-
-       if (dirty & R128_UPLOAD_TEX1) {
-               r128_emit_tex1(dev_priv);
-               sarea_priv->dirty &= ~R128_UPLOAD_TEX1;
-       }
-
-       /* Turn off the texture cache flushing */
-       sarea_priv->context_state.tex_cntl_c &= ~R128_TEX_CACHE_FLUSH;
-
-       sarea_priv->dirty &= ~R128_REQUIRE_QUIESCENCE;
-}
-
-#if R128_PERFORMANCE_BOXES
-/* ================================================================
- * Performance monitoring functions
- */
-
-static void r128_clear_box(drm_r128_private_t *dev_priv,
-                          int x, int y, int w, int h, int r, int g, int b)
-{
-       u32 pitch, offset;
-       u32 fb_bpp, color;
-       RING_LOCALS;
-
-       switch (dev_priv->fb_bpp) {
-       case 16:
-               fb_bpp = R128_GMC_DST_16BPP;
-               color = (((r & 0xf8) << 8) |
-                        ((g & 0xfc) << 3) | ((b & 0xf8) >> 3));
-               break;
-       case 24:
-               fb_bpp = R128_GMC_DST_24BPP;
-               color = ((r << 16) | (g << 8) | b);
-               break;
-       case 32:
-               fb_bpp = R128_GMC_DST_32BPP;
-               color = (((0xff) << 24) | (r << 16) | (g << 8) | b);
-               break;
-       default:
-               return;
-       }
-
-       offset = dev_priv->back_offset;
-       pitch = dev_priv->back_pitch >> 3;
-
-       BEGIN_RING(6);
-
-       OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-       OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                R128_GMC_BRUSH_SOLID_COLOR |
-                fb_bpp |
-                R128_GMC_SRC_DATATYPE_COLOR |
-                R128_ROP3_P |
-                R128_GMC_CLR_CMP_CNTL_DIS | R128_GMC_AUX_CLIP_DIS);
-
-       OUT_RING((pitch << 21) | (offset >> 5));
-       OUT_RING(color);
-
-       OUT_RING((x << 16) | y);
-       OUT_RING((w << 16) | h);
-
-       ADVANCE_RING();
-}
-
-static void r128_cce_performance_boxes(drm_r128_private_t *dev_priv)
-{
-       if (atomic_read(&dev_priv->idle_count) == 0)
-               r128_clear_box(dev_priv, 64, 4, 8, 8, 0, 255, 0);
-       else
-               atomic_set(&dev_priv->idle_count, 0);
-}
-
-#endif
-
-/* ================================================================
- * CCE command dispatch functions
- */
-
-static void r128_print_dirty(const char *msg, unsigned int flags)
-{
-       DRM_INFO("%s: (0x%x) %s%s%s%s%s%s%s%s%s\n",
-                msg,
-                flags,
-                (flags & R128_UPLOAD_CORE) ? "core, " : "",
-                (flags & R128_UPLOAD_CONTEXT) ? "context, " : "",
-                (flags & R128_UPLOAD_SETUP) ? "setup, " : "",
-                (flags & R128_UPLOAD_TEX0) ? "tex0, " : "",
-                (flags & R128_UPLOAD_TEX1) ? "tex1, " : "",
-                (flags & R128_UPLOAD_MASKS) ? "masks, " : "",
-                (flags & R128_UPLOAD_WINDOW) ? "window, " : "",
-                (flags & R128_UPLOAD_CLIPRECTS) ? "cliprects, " : "",
-                (flags & R128_REQUIRE_QUIESCENCE) ? "quiescence, " : "");
-}
-
-static void r128_cce_dispatch_clear(struct drm_device *dev,
-                                   drm_r128_clear_t *clear)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       int nbox = sarea_priv->nbox;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       unsigned int flags = clear->flags;
-       int i;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       if (dev_priv->page_flipping && dev_priv->current_page == 1) {
-               unsigned int tmp = flags;
-
-               flags &= ~(R128_FRONT | R128_BACK);
-               if (tmp & R128_FRONT)
-                       flags |= R128_BACK;
-               if (tmp & R128_BACK)
-                       flags |= R128_FRONT;
-       }
-
-       for (i = 0; i < nbox; i++) {
-               int x = pbox[i].x1;
-               int y = pbox[i].y1;
-               int w = pbox[i].x2 - x;
-               int h = pbox[i].y2 - y;
-
-               DRM_DEBUG("dispatch clear %d,%d-%d,%d flags 0x%x\n",
-                         pbox[i].x1, pbox[i].y1, pbox[i].x2,
-                         pbox[i].y2, flags);
-
-               if (flags & (R128_FRONT | R128_BACK)) {
-                       BEGIN_RING(2);
-
-                       OUT_RING(CCE_PACKET0(R128_DP_WRITE_MASK, 0));
-                       OUT_RING(clear->color_mask);
-
-                       ADVANCE_RING();
-               }
-
-               if (flags & R128_FRONT) {
-                       BEGIN_RING(6);
-
-                       OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                       OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                R128_GMC_BRUSH_SOLID_COLOR |
-                                (dev_priv->color_fmt << 8) |
-                                R128_GMC_SRC_DATATYPE_COLOR |
-                                R128_ROP3_P |
-                                R128_GMC_CLR_CMP_CNTL_DIS |
-                                R128_GMC_AUX_CLIP_DIS);
-
-                       OUT_RING(dev_priv->front_pitch_offset_c);
-                       OUT_RING(clear->clear_color);
-
-                       OUT_RING((x << 16) | y);
-                       OUT_RING((w << 16) | h);
-
-                       ADVANCE_RING();
-               }
-
-               if (flags & R128_BACK) {
-                       BEGIN_RING(6);
-
-                       OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                       OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                R128_GMC_BRUSH_SOLID_COLOR |
-                                (dev_priv->color_fmt << 8) |
-                                R128_GMC_SRC_DATATYPE_COLOR |
-                                R128_ROP3_P |
-                                R128_GMC_CLR_CMP_CNTL_DIS |
-                                R128_GMC_AUX_CLIP_DIS);
-
-                       OUT_RING(dev_priv->back_pitch_offset_c);
-                       OUT_RING(clear->clear_color);
-
-                       OUT_RING((x << 16) | y);
-                       OUT_RING((w << 16) | h);
-
-                       ADVANCE_RING();
-               }
-
-               if (flags & R128_DEPTH) {
-                       BEGIN_RING(6);
-
-                       OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                       OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                R128_GMC_BRUSH_SOLID_COLOR |
-                                (dev_priv->depth_fmt << 8) |
-                                R128_GMC_SRC_DATATYPE_COLOR |
-                                R128_ROP3_P |
-                                R128_GMC_CLR_CMP_CNTL_DIS |
-                                R128_GMC_AUX_CLIP_DIS | R128_GMC_WR_MSK_DIS);
-
-                       OUT_RING(dev_priv->depth_pitch_offset_c);
-                       OUT_RING(clear->clear_depth);
-
-                       OUT_RING((x << 16) | y);
-                       OUT_RING((w << 16) | h);
-
-                       ADVANCE_RING();
-               }
-       }
-}
-
-static void r128_cce_dispatch_swap(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       int nbox = sarea_priv->nbox;
-       struct drm_clip_rect *pbox = sarea_priv->boxes;
-       int i;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-#if R128_PERFORMANCE_BOXES
-       /* Do some trivial performance monitoring...
-        */
-       r128_cce_performance_boxes(dev_priv);
-#endif
-
-       for (i = 0; i < nbox; i++) {
-               int x = pbox[i].x1;
-               int y = pbox[i].y1;
-               int w = pbox[i].x2 - x;
-               int h = pbox[i].y2 - y;
-
-               BEGIN_RING(7);
-
-               OUT_RING(CCE_PACKET3(R128_CNTL_BITBLT_MULTI, 5));
-               OUT_RING(R128_GMC_SRC_PITCH_OFFSET_CNTL |
-                        R128_GMC_DST_PITCH_OFFSET_CNTL |
-                        R128_GMC_BRUSH_NONE |
-                        (dev_priv->color_fmt << 8) |
-                        R128_GMC_SRC_DATATYPE_COLOR |
-                        R128_ROP3_S |
-                        R128_DP_SRC_SOURCE_MEMORY |
-                        R128_GMC_CLR_CMP_CNTL_DIS |
-                        R128_GMC_AUX_CLIP_DIS | R128_GMC_WR_MSK_DIS);
-
-               /* Make this work even if front & back are flipped:
-                */
-               if (dev_priv->current_page == 0) {
-                       OUT_RING(dev_priv->back_pitch_offset_c);
-                       OUT_RING(dev_priv->front_pitch_offset_c);
-               } else {
-                       OUT_RING(dev_priv->front_pitch_offset_c);
-                       OUT_RING(dev_priv->back_pitch_offset_c);
-               }
-
-               OUT_RING((x << 16) | y);
-               OUT_RING((x << 16) | y);
-               OUT_RING((w << 16) | h);
-
-               ADVANCE_RING();
-       }
-
-       /* Increment the frame counter.  The client-side 3D driver must
-        * throttle the framerate by waiting for this value before
-        * performing the swapbuffer ioctl.
-        */
-       dev_priv->sarea_priv->last_frame++;
-
-       BEGIN_RING(2);
-
-       OUT_RING(CCE_PACKET0(R128_LAST_FRAME_REG, 0));
-       OUT_RING(dev_priv->sarea_priv->last_frame);
-
-       ADVANCE_RING();
-}
-
-static void r128_cce_dispatch_flip(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       RING_LOCALS;
-       DRM_DEBUG("page=%d pfCurrentPage=%d\n",
-                 dev_priv->current_page, dev_priv->sarea_priv->pfCurrentPage);
-
-#if R128_PERFORMANCE_BOXES
-       /* Do some trivial performance monitoring...
-        */
-       r128_cce_performance_boxes(dev_priv);
-#endif
-
-       BEGIN_RING(4);
-
-       R128_WAIT_UNTIL_PAGE_FLIPPED();
-       OUT_RING(CCE_PACKET0(R128_CRTC_OFFSET, 0));
-
-       if (dev_priv->current_page == 0)
-               OUT_RING(dev_priv->back_offset);
-       else
-               OUT_RING(dev_priv->front_offset);
-
-       ADVANCE_RING();
-
-       /* Increment the frame counter.  The client-side 3D driver must
-        * throttle the framerate by waiting for this value before
-        * performing the swapbuffer ioctl.
-        */
-       dev_priv->sarea_priv->last_frame++;
-       dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page =
-           1 - dev_priv->current_page;
-
-       BEGIN_RING(2);
-
-       OUT_RING(CCE_PACKET0(R128_LAST_FRAME_REG, 0));
-       OUT_RING(dev_priv->sarea_priv->last_frame);
-
-       ADVANCE_RING();
-}
-
-static void r128_cce_dispatch_vertex(struct drm_device *dev, struct drm_buf *buf)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_buf_priv_t *buf_priv = buf->dev_private;
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       int format = sarea_priv->vc_format;
-       int offset = buf->bus_address;
-       int size = buf->used;
-       int prim = buf_priv->prim;
-       int i = 0;
-       RING_LOCALS;
-       DRM_DEBUG("buf=%d nbox=%d\n", buf->idx, sarea_priv->nbox);
-
-       if (0)
-               r128_print_dirty("dispatch_vertex", sarea_priv->dirty);
-
-       if (buf->used) {
-               buf_priv->dispatched = 1;
-
-               if (sarea_priv->dirty & ~R128_UPLOAD_CLIPRECTS)
-                       r128_emit_state(dev_priv);
-
-               do {
-                       /* Emit the next set of up to three cliprects */
-                       if (i < sarea_priv->nbox) {
-                               r128_emit_clip_rects(dev_priv,
-                                                    &sarea_priv->boxes[i],
-                                                    sarea_priv->nbox - i);
-                       }
-
-                       /* Emit the vertex buffer rendering commands */
-                       BEGIN_RING(5);
-
-                       OUT_RING(CCE_PACKET3(R128_3D_RNDR_GEN_INDX_PRIM, 3));
-                       OUT_RING(offset);
-                       OUT_RING(size);
-                       OUT_RING(format);
-                       OUT_RING(prim | R128_CCE_VC_CNTL_PRIM_WALK_LIST |
-                                (size << R128_CCE_VC_CNTL_NUM_SHIFT));
-
-                       ADVANCE_RING();
-
-                       i += 3;
-               } while (i < sarea_priv->nbox);
-       }
-
-       if (buf_priv->discard) {
-               buf_priv->age = dev_priv->sarea_priv->last_dispatch;
-
-               /* Emit the vertex buffer age */
-               BEGIN_RING(2);
-
-               OUT_RING(CCE_PACKET0(R128_LAST_DISPATCH_REG, 0));
-               OUT_RING(buf_priv->age);
-
-               ADVANCE_RING();
-
-               buf->pending = 1;
-               buf->used = 0;
-               /* FIXME: Check dispatched field */
-               buf_priv->dispatched = 0;
-       }
-
-       dev_priv->sarea_priv->last_dispatch++;
-
-       sarea_priv->dirty &= ~R128_UPLOAD_CLIPRECTS;
-       sarea_priv->nbox = 0;
-}
-
-static void r128_cce_dispatch_indirect(struct drm_device *dev,
-                                      struct drm_buf *buf, int start, int end)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_buf_priv_t *buf_priv = buf->dev_private;
-       RING_LOCALS;
-       DRM_DEBUG("indirect: buf=%d s=0x%x e=0x%x\n", buf->idx, start, end);
-
-       if (start != end) {
-               int offset = buf->bus_address + start;
-               int dwords = (end - start + 3) / sizeof(u32);
-
-               /* Indirect buffer data must be an even number of
-                * dwords, so if we've been given an odd number we must
-                * pad the data with a Type-2 CCE packet.
-                */
-               if (dwords & 1) {
-                       u32 *data = (u32 *)
-                           ((char *)dev->agp_buffer_map->handle
-                            + buf->offset + start);
-                       data[dwords++] = cpu_to_le32(R128_CCE_PACKET2);
-               }
-
-               buf_priv->dispatched = 1;
-
-               /* Fire off the indirect buffer */
-               BEGIN_RING(3);
-
-               OUT_RING(CCE_PACKET0(R128_PM4_IW_INDOFF, 1));
-               OUT_RING(offset);
-               OUT_RING(dwords);
-
-               ADVANCE_RING();
-       }
-
-       if (buf_priv->discard) {
-               buf_priv->age = dev_priv->sarea_priv->last_dispatch;
-
-               /* Emit the indirect buffer age */
-               BEGIN_RING(2);
-
-               OUT_RING(CCE_PACKET0(R128_LAST_DISPATCH_REG, 0));
-               OUT_RING(buf_priv->age);
-
-               ADVANCE_RING();
-
-               buf->pending = 1;
-               buf->used = 0;
-               /* FIXME: Check dispatched field */
-               buf_priv->dispatched = 0;
-       }
-
-       dev_priv->sarea_priv->last_dispatch++;
-}
-
-static void r128_cce_dispatch_indices(struct drm_device *dev,
-                                     struct drm_buf *buf,
-                                     int start, int end, int count)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_buf_priv_t *buf_priv = buf->dev_private;
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       int format = sarea_priv->vc_format;
-       int offset = dev->agp_buffer_map->offset - dev_priv->cce_buffers_offset;
-       int prim = buf_priv->prim;
-       u32 *data;
-       int dwords;
-       int i = 0;
-       RING_LOCALS;
-       DRM_DEBUG("indices: s=%d e=%d c=%d\n", start, end, count);
-
-       if (0)
-               r128_print_dirty("dispatch_indices", sarea_priv->dirty);
-
-       if (start != end) {
-               buf_priv->dispatched = 1;
-
-               if (sarea_priv->dirty & ~R128_UPLOAD_CLIPRECTS)
-                       r128_emit_state(dev_priv);
-
-               dwords = (end - start + 3) / sizeof(u32);
-
-               data = (u32 *) ((char *)dev->agp_buffer_map->handle
-                               + buf->offset + start);
-
-               data[0] = cpu_to_le32(CCE_PACKET3(R128_3D_RNDR_GEN_INDX_PRIM,
-                                                 dwords - 2));
-
-               data[1] = cpu_to_le32(offset);
-               data[2] = cpu_to_le32(R128_MAX_VB_VERTS);
-               data[3] = cpu_to_le32(format);
-               data[4] = cpu_to_le32((prim | R128_CCE_VC_CNTL_PRIM_WALK_IND |
-                                      (count << 16)));
-
-               if (count & 0x1) {
-#ifdef __LITTLE_ENDIAN
-                       data[dwords - 1] &= 0x0000ffff;
-#else
-                       data[dwords - 1] &= 0xffff0000;
-#endif
-               }
-
-               do {
-                       /* Emit the next set of up to three cliprects */
-                       if (i < sarea_priv->nbox) {
-                               r128_emit_clip_rects(dev_priv,
-                                                    &sarea_priv->boxes[i],
-                                                    sarea_priv->nbox - i);
-                       }
-
-                       r128_cce_dispatch_indirect(dev, buf, start, end);
-
-                       i += 3;
-               } while (i < sarea_priv->nbox);
-       }
-
-       if (buf_priv->discard) {
-               buf_priv->age = dev_priv->sarea_priv->last_dispatch;
-
-               /* Emit the vertex buffer age */
-               BEGIN_RING(2);
-
-               OUT_RING(CCE_PACKET0(R128_LAST_DISPATCH_REG, 0));
-               OUT_RING(buf_priv->age);
-
-               ADVANCE_RING();
-
-               buf->pending = 1;
-               /* FIXME: Check dispatched field */
-               buf_priv->dispatched = 0;
-       }
-
-       dev_priv->sarea_priv->last_dispatch++;
-
-       sarea_priv->dirty &= ~R128_UPLOAD_CLIPRECTS;
-       sarea_priv->nbox = 0;
-}
-
-static int r128_cce_dispatch_blit(struct drm_device *dev,
-                                 struct drm_file *file_priv,
-                                 drm_r128_blit_t *blit)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_r128_buf_priv_t *buf_priv;
-       u32 *data;
-       int dword_shift, dwords;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       /* The compiler won't optimize away a division by a variable,
-        * even if the only legal values are powers of two.  Thus, we'll
-        * use a shift instead.
-        */
-       switch (blit->format) {
-       case R128_DATATYPE_ARGB8888:
-               dword_shift = 0;
-               break;
-       case R128_DATATYPE_ARGB1555:
-       case R128_DATATYPE_RGB565:
-       case R128_DATATYPE_ARGB4444:
-       case R128_DATATYPE_YVYU422:
-       case R128_DATATYPE_VYUY422:
-               dword_shift = 1;
-               break;
-       case R128_DATATYPE_CI8:
-       case R128_DATATYPE_RGB8:
-               dword_shift = 2;
-               break;
-       default:
-               DRM_ERROR("invalid blit format %d\n", blit->format);
-               return -EINVAL;
-       }
-
-       /* Flush the pixel cache, and mark the contents as Read Invalid.
-        * This ensures no pixel data gets mixed up with the texture
-        * data from the host data blit, otherwise part of the texture
-        * image may be corrupted.
-        */
-       BEGIN_RING(2);
-
-       OUT_RING(CCE_PACKET0(R128_PC_GUI_CTLSTAT, 0));
-       OUT_RING(R128_PC_RI_GUI | R128_PC_FLUSH_GUI);
-
-       ADVANCE_RING();
-
-       /* Dispatch the indirect buffer.
-        */
-       buf = dma->buflist[blit->idx];
-       buf_priv = buf->dev_private;
-
-       if (buf->file_priv != file_priv) {
-               DRM_ERROR("process %d using buffer owned by %p\n",
-                         task_pid_nr(current), buf->file_priv);
-               return -EINVAL;
-       }
-       if (buf->pending) {
-               DRM_ERROR("sending pending buffer %d\n", blit->idx);
-               return -EINVAL;
-       }
-
-       buf_priv->discard = 1;
-
-       dwords = (blit->width * blit->height) >> dword_shift;
-
-       data = (u32 *) ((char *)dev->agp_buffer_map->handle + buf->offset);
-
-       data[0] = cpu_to_le32(CCE_PACKET3(R128_CNTL_HOSTDATA_BLT, dwords + 6));
-       data[1] = cpu_to_le32((R128_GMC_DST_PITCH_OFFSET_CNTL |
-                              R128_GMC_BRUSH_NONE |
-                              (blit->format << 8) |
-                              R128_GMC_SRC_DATATYPE_COLOR |
-                              R128_ROP3_S |
-                              R128_DP_SRC_SOURCE_HOST_DATA |
-                              R128_GMC_CLR_CMP_CNTL_DIS |
-                              R128_GMC_AUX_CLIP_DIS | R128_GMC_WR_MSK_DIS));
-
-       data[2] = cpu_to_le32((blit->pitch << 21) | (blit->offset >> 5));
-       data[3] = cpu_to_le32(0xffffffff);
-       data[4] = cpu_to_le32(0xffffffff);
-       data[5] = cpu_to_le32((blit->y << 16) | blit->x);
-       data[6] = cpu_to_le32((blit->height << 16) | blit->width);
-       data[7] = cpu_to_le32(dwords);
-
-       buf->used = (dwords + 8) * sizeof(u32);
-
-       r128_cce_dispatch_indirect(dev, buf, 0, buf->used);
-
-       /* Flush the pixel cache after the blit completes.  This ensures
-        * the texture data is written out to memory before rendering
-        * continues.
-        */
-       BEGIN_RING(2);
-
-       OUT_RING(CCE_PACKET0(R128_PC_GUI_CTLSTAT, 0));
-       OUT_RING(R128_PC_FLUSH_GUI);
-
-       ADVANCE_RING();
-
-       return 0;
-}
-
-/* ================================================================
- * Tiled depth buffer management
- *
- * FIXME: These should all set the destination write mask for when we
- * have hardware stencil support.
- */
-
-static int r128_cce_dispatch_write_span(struct drm_device *dev,
-                                       drm_r128_depth_t *depth)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       int count, x, y;
-       u32 *buffer;
-       u8 *mask;
-       int i, buffer_size, mask_size;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       count = depth->n;
-       if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
-
-       if (copy_from_user(&x, depth->x, sizeof(x)))
-               return -EFAULT;
-       if (copy_from_user(&y, depth->y, sizeof(y)))
-               return -EFAULT;
-
-       buffer_size = depth->n * sizeof(u32);
-       buffer = memdup_user(depth->buffer, buffer_size);
-       if (IS_ERR(buffer))
-               return PTR_ERR(buffer);
-
-       mask_size = depth->n;
-       if (depth->mask) {
-               mask = memdup_user(depth->mask, mask_size);
-               if (IS_ERR(mask)) {
-                       kfree(buffer);
-                       return PTR_ERR(mask);
-               }
-
-               for (i = 0; i < count; i++, x++) {
-                       if (mask[i]) {
-                               BEGIN_RING(6);
-
-                               OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                               OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                        R128_GMC_BRUSH_SOLID_COLOR |
-                                        (dev_priv->depth_fmt << 8) |
-                                        R128_GMC_SRC_DATATYPE_COLOR |
-                                        R128_ROP3_P |
-                                        R128_GMC_CLR_CMP_CNTL_DIS |
-                                        R128_GMC_WR_MSK_DIS);
-
-                               OUT_RING(dev_priv->depth_pitch_offset_c);
-                               OUT_RING(buffer[i]);
-
-                               OUT_RING((x << 16) | y);
-                               OUT_RING((1 << 16) | 1);
-
-                               ADVANCE_RING();
-                       }
-               }
-
-               kfree(mask);
-       } else {
-               for (i = 0; i < count; i++, x++) {
-                       BEGIN_RING(6);
-
-                       OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                       OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                R128_GMC_BRUSH_SOLID_COLOR |
-                                (dev_priv->depth_fmt << 8) |
-                                R128_GMC_SRC_DATATYPE_COLOR |
-                                R128_ROP3_P |
-                                R128_GMC_CLR_CMP_CNTL_DIS |
-                                R128_GMC_WR_MSK_DIS);
-
-                       OUT_RING(dev_priv->depth_pitch_offset_c);
-                       OUT_RING(buffer[i]);
-
-                       OUT_RING((x << 16) | y);
-                       OUT_RING((1 << 16) | 1);
-
-                       ADVANCE_RING();
-               }
-       }
-
-       kfree(buffer);
-
-       return 0;
-}
-
-static int r128_cce_dispatch_write_pixels(struct drm_device *dev,
-                                         drm_r128_depth_t *depth)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       int count, *x, *y;
-       u32 *buffer;
-       u8 *mask;
-       int i, xbuf_size, ybuf_size, buffer_size, mask_size;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       count = depth->n;
-       if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
-
-       xbuf_size = count * sizeof(*x);
-       ybuf_size = count * sizeof(*y);
-       x = memdup_user(depth->x, xbuf_size);
-       if (IS_ERR(x))
-               return PTR_ERR(x);
-       y = memdup_user(depth->y, ybuf_size);
-       if (IS_ERR(y)) {
-               kfree(x);
-               return PTR_ERR(y);
-       }
-       buffer_size = depth->n * sizeof(u32);
-       buffer = memdup_user(depth->buffer, buffer_size);
-       if (IS_ERR(buffer)) {
-               kfree(x);
-               kfree(y);
-               return PTR_ERR(buffer);
-       }
-
-       if (depth->mask) {
-               mask_size = depth->n;
-               mask = memdup_user(depth->mask, mask_size);
-               if (IS_ERR(mask)) {
-                       kfree(x);
-                       kfree(y);
-                       kfree(buffer);
-                       return PTR_ERR(mask);
-               }
-
-               for (i = 0; i < count; i++) {
-                       if (mask[i]) {
-                               BEGIN_RING(6);
-
-                               OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                               OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                        R128_GMC_BRUSH_SOLID_COLOR |
-                                        (dev_priv->depth_fmt << 8) |
-                                        R128_GMC_SRC_DATATYPE_COLOR |
-                                        R128_ROP3_P |
-                                        R128_GMC_CLR_CMP_CNTL_DIS |
-                                        R128_GMC_WR_MSK_DIS);
-
-                               OUT_RING(dev_priv->depth_pitch_offset_c);
-                               OUT_RING(buffer[i]);
-
-                               OUT_RING((x[i] << 16) | y[i]);
-                               OUT_RING((1 << 16) | 1);
-
-                               ADVANCE_RING();
-                       }
-               }
-
-               kfree(mask);
-       } else {
-               for (i = 0; i < count; i++) {
-                       BEGIN_RING(6);
-
-                       OUT_RING(CCE_PACKET3(R128_CNTL_PAINT_MULTI, 4));
-                       OUT_RING(R128_GMC_DST_PITCH_OFFSET_CNTL |
-                                R128_GMC_BRUSH_SOLID_COLOR |
-                                (dev_priv->depth_fmt << 8) |
-                                R128_GMC_SRC_DATATYPE_COLOR |
-                                R128_ROP3_P |
-                                R128_GMC_CLR_CMP_CNTL_DIS |
-                                R128_GMC_WR_MSK_DIS);
-
-                       OUT_RING(dev_priv->depth_pitch_offset_c);
-                       OUT_RING(buffer[i]);
-
-                       OUT_RING((x[i] << 16) | y[i]);
-                       OUT_RING((1 << 16) | 1);
-
-                       ADVANCE_RING();
-               }
-       }
-
-       kfree(x);
-       kfree(y);
-       kfree(buffer);
-
-       return 0;
-}
-
-static int r128_cce_dispatch_read_span(struct drm_device *dev,
-                                      drm_r128_depth_t *depth)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       int count, x, y;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       count = depth->n;
-       if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
-
-       if (copy_from_user(&x, depth->x, sizeof(x)))
-               return -EFAULT;
-       if (copy_from_user(&y, depth->y, sizeof(y)))
-               return -EFAULT;
-
-       BEGIN_RING(7);
-
-       OUT_RING(CCE_PACKET3(R128_CNTL_BITBLT_MULTI, 5));
-       OUT_RING(R128_GMC_SRC_PITCH_OFFSET_CNTL |
-                R128_GMC_DST_PITCH_OFFSET_CNTL |
-                R128_GMC_BRUSH_NONE |
-                (dev_priv->depth_fmt << 8) |
-                R128_GMC_SRC_DATATYPE_COLOR |
-                R128_ROP3_S |
-                R128_DP_SRC_SOURCE_MEMORY |
-                R128_GMC_CLR_CMP_CNTL_DIS | R128_GMC_WR_MSK_DIS);
-
-       OUT_RING(dev_priv->depth_pitch_offset_c);
-       OUT_RING(dev_priv->span_pitch_offset_c);
-
-       OUT_RING((x << 16) | y);
-       OUT_RING((0 << 16) | 0);
-       OUT_RING((count << 16) | 1);
-
-       ADVANCE_RING();
-
-       return 0;
-}
-
-static int r128_cce_dispatch_read_pixels(struct drm_device *dev,
-                                        drm_r128_depth_t *depth)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       int count, *x, *y;
-       int i, xbuf_size, ybuf_size;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       count = depth->n;
-       if (count > 4096 || count <= 0)
-               return -EMSGSIZE;
-
-       if (count > dev_priv->depth_pitch)
-               count = dev_priv->depth_pitch;
-
-       xbuf_size = count * sizeof(*x);
-       ybuf_size = count * sizeof(*y);
-       x = kmalloc(xbuf_size, GFP_KERNEL);
-       if (x == NULL)
-               return -ENOMEM;
-       y = kmalloc(ybuf_size, GFP_KERNEL);
-       if (y == NULL) {
-               kfree(x);
-               return -ENOMEM;
-       }
-       if (copy_from_user(x, depth->x, xbuf_size)) {
-               kfree(x);
-               kfree(y);
-               return -EFAULT;
-       }
-       if (copy_from_user(y, depth->y, ybuf_size)) {
-               kfree(x);
-               kfree(y);
-               return -EFAULT;
-       }
-
-       for (i = 0; i < count; i++) {
-               BEGIN_RING(7);
-
-               OUT_RING(CCE_PACKET3(R128_CNTL_BITBLT_MULTI, 5));
-               OUT_RING(R128_GMC_SRC_PITCH_OFFSET_CNTL |
-                        R128_GMC_DST_PITCH_OFFSET_CNTL |
-                        R128_GMC_BRUSH_NONE |
-                        (dev_priv->depth_fmt << 8) |
-                        R128_GMC_SRC_DATATYPE_COLOR |
-                        R128_ROP3_S |
-                        R128_DP_SRC_SOURCE_MEMORY |
-                        R128_GMC_CLR_CMP_CNTL_DIS | R128_GMC_WR_MSK_DIS);
-
-               OUT_RING(dev_priv->depth_pitch_offset_c);
-               OUT_RING(dev_priv->span_pitch_offset_c);
-
-               OUT_RING((x[i] << 16) | y[i]);
-               OUT_RING((i << 16) | 0);
-               OUT_RING((1 << 16) | 1);
-
-               ADVANCE_RING();
-       }
-
-       kfree(x);
-       kfree(y);
-
-       return 0;
-}
-
-/* ================================================================
- * Polygon stipple
- */
-
-static void r128_cce_dispatch_stipple(struct drm_device *dev, u32 *stipple)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       int i;
-       RING_LOCALS;
-       DRM_DEBUG("\n");
-
-       BEGIN_RING(33);
-
-       OUT_RING(CCE_PACKET0(R128_BRUSH_DATA0, 31));
-       for (i = 0; i < 32; i++)
-               OUT_RING(stipple[i]);
-
-       ADVANCE_RING();
-}
-
-/* ================================================================
- * IOCTL functions
- */
-
-static int r128_cce_clear(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_sarea_t *sarea_priv;
-       drm_r128_clear_t *clear = data;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-
-       sarea_priv = dev_priv->sarea_priv;
-
-       if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS)
-               sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS;
-
-       r128_cce_dispatch_clear(dev, clear);
-       COMMIT_RING();
-
-       /* Make sure we restore the 3D state next time.
-        */
-       dev_priv->sarea_priv->dirty |= R128_UPLOAD_CONTEXT | R128_UPLOAD_MASKS;
-
-       return 0;
-}
-
-static int r128_do_init_pageflip(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       DRM_DEBUG("\n");
-
-       dev_priv->crtc_offset = R128_READ(R128_CRTC_OFFSET);
-       dev_priv->crtc_offset_cntl = R128_READ(R128_CRTC_OFFSET_CNTL);
-
-       R128_WRITE(R128_CRTC_OFFSET, dev_priv->front_offset);
-       R128_WRITE(R128_CRTC_OFFSET_CNTL,
-                  dev_priv->crtc_offset_cntl | R128_CRTC_OFFSET_FLIP_CNTL);
-
-       dev_priv->page_flipping = 1;
-       dev_priv->current_page = 0;
-       dev_priv->sarea_priv->pfCurrentPage = dev_priv->current_page;
-
-       return 0;
-}
-
-static int r128_do_cleanup_pageflip(struct drm_device *dev)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       DRM_DEBUG("\n");
-
-       R128_WRITE(R128_CRTC_OFFSET, dev_priv->crtc_offset);
-       R128_WRITE(R128_CRTC_OFFSET_CNTL, dev_priv->crtc_offset_cntl);
-
-       if (dev_priv->current_page != 0) {
-               r128_cce_dispatch_flip(dev);
-               COMMIT_RING();
-       }
-
-       dev_priv->page_flipping = 0;
-       return 0;
-}
-
-/* Swapping and flipping are different operations, need different ioctls.
- * They can & should be intermixed to support multiple 3d windows.
- */
-
-static int r128_cce_flip(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-
-       if (!dev_priv->page_flipping)
-               r128_do_init_pageflip(dev);
-
-       r128_cce_dispatch_flip(dev);
-
-       COMMIT_RING();
-       return 0;
-}
-
-static int r128_cce_swap(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-
-       if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS)
-               sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS;
-
-       r128_cce_dispatch_swap(dev);
-       dev_priv->sarea_priv->dirty |= (R128_UPLOAD_CONTEXT |
-                                       R128_UPLOAD_MASKS);
-
-       COMMIT_RING();
-       return 0;
-}
-
-static int r128_cce_vertex(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_r128_buf_priv_t *buf_priv;
-       drm_r128_vertex_t *vertex = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       DRM_DEBUG("pid=%d index=%d count=%d discard=%d\n",
-                 task_pid_nr(current), vertex->idx, vertex->count, vertex->discard);
-
-       if (vertex->idx < 0 || vertex->idx >= dma->buf_count) {
-               DRM_ERROR("buffer index %d (of %d max)\n",
-                         vertex->idx, dma->buf_count - 1);
-               return -EINVAL;
-       }
-       if (vertex->prim < 0 ||
-           vertex->prim > R128_CCE_VC_CNTL_PRIM_TYPE_TRI_TYPE2) {
-               DRM_ERROR("buffer prim %d\n", vertex->prim);
-               return -EINVAL;
-       }
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-       VB_AGE_TEST_WITH_RETURN(dev_priv);
-
-       buf = dma->buflist[vertex->idx];
-       buf_priv = buf->dev_private;
-
-       if (buf->file_priv != file_priv) {
-               DRM_ERROR("process %d using buffer owned by %p\n",
-                         task_pid_nr(current), buf->file_priv);
-               return -EINVAL;
-       }
-       if (buf->pending) {
-               DRM_ERROR("sending pending buffer %d\n", vertex->idx);
-               return -EINVAL;
-       }
-
-       buf->used = vertex->count;
-       buf_priv->prim = vertex->prim;
-       buf_priv->discard = vertex->discard;
-
-       r128_cce_dispatch_vertex(dev, buf);
-
-       COMMIT_RING();
-       return 0;
-}
-
-static int r128_cce_indices(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_r128_buf_priv_t *buf_priv;
-       drm_r128_indices_t *elts = data;
-       int count;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       DRM_DEBUG("pid=%d buf=%d s=%d e=%d d=%d\n", task_pid_nr(current),
-                 elts->idx, elts->start, elts->end, elts->discard);
-
-       if (elts->idx < 0 || elts->idx >= dma->buf_count) {
-               DRM_ERROR("buffer index %d (of %d max)\n",
-                         elts->idx, dma->buf_count - 1);
-               return -EINVAL;
-       }
-       if (elts->prim < 0 ||
-           elts->prim > R128_CCE_VC_CNTL_PRIM_TYPE_TRI_TYPE2) {
-               DRM_ERROR("buffer prim %d\n", elts->prim);
-               return -EINVAL;
-       }
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-       VB_AGE_TEST_WITH_RETURN(dev_priv);
-
-       buf = dma->buflist[elts->idx];
-       buf_priv = buf->dev_private;
-
-       if (buf->file_priv != file_priv) {
-               DRM_ERROR("process %d using buffer owned by %p\n",
-                         task_pid_nr(current), buf->file_priv);
-               return -EINVAL;
-       }
-       if (buf->pending) {
-               DRM_ERROR("sending pending buffer %d\n", elts->idx);
-               return -EINVAL;
-       }
-
-       count = (elts->end - elts->start) / sizeof(u16);
-       elts->start -= R128_INDEX_PRIM_OFFSET;
-
-       if (elts->start & 0x7) {
-               DRM_ERROR("misaligned buffer 0x%x\n", elts->start);
-               return -EINVAL;
-       }
-       if (elts->start < buf->used) {
-               DRM_ERROR("no header 0x%x - 0x%x\n", elts->start, buf->used);
-               return -EINVAL;
-       }
-
-       buf->used = elts->end;
-       buf_priv->prim = elts->prim;
-       buf_priv->discard = elts->discard;
-
-       r128_cce_dispatch_indices(dev, buf, elts->start, elts->end, count);
-
-       COMMIT_RING();
-       return 0;
-}
-
-static int r128_cce_blit(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_blit_t *blit = data;
-       int ret;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       DRM_DEBUG("pid=%d index=%d\n", task_pid_nr(current), blit->idx);
-
-       if (blit->idx < 0 || blit->idx >= dma->buf_count) {
-               DRM_ERROR("buffer index %d (of %d max)\n",
-                         blit->idx, dma->buf_count - 1);
-               return -EINVAL;
-       }
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-       VB_AGE_TEST_WITH_RETURN(dev_priv);
-
-       ret = r128_cce_dispatch_blit(dev, file_priv, blit);
-
-       COMMIT_RING();
-       return ret;
-}
-
-int r128_cce_depth(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_depth_t *depth = data;
-       int ret;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-
-       ret = -EINVAL;
-       switch (depth->func) {
-       case R128_WRITE_SPAN:
-               ret = r128_cce_dispatch_write_span(dev, depth);
-               break;
-       case R128_WRITE_PIXELS:
-               ret = r128_cce_dispatch_write_pixels(dev, depth);
-               break;
-       case R128_READ_SPAN:
-               ret = r128_cce_dispatch_read_span(dev, depth);
-               break;
-       case R128_READ_PIXELS:
-               ret = r128_cce_dispatch_read_pixels(dev, depth);
-               break;
-       }
-
-       COMMIT_RING();
-       return ret;
-}
-
-int r128_cce_stipple(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_stipple_t *stipple = data;
-       u32 mask[32];
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       if (copy_from_user(&mask, stipple->mask, 32 * sizeof(u32)))
-               return -EFAULT;
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-
-       r128_cce_dispatch_stipple(dev, mask);
-
-       COMMIT_RING();
-       return 0;
-}
-
-static int r128_cce_indirect(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_r128_buf_priv_t *buf_priv;
-       drm_r128_indirect_t *indirect = data;
-#if 0
-       RING_LOCALS;
-#endif
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       DRM_DEBUG("idx=%d s=%d e=%d d=%d\n",
-                 indirect->idx, indirect->start, indirect->end,
-                 indirect->discard);
-
-       if (indirect->idx < 0 || indirect->idx >= dma->buf_count) {
-               DRM_ERROR("buffer index %d (of %d max)\n",
-                         indirect->idx, dma->buf_count - 1);
-               return -EINVAL;
-       }
-
-       buf = dma->buflist[indirect->idx];
-       buf_priv = buf->dev_private;
-
-       if (buf->file_priv != file_priv) {
-               DRM_ERROR("process %d using buffer owned by %p\n",
-                         task_pid_nr(current), buf->file_priv);
-               return -EINVAL;
-       }
-       if (buf->pending) {
-               DRM_ERROR("sending pending buffer %d\n", indirect->idx);
-               return -EINVAL;
-       }
-
-       if (indirect->start < buf->used) {
-               DRM_ERROR("reusing indirect: start=0x%x actual=0x%x\n",
-                         indirect->start, buf->used);
-               return -EINVAL;
-       }
-
-       RING_SPACE_TEST_WITH_RETURN(dev_priv);
-       VB_AGE_TEST_WITH_RETURN(dev_priv);
-
-       buf->used = indirect->end;
-       buf_priv->discard = indirect->discard;
-
-#if 0
-       /* Wait for the 3D stream to idle before the indirect buffer
-        * containing 2D acceleration commands is processed.
-        */
-       BEGIN_RING(2);
-       RADEON_WAIT_UNTIL_3D_IDLE();
-       ADVANCE_RING();
-#endif
-
-       /* Dispatch the indirect buffer full of commands from the
-        * X server.  This is insecure and is thus only available to
-        * privileged clients.
-        */
-       r128_cce_dispatch_indirect(dev, buf, indirect->start, indirect->end);
-
-       COMMIT_RING();
-       return 0;
-}
-
-int r128_getparam(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_r128_private_t *dev_priv = dev->dev_private;
-       drm_r128_getparam_t *param = data;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       int value;
-
-       DEV_INIT_TEST_WITH_RETURN(dev_priv);
-
-       DRM_DEBUG("pid=%d\n", task_pid_nr(current));
-
-       switch (param->param) {
-       case R128_PARAM_IRQ_NR:
-               value = pdev->irq;
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       if (copy_to_user(param->value, &value, sizeof(int))) {
-               DRM_ERROR("copy_to_user\n");
-               return -EFAULT;
-       }
-
-       return 0;
-}
-
-void r128_driver_preclose(struct drm_device *dev, struct drm_file *file_priv)
-{
-       if (dev->dev_private) {
-               drm_r128_private_t *dev_priv = dev->dev_private;
-               if (dev_priv->page_flipping)
-                       r128_do_cleanup_pageflip(dev);
-       }
-}
-void r128_driver_lastclose(struct drm_device *dev)
-{
-       r128_do_cleanup_cce(dev);
-}
-
-const struct drm_ioctl_desc r128_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(R128_INIT, r128_cce_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(R128_CCE_START, r128_cce_start, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(R128_CCE_STOP, r128_cce_stop, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(R128_CCE_RESET, r128_cce_reset, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(R128_CCE_IDLE, r128_cce_idle, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_RESET, r128_engine_reset, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_FULLSCREEN, r128_fullscreen, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_SWAP, r128_cce_swap, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_FLIP, r128_cce_flip, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_CLEAR, r128_cce_clear, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_VERTEX, r128_cce_vertex, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_INDICES, r128_cce_indices, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_BLIT, r128_cce_blit, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_DEPTH, r128_cce_depth, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_STIPPLE, r128_cce_stipple, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(R128_INDIRECT, r128_cce_indirect, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(R128_GETPARAM, r128_getparam, DRM_AUTH),
-};
-
-int r128_max_ioctl = ARRAY_SIZE(r128_ioctls);
index d28d3acb3ba17e9f300bf99db41135dbc96499a0..ade13173921b8f87aaf27f38075d1f74ec5a80e0 100644 (file)
  *          Alex Deucher
  */
 
-#include <drm/drm_crtc_helper.h>
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fixed.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 #include <drm/radeon_drm.h>
 
index c841c273222e77fa6fc8be649046c06a65ee7194..1471c3a966020af18e87c17808883aee3ec8ad19 100644 (file)
@@ -30,6 +30,7 @@
 
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_file.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/radeon_drm.h>
 
 #include <acpi/video.h>
index 621ff174dff3d314554b63871be781f2ff8b88c8..7b0cfeaddcec35e1dd455317ce3ae0ebad26fea4 100644 (file)
@@ -31,7 +31,6 @@
 #include <linux/slab.h>
 
 #include <drm/drm.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_file.h>
 #include <drm/radeon_drm.h>
index b603c0b7707506185277f7b2ae01d88ebc874243..5771d1fcb073f24001f1d0b1bfac85496db81c9e 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 #include <linux/acpi.h>
+#include <linux/backlight.h>
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
 #include <linux/power_supply.h>
@@ -30,7 +31,6 @@
 #include <acpi/acpi_bus.h>
 #include <acpi/video.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_probe_helper.h>
 
 #include "atom.h"
index bfacf8fe5cc16931cbc96313d00019380143180c..802b5af19261838442a87154447e9e6ab72bd421 100644 (file)
@@ -30,7 +30,6 @@
 #include <linux/pci.h>
 #include <linux/vgaarb.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/radeon_drm.h>
 
 #include "atom.h"
index f7431d22460442d44740ccf9d98384b7240976cf..07193cd0c417468ae3defcd9b354b1e607e5eb62 100644 (file)
@@ -27,7 +27,7 @@
 #include <drm/display/drm_dp_mst_helper.h>
 #include <drm/drm_edid.h>
 #include <drm/drm_crtc_helper.h>
-#include <drm/drm_fb_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/radeon_drm.h>
 #include "radeon.h"
index 9bed1a6cb16332b777491912f481cd6679876e87..f34a7f63261d4ce17c2275dee217358183a78309 100644 (file)
@@ -38,6 +38,7 @@
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_framebuffer_helper.h>
+#include <drm/drm_modeset_helper.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_vblank.h>
 #include <drm/radeon_drm.h>
index 69379b95146ef7c6ba9580e16c7495626bef3ed6..1e5b6baf76a167c030a5a5045c20241892fe54e7 100644 (file)
@@ -158,7 +158,7 @@ radeon_dp_aux_transfer_native(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg
        } while (retry_count++ < 1000);
 
        if (retry_count >= 1000) {
-               DRM_ERROR("auxch hw never signalled completion, error %08x\n", tmp);
+               dev_err(rdev->dev, "auxch hw never signalled completion, error %08x\n", tmp);
                ret = -EIO;
                goto done;
        }
@@ -168,8 +168,7 @@ radeon_dp_aux_transfer_native(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg
                goto done;
        }
        if (tmp & AUX_RX_ERROR_FLAGS) {
-               DRM_DEBUG_KMS_RATELIMITED("dp_aux_ch flags not zero: %08x\n",
-                                         tmp);
+               drm_dbg_kms_ratelimited(dev, "dp_aux_ch flags not zero: %08x\n", tmp);
                ret = -EIO;
                goto done;
        }
index 6cbe1ab81abad7217681438666e10860c5d5b323..716ab85a376b32747c48a81544f88b75ff83ca6b 100644 (file)
@@ -38,9 +38,7 @@
 #include <linux/pci.h>
 
 #include <drm/drm_aperture.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem.h>
 #include <drm/drm_ioctl.h>
index fbc0a21823180754f71f8bbe3d29b05d6a6fc4d5..b3518a8f95a072bd59fe86788143b0b466c69ce4 100644 (file)
@@ -26,7 +26,6 @@
 
 #include <linux/pci.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/radeon_drm.h>
 
index c1710ed1cab838fc0ebe1a960775d8112712ac37..fe4087bfdb3c076a9d854721b4d3f84f102d0d2b 100644 (file)
@@ -277,10 +277,6 @@ static int radeonfb_create(struct drm_fb_helper *helper,
 
        drm_fb_helper_fill_info(info, &rfbdev->helper, sizes);
 
-       /* setup aperture base/size for vesafb takeover */
-       info->apertures->ranges[0].base = rdev->mc.aper_base;
-       info->apertures->ranges[0].size = rdev->mc.aper_size;
-
        /* Use default scratch pixmap (info->pixmap.flags = FB_PIXMAP_SYSTEM) */
 
        if (info->screen_base == NULL) {
index da2173435eddbfd0b14f11c012f6fb9aca2c9f29..3377fbc71f65478b630085fccdbc786306f0157e 100644 (file)
@@ -29,7 +29,6 @@
 #include <linux/pci.h>
 #include <linux/pm_runtime.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_probe_helper.h>
index 6072ed5f2dd3427961735d36a9ac9fd4d1b123ae..825b351ff53cc73b3f71c0a1d94e9797e8f0f864 100644 (file)
  *          Alex Deucher
  */
 
-#include <drm/drm_crtc_helper.h>
-#include <drm/drm_fb_helper.h>
 #include <drm/drm_fixed.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_vblank.h>
 #include <drm/radeon_drm.h>
 
@@ -322,7 +321,7 @@ static void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
         */
        if (rdev->flags & RADEON_SINGLE_CRTC)
                crtc_ext_cntl = RADEON_CRTC_CRT_ON;
-       
+
        switch (mode) {
        case DRM_MODE_DPMS_ON:
                radeon_crtc->enabled = true;
index 0cd32c65456c2b29f12bc072b42cb7dce271c982..601d35d34eabfffbbf05d2f0e7a56b5f6d72e974 100644 (file)
@@ -27,9 +27,9 @@
 #include <linux/backlight.h>
 #include <linux/pci.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 #include <drm/drm_file.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_util.h>
 #include <drm/radeon_drm.h>
 
index d9df7f311e76135ed707c538daf7144fdb67f830..12e180b119ac999243f6195f2b9a6aaa3fc5f66a 100644 (file)
@@ -1,6 +1,5 @@
 // SPDX-License-Identifier: MIT
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_device.h>
 
 #include "radeon.h"
index 9f5be416454faa380a4cec1033e6cc368011ca4a..3a59d016e8cdb4cad19332c43aefeb7b26c1258b 100644 (file)
@@ -35,7 +35,7 @@
 #include <drm/drm_edid.h>
 #include <drm/drm_encoder.h>
 #include <drm/drm_fixed.h>
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <linux/i2c.h>
 #include <linux/i2c-algo-bit.h>
 
index 8cecf81a5ae032e25fe8f38c2863afc8c6e29974..ba3b817895091fc285c965c518ad3ed614d6ad53 100644 (file)
@@ -25,7 +25,6 @@
 #include <drm/drm_atomic_uapi.h>
 #include <drm/drm_blend.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_debugfs.h>
 #include <drm/drm_flip_work.h>
 #include <drm/drm_framebuffer.h>
diff --git a/drivers/gpu/drm/savage/Makefile b/drivers/gpu/drm/savage/Makefile
deleted file mode 100644 (file)
index 3e52076..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-savage-y := savage_drv.o savage_bci.o savage_state.o
-
-obj-$(CONFIG_DRM_SAVAGE)+= savage.o
-
diff --git a/drivers/gpu/drm/savage/savage_bci.c b/drivers/gpu/drm/savage/savage_bci.c
deleted file mode 100644 (file)
index e33385d..0000000
+++ /dev/null
@@ -1,1082 +0,0 @@
-/* savage_bci.c -- BCI support for Savage
- *
- * Copyright 2004  Felix Kuehling
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <linux/delay.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_file.h>
-#include <drm/drm_print.h>
-#include <drm/savage_drm.h>
-
-#include "savage_drv.h"
-
-/* Need a long timeout for shadow status updates can take a while
- * and so can waiting for events when the queue is full. */
-#define SAVAGE_DEFAULT_USEC_TIMEOUT    1000000 /* 1s */
-#define SAVAGE_EVENT_USEC_TIMEOUT      5000000 /* 5s */
-#define SAVAGE_FREELIST_DEBUG          0
-
-static int savage_do_cleanup_bci(struct drm_device *dev);
-
-static int
-savage_bci_wait_fifo_shadow(drm_savage_private_t * dev_priv, unsigned int n)
-{
-       uint32_t mask = dev_priv->status_used_mask;
-       uint32_t threshold = dev_priv->bci_threshold_hi;
-       uint32_t status;
-       int i;
-
-#if SAVAGE_BCI_DEBUG
-       if (n > dev_priv->cob_size + SAVAGE_BCI_FIFO_SIZE - threshold)
-               DRM_ERROR("Trying to emit %d words "
-                         "(more than guaranteed space in COB)\n", n);
-#endif
-
-       for (i = 0; i < SAVAGE_DEFAULT_USEC_TIMEOUT; i++) {
-               mb();
-               status = dev_priv->status_ptr[0];
-               if ((status & mask) < threshold)
-                       return 0;
-               udelay(1);
-       }
-
-#if SAVAGE_BCI_DEBUG
-       DRM_ERROR("failed!\n");
-       DRM_INFO("   status=0x%08x, threshold=0x%08x\n", status, threshold);
-#endif
-       return -EBUSY;
-}
-
-static int
-savage_bci_wait_fifo_s3d(drm_savage_private_t * dev_priv, unsigned int n)
-{
-       uint32_t maxUsed = dev_priv->cob_size + SAVAGE_BCI_FIFO_SIZE - n;
-       uint32_t status;
-       int i;
-
-       for (i = 0; i < SAVAGE_DEFAULT_USEC_TIMEOUT; i++) {
-               status = SAVAGE_READ(SAVAGE_STATUS_WORD0);
-               if ((status & SAVAGE_FIFO_USED_MASK_S3D) <= maxUsed)
-                       return 0;
-               udelay(1);
-       }
-
-#if SAVAGE_BCI_DEBUG
-       DRM_ERROR("failed!\n");
-       DRM_INFO("   status=0x%08x\n", status);
-#endif
-       return -EBUSY;
-}
-
-static int
-savage_bci_wait_fifo_s4(drm_savage_private_t * dev_priv, unsigned int n)
-{
-       uint32_t maxUsed = dev_priv->cob_size + SAVAGE_BCI_FIFO_SIZE - n;
-       uint32_t status;
-       int i;
-
-       for (i = 0; i < SAVAGE_DEFAULT_USEC_TIMEOUT; i++) {
-               status = SAVAGE_READ(SAVAGE_ALT_STATUS_WORD0);
-               if ((status & SAVAGE_FIFO_USED_MASK_S4) <= maxUsed)
-                       return 0;
-               udelay(1);
-       }
-
-#if SAVAGE_BCI_DEBUG
-       DRM_ERROR("failed!\n");
-       DRM_INFO("   status=0x%08x\n", status);
-#endif
-       return -EBUSY;
-}
-
-/*
- * Waiting for events.
- *
- * The BIOSresets the event tag to 0 on mode changes. Therefore we
- * never emit 0 to the event tag. If we find a 0 event tag we know the
- * BIOS stomped on it and return success assuming that the BIOS waited
- * for engine idle.
- *
- * Note: if the Xserver uses the event tag it has to follow the same
- * rule. Otherwise there may be glitches every 2^16 events.
- */
-static int
-savage_bci_wait_event_shadow(drm_savage_private_t * dev_priv, uint16_t e)
-{
-       uint32_t status;
-       int i;
-
-       for (i = 0; i < SAVAGE_EVENT_USEC_TIMEOUT; i++) {
-               mb();
-               status = dev_priv->status_ptr[1];
-               if ((((status & 0xffff) - e) & 0xffff) <= 0x7fff ||
-                   (status & 0xffff) == 0)
-                       return 0;
-               udelay(1);
-       }
-
-#if SAVAGE_BCI_DEBUG
-       DRM_ERROR("failed!\n");
-       DRM_INFO("   status=0x%08x, e=0x%04x\n", status, e);
-#endif
-
-       return -EBUSY;
-}
-
-static int
-savage_bci_wait_event_reg(drm_savage_private_t * dev_priv, uint16_t e)
-{
-       uint32_t status;
-       int i;
-
-       for (i = 0; i < SAVAGE_EVENT_USEC_TIMEOUT; i++) {
-               status = SAVAGE_READ(SAVAGE_STATUS_WORD1);
-               if ((((status & 0xffff) - e) & 0xffff) <= 0x7fff ||
-                   (status & 0xffff) == 0)
-                       return 0;
-               udelay(1);
-       }
-
-#if SAVAGE_BCI_DEBUG
-       DRM_ERROR("failed!\n");
-       DRM_INFO("   status=0x%08x, e=0x%04x\n", status, e);
-#endif
-
-       return -EBUSY;
-}
-
-uint16_t savage_bci_emit_event(drm_savage_private_t * dev_priv,
-                              unsigned int flags)
-{
-       uint16_t count;
-       BCI_LOCALS;
-
-       if (dev_priv->status_ptr) {
-               /* coordinate with Xserver */
-               count = dev_priv->status_ptr[1023];
-               if (count < dev_priv->event_counter)
-                       dev_priv->event_wrap++;
-       } else {
-               count = dev_priv->event_counter;
-       }
-       count = (count + 1) & 0xffff;
-       if (count == 0) {
-               count++;        /* See the comment above savage_wait_event_*. */
-               dev_priv->event_wrap++;
-       }
-       dev_priv->event_counter = count;
-       if (dev_priv->status_ptr)
-               dev_priv->status_ptr[1023] = (uint32_t) count;
-
-       if ((flags & (SAVAGE_WAIT_2D | SAVAGE_WAIT_3D))) {
-               unsigned int wait_cmd = BCI_CMD_WAIT;
-               if ((flags & SAVAGE_WAIT_2D))
-                       wait_cmd |= BCI_CMD_WAIT_2D;
-               if ((flags & SAVAGE_WAIT_3D))
-                       wait_cmd |= BCI_CMD_WAIT_3D;
-               BEGIN_BCI(2);
-               BCI_WRITE(wait_cmd);
-       } else {
-               BEGIN_BCI(1);
-       }
-       BCI_WRITE(BCI_CMD_UPDATE_EVENT_TAG | (uint32_t) count);
-
-       return count;
-}
-
-/*
- * Freelist management
- */
-static int savage_freelist_init(struct drm_device * dev)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *buf;
-       drm_savage_buf_priv_t *entry;
-       int i;
-       DRM_DEBUG("count=%d\n", dma->buf_count);
-
-       dev_priv->head.next = &dev_priv->tail;
-       dev_priv->head.prev = NULL;
-       dev_priv->head.buf = NULL;
-
-       dev_priv->tail.next = NULL;
-       dev_priv->tail.prev = &dev_priv->head;
-       dev_priv->tail.buf = NULL;
-
-       for (i = 0; i < dma->buf_count; i++) {
-               buf = dma->buflist[i];
-               entry = buf->dev_private;
-
-               SET_AGE(&entry->age, 0, 0);
-               entry->buf = buf;
-
-               entry->next = dev_priv->head.next;
-               entry->prev = &dev_priv->head;
-               dev_priv->head.next->prev = entry;
-               dev_priv->head.next = entry;
-       }
-
-       return 0;
-}
-
-static struct drm_buf *savage_freelist_get(struct drm_device * dev)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       drm_savage_buf_priv_t *tail = dev_priv->tail.prev;
-       uint16_t event;
-       unsigned int wrap;
-       DRM_DEBUG("\n");
-
-       UPDATE_EVENT_COUNTER();
-       if (dev_priv->status_ptr)
-               event = dev_priv->status_ptr[1] & 0xffff;
-       else
-               event = SAVAGE_READ(SAVAGE_STATUS_WORD1) & 0xffff;
-       wrap = dev_priv->event_wrap;
-       if (event > dev_priv->event_counter)
-               wrap--;         /* hardware hasn't passed the last wrap yet */
-
-       DRM_DEBUG("   tail=0x%04x %d\n", tail->age.event, tail->age.wrap);
-       DRM_DEBUG("   head=0x%04x %d\n", event, wrap);
-
-       if (tail->buf && (TEST_AGE(&tail->age, event, wrap) || event == 0)) {
-               drm_savage_buf_priv_t *next = tail->next;
-               drm_savage_buf_priv_t *prev = tail->prev;
-               prev->next = next;
-               next->prev = prev;
-               tail->next = tail->prev = NULL;
-               return tail->buf;
-       }
-
-       DRM_DEBUG("returning NULL, tail->buf=%p!\n", tail->buf);
-       return NULL;
-}
-
-void savage_freelist_put(struct drm_device * dev, struct drm_buf * buf)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       drm_savage_buf_priv_t *entry = buf->dev_private, *prev, *next;
-
-       DRM_DEBUG("age=0x%04x wrap=%d\n", entry->age.event, entry->age.wrap);
-
-       if (entry->next != NULL || entry->prev != NULL) {
-               DRM_ERROR("entry already on freelist.\n");
-               return;
-       }
-
-       prev = &dev_priv->head;
-       next = prev->next;
-       prev->next = entry;
-       next->prev = entry;
-       entry->prev = prev;
-       entry->next = next;
-}
-
-/*
- * Command DMA
- */
-static int savage_dma_init(drm_savage_private_t * dev_priv)
-{
-       unsigned int i;
-
-       dev_priv->nr_dma_pages = dev_priv->cmd_dma->size /
-           (SAVAGE_DMA_PAGE_SIZE * 4);
-       dev_priv->dma_pages = kmalloc_array(dev_priv->nr_dma_pages,
-                                           sizeof(drm_savage_dma_page_t),
-                                           GFP_KERNEL);
-       if (dev_priv->dma_pages == NULL)
-               return -ENOMEM;
-
-       for (i = 0; i < dev_priv->nr_dma_pages; ++i) {
-               SET_AGE(&dev_priv->dma_pages[i].age, 0, 0);
-               dev_priv->dma_pages[i].used = 0;
-               dev_priv->dma_pages[i].flushed = 0;
-       }
-       SET_AGE(&dev_priv->last_dma_age, 0, 0);
-
-       dev_priv->first_dma_page = 0;
-       dev_priv->current_dma_page = 0;
-
-       return 0;
-}
-
-void savage_dma_reset(drm_savage_private_t * dev_priv)
-{
-       uint16_t event;
-       unsigned int wrap, i;
-       event = savage_bci_emit_event(dev_priv, 0);
-       wrap = dev_priv->event_wrap;
-       for (i = 0; i < dev_priv->nr_dma_pages; ++i) {
-               SET_AGE(&dev_priv->dma_pages[i].age, event, wrap);
-               dev_priv->dma_pages[i].used = 0;
-               dev_priv->dma_pages[i].flushed = 0;
-       }
-       SET_AGE(&dev_priv->last_dma_age, event, wrap);
-       dev_priv->first_dma_page = dev_priv->current_dma_page = 0;
-}
-
-void savage_dma_wait(drm_savage_private_t * dev_priv, unsigned int page)
-{
-       uint16_t event;
-       unsigned int wrap;
-
-       /* Faked DMA buffer pages don't age. */
-       if (dev_priv->cmd_dma == &dev_priv->fake_dma)
-               return;
-
-       UPDATE_EVENT_COUNTER();
-       if (dev_priv->status_ptr)
-               event = dev_priv->status_ptr[1] & 0xffff;
-       else
-               event = SAVAGE_READ(SAVAGE_STATUS_WORD1) & 0xffff;
-       wrap = dev_priv->event_wrap;
-       if (event > dev_priv->event_counter)
-               wrap--;         /* hardware hasn't passed the last wrap yet */
-
-       if (dev_priv->dma_pages[page].age.wrap > wrap ||
-           (dev_priv->dma_pages[page].age.wrap == wrap &&
-            dev_priv->dma_pages[page].age.event > event)) {
-               if (dev_priv->wait_evnt(dev_priv,
-                                       dev_priv->dma_pages[page].age.event)
-                   < 0)
-                       DRM_ERROR("wait_evnt failed!\n");
-       }
-}
-
-uint32_t *savage_dma_alloc(drm_savage_private_t * dev_priv, unsigned int n)
-{
-       unsigned int cur = dev_priv->current_dma_page;
-       unsigned int rest = SAVAGE_DMA_PAGE_SIZE -
-           dev_priv->dma_pages[cur].used;
-       unsigned int nr_pages = (n - rest + SAVAGE_DMA_PAGE_SIZE - 1) /
-           SAVAGE_DMA_PAGE_SIZE;
-       uint32_t *dma_ptr;
-       unsigned int i;
-
-       DRM_DEBUG("cur=%u, cur->used=%u, n=%u, rest=%u, nr_pages=%u\n",
-                 cur, dev_priv->dma_pages[cur].used, n, rest, nr_pages);
-
-       if (cur + nr_pages < dev_priv->nr_dma_pages) {
-               dma_ptr = (uint32_t *) dev_priv->cmd_dma->handle +
-                   cur * SAVAGE_DMA_PAGE_SIZE + dev_priv->dma_pages[cur].used;
-               if (n < rest)
-                       rest = n;
-               dev_priv->dma_pages[cur].used += rest;
-               n -= rest;
-               cur++;
-       } else {
-               dev_priv->dma_flush(dev_priv);
-               nr_pages =
-                   (n + SAVAGE_DMA_PAGE_SIZE - 1) / SAVAGE_DMA_PAGE_SIZE;
-               for (i = cur; i < dev_priv->nr_dma_pages; ++i) {
-                       dev_priv->dma_pages[i].age = dev_priv->last_dma_age;
-                       dev_priv->dma_pages[i].used = 0;
-                       dev_priv->dma_pages[i].flushed = 0;
-               }
-               dma_ptr = (uint32_t *) dev_priv->cmd_dma->handle;
-               dev_priv->first_dma_page = cur = 0;
-       }
-       for (i = cur; nr_pages > 0; ++i, --nr_pages) {
-#if SAVAGE_DMA_DEBUG
-               if (dev_priv->dma_pages[i].used) {
-                       DRM_ERROR("unflushed page %u: used=%u\n",
-                                 i, dev_priv->dma_pages[i].used);
-               }
-#endif
-               if (n > SAVAGE_DMA_PAGE_SIZE)
-                       dev_priv->dma_pages[i].used = SAVAGE_DMA_PAGE_SIZE;
-               else
-                       dev_priv->dma_pages[i].used = n;
-               n -= SAVAGE_DMA_PAGE_SIZE;
-       }
-       dev_priv->current_dma_page = --i;
-
-       DRM_DEBUG("cur=%u, cur->used=%u, n=%u\n",
-                 i, dev_priv->dma_pages[i].used, n);
-
-       savage_dma_wait(dev_priv, dev_priv->current_dma_page);
-
-       return dma_ptr;
-}
-
-static void savage_dma_flush(drm_savage_private_t * dev_priv)
-{
-       unsigned int first = dev_priv->first_dma_page;
-       unsigned int cur = dev_priv->current_dma_page;
-       uint16_t event;
-       unsigned int wrap, pad, align, len, i;
-       unsigned long phys_addr;
-       BCI_LOCALS;
-
-       if (first == cur &&
-           dev_priv->dma_pages[cur].used == dev_priv->dma_pages[cur].flushed)
-               return;
-
-       /* pad length to multiples of 2 entries
-        * align start of next DMA block to multiles of 8 entries */
-       pad = -dev_priv->dma_pages[cur].used & 1;
-       align = -(dev_priv->dma_pages[cur].used + pad) & 7;
-
-       DRM_DEBUG("first=%u, cur=%u, first->flushed=%u, cur->used=%u, "
-                 "pad=%u, align=%u\n",
-                 first, cur, dev_priv->dma_pages[first].flushed,
-                 dev_priv->dma_pages[cur].used, pad, align);
-
-       /* pad with noops */
-       if (pad) {
-               uint32_t *dma_ptr = (uint32_t *) dev_priv->cmd_dma->handle +
-                   cur * SAVAGE_DMA_PAGE_SIZE + dev_priv->dma_pages[cur].used;
-               dev_priv->dma_pages[cur].used += pad;
-               while (pad != 0) {
-                       *dma_ptr++ = BCI_CMD_WAIT;
-                       pad--;
-               }
-       }
-
-       mb();
-
-       /* do flush ... */
-       phys_addr = dev_priv->cmd_dma->offset +
-           (first * SAVAGE_DMA_PAGE_SIZE +
-            dev_priv->dma_pages[first].flushed) * 4;
-       len = (cur - first) * SAVAGE_DMA_PAGE_SIZE +
-           dev_priv->dma_pages[cur].used - dev_priv->dma_pages[first].flushed;
-
-       DRM_DEBUG("phys_addr=%lx, len=%u\n",
-                 phys_addr | dev_priv->dma_type, len);
-
-       BEGIN_BCI(3);
-       BCI_SET_REGISTERS(SAVAGE_DMABUFADDR, 1);
-       BCI_WRITE(phys_addr | dev_priv->dma_type);
-       BCI_DMA(len);
-
-       /* fix alignment of the start of the next block */
-       dev_priv->dma_pages[cur].used += align;
-
-       /* age DMA pages */
-       event = savage_bci_emit_event(dev_priv, 0);
-       wrap = dev_priv->event_wrap;
-       for (i = first; i < cur; ++i) {
-               SET_AGE(&dev_priv->dma_pages[i].age, event, wrap);
-               dev_priv->dma_pages[i].used = 0;
-               dev_priv->dma_pages[i].flushed = 0;
-       }
-       /* age the current page only when it's full */
-       if (dev_priv->dma_pages[cur].used == SAVAGE_DMA_PAGE_SIZE) {
-               SET_AGE(&dev_priv->dma_pages[cur].age, event, wrap);
-               dev_priv->dma_pages[cur].used = 0;
-               dev_priv->dma_pages[cur].flushed = 0;
-               /* advance to next page */
-               cur++;
-               if (cur == dev_priv->nr_dma_pages)
-                       cur = 0;
-               dev_priv->first_dma_page = dev_priv->current_dma_page = cur;
-       } else {
-               dev_priv->first_dma_page = cur;
-               dev_priv->dma_pages[cur].flushed = dev_priv->dma_pages[i].used;
-       }
-       SET_AGE(&dev_priv->last_dma_age, event, wrap);
-
-       DRM_DEBUG("first=cur=%u, cur->used=%u, cur->flushed=%u\n", cur,
-                 dev_priv->dma_pages[cur].used,
-                 dev_priv->dma_pages[cur].flushed);
-}
-
-static void savage_fake_dma_flush(drm_savage_private_t * dev_priv)
-{
-       unsigned int i, j;
-       BCI_LOCALS;
-
-       if (dev_priv->first_dma_page == dev_priv->current_dma_page &&
-           dev_priv->dma_pages[dev_priv->current_dma_page].used == 0)
-               return;
-
-       DRM_DEBUG("first=%u, cur=%u, cur->used=%u\n",
-                 dev_priv->first_dma_page, dev_priv->current_dma_page,
-                 dev_priv->dma_pages[dev_priv->current_dma_page].used);
-
-       for (i = dev_priv->first_dma_page;
-            i <= dev_priv->current_dma_page && dev_priv->dma_pages[i].used;
-            ++i) {
-               uint32_t *dma_ptr = (uint32_t *) dev_priv->cmd_dma->handle +
-                   i * SAVAGE_DMA_PAGE_SIZE;
-#if SAVAGE_DMA_DEBUG
-               /* Sanity check: all pages except the last one must be full. */
-               if (i < dev_priv->current_dma_page &&
-                   dev_priv->dma_pages[i].used != SAVAGE_DMA_PAGE_SIZE) {
-                       DRM_ERROR("partial DMA page %u: used=%u",
-                                 i, dev_priv->dma_pages[i].used);
-               }
-#endif
-               BEGIN_BCI(dev_priv->dma_pages[i].used);
-               for (j = 0; j < dev_priv->dma_pages[i].used; ++j) {
-                       BCI_WRITE(dma_ptr[j]);
-               }
-               dev_priv->dma_pages[i].used = 0;
-       }
-
-       /* reset to first page */
-       dev_priv->first_dma_page = dev_priv->current_dma_page = 0;
-}
-
-int savage_driver_load(struct drm_device *dev, unsigned long chipset)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       drm_savage_private_t *dev_priv;
-
-       dev_priv = kzalloc(sizeof(drm_savage_private_t), GFP_KERNEL);
-       if (dev_priv == NULL)
-               return -ENOMEM;
-
-       dev->dev_private = (void *)dev_priv;
-
-       dev_priv->chipset = (enum savage_family)chipset;
-
-       pci_set_master(pdev);
-
-       return 0;
-}
-
-
-/*
- * Initialize mappings. On Savage4 and SavageIX the alignment
- * and size of the aperture is not suitable for automatic MTRR setup
- * in drm_legacy_addmap. Therefore we add them manually before the maps are
- * initialized, and tear them down on last close.
- */
-int savage_driver_firstopen(struct drm_device *dev)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       unsigned long mmio_base, fb_base, fb_size, aperture_base;
-       int ret = 0;
-
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               fb_base = pci_resource_start(pdev, 0);
-               fb_size = SAVAGE_FB_SIZE_S3;
-               mmio_base = fb_base + SAVAGE_FB_SIZE_S3;
-               aperture_base = fb_base + SAVAGE_APERTURE_OFFSET;
-               /* this should always be true */
-               if (pci_resource_len(pdev, 0) == 0x08000000) {
-                       /* Don't make MMIO write-cobining! We need 3
-                        * MTRRs. */
-                       dev_priv->mtrr_handles[0] =
-                               arch_phys_wc_add(fb_base, 0x01000000);
-                       dev_priv->mtrr_handles[1] =
-                               arch_phys_wc_add(fb_base + 0x02000000,
-                                                0x02000000);
-                       dev_priv->mtrr_handles[2] =
-                               arch_phys_wc_add(fb_base + 0x04000000,
-                                               0x04000000);
-               } else {
-                       DRM_ERROR("strange pci_resource_len %08llx\n",
-                                 (unsigned long long)
-                                 pci_resource_len(pdev, 0));
-               }
-       } else if (dev_priv->chipset != S3_SUPERSAVAGE &&
-                  dev_priv->chipset != S3_SAVAGE2000) {
-               mmio_base = pci_resource_start(pdev, 0);
-               fb_base = pci_resource_start(pdev, 1);
-               fb_size = SAVAGE_FB_SIZE_S4;
-               aperture_base = fb_base + SAVAGE_APERTURE_OFFSET;
-               /* this should always be true */
-               if (pci_resource_len(pdev, 1) == 0x08000000) {
-                       /* Can use one MTRR to cover both fb and
-                        * aperture. */
-                       dev_priv->mtrr_handles[0] =
-                               arch_phys_wc_add(fb_base,
-                                                0x08000000);
-               } else {
-                       DRM_ERROR("strange pci_resource_len %08llx\n",
-                                 (unsigned long long)
-                                 pci_resource_len(pdev, 1));
-               }
-       } else {
-               mmio_base = pci_resource_start(pdev, 0);
-               fb_base = pci_resource_start(pdev, 1);
-               fb_size = pci_resource_len(pdev, 1);
-               aperture_base = pci_resource_start(pdev, 2);
-               /* Automatic MTRR setup will do the right thing. */
-       }
-
-       ret = drm_legacy_addmap(dev, mmio_base, SAVAGE_MMIO_SIZE,
-                               _DRM_REGISTERS, _DRM_READ_ONLY,
-                               &dev_priv->mmio);
-       if (ret)
-               return ret;
-
-       ret = drm_legacy_addmap(dev, fb_base, fb_size, _DRM_FRAME_BUFFER,
-                               _DRM_WRITE_COMBINING, &dev_priv->fb);
-       if (ret)
-               return ret;
-
-       ret = drm_legacy_addmap(dev, aperture_base, SAVAGE_APERTURE_SIZE,
-                               _DRM_FRAME_BUFFER, _DRM_WRITE_COMBINING,
-                               &dev_priv->aperture);
-       return ret;
-}
-
-/*
- * Delete MTRRs and free device-private data.
- */
-void savage_driver_lastclose(struct drm_device *dev)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       int i;
-
-       for (i = 0; i < 3; ++i) {
-               arch_phys_wc_del(dev_priv->mtrr_handles[i]);
-               dev_priv->mtrr_handles[i] = 0;
-       }
-}
-
-void savage_driver_unload(struct drm_device *dev)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-
-       kfree(dev_priv);
-}
-
-static int savage_do_init_bci(struct drm_device * dev, drm_savage_init_t * init)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-
-       if (init->fb_bpp != 16 && init->fb_bpp != 32) {
-               DRM_ERROR("invalid frame buffer bpp %d!\n", init->fb_bpp);
-               return -EINVAL;
-       }
-       if (init->depth_bpp != 16 && init->depth_bpp != 32) {
-               DRM_ERROR("invalid depth buffer bpp %d!\n", init->fb_bpp);
-               return -EINVAL;
-       }
-       if (init->dma_type != SAVAGE_DMA_AGP &&
-           init->dma_type != SAVAGE_DMA_PCI) {
-               DRM_ERROR("invalid dma memory type %d!\n", init->dma_type);
-               return -EINVAL;
-       }
-
-       dev_priv->cob_size = init->cob_size;
-       dev_priv->bci_threshold_lo = init->bci_threshold_lo;
-       dev_priv->bci_threshold_hi = init->bci_threshold_hi;
-       dev_priv->dma_type = init->dma_type;
-
-       dev_priv->fb_bpp = init->fb_bpp;
-       dev_priv->front_offset = init->front_offset;
-       dev_priv->front_pitch = init->front_pitch;
-       dev_priv->back_offset = init->back_offset;
-       dev_priv->back_pitch = init->back_pitch;
-       dev_priv->depth_bpp = init->depth_bpp;
-       dev_priv->depth_offset = init->depth_offset;
-       dev_priv->depth_pitch = init->depth_pitch;
-
-       dev_priv->texture_offset = init->texture_offset;
-       dev_priv->texture_size = init->texture_size;
-
-       dev_priv->sarea = drm_legacy_getsarea(dev);
-       if (!dev_priv->sarea) {
-               DRM_ERROR("could not find sarea!\n");
-               savage_do_cleanup_bci(dev);
-               return -EINVAL;
-       }
-       if (init->status_offset != 0) {
-               dev_priv->status = drm_legacy_findmap(dev, init->status_offset);
-               if (!dev_priv->status) {
-                       DRM_ERROR("could not find shadow status region!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-       } else {
-               dev_priv->status = NULL;
-       }
-       if (dev_priv->dma_type == SAVAGE_DMA_AGP && init->buffers_offset) {
-               dev->agp_buffer_token = init->buffers_offset;
-               dev->agp_buffer_map = drm_legacy_findmap(dev,
-                                                      init->buffers_offset);
-               if (!dev->agp_buffer_map) {
-                       DRM_ERROR("could not find DMA buffer region!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-               drm_legacy_ioremap(dev->agp_buffer_map, dev);
-               if (!dev->agp_buffer_map->handle) {
-                       DRM_ERROR("failed to ioremap DMA buffer region!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -ENOMEM;
-               }
-       }
-       if (init->agp_textures_offset) {
-               dev_priv->agp_textures =
-                   drm_legacy_findmap(dev, init->agp_textures_offset);
-               if (!dev_priv->agp_textures) {
-                       DRM_ERROR("could not find agp texture region!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-       } else {
-               dev_priv->agp_textures = NULL;
-       }
-
-       if (init->cmd_dma_offset) {
-               if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-                       DRM_ERROR("command DMA not supported on "
-                                 "Savage3D/MX/IX.\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-               if (dev->dma && dev->dma->buflist) {
-                       DRM_ERROR("command and vertex DMA not supported "
-                                 "at the same time.\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-               dev_priv->cmd_dma = drm_legacy_findmap(dev, init->cmd_dma_offset);
-               if (!dev_priv->cmd_dma) {
-                       DRM_ERROR("could not find command DMA region!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-               if (dev_priv->dma_type == SAVAGE_DMA_AGP) {
-                       if (dev_priv->cmd_dma->type != _DRM_AGP) {
-                               DRM_ERROR("AGP command DMA region is not a "
-                                         "_DRM_AGP map!\n");
-                               savage_do_cleanup_bci(dev);
-                               return -EINVAL;
-                       }
-                       drm_legacy_ioremap(dev_priv->cmd_dma, dev);
-                       if (!dev_priv->cmd_dma->handle) {
-                               DRM_ERROR("failed to ioremap command "
-                                         "DMA region!\n");
-                               savage_do_cleanup_bci(dev);
-                               return -ENOMEM;
-                       }
-               } else if (dev_priv->cmd_dma->type != _DRM_CONSISTENT) {
-                       DRM_ERROR("PCI command DMA region is not a "
-                                 "_DRM_CONSISTENT map!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -EINVAL;
-               }
-       } else {
-               dev_priv->cmd_dma = NULL;
-       }
-
-       dev_priv->dma_flush = savage_dma_flush;
-       if (!dev_priv->cmd_dma) {
-               DRM_DEBUG("falling back to faked command DMA.\n");
-               dev_priv->fake_dma.offset = 0;
-               dev_priv->fake_dma.size = SAVAGE_FAKE_DMA_SIZE;
-               dev_priv->fake_dma.type = _DRM_SHM;
-               dev_priv->fake_dma.handle = kmalloc(SAVAGE_FAKE_DMA_SIZE,
-                                                   GFP_KERNEL);
-               if (!dev_priv->fake_dma.handle) {
-                       DRM_ERROR("could not allocate faked DMA buffer!\n");
-                       savage_do_cleanup_bci(dev);
-                       return -ENOMEM;
-               }
-               dev_priv->cmd_dma = &dev_priv->fake_dma;
-               dev_priv->dma_flush = savage_fake_dma_flush;
-       }
-
-       dev_priv->sarea_priv =
-           (drm_savage_sarea_t *) ((uint8_t *) dev_priv->sarea->handle +
-                                   init->sarea_priv_offset);
-
-       /* setup bitmap descriptors */
-       {
-               unsigned int color_tile_format;
-               unsigned int depth_tile_format;
-               unsigned int front_stride, back_stride, depth_stride;
-               if (dev_priv->chipset <= S3_SAVAGE4) {
-                       color_tile_format = dev_priv->fb_bpp == 16 ?
-                           SAVAGE_BD_TILE_16BPP : SAVAGE_BD_TILE_32BPP;
-                       depth_tile_format = dev_priv->depth_bpp == 16 ?
-                           SAVAGE_BD_TILE_16BPP : SAVAGE_BD_TILE_32BPP;
-               } else {
-                       color_tile_format = SAVAGE_BD_TILE_DEST;
-                       depth_tile_format = SAVAGE_BD_TILE_DEST;
-               }
-               front_stride = dev_priv->front_pitch / (dev_priv->fb_bpp / 8);
-               back_stride = dev_priv->back_pitch / (dev_priv->fb_bpp / 8);
-               depth_stride =
-                   dev_priv->depth_pitch / (dev_priv->depth_bpp / 8);
-
-               dev_priv->front_bd = front_stride | SAVAGE_BD_BW_DISABLE |
-                   (dev_priv->fb_bpp << SAVAGE_BD_BPP_SHIFT) |
-                   (color_tile_format << SAVAGE_BD_TILE_SHIFT);
-
-               dev_priv->back_bd = back_stride | SAVAGE_BD_BW_DISABLE |
-                   (dev_priv->fb_bpp << SAVAGE_BD_BPP_SHIFT) |
-                   (color_tile_format << SAVAGE_BD_TILE_SHIFT);
-
-               dev_priv->depth_bd = depth_stride | SAVAGE_BD_BW_DISABLE |
-                   (dev_priv->depth_bpp << SAVAGE_BD_BPP_SHIFT) |
-                   (depth_tile_format << SAVAGE_BD_TILE_SHIFT);
-       }
-
-       /* setup status and bci ptr */
-       dev_priv->event_counter = 0;
-       dev_priv->event_wrap = 0;
-       dev_priv->bci_ptr = (volatile uint32_t *)
-           ((uint8_t *) dev_priv->mmio->handle + SAVAGE_BCI_OFFSET);
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               dev_priv->status_used_mask = SAVAGE_FIFO_USED_MASK_S3D;
-       } else {
-               dev_priv->status_used_mask = SAVAGE_FIFO_USED_MASK_S4;
-       }
-       if (dev_priv->status != NULL) {
-               dev_priv->status_ptr =
-                   (volatile uint32_t *)dev_priv->status->handle;
-               dev_priv->wait_fifo = savage_bci_wait_fifo_shadow;
-               dev_priv->wait_evnt = savage_bci_wait_event_shadow;
-               dev_priv->status_ptr[1023] = dev_priv->event_counter;
-       } else {
-               dev_priv->status_ptr = NULL;
-               if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-                       dev_priv->wait_fifo = savage_bci_wait_fifo_s3d;
-               } else {
-                       dev_priv->wait_fifo = savage_bci_wait_fifo_s4;
-               }
-               dev_priv->wait_evnt = savage_bci_wait_event_reg;
-       }
-
-       /* cliprect functions */
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset))
-               dev_priv->emit_clip_rect = savage_emit_clip_rect_s3d;
-       else
-               dev_priv->emit_clip_rect = savage_emit_clip_rect_s4;
-
-       if (savage_freelist_init(dev) < 0) {
-               DRM_ERROR("could not initialize freelist\n");
-               savage_do_cleanup_bci(dev);
-               return -ENOMEM;
-       }
-
-       if (savage_dma_init(dev_priv) < 0) {
-               DRM_ERROR("could not initialize command DMA\n");
-               savage_do_cleanup_bci(dev);
-               return -ENOMEM;
-       }
-
-       return 0;
-}
-
-static int savage_do_cleanup_bci(struct drm_device * dev)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-
-       if (dev_priv->cmd_dma == &dev_priv->fake_dma) {
-               kfree(dev_priv->fake_dma.handle);
-       } else if (dev_priv->cmd_dma && dev_priv->cmd_dma->handle &&
-                  dev_priv->cmd_dma->type == _DRM_AGP &&
-                  dev_priv->dma_type == SAVAGE_DMA_AGP)
-               drm_legacy_ioremapfree(dev_priv->cmd_dma, dev);
-
-       if (dev_priv->dma_type == SAVAGE_DMA_AGP &&
-           dev->agp_buffer_map && dev->agp_buffer_map->handle) {
-               drm_legacy_ioremapfree(dev->agp_buffer_map, dev);
-               /* make sure the next instance (which may be running
-                * in PCI mode) doesn't try to use an old
-                * agp_buffer_map. */
-               dev->agp_buffer_map = NULL;
-       }
-
-       kfree(dev_priv->dma_pages);
-
-       return 0;
-}
-
-static int savage_bci_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_savage_init_t *init = data;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       switch (init->func) {
-       case SAVAGE_INIT_BCI:
-               return savage_do_init_bci(dev, init);
-       case SAVAGE_CLEANUP_BCI:
-               return savage_do_cleanup_bci(dev);
-       }
-
-       return -EINVAL;
-}
-
-static int savage_bci_event_emit(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       drm_savage_event_emit_t *event = data;
-
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       event->count = savage_bci_emit_event(dev_priv, event->flags);
-       event->count |= dev_priv->event_wrap << 16;
-
-       return 0;
-}
-
-static int savage_bci_event_wait(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       drm_savage_event_wait_t *event = data;
-       unsigned int event_e, hw_e;
-       unsigned int event_w, hw_w;
-
-       DRM_DEBUG("\n");
-
-       UPDATE_EVENT_COUNTER();
-       if (dev_priv->status_ptr)
-               hw_e = dev_priv->status_ptr[1] & 0xffff;
-       else
-               hw_e = SAVAGE_READ(SAVAGE_STATUS_WORD1) & 0xffff;
-       hw_w = dev_priv->event_wrap;
-       if (hw_e > dev_priv->event_counter)
-               hw_w--;         /* hardware hasn't passed the last wrap yet */
-
-       event_e = event->count & 0xffff;
-       event_w = event->count >> 16;
-
-       /* Don't need to wait if
-        * - event counter wrapped since the event was emitted or
-        * - the hardware has advanced up to or over the event to wait for.
-        */
-       if (event_w < hw_w || (event_w == hw_w && event_e <= hw_e))
-               return 0;
-       else
-               return dev_priv->wait_evnt(dev_priv, event_e);
-}
-
-/*
- * DMA buffer management
- */
-
-static int savage_bci_get_buffers(struct drm_device *dev,
-                                 struct drm_file *file_priv,
-                                 struct drm_dma *d)
-{
-       struct drm_buf *buf;
-       int i;
-
-       for (i = d->granted_count; i < d->request_count; i++) {
-               buf = savage_freelist_get(dev);
-               if (!buf)
-                       return -EAGAIN;
-
-               buf->file_priv = file_priv;
-
-               if (copy_to_user(&d->request_indices[i],
-                                    &buf->idx, sizeof(buf->idx)))
-                       return -EFAULT;
-               if (copy_to_user(&d->request_sizes[i],
-                                    &buf->total, sizeof(buf->total)))
-                       return -EFAULT;
-
-               d->granted_count++;
-       }
-       return 0;
-}
-
-int savage_bci_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_dma *d = data;
-       int ret = 0;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       /* Please don't send us buffers.
-        */
-       if (d->send_count != 0) {
-               DRM_ERROR("Process %d trying to send %d buffers via drmDMA\n",
-                         task_pid_nr(current), d->send_count);
-               return -EINVAL;
-       }
-
-       /* We'll send you buffers.
-        */
-       if (d->request_count < 0 || d->request_count > dma->buf_count) {
-               DRM_ERROR("Process %d trying to get %d buffers (of %d max)\n",
-                         task_pid_nr(current), d->request_count, dma->buf_count);
-               return -EINVAL;
-       }
-
-       d->granted_count = 0;
-
-       if (d->request_count) {
-               ret = savage_bci_get_buffers(dev, file_priv, d);
-       }
-
-       return ret;
-}
-
-void savage_reclaim_buffers(struct drm_device *dev, struct drm_file *file_priv)
-{
-       struct drm_device_dma *dma = dev->dma;
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       int release_idlelock = 0;
-       int i;
-
-       if (!dma)
-               return;
-       if (!dev_priv)
-               return;
-       if (!dma->buflist)
-               return;
-
-       if (file_priv->master && file_priv->master->lock.hw_lock) {
-               drm_legacy_idlelock_take(&file_priv->master->lock);
-               release_idlelock = 1;
-       }
-
-       for (i = 0; i < dma->buf_count; i++) {
-               struct drm_buf *buf = dma->buflist[i];
-               drm_savage_buf_priv_t *buf_priv = buf->dev_private;
-
-               if (buf->file_priv == file_priv && buf_priv &&
-                   buf_priv->next == NULL && buf_priv->prev == NULL) {
-                       uint16_t event;
-                       DRM_DEBUG("reclaimed from client\n");
-                       event = savage_bci_emit_event(dev_priv, SAVAGE_WAIT_3D);
-                       SET_AGE(&buf_priv->age, event, dev_priv->event_wrap);
-                       savage_freelist_put(dev, buf);
-               }
-       }
-
-       if (release_idlelock)
-               drm_legacy_idlelock_release(&file_priv->master->lock);
-}
-
-const struct drm_ioctl_desc savage_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(SAVAGE_BCI_INIT, savage_bci_init, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(SAVAGE_BCI_CMDBUF, savage_bci_cmdbuf, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(SAVAGE_BCI_EVENT_EMIT, savage_bci_event_emit, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(SAVAGE_BCI_EVENT_WAIT, savage_bci_event_wait, DRM_AUTH),
-};
-
-int savage_max_ioctl = ARRAY_SIZE(savage_ioctls);
diff --git a/drivers/gpu/drm/savage/savage_drv.c b/drivers/gpu/drm/savage/savage_drv.c
deleted file mode 100644 (file)
index 799bd11..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/* savage_drv.c -- Savage driver for Linux
- *
- * Copyright 2004  Felix Kuehling
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <linux/module.h>
-#include <linux/pci.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_pciids.h>
-
-#include "savage_drv.h"
-
-static struct pci_device_id pciidlist[] = {
-       savage_PCI_IDS
-};
-
-static const struct file_operations savage_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-       .compat_ioctl = drm_compat_ioctl,
-       .llseek = noop_llseek,
-};
-
-static struct drm_driver driver = {
-       .driver_features =
-           DRIVER_USE_AGP | DRIVER_HAVE_DMA | DRIVER_PCI_DMA | DRIVER_LEGACY,
-       .dev_priv_size = sizeof(drm_savage_buf_priv_t),
-       .load = savage_driver_load,
-       .firstopen = savage_driver_firstopen,
-       .preclose = savage_reclaim_buffers,
-       .lastclose = savage_driver_lastclose,
-       .unload = savage_driver_unload,
-       .ioctls = savage_ioctls,
-       .dma_ioctl = savage_bci_buffers,
-       .fops = &savage_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-static struct pci_driver savage_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init savage_init(void)
-{
-       driver.num_ioctls = savage_max_ioctl;
-       return drm_legacy_pci_init(&driver, &savage_pci_driver);
-}
-
-static void __exit savage_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &savage_pci_driver);
-}
-
-module_init(savage_init);
-module_exit(savage_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/savage/savage_drv.h b/drivers/gpu/drm/savage/savage_drv.h
deleted file mode 100644 (file)
index b0081bb..0000000
+++ /dev/null
@@ -1,580 +0,0 @@
-/* savage_drv.h -- Private header for the savage driver */
-/*
- * Copyright 2004  Felix Kuehling
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __SAVAGE_DRV_H__
-#define __SAVAGE_DRV_H__
-
-#include <linux/io.h>
-
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/savage_drm.h>
-
-#define DRIVER_AUTHOR  "Felix Kuehling"
-
-#define DRIVER_NAME    "savage"
-#define DRIVER_DESC    "Savage3D/MX/IX, Savage4, SuperSavage, Twister, ProSavage[DDR]"
-#define DRIVER_DATE    "20050313"
-
-#define DRIVER_MAJOR           2
-#define DRIVER_MINOR           4
-#define DRIVER_PATCHLEVEL      1
-/* Interface history:
- *
- * 1.x   The DRM driver from the VIA/S3 code drop, basically a dummy
- * 2.0   The first real DRM
- * 2.1   Scissors registers managed by the DRM, 3D operations clipped by
- *       cliprects of the cmdbuf ioctl
- * 2.2   Implemented SAVAGE_CMD_DMA_IDX and SAVAGE_CMD_VB_IDX
- * 2.3   Event counters used by BCI_EVENT_EMIT/WAIT ioctls are now 32 bits
- *       wide and thus very long lived (unlikely to ever wrap). The size
- *       in the struct was 32 bits before, but only 16 bits were used
- * 2.4   Implemented command DMA. Now drm_savage_init_t.cmd_dma_offset is
- *       actually used
- */
-
-typedef struct drm_savage_age {
-       uint16_t event;
-       unsigned int wrap;
-} drm_savage_age_t;
-
-typedef struct drm_savage_buf_priv {
-       struct drm_savage_buf_priv *next;
-       struct drm_savage_buf_priv *prev;
-       drm_savage_age_t age;
-       struct drm_buf *buf;
-} drm_savage_buf_priv_t;
-
-typedef struct drm_savage_dma_page {
-       drm_savage_age_t age;
-       unsigned int used, flushed;
-} drm_savage_dma_page_t;
-#define SAVAGE_DMA_PAGE_SIZE 1024      /* in dwords */
-/* Fake DMA buffer size in bytes. 4 pages. Allows a maximum command
- * size of 16kbytes or 4k entries. Minimum requirement would be
- * 10kbytes for 255 40-byte vertices in one drawing command. */
-#define SAVAGE_FAKE_DMA_SIZE (SAVAGE_DMA_PAGE_SIZE*4*4)
-
-/* interesting bits of hardware state that are saved in dev_priv */
-typedef union {
-       struct drm_savage_common_state {
-               uint32_t vbaddr;
-       } common;
-       struct {
-               unsigned char pad[sizeof(struct drm_savage_common_state)];
-               uint32_t texctrl, texaddr;
-               uint32_t scstart, new_scstart;
-               uint32_t scend, new_scend;
-       } s3d;
-       struct {
-               unsigned char pad[sizeof(struct drm_savage_common_state)];
-               uint32_t texdescr, texaddr0, texaddr1;
-               uint32_t drawctrl0, new_drawctrl0;
-               uint32_t drawctrl1, new_drawctrl1;
-       } s4;
-} drm_savage_state_t;
-
-/* these chip tags should match the ones in the 2D driver in savage_regs.h. */
-enum savage_family {
-       S3_UNKNOWN = 0,
-       S3_SAVAGE3D,
-       S3_SAVAGE_MX,
-       S3_SAVAGE4,
-       S3_PROSAVAGE,
-       S3_TWISTER,
-       S3_PROSAVAGEDDR,
-       S3_SUPERSAVAGE,
-       S3_SAVAGE2000,
-       S3_LAST
-};
-
-extern const struct drm_ioctl_desc savage_ioctls[];
-extern int savage_max_ioctl;
-
-#define S3_SAVAGE3D_SERIES(chip)  ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE_MX))
-
-#define S3_SAVAGE4_SERIES(chip)  ((chip==S3_SAVAGE4)            \
-                                  || (chip==S3_PROSAVAGE)       \
-                                  || (chip==S3_TWISTER)         \
-                                  || (chip==S3_PROSAVAGEDDR))
-
-#define        S3_SAVAGE_MOBILE_SERIES(chip)   ((chip==S3_SAVAGE_MX) || (chip==S3_SUPERSAVAGE))
-
-#define S3_SAVAGE_SERIES(chip)    ((chip>=S3_SAVAGE3D) && (chip<=S3_SAVAGE2000))
-
-#define S3_MOBILE_TWISTER_SERIES(chip)   ((chip==S3_TWISTER)    \
-                                          ||(chip==S3_PROSAVAGEDDR))
-
-/* flags */
-#define SAVAGE_IS_AGP 1
-
-typedef struct drm_savage_private {
-       drm_savage_sarea_t *sarea_priv;
-
-       drm_savage_buf_priv_t head, tail;
-
-       /* who am I? */
-       enum savage_family chipset;
-
-       unsigned int cob_size;
-       unsigned int bci_threshold_lo, bci_threshold_hi;
-       unsigned int dma_type;
-
-       /* frame buffer layout */
-       unsigned int fb_bpp;
-       unsigned int front_offset, front_pitch;
-       unsigned int back_offset, back_pitch;
-       unsigned int depth_bpp;
-       unsigned int depth_offset, depth_pitch;
-
-       /* bitmap descriptors for swap and clear */
-       unsigned int front_bd, back_bd, depth_bd;
-
-       /* local textures */
-       unsigned int texture_offset;
-       unsigned int texture_size;
-
-       /* memory regions in physical memory */
-       drm_local_map_t *sarea;
-       drm_local_map_t *mmio;
-       drm_local_map_t *fb;
-       drm_local_map_t *aperture;
-       drm_local_map_t *status;
-       drm_local_map_t *agp_textures;
-       drm_local_map_t *cmd_dma;
-       drm_local_map_t fake_dma;
-
-       int mtrr_handles[3];
-
-       /* BCI and status-related stuff */
-       volatile uint32_t *status_ptr, *bci_ptr;
-       uint32_t status_used_mask;
-       uint16_t event_counter;
-       unsigned int event_wrap;
-
-       /* Savage4 command DMA */
-       drm_savage_dma_page_t *dma_pages;
-       unsigned int nr_dma_pages, first_dma_page, current_dma_page;
-       drm_savage_age_t last_dma_age;
-
-       /* saved hw state for global/local check on S3D */
-       uint32_t hw_draw_ctrl, hw_zbuf_ctrl;
-       /* and for scissors (global, so don't emit if not changed) */
-       uint32_t hw_scissors_start, hw_scissors_end;
-
-       drm_savage_state_t state;
-
-       /* after emitting a wait cmd Savage3D needs 63 nops before next DMA */
-       unsigned int waiting;
-
-       /* config/hardware-dependent function pointers */
-       int (*wait_fifo) (struct drm_savage_private * dev_priv, unsigned int n);
-       int (*wait_evnt) (struct drm_savage_private * dev_priv, uint16_t e);
-       /* Err, there is a macro wait_event in include/linux/wait.h.
-        * Avoid unwanted macro expansion. */
-       void (*emit_clip_rect) (struct drm_savage_private * dev_priv,
-                               const struct drm_clip_rect * pbox);
-       void (*dma_flush) (struct drm_savage_private * dev_priv);
-} drm_savage_private_t;
-
-/* ioctls */
-extern int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_priv);
-extern int savage_bci_buffers(struct drm_device *dev, void *data, struct drm_file *file_priv);
-
-/* BCI functions */
-extern uint16_t savage_bci_emit_event(drm_savage_private_t * dev_priv,
-                                     unsigned int flags);
-extern void savage_freelist_put(struct drm_device * dev, struct drm_buf * buf);
-extern void savage_dma_reset(drm_savage_private_t * dev_priv);
-extern void savage_dma_wait(drm_savage_private_t * dev_priv, unsigned int page);
-extern uint32_t *savage_dma_alloc(drm_savage_private_t * dev_priv,
-                                 unsigned int n);
-extern int savage_driver_load(struct drm_device *dev, unsigned long chipset);
-extern int savage_driver_firstopen(struct drm_device *dev);
-extern void savage_driver_lastclose(struct drm_device *dev);
-extern void savage_driver_unload(struct drm_device *dev);
-extern void savage_reclaim_buffers(struct drm_device *dev,
-                                  struct drm_file *file_priv);
-
-/* state functions */
-extern void savage_emit_clip_rect_s3d(drm_savage_private_t * dev_priv,
-                                     const struct drm_clip_rect * pbox);
-extern void savage_emit_clip_rect_s4(drm_savage_private_t * dev_priv,
-                                    const struct drm_clip_rect * pbox);
-
-#define SAVAGE_FB_SIZE_S3      0x01000000      /*  16MB */
-#define SAVAGE_FB_SIZE_S4      0x02000000      /*  32MB */
-#define SAVAGE_MMIO_SIZE        0x00080000     /* 512kB */
-#define SAVAGE_APERTURE_OFFSET  0x02000000     /*  32MB */
-#define SAVAGE_APERTURE_SIZE    0x05000000     /* 5 tiled surfaces, 16MB each */
-
-#define SAVAGE_BCI_OFFSET       0x00010000     /* offset of the BCI region
-                                                * inside the MMIO region */
-#define SAVAGE_BCI_FIFO_SIZE   32      /* number of entries in on-chip
-                                        * BCI FIFO */
-
-/*
- * MMIO registers
- */
-#define SAVAGE_STATUS_WORD0            0x48C00
-#define SAVAGE_STATUS_WORD1            0x48C04
-#define SAVAGE_ALT_STATUS_WORD0        0x48C60
-
-#define SAVAGE_FIFO_USED_MASK_S3D      0x0001ffff
-#define SAVAGE_FIFO_USED_MASK_S4       0x001fffff
-
-/* Copied from savage_bci.h in the 2D driver with some renaming. */
-
-/* Bitmap descriptors */
-#define SAVAGE_BD_STRIDE_SHIFT 0
-#define SAVAGE_BD_BPP_SHIFT   16
-#define SAVAGE_BD_TILE_SHIFT  24
-#define SAVAGE_BD_BW_DISABLE  (1<<28)
-/* common: */
-#define        SAVAGE_BD_TILE_LINEAR           0
-/* savage4, MX, IX, 3D */
-#define        SAVAGE_BD_TILE_16BPP            2
-#define        SAVAGE_BD_TILE_32BPP            3
-/* twister, prosavage, DDR, supersavage, 2000 */
-#define        SAVAGE_BD_TILE_DEST             1
-#define        SAVAGE_BD_TILE_TEXTURE          2
-/* GBD - BCI enable */
-/* savage4, MX, IX, 3D */
-#define SAVAGE_GBD_BCI_ENABLE                    8
-/* twister, prosavage, DDR, supersavage, 2000 */
-#define SAVAGE_GBD_BCI_ENABLE_TWISTER            0
-
-#define SAVAGE_GBD_BIG_ENDIAN                    4
-#define SAVAGE_GBD_LITTLE_ENDIAN                 0
-#define SAVAGE_GBD_64                            1
-
-/*  Global Bitmap Descriptor */
-#define SAVAGE_BCI_GLB_BD_LOW             0x8168
-#define SAVAGE_BCI_GLB_BD_HIGH            0x816C
-
-/*
- * BCI registers
- */
-/* Savage4/Twister/ProSavage 3D registers */
-#define SAVAGE_DRAWLOCALCTRL_S4                0x1e
-#define SAVAGE_TEXPALADDR_S4           0x1f
-#define SAVAGE_TEXCTRL0_S4             0x20
-#define SAVAGE_TEXCTRL1_S4             0x21
-#define SAVAGE_TEXADDR0_S4             0x22
-#define SAVAGE_TEXADDR1_S4             0x23
-#define SAVAGE_TEXBLEND0_S4            0x24
-#define SAVAGE_TEXBLEND1_S4            0x25
-#define SAVAGE_TEXXPRCLR_S4            0x26    /* never used */
-#define SAVAGE_TEXDESCR_S4             0x27
-#define SAVAGE_FOGTABLE_S4             0x28
-#define SAVAGE_FOGCTRL_S4              0x30
-#define SAVAGE_STENCILCTRL_S4          0x31
-#define SAVAGE_ZBUFCTRL_S4             0x32
-#define SAVAGE_ZBUFOFF_S4              0x33
-#define SAVAGE_DESTCTRL_S4             0x34
-#define SAVAGE_DRAWCTRL0_S4            0x35
-#define SAVAGE_DRAWCTRL1_S4            0x36
-#define SAVAGE_ZWATERMARK_S4           0x37
-#define SAVAGE_DESTTEXRWWATERMARK_S4   0x38
-#define SAVAGE_TEXBLENDCOLOR_S4                0x39
-/* Savage3D/MX/IX 3D registers */
-#define SAVAGE_TEXPALADDR_S3D          0x18
-#define SAVAGE_TEXXPRCLR_S3D           0x19    /* never used */
-#define SAVAGE_TEXADDR_S3D             0x1A
-#define SAVAGE_TEXDESCR_S3D            0x1B
-#define SAVAGE_TEXCTRL_S3D             0x1C
-#define SAVAGE_FOGTABLE_S3D            0x20
-#define SAVAGE_FOGCTRL_S3D             0x30
-#define SAVAGE_DRAWCTRL_S3D            0x31
-#define SAVAGE_ZBUFCTRL_S3D            0x32
-#define SAVAGE_ZBUFOFF_S3D             0x33
-#define SAVAGE_DESTCTRL_S3D            0x34
-#define SAVAGE_SCSTART_S3D             0x35
-#define SAVAGE_SCEND_S3D               0x36
-#define SAVAGE_ZWATERMARK_S3D          0x37
-#define SAVAGE_DESTTEXRWWATERMARK_S3D  0x38
-/* common stuff */
-#define SAVAGE_VERTBUFADDR             0x3e
-#define SAVAGE_BITPLANEWTMASK          0xd7
-#define SAVAGE_DMABUFADDR              0x51
-
-/* texture enable bits (needed for tex addr checking) */
-#define SAVAGE_TEXCTRL_TEXEN_MASK      0x00010000      /* S3D */
-#define SAVAGE_TEXDESCR_TEX0EN_MASK    0x02000000      /* S4 */
-#define SAVAGE_TEXDESCR_TEX1EN_MASK    0x04000000      /* S4 */
-
-/* Global fields in Savage4/Twister/ProSavage 3D registers:
- *
- * All texture registers and DrawLocalCtrl are local. All other
- * registers are global. */
-
-/* Global fields in Savage3D/MX/IX 3D registers:
- *
- * All texture registers are local. DrawCtrl and ZBufCtrl are
- * partially local. All other registers are global.
- *
- * DrawCtrl global fields: cullMode, alphaTestCmpFunc, alphaTestEn, alphaRefVal
- * ZBufCtrl global fields: zCmpFunc, zBufEn
- */
-#define SAVAGE_DRAWCTRL_S3D_GLOBAL     0x03f3c00c
-#define SAVAGE_ZBUFCTRL_S3D_GLOBAL     0x00000027
-
-/* Masks for scissor bits (drawCtrl[01] on s4, scissorStart/End on s3d)
- */
-#define SAVAGE_SCISSOR_MASK_S4         0x00fff7ff
-#define SAVAGE_SCISSOR_MASK_S3D                0x07ff07ff
-
-/*
- * BCI commands
- */
-#define BCI_CMD_NOP                  0x40000000
-#define BCI_CMD_RECT                 0x48000000
-#define BCI_CMD_RECT_XP              0x01000000
-#define BCI_CMD_RECT_YP              0x02000000
-#define BCI_CMD_SCANLINE             0x50000000
-#define BCI_CMD_LINE                 0x5C000000
-#define BCI_CMD_LINE_LAST_PIXEL      0x58000000
-#define BCI_CMD_BYTE_TEXT            0x63000000
-#define BCI_CMD_NT_BYTE_TEXT         0x67000000
-#define BCI_CMD_BIT_TEXT             0x6C000000
-#define BCI_CMD_GET_ROP(cmd)         (((cmd) >> 16) & 0xFF)
-#define BCI_CMD_SET_ROP(cmd, rop)    ((cmd) |= ((rop & 0xFF) << 16))
-#define BCI_CMD_SEND_COLOR           0x00008000
-
-#define BCI_CMD_CLIP_NONE            0x00000000
-#define BCI_CMD_CLIP_CURRENT         0x00002000
-#define BCI_CMD_CLIP_LR              0x00004000
-#define BCI_CMD_CLIP_NEW             0x00006000
-
-#define BCI_CMD_DEST_GBD             0x00000000
-#define BCI_CMD_DEST_PBD             0x00000800
-#define BCI_CMD_DEST_PBD_NEW         0x00000C00
-#define BCI_CMD_DEST_SBD             0x00001000
-#define BCI_CMD_DEST_SBD_NEW         0x00001400
-
-#define BCI_CMD_SRC_TRANSPARENT      0x00000200
-#define BCI_CMD_SRC_SOLID            0x00000000
-#define BCI_CMD_SRC_GBD              0x00000020
-#define BCI_CMD_SRC_COLOR            0x00000040
-#define BCI_CMD_SRC_MONO             0x00000060
-#define BCI_CMD_SRC_PBD_COLOR        0x00000080
-#define BCI_CMD_SRC_PBD_MONO         0x000000A0
-#define BCI_CMD_SRC_PBD_COLOR_NEW    0x000000C0
-#define BCI_CMD_SRC_PBD_MONO_NEW     0x000000E0
-#define BCI_CMD_SRC_SBD_COLOR        0x00000100
-#define BCI_CMD_SRC_SBD_MONO         0x00000120
-#define BCI_CMD_SRC_SBD_COLOR_NEW    0x00000140
-#define BCI_CMD_SRC_SBD_MONO_NEW     0x00000160
-
-#define BCI_CMD_PAT_TRANSPARENT      0x00000010
-#define BCI_CMD_PAT_NONE             0x00000000
-#define BCI_CMD_PAT_COLOR            0x00000002
-#define BCI_CMD_PAT_MONO             0x00000003
-#define BCI_CMD_PAT_PBD_COLOR        0x00000004
-#define BCI_CMD_PAT_PBD_MONO         0x00000005
-#define BCI_CMD_PAT_PBD_COLOR_NEW    0x00000006
-#define BCI_CMD_PAT_PBD_MONO_NEW     0x00000007
-#define BCI_CMD_PAT_SBD_COLOR        0x00000008
-#define BCI_CMD_PAT_SBD_MONO         0x00000009
-#define BCI_CMD_PAT_SBD_COLOR_NEW    0x0000000A
-#define BCI_CMD_PAT_SBD_MONO_NEW     0x0000000B
-
-#define BCI_BD_BW_DISABLE            0x10000000
-#define BCI_BD_TILE_MASK             0x03000000
-#define BCI_BD_TILE_NONE             0x00000000
-#define BCI_BD_TILE_16               0x02000000
-#define BCI_BD_TILE_32               0x03000000
-#define BCI_BD_GET_BPP(bd)           (((bd) >> 16) & 0xFF)
-#define BCI_BD_SET_BPP(bd, bpp)      ((bd) |= (((bpp) & 0xFF) << 16))
-#define BCI_BD_GET_STRIDE(bd)        ((bd) & 0xFFFF)
-#define BCI_BD_SET_STRIDE(bd, st)    ((bd) |= ((st) & 0xFFFF))
-
-#define BCI_CMD_SET_REGISTER            0x96000000
-
-#define BCI_CMD_WAIT                    0xC0000000
-#define BCI_CMD_WAIT_3D                 0x00010000
-#define BCI_CMD_WAIT_2D                 0x00020000
-
-#define BCI_CMD_UPDATE_EVENT_TAG        0x98000000
-
-#define BCI_CMD_DRAW_PRIM               0x80000000
-#define BCI_CMD_DRAW_INDEXED_PRIM       0x88000000
-#define BCI_CMD_DRAW_CONT               0x01000000
-#define BCI_CMD_DRAW_TRILIST            0x00000000
-#define BCI_CMD_DRAW_TRISTRIP           0x02000000
-#define BCI_CMD_DRAW_TRIFAN             0x04000000
-#define BCI_CMD_DRAW_SKIPFLAGS          0x000000ff
-#define BCI_CMD_DRAW_NO_Z              0x00000001
-#define BCI_CMD_DRAW_NO_W              0x00000002
-#define BCI_CMD_DRAW_NO_CD             0x00000004
-#define BCI_CMD_DRAW_NO_CS             0x00000008
-#define BCI_CMD_DRAW_NO_U0             0x00000010
-#define BCI_CMD_DRAW_NO_V0             0x00000020
-#define BCI_CMD_DRAW_NO_UV0            0x00000030
-#define BCI_CMD_DRAW_NO_U1             0x00000040
-#define BCI_CMD_DRAW_NO_V1             0x00000080
-#define BCI_CMD_DRAW_NO_UV1            0x000000c0
-
-#define BCI_CMD_DMA                    0xa8000000
-
-#define BCI_W_H(w, h)                ((((h) << 16) | (w)) & 0x0FFF0FFF)
-#define BCI_X_Y(x, y)                ((((y) << 16) | (x)) & 0x0FFF0FFF)
-#define BCI_X_W(x, y)                ((((w) << 16) | (x)) & 0x0FFF0FFF)
-#define BCI_CLIP_LR(l, r)            ((((r) << 16) | (l)) & 0x0FFF0FFF)
-#define BCI_CLIP_TL(t, l)            ((((t) << 16) | (l)) & 0x0FFF0FFF)
-#define BCI_CLIP_BR(b, r)            ((((b) << 16) | (r)) & 0x0FFF0FFF)
-
-#define BCI_LINE_X_Y(x, y)           (((y) << 16) | ((x) & 0xFFFF))
-#define BCI_LINE_STEPS(diag, axi)    (((axi) << 16) | ((diag) & 0xFFFF))
-#define BCI_LINE_MISC(maj, ym, xp, yp, err) \
-       (((maj) & 0x1FFF) | \
-       ((ym) ? 1<<13 : 0) | \
-       ((xp) ? 1<<14 : 0) | \
-       ((yp) ? 1<<15 : 0) | \
-       ((err) << 16))
-
-/*
- * common commands
- */
-#define BCI_SET_REGISTERS( first, n )                  \
-       BCI_WRITE(BCI_CMD_SET_REGISTER |                \
-                 ((uint32_t)(n) & 0xff) << 16 |        \
-                 ((uint32_t)(first) & 0xffff))
-#define DMA_SET_REGISTERS( first, n )                  \
-       DMA_WRITE(BCI_CMD_SET_REGISTER |                \
-                 ((uint32_t)(n) & 0xff) << 16 |        \
-                 ((uint32_t)(first) & 0xffff))
-
-#define BCI_DRAW_PRIMITIVE(n, type, skip)         \
-        BCI_WRITE(BCI_CMD_DRAW_PRIM | (type) | (skip) | \
-                 ((n) << 16))
-#define DMA_DRAW_PRIMITIVE(n, type, skip)         \
-        DMA_WRITE(BCI_CMD_DRAW_PRIM | (type) | (skip) | \
-                 ((n) << 16))
-
-#define BCI_DRAW_INDICES_S3D(n, type, i0)         \
-        BCI_WRITE(BCI_CMD_DRAW_INDEXED_PRIM | (type) |  \
-                 ((n) << 16) | (i0))
-
-#define BCI_DRAW_INDICES_S4(n, type, skip)        \
-        BCI_WRITE(BCI_CMD_DRAW_INDEXED_PRIM | (type) |  \
-                  (skip) | ((n) << 16))
-
-#define BCI_DMA(n)     \
-       BCI_WRITE(BCI_CMD_DMA | (((n) >> 1) - 1))
-
-/*
- * access to MMIO
- */
-#define SAVAGE_READ(reg) \
-       readl(((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define SAVAGE_WRITE(reg) \
-       writel(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
-
-/*
- * access to the burst command interface (BCI)
- */
-#define SAVAGE_BCI_DEBUG 1
-
-#define BCI_LOCALS    volatile uint32_t *bci_ptr;
-
-#define BEGIN_BCI( n ) do {                    \
-       dev_priv->wait_fifo(dev_priv, (n));     \
-       bci_ptr = dev_priv->bci_ptr;            \
-} while(0)
-
-#define BCI_WRITE( val ) *bci_ptr++ = (uint32_t)(val)
-
-/*
- * command DMA support
- */
-#define SAVAGE_DMA_DEBUG 1
-
-#define DMA_LOCALS   uint32_t *dma_ptr;
-
-#define BEGIN_DMA( n ) do {                                            \
-       unsigned int cur = dev_priv->current_dma_page;                  \
-       unsigned int rest = SAVAGE_DMA_PAGE_SIZE -                      \
-               dev_priv->dma_pages[cur].used;                          \
-       if ((n) > rest) {                                               \
-               dma_ptr = savage_dma_alloc(dev_priv, (n));              \
-       } else { /* fast path for small allocations */                  \
-               dma_ptr = (uint32_t *)dev_priv->cmd_dma->handle +       \
-                       cur * SAVAGE_DMA_PAGE_SIZE +                    \
-                       dev_priv->dma_pages[cur].used;                  \
-               if (dev_priv->dma_pages[cur].used == 0)                 \
-                       savage_dma_wait(dev_priv, cur);                 \
-               dev_priv->dma_pages[cur].used += (n);                   \
-       }                                                               \
-} while(0)
-
-#define DMA_WRITE( val ) *dma_ptr++ = (uint32_t)(val)
-
-#define DMA_COPY(src, n) do {                                  \
-       memcpy(dma_ptr, (src), (n)*4);                          \
-       dma_ptr += n;                                           \
-} while(0)
-
-#if SAVAGE_DMA_DEBUG
-#define DMA_COMMIT() do {                                              \
-       unsigned int cur = dev_priv->current_dma_page;                  \
-       uint32_t *expected = (uint32_t *)dev_priv->cmd_dma->handle +    \
-                       cur * SAVAGE_DMA_PAGE_SIZE +                    \
-                       dev_priv->dma_pages[cur].used;                  \
-       if (dma_ptr != expected) {                                      \
-               DRM_ERROR("DMA allocation and use don't match: "        \
-                         "%p != %p\n", expected, dma_ptr);             \
-               savage_dma_reset(dev_priv);                             \
-       }                                                               \
-} while(0)
-#else
-#define DMA_COMMIT() do {/* nothing */} while(0)
-#endif
-
-#define DMA_FLUSH() dev_priv->dma_flush(dev_priv)
-
-/* Buffer aging via event tag
- */
-
-#define UPDATE_EVENT_COUNTER( ) do {                   \
-       if (dev_priv->status_ptr) {                     \
-               uint16_t count;                         \
-               /* coordinate with Xserver */           \
-               count = dev_priv->status_ptr[1023];     \
-               if (count < dev_priv->event_counter)    \
-                       dev_priv->event_wrap++;         \
-               dev_priv->event_counter = count;        \
-       }                                               \
-} while(0)
-
-#define SET_AGE( age, e, w ) do {      \
-       (age)->event = e;               \
-       (age)->wrap = w;                \
-} while(0)
-
-#define TEST_AGE( age, e, w )                          \
-       ( (age)->wrap < (w) || ( (age)->wrap == (w) && (age)->event <= (e) ) )
-
-#endif                         /* __SAVAGE_DRV_H__ */
diff --git a/drivers/gpu/drm/savage/savage_state.c b/drivers/gpu/drm/savage/savage_state.c
deleted file mode 100644 (file)
index e0d40ae..0000000
+++ /dev/null
@@ -1,1169 +0,0 @@
-/* savage_state.c -- State and drawing support for Savage
- *
- * Copyright 2004  Felix Kuehling
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#include <linux/slab.h>
-#include <linux/uaccess.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_file.h>
-#include <drm/drm_print.h>
-#include <drm/savage_drm.h>
-
-#include "savage_drv.h"
-
-void savage_emit_clip_rect_s3d(drm_savage_private_t * dev_priv,
-                              const struct drm_clip_rect * pbox)
-{
-       uint32_t scstart = dev_priv->state.s3d.new_scstart;
-       uint32_t scend = dev_priv->state.s3d.new_scend;
-       scstart = (scstart & ~SAVAGE_SCISSOR_MASK_S3D) |
-           ((uint32_t) pbox->x1 & 0x000007ff) |
-           (((uint32_t) pbox->y1 << 16) & 0x07ff0000);
-       scend = (scend & ~SAVAGE_SCISSOR_MASK_S3D) |
-           (((uint32_t) pbox->x2 - 1) & 0x000007ff) |
-           ((((uint32_t) pbox->y2 - 1) << 16) & 0x07ff0000);
-       if (scstart != dev_priv->state.s3d.scstart ||
-           scend != dev_priv->state.s3d.scend) {
-               DMA_LOCALS;
-               BEGIN_DMA(4);
-               DMA_WRITE(BCI_CMD_WAIT | BCI_CMD_WAIT_3D);
-               DMA_SET_REGISTERS(SAVAGE_SCSTART_S3D, 2);
-               DMA_WRITE(scstart);
-               DMA_WRITE(scend);
-               dev_priv->state.s3d.scstart = scstart;
-               dev_priv->state.s3d.scend = scend;
-               dev_priv->waiting = 1;
-               DMA_COMMIT();
-       }
-}
-
-void savage_emit_clip_rect_s4(drm_savage_private_t * dev_priv,
-                             const struct drm_clip_rect * pbox)
-{
-       uint32_t drawctrl0 = dev_priv->state.s4.new_drawctrl0;
-       uint32_t drawctrl1 = dev_priv->state.s4.new_drawctrl1;
-       drawctrl0 = (drawctrl0 & ~SAVAGE_SCISSOR_MASK_S4) |
-           ((uint32_t) pbox->x1 & 0x000007ff) |
-           (((uint32_t) pbox->y1 << 12) & 0x00fff000);
-       drawctrl1 = (drawctrl1 & ~SAVAGE_SCISSOR_MASK_S4) |
-           (((uint32_t) pbox->x2 - 1) & 0x000007ff) |
-           ((((uint32_t) pbox->y2 - 1) << 12) & 0x00fff000);
-       if (drawctrl0 != dev_priv->state.s4.drawctrl0 ||
-           drawctrl1 != dev_priv->state.s4.drawctrl1) {
-               DMA_LOCALS;
-               BEGIN_DMA(4);
-               DMA_WRITE(BCI_CMD_WAIT | BCI_CMD_WAIT_3D);
-               DMA_SET_REGISTERS(SAVAGE_DRAWCTRL0_S4, 2);
-               DMA_WRITE(drawctrl0);
-               DMA_WRITE(drawctrl1);
-               dev_priv->state.s4.drawctrl0 = drawctrl0;
-               dev_priv->state.s4.drawctrl1 = drawctrl1;
-               dev_priv->waiting = 1;
-               DMA_COMMIT();
-       }
-}
-
-static int savage_verify_texaddr(drm_savage_private_t * dev_priv, int unit,
-                                uint32_t addr)
-{
-       if ((addr & 6) != 2) {  /* reserved bits */
-               DRM_ERROR("bad texAddr%d %08x (reserved bits)\n", unit, addr);
-               return -EINVAL;
-       }
-       if (!(addr & 1)) {      /* local */
-               addr &= ~7;
-               if (addr < dev_priv->texture_offset ||
-                   addr >= dev_priv->texture_offset + dev_priv->texture_size) {
-                       DRM_ERROR
-                           ("bad texAddr%d %08x (local addr out of range)\n",
-                            unit, addr);
-                       return -EINVAL;
-               }
-       } else {                /* AGP */
-               if (!dev_priv->agp_textures) {
-                       DRM_ERROR("bad texAddr%d %08x (AGP not available)\n",
-                                 unit, addr);
-                       return -EINVAL;
-               }
-               addr &= ~7;
-               if (addr < dev_priv->agp_textures->offset ||
-                   addr >= (dev_priv->agp_textures->offset +
-                            dev_priv->agp_textures->size)) {
-                       DRM_ERROR
-                           ("bad texAddr%d %08x (AGP addr out of range)\n",
-                            unit, addr);
-                       return -EINVAL;
-               }
-       }
-       return 0;
-}
-
-#define SAVE_STATE(reg,where)                  \
-       if(start <= reg && start+count > reg)   \
-               dev_priv->state.where = regs[reg - start]
-#define SAVE_STATE_MASK(reg,where,mask) do {                   \
-       if(start <= reg && start+count > reg) {                 \
-               uint32_t tmp;                                   \
-               tmp = regs[reg - start];                        \
-               dev_priv->state.where = (tmp & (mask)) |        \
-                       (dev_priv->state.where & ~(mask));      \
-       }                                                       \
-} while (0)
-
-static int savage_verify_state_s3d(drm_savage_private_t * dev_priv,
-                                  unsigned int start, unsigned int count,
-                                  const uint32_t *regs)
-{
-       if (start < SAVAGE_TEXPALADDR_S3D ||
-           start + count - 1 > SAVAGE_DESTTEXRWWATERMARK_S3D) {
-               DRM_ERROR("invalid register range (0x%04x-0x%04x)\n",
-                         start, start + count - 1);
-               return -EINVAL;
-       }
-
-       SAVE_STATE_MASK(SAVAGE_SCSTART_S3D, s3d.new_scstart,
-                       ~SAVAGE_SCISSOR_MASK_S3D);
-       SAVE_STATE_MASK(SAVAGE_SCEND_S3D, s3d.new_scend,
-                       ~SAVAGE_SCISSOR_MASK_S3D);
-
-       /* if any texture regs were changed ... */
-       if (start <= SAVAGE_TEXCTRL_S3D &&
-           start + count > SAVAGE_TEXPALADDR_S3D) {
-               /* ... check texture state */
-               SAVE_STATE(SAVAGE_TEXCTRL_S3D, s3d.texctrl);
-               SAVE_STATE(SAVAGE_TEXADDR_S3D, s3d.texaddr);
-               if (dev_priv->state.s3d.texctrl & SAVAGE_TEXCTRL_TEXEN_MASK)
-                       return savage_verify_texaddr(dev_priv, 0,
-                                               dev_priv->state.s3d.texaddr);
-       }
-
-       return 0;
-}
-
-static int savage_verify_state_s4(drm_savage_private_t * dev_priv,
-                                 unsigned int start, unsigned int count,
-                                 const uint32_t *regs)
-{
-       int ret = 0;
-
-       if (start < SAVAGE_DRAWLOCALCTRL_S4 ||
-           start + count - 1 > SAVAGE_TEXBLENDCOLOR_S4) {
-               DRM_ERROR("invalid register range (0x%04x-0x%04x)\n",
-                         start, start + count - 1);
-               return -EINVAL;
-       }
-
-       SAVE_STATE_MASK(SAVAGE_DRAWCTRL0_S4, s4.new_drawctrl0,
-                       ~SAVAGE_SCISSOR_MASK_S4);
-       SAVE_STATE_MASK(SAVAGE_DRAWCTRL1_S4, s4.new_drawctrl1,
-                       ~SAVAGE_SCISSOR_MASK_S4);
-
-       /* if any texture regs were changed ... */
-       if (start <= SAVAGE_TEXDESCR_S4 &&
-           start + count > SAVAGE_TEXPALADDR_S4) {
-               /* ... check texture state */
-               SAVE_STATE(SAVAGE_TEXDESCR_S4, s4.texdescr);
-               SAVE_STATE(SAVAGE_TEXADDR0_S4, s4.texaddr0);
-               SAVE_STATE(SAVAGE_TEXADDR1_S4, s4.texaddr1);
-               if (dev_priv->state.s4.texdescr & SAVAGE_TEXDESCR_TEX0EN_MASK)
-                       ret |= savage_verify_texaddr(dev_priv, 0,
-                                               dev_priv->state.s4.texaddr0);
-               if (dev_priv->state.s4.texdescr & SAVAGE_TEXDESCR_TEX1EN_MASK)
-                       ret |= savage_verify_texaddr(dev_priv, 1,
-                                               dev_priv->state.s4.texaddr1);
-       }
-
-       return ret;
-}
-
-#undef SAVE_STATE
-#undef SAVE_STATE_MASK
-
-static int savage_dispatch_state(drm_savage_private_t * dev_priv,
-                                const drm_savage_cmd_header_t * cmd_header,
-                                const uint32_t *regs)
-{
-       unsigned int count = cmd_header->state.count;
-       unsigned int start = cmd_header->state.start;
-       unsigned int count2 = 0;
-       unsigned int bci_size;
-       int ret;
-       DMA_LOCALS;
-
-       if (!count)
-               return 0;
-
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               ret = savage_verify_state_s3d(dev_priv, start, count, regs);
-               if (ret != 0)
-                       return ret;
-               /* scissor regs are emitted in savage_dispatch_draw */
-               if (start < SAVAGE_SCSTART_S3D) {
-                       if (start + count > SAVAGE_SCEND_S3D + 1)
-                               count2 = count - (SAVAGE_SCEND_S3D + 1 - start);
-                       if (start + count > SAVAGE_SCSTART_S3D)
-                               count = SAVAGE_SCSTART_S3D - start;
-               } else if (start <= SAVAGE_SCEND_S3D) {
-                       if (start + count > SAVAGE_SCEND_S3D + 1) {
-                               count -= SAVAGE_SCEND_S3D + 1 - start;
-                               start = SAVAGE_SCEND_S3D + 1;
-                       } else
-                               return 0;
-               }
-       } else {
-               ret = savage_verify_state_s4(dev_priv, start, count, regs);
-               if (ret != 0)
-                       return ret;
-               /* scissor regs are emitted in savage_dispatch_draw */
-               if (start < SAVAGE_DRAWCTRL0_S4) {
-                       if (start + count > SAVAGE_DRAWCTRL1_S4 + 1)
-                               count2 = count -
-                                        (SAVAGE_DRAWCTRL1_S4 + 1 - start);
-                       if (start + count > SAVAGE_DRAWCTRL0_S4)
-                               count = SAVAGE_DRAWCTRL0_S4 - start;
-               } else if (start <= SAVAGE_DRAWCTRL1_S4) {
-                       if (start + count > SAVAGE_DRAWCTRL1_S4 + 1) {
-                               count -= SAVAGE_DRAWCTRL1_S4 + 1 - start;
-                               start = SAVAGE_DRAWCTRL1_S4 + 1;
-                       } else
-                               return 0;
-               }
-       }
-
-       bci_size = count + (count + 254) / 255 + count2 + (count2 + 254) / 255;
-
-       if (cmd_header->state.global) {
-               BEGIN_DMA(bci_size + 1);
-               DMA_WRITE(BCI_CMD_WAIT | BCI_CMD_WAIT_3D);
-               dev_priv->waiting = 1;
-       } else {
-               BEGIN_DMA(bci_size);
-       }
-
-       do {
-               while (count > 0) {
-                       unsigned int n = count < 255 ? count : 255;
-                       DMA_SET_REGISTERS(start, n);
-                       DMA_COPY(regs, n);
-                       count -= n;
-                       start += n;
-                       regs += n;
-               }
-               start += 2;
-               regs += 2;
-               count = count2;
-               count2 = 0;
-       } while (count);
-
-       DMA_COMMIT();
-
-       return 0;
-}
-
-static int savage_dispatch_dma_prim(drm_savage_private_t * dev_priv,
-                                   const drm_savage_cmd_header_t * cmd_header,
-                                   const struct drm_buf * dmabuf)
-{
-       unsigned char reorder = 0;
-       unsigned int prim = cmd_header->prim.prim;
-       unsigned int skip = cmd_header->prim.skip;
-       unsigned int n = cmd_header->prim.count;
-       unsigned int start = cmd_header->prim.start;
-       unsigned int i;
-       BCI_LOCALS;
-
-       if (!dmabuf) {
-               DRM_ERROR("called without dma buffers!\n");
-               return -EINVAL;
-       }
-
-       if (!n)
-               return 0;
-
-       switch (prim) {
-       case SAVAGE_PRIM_TRILIST_201:
-               reorder = 1;
-               prim = SAVAGE_PRIM_TRILIST;
-               fallthrough;
-       case SAVAGE_PRIM_TRILIST:
-               if (n % 3 != 0) {
-                       DRM_ERROR("wrong number of vertices %u in TRILIST\n",
-                                 n);
-                       return -EINVAL;
-               }
-               break;
-       case SAVAGE_PRIM_TRISTRIP:
-       case SAVAGE_PRIM_TRIFAN:
-               if (n < 3) {
-                       DRM_ERROR
-                           ("wrong number of vertices %u in TRIFAN/STRIP\n",
-                            n);
-                       return -EINVAL;
-               }
-               break;
-       default:
-               DRM_ERROR("invalid primitive type %u\n", prim);
-               return -EINVAL;
-       }
-
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               if (skip != 0) {
-                       DRM_ERROR("invalid skip flags 0x%04x for DMA\n", skip);
-                       return -EINVAL;
-               }
-       } else {
-               unsigned int size = 10 - (skip & 1) - (skip >> 1 & 1) -
-                   (skip >> 2 & 1) - (skip >> 3 & 1) - (skip >> 4 & 1) -
-                   (skip >> 5 & 1) - (skip >> 6 & 1) - (skip >> 7 & 1);
-               if (skip > SAVAGE_SKIP_ALL_S4 || size != 8) {
-                       DRM_ERROR("invalid skip flags 0x%04x for DMA\n", skip);
-                       return -EINVAL;
-               }
-               if (reorder) {
-                       DRM_ERROR("TRILIST_201 used on Savage4 hardware\n");
-                       return -EINVAL;
-               }
-       }
-
-       if (start + n > dmabuf->total / 32) {
-               DRM_ERROR("vertex indices (%u-%u) out of range (0-%u)\n",
-                         start, start + n - 1, dmabuf->total / 32);
-               return -EINVAL;
-       }
-
-       /* Vertex DMA doesn't work with command DMA at the same time,
-        * so we use BCI_... to submit commands here. Flush buffered
-        * faked DMA first. */
-       DMA_FLUSH();
-
-       if (dmabuf->bus_address != dev_priv->state.common.vbaddr) {
-               BEGIN_BCI(2);
-               BCI_SET_REGISTERS(SAVAGE_VERTBUFADDR, 1);
-               BCI_WRITE(dmabuf->bus_address | dev_priv->dma_type);
-               dev_priv->state.common.vbaddr = dmabuf->bus_address;
-       }
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset) && dev_priv->waiting) {
-               /* Workaround for what looks like a hardware bug. If a
-                * WAIT_3D_IDLE was emitted some time before the
-                * indexed drawing command then the engine will lock
-                * up. There are two known workarounds:
-                * WAIT_IDLE_EMPTY or emit at least 63 NOPs. */
-               BEGIN_BCI(63);
-               for (i = 0; i < 63; ++i)
-                       BCI_WRITE(BCI_CMD_WAIT);
-               dev_priv->waiting = 0;
-       }
-
-       prim <<= 25;
-       while (n != 0) {
-               /* Can emit up to 255 indices (85 triangles) at once. */
-               unsigned int count = n > 255 ? 255 : n;
-               if (reorder) {
-                       /* Need to reorder indices for correct flat
-                        * shading while preserving the clock sense
-                        * for correct culling. Only on Savage3D. */
-                       int reorder[3] = { -1, -1, -1 };
-                       reorder[start % 3] = 2;
-
-                       BEGIN_BCI((count + 1 + 1) / 2);
-                       BCI_DRAW_INDICES_S3D(count, prim, start + 2);
-
-                       for (i = start + 1; i + 1 < start + count; i += 2)
-                               BCI_WRITE((i + reorder[i % 3]) |
-                                         ((i + 1 +
-                                           reorder[(i + 1) % 3]) << 16));
-                       if (i < start + count)
-                               BCI_WRITE(i + reorder[i % 3]);
-               } else if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-                       BEGIN_BCI((count + 1 + 1) / 2);
-                       BCI_DRAW_INDICES_S3D(count, prim, start);
-
-                       for (i = start + 1; i + 1 < start + count; i += 2)
-                               BCI_WRITE(i | ((i + 1) << 16));
-                       if (i < start + count)
-                               BCI_WRITE(i);
-               } else {
-                       BEGIN_BCI((count + 2 + 1) / 2);
-                       BCI_DRAW_INDICES_S4(count, prim, skip);
-
-                       for (i = start; i + 1 < start + count; i += 2)
-                               BCI_WRITE(i | ((i + 1) << 16));
-                       if (i < start + count)
-                               BCI_WRITE(i);
-               }
-
-               start += count;
-               n -= count;
-
-               prim |= BCI_CMD_DRAW_CONT;
-       }
-
-       return 0;
-}
-
-static int savage_dispatch_vb_prim(drm_savage_private_t * dev_priv,
-                                  const drm_savage_cmd_header_t * cmd_header,
-                                  const uint32_t *vtxbuf, unsigned int vb_size,
-                                  unsigned int vb_stride)
-{
-       unsigned char reorder = 0;
-       unsigned int prim = cmd_header->prim.prim;
-       unsigned int skip = cmd_header->prim.skip;
-       unsigned int n = cmd_header->prim.count;
-       unsigned int start = cmd_header->prim.start;
-       unsigned int vtx_size;
-       unsigned int i;
-       DMA_LOCALS;
-
-       if (!n)
-               return 0;
-
-       switch (prim) {
-       case SAVAGE_PRIM_TRILIST_201:
-               reorder = 1;
-               prim = SAVAGE_PRIM_TRILIST;
-               fallthrough;
-       case SAVAGE_PRIM_TRILIST:
-               if (n % 3 != 0) {
-                       DRM_ERROR("wrong number of vertices %u in TRILIST\n",
-                                 n);
-                       return -EINVAL;
-               }
-               break;
-       case SAVAGE_PRIM_TRISTRIP:
-       case SAVAGE_PRIM_TRIFAN:
-               if (n < 3) {
-                       DRM_ERROR
-                           ("wrong number of vertices %u in TRIFAN/STRIP\n",
-                            n);
-                       return -EINVAL;
-               }
-               break;
-       default:
-               DRM_ERROR("invalid primitive type %u\n", prim);
-               return -EINVAL;
-       }
-
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               if (skip > SAVAGE_SKIP_ALL_S3D) {
-                       DRM_ERROR("invalid skip flags 0x%04x\n", skip);
-                       return -EINVAL;
-               }
-               vtx_size = 8;   /* full vertex */
-       } else {
-               if (skip > SAVAGE_SKIP_ALL_S4) {
-                       DRM_ERROR("invalid skip flags 0x%04x\n", skip);
-                       return -EINVAL;
-               }
-               vtx_size = 10;  /* full vertex */
-       }
-
-       vtx_size -= (skip & 1) + (skip >> 1 & 1) +
-           (skip >> 2 & 1) + (skip >> 3 & 1) + (skip >> 4 & 1) +
-           (skip >> 5 & 1) + (skip >> 6 & 1) + (skip >> 7 & 1);
-
-       if (vtx_size > vb_stride) {
-               DRM_ERROR("vertex size greater than vb stride (%u > %u)\n",
-                         vtx_size, vb_stride);
-               return -EINVAL;
-       }
-
-       if (start + n > vb_size / (vb_stride * 4)) {
-               DRM_ERROR("vertex indices (%u-%u) out of range (0-%u)\n",
-                         start, start + n - 1, vb_size / (vb_stride * 4));
-               return -EINVAL;
-       }
-
-       prim <<= 25;
-       while (n != 0) {
-               /* Can emit up to 255 vertices (85 triangles) at once. */
-               unsigned int count = n > 255 ? 255 : n;
-               if (reorder) {
-                       /* Need to reorder vertices for correct flat
-                        * shading while preserving the clock sense
-                        * for correct culling. Only on Savage3D. */
-                       int reorder[3] = { -1, -1, -1 };
-                       reorder[start % 3] = 2;
-
-                       BEGIN_DMA(count * vtx_size + 1);
-                       DMA_DRAW_PRIMITIVE(count, prim, skip);
-
-                       for (i = start; i < start + count; ++i) {
-                               unsigned int j = i + reorder[i % 3];
-                               DMA_COPY(&vtxbuf[vb_stride * j], vtx_size);
-                       }
-
-                       DMA_COMMIT();
-               } else {
-                       BEGIN_DMA(count * vtx_size + 1);
-                       DMA_DRAW_PRIMITIVE(count, prim, skip);
-
-                       if (vb_stride == vtx_size) {
-                               DMA_COPY(&vtxbuf[vb_stride * start],
-                                        vtx_size * count);
-                       } else {
-                               for (i = start; i < start + count; ++i) {
-                                       DMA_COPY(&vtxbuf [vb_stride * i],
-                                                vtx_size);
-                               }
-                       }
-
-                       DMA_COMMIT();
-               }
-
-               start += count;
-               n -= count;
-
-               prim |= BCI_CMD_DRAW_CONT;
-       }
-
-       return 0;
-}
-
-static int savage_dispatch_dma_idx(drm_savage_private_t * dev_priv,
-                                  const drm_savage_cmd_header_t * cmd_header,
-                                  const uint16_t *idx,
-                                  const struct drm_buf * dmabuf)
-{
-       unsigned char reorder = 0;
-       unsigned int prim = cmd_header->idx.prim;
-       unsigned int skip = cmd_header->idx.skip;
-       unsigned int n = cmd_header->idx.count;
-       unsigned int i;
-       BCI_LOCALS;
-
-       if (!dmabuf) {
-               DRM_ERROR("called without dma buffers!\n");
-               return -EINVAL;
-       }
-
-       if (!n)
-               return 0;
-
-       switch (prim) {
-       case SAVAGE_PRIM_TRILIST_201:
-               reorder = 1;
-               prim = SAVAGE_PRIM_TRILIST;
-               fallthrough;
-       case SAVAGE_PRIM_TRILIST:
-               if (n % 3 != 0) {
-                       DRM_ERROR("wrong number of indices %u in TRILIST\n", n);
-                       return -EINVAL;
-               }
-               break;
-       case SAVAGE_PRIM_TRISTRIP:
-       case SAVAGE_PRIM_TRIFAN:
-               if (n < 3) {
-                       DRM_ERROR
-                           ("wrong number of indices %u in TRIFAN/STRIP\n", n);
-                       return -EINVAL;
-               }
-               break;
-       default:
-               DRM_ERROR("invalid primitive type %u\n", prim);
-               return -EINVAL;
-       }
-
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               if (skip != 0) {
-                       DRM_ERROR("invalid skip flags 0x%04x for DMA\n", skip);
-                       return -EINVAL;
-               }
-       } else {
-               unsigned int size = 10 - (skip & 1) - (skip >> 1 & 1) -
-                   (skip >> 2 & 1) - (skip >> 3 & 1) - (skip >> 4 & 1) -
-                   (skip >> 5 & 1) - (skip >> 6 & 1) - (skip >> 7 & 1);
-               if (skip > SAVAGE_SKIP_ALL_S4 || size != 8) {
-                       DRM_ERROR("invalid skip flags 0x%04x for DMA\n", skip);
-                       return -EINVAL;
-               }
-               if (reorder) {
-                       DRM_ERROR("TRILIST_201 used on Savage4 hardware\n");
-                       return -EINVAL;
-               }
-       }
-
-       /* Vertex DMA doesn't work with command DMA at the same time,
-        * so we use BCI_... to submit commands here. Flush buffered
-        * faked DMA first. */
-       DMA_FLUSH();
-
-       if (dmabuf->bus_address != dev_priv->state.common.vbaddr) {
-               BEGIN_BCI(2);
-               BCI_SET_REGISTERS(SAVAGE_VERTBUFADDR, 1);
-               BCI_WRITE(dmabuf->bus_address | dev_priv->dma_type);
-               dev_priv->state.common.vbaddr = dmabuf->bus_address;
-       }
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset) && dev_priv->waiting) {
-               /* Workaround for what looks like a hardware bug. If a
-                * WAIT_3D_IDLE was emitted some time before the
-                * indexed drawing command then the engine will lock
-                * up. There are two known workarounds:
-                * WAIT_IDLE_EMPTY or emit at least 63 NOPs. */
-               BEGIN_BCI(63);
-               for (i = 0; i < 63; ++i)
-                       BCI_WRITE(BCI_CMD_WAIT);
-               dev_priv->waiting = 0;
-       }
-
-       prim <<= 25;
-       while (n != 0) {
-               /* Can emit up to 255 indices (85 triangles) at once. */
-               unsigned int count = n > 255 ? 255 : n;
-
-               /* check indices */
-               for (i = 0; i < count; ++i) {
-                       if (idx[i] > dmabuf->total / 32) {
-                               DRM_ERROR("idx[%u]=%u out of range (0-%u)\n",
-                                         i, idx[i], dmabuf->total / 32);
-                               return -EINVAL;
-                       }
-               }
-
-               if (reorder) {
-                       /* Need to reorder indices for correct flat
-                        * shading while preserving the clock sense
-                        * for correct culling. Only on Savage3D. */
-                       int reorder[3] = { 2, -1, -1 };
-
-                       BEGIN_BCI((count + 1 + 1) / 2);
-                       BCI_DRAW_INDICES_S3D(count, prim, idx[2]);
-
-                       for (i = 1; i + 1 < count; i += 2)
-                               BCI_WRITE(idx[i + reorder[i % 3]] |
-                                         (idx[i + 1 +
-                                          reorder[(i + 1) % 3]] << 16));
-                       if (i < count)
-                               BCI_WRITE(idx[i + reorder[i % 3]]);
-               } else if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-                       BEGIN_BCI((count + 1 + 1) / 2);
-                       BCI_DRAW_INDICES_S3D(count, prim, idx[0]);
-
-                       for (i = 1; i + 1 < count; i += 2)
-                               BCI_WRITE(idx[i] | (idx[i + 1] << 16));
-                       if (i < count)
-                               BCI_WRITE(idx[i]);
-               } else {
-                       BEGIN_BCI((count + 2 + 1) / 2);
-                       BCI_DRAW_INDICES_S4(count, prim, skip);
-
-                       for (i = 0; i + 1 < count; i += 2)
-                               BCI_WRITE(idx[i] | (idx[i + 1] << 16));
-                       if (i < count)
-                               BCI_WRITE(idx[i]);
-               }
-
-               idx += count;
-               n -= count;
-
-               prim |= BCI_CMD_DRAW_CONT;
-       }
-
-       return 0;
-}
-
-static int savage_dispatch_vb_idx(drm_savage_private_t * dev_priv,
-                                 const drm_savage_cmd_header_t * cmd_header,
-                                 const uint16_t *idx,
-                                 const uint32_t *vtxbuf,
-                                 unsigned int vb_size, unsigned int vb_stride)
-{
-       unsigned char reorder = 0;
-       unsigned int prim = cmd_header->idx.prim;
-       unsigned int skip = cmd_header->idx.skip;
-       unsigned int n = cmd_header->idx.count;
-       unsigned int vtx_size;
-       unsigned int i;
-       DMA_LOCALS;
-
-       if (!n)
-               return 0;
-
-       switch (prim) {
-       case SAVAGE_PRIM_TRILIST_201:
-               reorder = 1;
-               prim = SAVAGE_PRIM_TRILIST;
-               fallthrough;
-       case SAVAGE_PRIM_TRILIST:
-               if (n % 3 != 0) {
-                       DRM_ERROR("wrong number of indices %u in TRILIST\n", n);
-                       return -EINVAL;
-               }
-               break;
-       case SAVAGE_PRIM_TRISTRIP:
-       case SAVAGE_PRIM_TRIFAN:
-               if (n < 3) {
-                       DRM_ERROR
-                           ("wrong number of indices %u in TRIFAN/STRIP\n", n);
-                       return -EINVAL;
-               }
-               break;
-       default:
-               DRM_ERROR("invalid primitive type %u\n", prim);
-               return -EINVAL;
-       }
-
-       if (S3_SAVAGE3D_SERIES(dev_priv->chipset)) {
-               if (skip > SAVAGE_SKIP_ALL_S3D) {
-                       DRM_ERROR("invalid skip flags 0x%04x\n", skip);
-                       return -EINVAL;
-               }
-               vtx_size = 8;   /* full vertex */
-       } else {
-               if (skip > SAVAGE_SKIP_ALL_S4) {
-                       DRM_ERROR("invalid skip flags 0x%04x\n", skip);
-                       return -EINVAL;
-               }
-               vtx_size = 10;  /* full vertex */
-       }
-
-       vtx_size -= (skip & 1) + (skip >> 1 & 1) +
-           (skip >> 2 & 1) + (skip >> 3 & 1) + (skip >> 4 & 1) +
-           (skip >> 5 & 1) + (skip >> 6 & 1) + (skip >> 7 & 1);
-
-       if (vtx_size > vb_stride) {
-               DRM_ERROR("vertex size greater than vb stride (%u > %u)\n",
-                         vtx_size, vb_stride);
-               return -EINVAL;
-       }
-
-       prim <<= 25;
-       while (n != 0) {
-               /* Can emit up to 255 vertices (85 triangles) at once. */
-               unsigned int count = n > 255 ? 255 : n;
-
-               /* Check indices */
-               for (i = 0; i < count; ++i) {
-                       if (idx[i] > vb_size / (vb_stride * 4)) {
-                               DRM_ERROR("idx[%u]=%u out of range (0-%u)\n",
-                                         i, idx[i], vb_size / (vb_stride * 4));
-                               return -EINVAL;
-                       }
-               }
-
-               if (reorder) {
-                       /* Need to reorder vertices for correct flat
-                        * shading while preserving the clock sense
-                        * for correct culling. Only on Savage3D. */
-                       int reorder[3] = { 2, -1, -1 };
-
-                       BEGIN_DMA(count * vtx_size + 1);
-                       DMA_DRAW_PRIMITIVE(count, prim, skip);
-
-                       for (i = 0; i < count; ++i) {
-                               unsigned int j = idx[i + reorder[i % 3]];
-                               DMA_COPY(&vtxbuf[vb_stride * j], vtx_size);
-                       }
-
-                       DMA_COMMIT();
-               } else {
-                       BEGIN_DMA(count * vtx_size + 1);
-                       DMA_DRAW_PRIMITIVE(count, prim, skip);
-
-                       for (i = 0; i < count; ++i) {
-                               unsigned int j = idx[i];
-                               DMA_COPY(&vtxbuf[vb_stride * j], vtx_size);
-                       }
-
-                       DMA_COMMIT();
-               }
-
-               idx += count;
-               n -= count;
-
-               prim |= BCI_CMD_DRAW_CONT;
-       }
-
-       return 0;
-}
-
-static int savage_dispatch_clear(drm_savage_private_t * dev_priv,
-                                const drm_savage_cmd_header_t * cmd_header,
-                                const drm_savage_cmd_header_t *data,
-                                unsigned int nbox,
-                                const struct drm_clip_rect *boxes)
-{
-       unsigned int flags = cmd_header->clear0.flags;
-       unsigned int clear_cmd;
-       unsigned int i, nbufs;
-       DMA_LOCALS;
-
-       if (nbox == 0)
-               return 0;
-
-       clear_cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |
-           BCI_CMD_SEND_COLOR | BCI_CMD_DEST_PBD_NEW;
-       BCI_CMD_SET_ROP(clear_cmd, 0xCC);
-
-       nbufs = ((flags & SAVAGE_FRONT) ? 1 : 0) +
-           ((flags & SAVAGE_BACK) ? 1 : 0) + ((flags & SAVAGE_DEPTH) ? 1 : 0);
-       if (nbufs == 0)
-               return 0;
-
-       if (data->clear1.mask != 0xffffffff) {
-               /* set mask */
-               BEGIN_DMA(2);
-               DMA_SET_REGISTERS(SAVAGE_BITPLANEWTMASK, 1);
-               DMA_WRITE(data->clear1.mask);
-               DMA_COMMIT();
-       }
-       for (i = 0; i < nbox; ++i) {
-               unsigned int x, y, w, h;
-               unsigned int buf;
-               x = boxes[i].x1, y = boxes[i].y1;
-               w = boxes[i].x2 - boxes[i].x1;
-               h = boxes[i].y2 - boxes[i].y1;
-               BEGIN_DMA(nbufs * 6);
-               for (buf = SAVAGE_FRONT; buf <= SAVAGE_DEPTH; buf <<= 1) {
-                       if (!(flags & buf))
-                               continue;
-                       DMA_WRITE(clear_cmd);
-                       switch (buf) {
-                       case SAVAGE_FRONT:
-                               DMA_WRITE(dev_priv->front_offset);
-                               DMA_WRITE(dev_priv->front_bd);
-                               break;
-                       case SAVAGE_BACK:
-                               DMA_WRITE(dev_priv->back_offset);
-                               DMA_WRITE(dev_priv->back_bd);
-                               break;
-                       case SAVAGE_DEPTH:
-                               DMA_WRITE(dev_priv->depth_offset);
-                               DMA_WRITE(dev_priv->depth_bd);
-                               break;
-                       }
-                       DMA_WRITE(data->clear1.value);
-                       DMA_WRITE(BCI_X_Y(x, y));
-                       DMA_WRITE(BCI_W_H(w, h));
-               }
-               DMA_COMMIT();
-       }
-       if (data->clear1.mask != 0xffffffff) {
-               /* reset mask */
-               BEGIN_DMA(2);
-               DMA_SET_REGISTERS(SAVAGE_BITPLANEWTMASK, 1);
-               DMA_WRITE(0xffffffff);
-               DMA_COMMIT();
-       }
-
-       return 0;
-}
-
-static int savage_dispatch_swap(drm_savage_private_t * dev_priv,
-                               unsigned int nbox, const struct drm_clip_rect *boxes)
-{
-       unsigned int swap_cmd;
-       unsigned int i;
-       DMA_LOCALS;
-
-       if (nbox == 0)
-               return 0;
-
-       swap_cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |
-           BCI_CMD_SRC_PBD_COLOR_NEW | BCI_CMD_DEST_GBD;
-       BCI_CMD_SET_ROP(swap_cmd, 0xCC);
-
-       for (i = 0; i < nbox; ++i) {
-               BEGIN_DMA(6);
-               DMA_WRITE(swap_cmd);
-               DMA_WRITE(dev_priv->back_offset);
-               DMA_WRITE(dev_priv->back_bd);
-               DMA_WRITE(BCI_X_Y(boxes[i].x1, boxes[i].y1));
-               DMA_WRITE(BCI_X_Y(boxes[i].x1, boxes[i].y1));
-               DMA_WRITE(BCI_W_H(boxes[i].x2 - boxes[i].x1,
-                                 boxes[i].y2 - boxes[i].y1));
-               DMA_COMMIT();
-       }
-
-       return 0;
-}
-
-static int savage_dispatch_draw(drm_savage_private_t * dev_priv,
-                               const drm_savage_cmd_header_t *start,
-                               const drm_savage_cmd_header_t *end,
-                               const struct drm_buf * dmabuf,
-                               const unsigned int *vtxbuf,
-                               unsigned int vb_size, unsigned int vb_stride,
-                               unsigned int nbox,
-                               const struct drm_clip_rect *boxes)
-{
-       unsigned int i, j;
-       int ret;
-
-       for (i = 0; i < nbox; ++i) {
-               const drm_savage_cmd_header_t *cmdbuf;
-               dev_priv->emit_clip_rect(dev_priv, &boxes[i]);
-
-               cmdbuf = start;
-               while (cmdbuf < end) {
-                       drm_savage_cmd_header_t cmd_header;
-                       cmd_header = *cmdbuf;
-                       cmdbuf++;
-                       switch (cmd_header.cmd.cmd) {
-                       case SAVAGE_CMD_DMA_PRIM:
-                               ret = savage_dispatch_dma_prim(
-                                       dev_priv, &cmd_header, dmabuf);
-                               break;
-                       case SAVAGE_CMD_VB_PRIM:
-                               ret = savage_dispatch_vb_prim(
-                                       dev_priv, &cmd_header,
-                                       vtxbuf, vb_size, vb_stride);
-                               break;
-                       case SAVAGE_CMD_DMA_IDX:
-                               j = (cmd_header.idx.count + 3) / 4;
-                               /* j was check in savage_bci_cmdbuf */
-                               ret = savage_dispatch_dma_idx(dev_priv,
-                                       &cmd_header, (const uint16_t *)cmdbuf,
-                                       dmabuf);
-                               cmdbuf += j;
-                               break;
-                       case SAVAGE_CMD_VB_IDX:
-                               j = (cmd_header.idx.count + 3) / 4;
-                               /* j was check in savage_bci_cmdbuf */
-                               ret = savage_dispatch_vb_idx(dev_priv,
-                                       &cmd_header, (const uint16_t *)cmdbuf,
-                                       (const uint32_t *)vtxbuf, vb_size,
-                                       vb_stride);
-                               cmdbuf += j;
-                               break;
-                       default:
-                               /* What's the best return code? EFAULT? */
-                               DRM_ERROR("IMPLEMENTATION ERROR: "
-                                         "non-drawing-command %d\n",
-                                         cmd_header.cmd.cmd);
-                               return -EINVAL;
-                       }
-
-                       if (ret != 0)
-                               return ret;
-               }
-       }
-
-       return 0;
-}
-
-int savage_bci_cmdbuf(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_savage_private_t *dev_priv = dev->dev_private;
-       struct drm_device_dma *dma = dev->dma;
-       struct drm_buf *dmabuf;
-       drm_savage_cmdbuf_t *cmdbuf = data;
-       drm_savage_cmd_header_t *kcmd_addr = NULL;
-       drm_savage_cmd_header_t *first_draw_cmd;
-       unsigned int *kvb_addr = NULL;
-       struct drm_clip_rect *kbox_addr = NULL;
-       unsigned int i, j;
-       int ret = 0;
-
-       DRM_DEBUG("\n");
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       if (dma && dma->buflist) {
-               if (cmdbuf->dma_idx >= dma->buf_count) {
-                       DRM_ERROR
-                           ("vertex buffer index %u out of range (0-%u)\n",
-                            cmdbuf->dma_idx, dma->buf_count - 1);
-                       return -EINVAL;
-               }
-               dmabuf = dma->buflist[cmdbuf->dma_idx];
-       } else {
-               dmabuf = NULL;
-       }
-
-       /* Copy the user buffers into kernel temporary areas.  This hasn't been
-        * a performance loss compared to VERIFYAREA_READ/
-        * COPY_FROM_USER_UNCHECKED when done in other drivers, and is correct
-        * for locking on FreeBSD.
-        */
-       if (cmdbuf->size) {
-               kcmd_addr = kmalloc_array(cmdbuf->size, 8, GFP_KERNEL);
-               if (kcmd_addr == NULL)
-                       return -ENOMEM;
-
-               if (copy_from_user(kcmd_addr, cmdbuf->cmd_addr,
-                                      cmdbuf->size * 8))
-               {
-                       kfree(kcmd_addr);
-                       return -EFAULT;
-               }
-               cmdbuf->cmd_addr = kcmd_addr;
-       }
-       if (cmdbuf->vb_size) {
-               kvb_addr = memdup_user(cmdbuf->vb_addr, cmdbuf->vb_size);
-               if (IS_ERR(kvb_addr)) {
-                       ret = PTR_ERR(kvb_addr);
-                       kvb_addr = NULL;
-                       goto done;
-               }
-               cmdbuf->vb_addr = kvb_addr;
-       }
-       if (cmdbuf->nbox) {
-               kbox_addr = kmalloc_array(cmdbuf->nbox, sizeof(struct drm_clip_rect),
-                                         GFP_KERNEL);
-               if (kbox_addr == NULL) {
-                       ret = -ENOMEM;
-                       goto done;
-               }
-
-               if (copy_from_user(kbox_addr, cmdbuf->box_addr,
-                                      cmdbuf->nbox * sizeof(struct drm_clip_rect))) {
-                       ret = -EFAULT;
-                       goto done;
-               }
-       cmdbuf->box_addr = kbox_addr;
-       }
-
-       /* Make sure writes to DMA buffers are finished before sending
-        * DMA commands to the graphics hardware. */
-       mb();
-
-       /* Coming from user space. Don't know if the Xserver has
-        * emitted wait commands. Assuming the worst. */
-       dev_priv->waiting = 1;
-
-       i = 0;
-       first_draw_cmd = NULL;
-       while (i < cmdbuf->size) {
-               drm_savage_cmd_header_t cmd_header;
-               cmd_header = *(drm_savage_cmd_header_t *)cmdbuf->cmd_addr;
-               cmdbuf->cmd_addr++;
-               i++;
-
-               /* Group drawing commands with same state to minimize
-                * iterations over clip rects. */
-               j = 0;
-               switch (cmd_header.cmd.cmd) {
-               case SAVAGE_CMD_DMA_IDX:
-               case SAVAGE_CMD_VB_IDX:
-                       j = (cmd_header.idx.count + 3) / 4;
-                       if (i + j > cmdbuf->size) {
-                               DRM_ERROR("indexed drawing command extends "
-                                         "beyond end of command buffer\n");
-                               DMA_FLUSH();
-                               ret = -EINVAL;
-                               goto done;
-                       }
-                       fallthrough;
-               case SAVAGE_CMD_DMA_PRIM:
-               case SAVAGE_CMD_VB_PRIM:
-                       if (!first_draw_cmd)
-                               first_draw_cmd = cmdbuf->cmd_addr - 1;
-                       cmdbuf->cmd_addr += j;
-                       i += j;
-                       break;
-               default:
-                       if (first_draw_cmd) {
-                               ret = savage_dispatch_draw(
-                                     dev_priv, first_draw_cmd,
-                                     cmdbuf->cmd_addr - 1,
-                                     dmabuf, cmdbuf->vb_addr, cmdbuf->vb_size,
-                                     cmdbuf->vb_stride,
-                                     cmdbuf->nbox, cmdbuf->box_addr);
-                               if (ret != 0)
-                                       goto done;
-                               first_draw_cmd = NULL;
-                       }
-               }
-               if (first_draw_cmd)
-                       continue;
-
-               switch (cmd_header.cmd.cmd) {
-               case SAVAGE_CMD_STATE:
-                       j = (cmd_header.state.count + 1) / 2;
-                       if (i + j > cmdbuf->size) {
-                               DRM_ERROR("command SAVAGE_CMD_STATE extends "
-                                         "beyond end of command buffer\n");
-                               DMA_FLUSH();
-                               ret = -EINVAL;
-                               goto done;
-                       }
-                       ret = savage_dispatch_state(dev_priv, &cmd_header,
-                               (const uint32_t *)cmdbuf->cmd_addr);
-                       cmdbuf->cmd_addr += j;
-                       i += j;
-                       break;
-               case SAVAGE_CMD_CLEAR:
-                       if (i + 1 > cmdbuf->size) {
-                               DRM_ERROR("command SAVAGE_CMD_CLEAR extends "
-                                         "beyond end of command buffer\n");
-                               DMA_FLUSH();
-                               ret = -EINVAL;
-                               goto done;
-                       }
-                       ret = savage_dispatch_clear(dev_priv, &cmd_header,
-                                                   cmdbuf->cmd_addr,
-                                                   cmdbuf->nbox,
-                                                   cmdbuf->box_addr);
-                       cmdbuf->cmd_addr++;
-                       i++;
-                       break;
-               case SAVAGE_CMD_SWAP:
-                       ret = savage_dispatch_swap(dev_priv, cmdbuf->nbox,
-                                                  cmdbuf->box_addr);
-                       break;
-               default:
-                       DRM_ERROR("invalid command 0x%x\n",
-                                 cmd_header.cmd.cmd);
-                       DMA_FLUSH();
-                       ret = -EINVAL;
-                       goto done;
-               }
-
-               if (ret != 0) {
-                       DMA_FLUSH();
-                       goto done;
-               }
-       }
-
-       if (first_draw_cmd) {
-               ret = savage_dispatch_draw (
-                       dev_priv, first_draw_cmd, cmdbuf->cmd_addr, dmabuf,
-                       cmdbuf->vb_addr, cmdbuf->vb_size, cmdbuf->vb_stride,
-                       cmdbuf->nbox, cmdbuf->box_addr);
-               if (ret != 0) {
-                       DMA_FLUSH();
-                       goto done;
-               }
-       }
-
-       DMA_FLUSH();
-
-       if (dmabuf && cmdbuf->discard) {
-               drm_savage_buf_priv_t *buf_priv = dmabuf->dev_private;
-               uint16_t event;
-               event = savage_bci_emit_event(dev_priv, SAVAGE_WAIT_3D);
-               SET_AGE(&buf_priv->age, event, dev_priv->event_wrap);
-               savage_freelist_put(dev, dmabuf);
-       }
-
-done:
-       /* If we didn't need to allocate them, these'll be NULL */
-       kfree(kcmd_addr);
-       kfree(kvb_addr);
-       kfree(kbox_addr);
-
-       return ret;
-}
index fd22d753b4ed0ca40ade22549b042f767e1bab30..0e43784202718399048ddb804881fb88bdbaa293 100644 (file)
@@ -551,10 +551,21 @@ void drm_sched_start(struct drm_gpu_scheduler *sched, bool full_recovery)
 EXPORT_SYMBOL(drm_sched_start);
 
 /**
- * drm_sched_resubmit_jobs - helper to relaunch jobs from the pending list
+ * drm_sched_resubmit_jobs - Deprecated, don't use in new code!
  *
  * @sched: scheduler instance
  *
+ * Re-submitting jobs was a concept AMD came up as cheap way to implement
+ * recovery after a job timeout.
+ *
+ * This turned out to be not working very well. First of all there are many
+ * problem with the dma_fence implementation and requirements. Either the
+ * implementation is risking deadlocks with core memory management or violating
+ * documented implementation details of the dma_fence object.
+ *
+ * Drivers can still save and restore their state for recovery operations, but
+ * we shouldn't make this a general scheduler feature around the dma_fence
+ * interface.
  */
 void drm_sched_resubmit_jobs(struct drm_gpu_scheduler *sched)
 {
index 4624c0aff51ffa583d438d1b44b149fbc6ed4a30..d354ab3077cecf9467f796bd01bbb82f57f78c00 100644 (file)
@@ -16,6 +16,8 @@
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_dma_helper.h>
+#include <drm/drm_modeset_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_simple_kms_helper.h>
 #include <drm/drm_vblank.h>
index 337040fa64387c84136af1818e3aa38a06cc0a1d..faacfee24763b1d4475a56be460c997b1342289d 100644 (file)
@@ -15,7 +15,6 @@
 #include <linux/pm.h>
 #include <linux/slab.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_module.h>
index 6c5f0cbe7d95b94cb37bd0639929bde5f5577ed6..604ae23825daaafde4cadb651828d870a75eacb9 100644 (file)
@@ -8,7 +8,6 @@
  */
 
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
diff --git a/drivers/gpu/drm/sis/Makefile b/drivers/gpu/drm/sis/Makefile
deleted file mode 100644 (file)
index 02b0253..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-sis-y := sis_drv.o sis_mm.o
-
-obj-$(CONFIG_DRM_SIS)   += sis.o
-
-
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c
deleted file mode 100644 (file)
index 6173020..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-/* sis.c -- sis driver -*- linux-c -*-
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-#include <linux/module.h>
-#include <linux/pci.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_pciids.h>
-#include <drm/sis_drm.h>
-
-#include "sis_drv.h"
-
-static struct pci_device_id pciidlist[] = {
-       sisdrv_PCI_IDS
-};
-
-static int sis_driver_load(struct drm_device *dev, unsigned long chipset)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       drm_sis_private_t *dev_priv;
-
-       pci_set_master(pdev);
-
-       dev_priv = kzalloc(sizeof(drm_sis_private_t), GFP_KERNEL);
-       if (dev_priv == NULL)
-               return -ENOMEM;
-
-       idr_init_base(&dev_priv->object_idr, 1);
-       dev->dev_private = (void *)dev_priv;
-       dev_priv->chipset = chipset;
-
-       return 0;
-}
-
-static void sis_driver_unload(struct drm_device *dev)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-
-       idr_destroy(&dev_priv->object_idr);
-
-       kfree(dev_priv);
-}
-
-static const struct file_operations sis_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-       .compat_ioctl = drm_compat_ioctl,
-       .llseek = noop_llseek,
-};
-
-static int sis_driver_open(struct drm_device *dev, struct drm_file *file)
-{
-       struct sis_file_private *file_priv;
-
-       DRM_DEBUG_DRIVER("\n");
-       file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL);
-       if (!file_priv)
-               return -ENOMEM;
-
-       file->driver_priv = file_priv;
-
-       INIT_LIST_HEAD(&file_priv->obj_list);
-
-       return 0;
-}
-
-static void sis_driver_postclose(struct drm_device *dev, struct drm_file *file)
-{
-       struct sis_file_private *file_priv = file->driver_priv;
-
-       kfree(file_priv);
-}
-
-static struct drm_driver driver = {
-       .driver_features = DRIVER_USE_AGP | DRIVER_LEGACY,
-       .load = sis_driver_load,
-       .unload = sis_driver_unload,
-       .open = sis_driver_open,
-       .preclose = sis_reclaim_buffers_locked,
-       .postclose = sis_driver_postclose,
-       .dma_quiescent = sis_idle,
-       .lastclose = sis_lastclose,
-       .ioctls = sis_ioctls,
-       .fops = &sis_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-static struct pci_driver sis_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init sis_init(void)
-{
-       driver.num_ioctls = sis_max_ioctl;
-       return drm_legacy_pci_init(&driver, &sis_pci_driver);
-}
-
-static void __exit sis_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &sis_pci_driver);
-}
-
-module_init(sis_init);
-module_exit(sis_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/sis/sis_drv.h b/drivers/gpu/drm/sis/sis_drv.h
deleted file mode 100644 (file)
index 8133944..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/* sis_drv.h -- Private header for sis driver -*- linux-c -*- */
-/*
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- */
-
-#ifndef _SIS_DRV_H_
-#define _SIS_DRV_H_
-
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/drm_mm.h>
-
-/* General customization:
- */
-
-#define DRIVER_AUTHOR          "SIS, Tungsten Graphics"
-#define DRIVER_NAME            "sis"
-#define DRIVER_DESC            "SIS 300/630/540 and XGI V3XE/V5/V8"
-#define DRIVER_DATE            "20070626"
-#define DRIVER_MAJOR           1
-#define DRIVER_MINOR           3
-#define DRIVER_PATCHLEVEL      0
-
-enum sis_family {
-       SIS_OTHER = 0,
-       SIS_CHIP_315 = 1,
-};
-
-#define SIS_READ(reg)         readl(((void __iomem *)dev_priv->mmio->handle) + (reg))
-#define SIS_WRITE(reg, val)   writel(val, ((void __iomem *)dev_priv->mmio->handle) + (reg))
-
-typedef struct drm_sis_private {
-       drm_local_map_t *mmio;
-       unsigned int idle_fault;
-       unsigned int chipset;
-       int vram_initialized;
-       int agp_initialized;
-       unsigned long vram_offset;
-       unsigned long agp_offset;
-       struct drm_mm vram_mm;
-       struct drm_mm agp_mm;
-       /** Mapping of userspace keys to mm objects */
-       struct idr object_idr;
-} drm_sis_private_t;
-
-struct sis_file_private {
-       struct list_head obj_list;
-};
-
-extern int sis_idle(struct drm_device *dev);
-extern void sis_reclaim_buffers_locked(struct drm_device *dev,
-                                      struct drm_file *file_priv);
-extern void sis_lastclose(struct drm_device *dev);
-
-extern const struct drm_ioctl_desc sis_ioctls[];
-extern int sis_max_ioctl;
-
-#endif
diff --git a/drivers/gpu/drm/sis/sis_mm.c b/drivers/gpu/drm/sis/sis_mm.c
deleted file mode 100644 (file)
index e51d428..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-/**************************************************************************
- *
- * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
- * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
- * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
- * USE OR OTHER DEALINGS IN THE SOFTWARE.
- *
- *
- **************************************************************************/
-
-/*
- * Authors:
- *    Thomas Hellström <thomas-at-tungstengraphics-dot-com>
- */
-
-#include <video/sisfb.h>
-
-#include <drm/drm_device.h>
-#include <drm/drm_file.h>
-#include <drm/sis_drm.h>
-
-#include "sis_drv.h"
-
-
-#define VIDEO_TYPE 0
-#define AGP_TYPE 1
-
-
-struct sis_memblock {
-       struct drm_mm_node mm_node;
-       struct sis_memreq req;
-       struct list_head owner_list;
-};
-
-#if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
-/* fb management via fb device */
-
-#define SIS_MM_ALIGN_SHIFT 0
-#define SIS_MM_ALIGN_MASK 0
-
-#else /* CONFIG_FB_SIS[_MODULE] */
-
-#define SIS_MM_ALIGN_SHIFT 4
-#define SIS_MM_ALIGN_MASK ((1 << SIS_MM_ALIGN_SHIFT) - 1)
-
-#endif /* CONFIG_FB_SIS[_MODULE] */
-
-static int sis_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-       drm_sis_fb_t *fb = data;
-
-       mutex_lock(&dev->struct_mutex);
-       /* Unconditionally init the drm_mm, even though we don't use it when the
-        * fb sis driver is available - make cleanup easier. */
-       drm_mm_init(&dev_priv->vram_mm, 0, fb->size >> SIS_MM_ALIGN_SHIFT);
-
-       dev_priv->vram_initialized = 1;
-       dev_priv->vram_offset = fb->offset;
-
-       mutex_unlock(&dev->struct_mutex);
-       DRM_DEBUG("offset = %lu, size = %lu\n", fb->offset, fb->size);
-
-       return 0;
-}
-
-static int sis_drm_alloc(struct drm_device *dev, struct drm_file *file,
-                        void *data, int pool)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-       drm_sis_mem_t *mem = data;
-       int retval = 0, user_key;
-       struct sis_memblock *item;
-       struct sis_file_private *file_priv = file->driver_priv;
-       unsigned long offset;
-
-       mutex_lock(&dev->struct_mutex);
-
-       if (0 == ((pool == 0) ? dev_priv->vram_initialized :
-                     dev_priv->agp_initialized)) {
-               DRM_ERROR
-                   ("Attempt to allocate from uninitialized memory manager.\n");
-               mutex_unlock(&dev->struct_mutex);
-               return -EINVAL;
-       }
-
-       item = kzalloc(sizeof(*item), GFP_KERNEL);
-       if (!item) {
-               retval = -ENOMEM;
-               goto fail_alloc;
-       }
-
-       mem->size = (mem->size + SIS_MM_ALIGN_MASK) >> SIS_MM_ALIGN_SHIFT;
-       if (pool == AGP_TYPE) {
-               retval = drm_mm_insert_node(&dev_priv->agp_mm,
-                                           &item->mm_node,
-                                           mem->size);
-               offset = item->mm_node.start;
-       } else {
-#if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
-               item->req.size = mem->size;
-               sis_malloc(&item->req);
-               if (item->req.size == 0)
-                       retval = -ENOMEM;
-               offset = item->req.offset;
-#else
-               retval = drm_mm_insert_node(&dev_priv->vram_mm,
-                                           &item->mm_node,
-                                           mem->size);
-               offset = item->mm_node.start;
-#endif
-       }
-       if (retval)
-               goto fail_alloc;
-
-       retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL);
-       if (retval < 0)
-               goto fail_idr;
-       user_key = retval;
-
-       list_add(&item->owner_list, &file_priv->obj_list);
-       mutex_unlock(&dev->struct_mutex);
-
-       mem->offset = ((pool == 0) ?
-                     dev_priv->vram_offset : dev_priv->agp_offset) +
-           (offset << SIS_MM_ALIGN_SHIFT);
-       mem->free = user_key;
-       mem->size = mem->size << SIS_MM_ALIGN_SHIFT;
-
-       return 0;
-
-fail_idr:
-       drm_mm_remove_node(&item->mm_node);
-fail_alloc:
-       kfree(item);
-       mutex_unlock(&dev->struct_mutex);
-
-       mem->offset = 0;
-       mem->size = 0;
-       mem->free = 0;
-
-       DRM_DEBUG("alloc %d, size = %ld, offset = %ld\n", pool, mem->size,
-                 mem->offset);
-
-       return retval;
-}
-
-static int sis_drm_free(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-       drm_sis_mem_t *mem = data;
-       struct sis_memblock *obj;
-
-       mutex_lock(&dev->struct_mutex);
-       obj = idr_find(&dev_priv->object_idr, mem->free);
-       if (obj == NULL) {
-               mutex_unlock(&dev->struct_mutex);
-               return -EINVAL;
-       }
-
-       idr_remove(&dev_priv->object_idr, mem->free);
-       list_del(&obj->owner_list);
-       if (drm_mm_node_allocated(&obj->mm_node))
-               drm_mm_remove_node(&obj->mm_node);
-#if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
-       else
-               sis_free(obj->req.offset);
-#endif
-       kfree(obj);
-       mutex_unlock(&dev->struct_mutex);
-       DRM_DEBUG("free = 0x%lx\n", mem->free);
-
-       return 0;
-}
-
-static int sis_fb_alloc(struct drm_device *dev, void *data,
-                       struct drm_file *file_priv)
-{
-       return sis_drm_alloc(dev, file_priv, data, VIDEO_TYPE);
-}
-
-static int sis_ioctl_agp_init(struct drm_device *dev, void *data,
-                             struct drm_file *file_priv)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-       drm_sis_agp_t *agp = data;
-       dev_priv = dev->dev_private;
-
-       mutex_lock(&dev->struct_mutex);
-       drm_mm_init(&dev_priv->agp_mm, 0, agp->size >> SIS_MM_ALIGN_SHIFT);
-
-       dev_priv->agp_initialized = 1;
-       dev_priv->agp_offset = agp->offset;
-       mutex_unlock(&dev->struct_mutex);
-
-       DRM_DEBUG("offset = %lu, size = %lu\n", agp->offset, agp->size);
-       return 0;
-}
-
-static int sis_ioctl_agp_alloc(struct drm_device *dev, void *data,
-                              struct drm_file *file_priv)
-{
-
-       return sis_drm_alloc(dev, file_priv, data, AGP_TYPE);
-}
-
-static drm_local_map_t *sis_reg_init(struct drm_device *dev)
-{
-       struct drm_map_list *entry;
-       drm_local_map_t *map;
-
-       list_for_each_entry(entry, &dev->maplist, head) {
-               map = entry->map;
-               if (!map)
-                       continue;
-               if (map->type == _DRM_REGISTERS)
-                       return map;
-       }
-       return NULL;
-}
-
-int sis_idle(struct drm_device *dev)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-       uint32_t idle_reg;
-       unsigned long end;
-       int i;
-
-       if (dev_priv->idle_fault)
-               return 0;
-
-       if (dev_priv->mmio == NULL) {
-               dev_priv->mmio = sis_reg_init(dev);
-               if (dev_priv->mmio == NULL) {
-                       DRM_ERROR("Could not find register map.\n");
-                       return 0;
-               }
-       }
-
-       /*
-        * Implement a device switch here if needed
-        */
-
-       if (dev_priv->chipset != SIS_CHIP_315)
-               return 0;
-
-       /*
-        * Timeout after 3 seconds. We cannot use DRM_WAIT_ON here
-        * because its polling frequency is too low.
-        */
-
-       end = jiffies + (HZ * 3);
-
-       for (i = 0; i < 4; ++i) {
-               do {
-                       idle_reg = SIS_READ(0x85cc);
-               } while (!time_after_eq(jiffies, end) &&
-                         ((idle_reg & 0x80000000) != 0x80000000));
-       }
-
-       if (time_after_eq(jiffies, end)) {
-               DRM_ERROR("Graphics engine idle timeout. "
-                         "Disabling idle check\n");
-               dev_priv->idle_fault = 1;
-       }
-
-       /*
-        * The caller never sees an error code. It gets trapped
-        * in libdrm.
-        */
-
-       return 0;
-}
-
-
-void sis_lastclose(struct drm_device *dev)
-{
-       drm_sis_private_t *dev_priv = dev->dev_private;
-
-       if (!dev_priv)
-               return;
-
-       mutex_lock(&dev->struct_mutex);
-       if (dev_priv->vram_initialized) {
-               drm_mm_takedown(&dev_priv->vram_mm);
-               dev_priv->vram_initialized = 0;
-       }
-       if (dev_priv->agp_initialized) {
-               drm_mm_takedown(&dev_priv->agp_mm);
-               dev_priv->agp_initialized = 0;
-       }
-       dev_priv->mmio = NULL;
-       mutex_unlock(&dev->struct_mutex);
-}
-
-void sis_reclaim_buffers_locked(struct drm_device *dev,
-                               struct drm_file *file)
-{
-       struct sis_file_private *file_priv = file->driver_priv;
-       struct sis_memblock *entry, *next;
-
-       if (!(dev->master && file->master->lock.hw_lock))
-               return;
-
-       drm_legacy_idlelock_take(&file->master->lock);
-
-       mutex_lock(&dev->struct_mutex);
-       if (list_empty(&file_priv->obj_list)) {
-               mutex_unlock(&dev->struct_mutex);
-               drm_legacy_idlelock_release(&file->master->lock);
-
-               return;
-       }
-
-       sis_idle(dev);
-
-
-       list_for_each_entry_safe(entry, next, &file_priv->obj_list,
-                                owner_list) {
-               list_del(&entry->owner_list);
-               if (drm_mm_node_allocated(&entry->mm_node))
-                       drm_mm_remove_node(&entry->mm_node);
-#if defined(CONFIG_FB_SIS) || defined(CONFIG_FB_SIS_MODULE)
-               else
-                       sis_free(entry->req.offset);
-#endif
-               kfree(entry);
-       }
-       mutex_unlock(&dev->struct_mutex);
-
-       drm_legacy_idlelock_release(&file->master->lock);
-
-       return;
-}
-
-const struct drm_ioctl_desc sis_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(SIS_FB_ALLOC, sis_fb_alloc, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(SIS_FB_FREE, sis_drm_free, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(SIS_AGP_INIT, sis_ioctl_agp_init, DRM_AUTH | DRM_MASTER | DRM_ROOT_ONLY),
-       DRM_IOCTL_DEF_DRV(SIS_AGP_ALLOC, sis_ioctl_agp_alloc, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(SIS_AGP_FREE, sis_drm_free, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(SIS_FB_INIT, sis_fb_init, DRM_AUTH | DRM_MASTER | DRM_ROOT_ONLY),
-};
-
-int sis_max_ioctl = ARRAY_SIZE(sis_ioctls);
index db0bcea1d9f4ada32adbc9b5f2ec30d3f02a672e..b96fc6837b0d20ce1d2f955d23b2787cd256af7e 100644 (file)
@@ -18,7 +18,6 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_blend.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fb_dma_helper.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_dma_helper.h>
index 9d42f17a5734352ac93a7666c17bbbe5ead22aa1..be60c0d546a34f805eabe02bb846c29d66739898 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/of_platform.h>
 
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
index 12b67a5d592317986605b5de51a7f6afecda5042..ab0e5cce7adb634583fe33cf46f7854bccad6508 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_probe_helper.h>
 
index 477cb6985b4d27479c00a12fd753f32d8b7fc205..7cab4213a6808ba09c0d80711507f1dc0c3d21d5 100644 (file)
@@ -8,7 +8,7 @@
 #include <linux/of_device.h>
 #include <linux/platform_device.h>
 
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_of.h>
 #include <drm/drm_simple_kms_helper.h>
 
diff --git a/drivers/gpu/drm/tdfx/Makefile b/drivers/gpu/drm/tdfx/Makefile
deleted file mode 100644 (file)
index 03b7d0f..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-tdfx-y := tdfx_drv.o
-
-obj-$(CONFIG_DRM_TDFX) += tdfx.o
diff --git a/drivers/gpu/drm/tdfx/tdfx_drv.c b/drivers/gpu/drm/tdfx/tdfx_drv.c
deleted file mode 100644 (file)
index 58c185c..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/* tdfx_drv.c -- tdfx driver -*- linux-c -*-
- * Created: Thu Oct  7 10:38:32 1999 by faith@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Rickard E. (Rik) Faith <faith@valinux.com>
- *    Daryll Strauss <daryll@valinux.com>
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#include <linux/module.h>
-#include <linux/pci.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/drm_pciids.h>
-
-#include "tdfx_drv.h"
-
-static struct pci_device_id pciidlist[] = {
-       tdfx_PCI_IDS
-};
-
-static const struct file_operations tdfx_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-       .compat_ioctl = drm_compat_ioctl,
-       .llseek = noop_llseek,
-};
-
-static const struct drm_driver driver = {
-       .driver_features = DRIVER_LEGACY,
-       .fops = &tdfx_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-static struct pci_driver tdfx_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init tdfx_init(void)
-{
-       return drm_legacy_pci_init(&driver, &tdfx_pci_driver);
-}
-
-static void __exit tdfx_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &tdfx_pci_driver);
-}
-
-module_init(tdfx_init);
-module_exit(tdfx_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
diff --git a/drivers/gpu/drm/tdfx/tdfx_drv.h b/drivers/gpu/drm/tdfx/tdfx_drv.h
deleted file mode 100644 (file)
index 84204ec..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/* tdfx.h -- 3dfx DRM template customization -*- linux-c -*-
- * Created: Wed Feb 14 12:32:32 2001 by gareth@valinux.com
- */
-/*
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#ifndef __TDFX_H__
-#define __TDFX_H__
-
-/* General customization:
- */
-
-#define DRIVER_AUTHOR          "VA Linux Systems Inc."
-
-#define DRIVER_NAME            "tdfx"
-#define DRIVER_DESC            "3dfx Banshee/Voodoo3+"
-#define DRIVER_DATE            "20010216"
-
-#define DRIVER_MAJOR           1
-#define DRIVER_MINOR           0
-#define DRIVER_PATCHLEVEL      0
-
-#endif
index cd3c43a6c806483f5dccea762eb9b5184db471d4..5e5e466f35d10c50320c42666692a593fe5efd25 100644 (file)
@@ -7,7 +7,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_gem_dma_helper.h>
 #include <drm/drm_vblank.h>
 
index 07d94b1e80895ffd6d002f43dfb0abf4e11495e8..2dac8727d2f44f08e452addc48d57a0bc3e7bb1b 100644 (file)
@@ -12,7 +12,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_generic.h>
 #include <drm/drm_gem_dma_helper.h>
index e278a9c894764140d8762ecd1a45b26ab3dbd1d0..0d4865e9c03d63d6d7d558429462056cdd2ca54c 100644 (file)
@@ -7,7 +7,7 @@
 #include <linux/export.h>
 
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
+#include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_panel.h>
 #include <drm/drm_of.h>
 
index 345bcc3011e4f945b9ae7fecc45c787fb3bfd0d0..ad2fa3c3d4a7110ccf901021b73ff89b7b52df2d 100644 (file)
@@ -9,7 +9,6 @@
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_of.h>
 #include <drm/drm_panel.h>
index 42d50ec5526d72830fe328ba9a3a0c5145fcf514..fe2c41f0cd4f3b3320ef525dfe2f6ea832764329 100644 (file)
@@ -8,7 +8,6 @@
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_blend.h>
 #include <drm/drm_crtc.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
 #include <drm/drm_gem_atomic_helper.h>
index cd266a0677733689be27bcb02b256a07faacd7e2..326a3d13a82956846a428ac2e395bab48297a486 100644 (file)
@@ -1087,47 +1087,35 @@ void ttm_bo_unmap_virtual(struct ttm_buffer_object *bo)
 EXPORT_SYMBOL(ttm_bo_unmap_virtual);
 
 /**
- * ttm_bo_wait - wait for buffer idle.
+ * ttm_bo_wait_ctx - wait for buffer idle.
  *
  * @bo:  The buffer object.
- * @interruptible:  Use interruptible wait.
- * @no_wait:  Return immediately if buffer is busy.
+ * @ctx: defines how to wait
  *
- * This function must be called with the bo::mutex held, and makes
- * sure any previous rendering to the buffer is completed.
- * Note: It might be necessary to block validations before the
- * wait by reserving the buffer.
- * Returns -EBUSY if no_wait is true and the buffer is busy.
- * Returns -ERESTARTSYS if interrupted by a signal.
+ * Waits for the buffer to be idle. Used timeout depends on the context.
+ * Returns -EBUSY if wait timed outt, -ERESTARTSYS if interrupted by a signal or
+ * zero on success.
  */
-int ttm_bo_wait(struct ttm_buffer_object *bo,
-               bool interruptible, bool no_wait)
+int ttm_bo_wait_ctx(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx)
 {
-       long timeout = 15 * HZ;
+       long ret;
 
-       if (no_wait) {
-               if (dma_resv_test_signaled(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP))
+       if (ctx->no_wait_gpu) {
+               if (dma_resv_test_signaled(bo->base.resv,
+                                          DMA_RESV_USAGE_BOOKKEEP))
                        return 0;
                else
                        return -EBUSY;
        }
 
-       timeout = dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP,
-                                       interruptible, timeout);
-       if (timeout < 0)
-               return timeout;
-
-       if (timeout == 0)
+       ret = dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP,
+                                   ctx->interruptible, 15 * HZ);
+       if (unlikely(ret < 0))
+               return ret;
+       if (unlikely(ret == 0))
                return -EBUSY;
-
        return 0;
 }
-EXPORT_SYMBOL(ttm_bo_wait);
-
-int ttm_bo_wait_ctx(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx)
-{
-       return ttm_bo_wait(bo, ctx->interruptible, ctx->no_wait_gpu);
-}
 EXPORT_SYMBOL(ttm_bo_wait_ctx);
 
 int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx,
@@ -1135,7 +1123,7 @@ int ttm_bo_swapout(struct ttm_buffer_object *bo, struct ttm_operation_ctx *ctx,
 {
        struct ttm_place place;
        bool locked;
-       int ret;
+       long ret;
 
        /*
         * While the bo may already reside in SYSTEM placement, set
index fee7c20775c037d5d543cdd7c4b82f5cc4a304af..fca8b0e0e30a7d4d4c7a78202ffbbef0c38efa73 100644 (file)
@@ -29,6 +29,8 @@
  * Authors: Thomas Hellstrom <thellstrom-at-vmware-dot-com>
  */
 
+#include <linux/vmalloc.h>
+
 #include <drm/ttm/ttm_bo.h>
 #include <drm/ttm/ttm_placement.h>
 #include <drm/ttm/ttm_tt.h>
@@ -125,9 +127,8 @@ EXPORT_SYMBOL(ttm_move_memcpy);
  * ttm_bo_move_memcpy
  *
  * @bo: A pointer to a struct ttm_buffer_object.
- * @interruptible: Sleep interruptible if waiting.
- * @no_wait_gpu: Return immediately if the GPU is busy.
- * @new_mem: struct ttm_resource indicating where to move.
+ * @ctx: operation context
+ * @dst_mem: struct ttm_resource indicating where to move.
  *
  * Fallback move function for a mappable buffer object in mappable memory.
  * The function will, if successful,
@@ -279,8 +280,8 @@ static int ttm_buffer_object_transfer(struct ttm_buffer_object *bo,
 /**
  * ttm_io_prot
  *
- * bo: ttm buffer object
- * res: ttm resource object
+ * @bo: ttm buffer object
+ * @res: ttm resource object
  * @tmp: Page protection flag for a normal, cached mapping.
  *
  * Utility function that returns the pgprot_t that should be used for
@@ -547,9 +548,13 @@ EXPORT_SYMBOL(ttm_bo_vunmap);
 static int ttm_bo_wait_free_node(struct ttm_buffer_object *bo,
                                 bool dst_use_tt)
 {
-       int ret;
-       ret = ttm_bo_wait(bo, false, false);
-       if (ret)
+       long ret;
+
+       ret = dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP,
+                                   false, 15 * HZ);
+       if (ret == 0)
+               return -EBUSY;
+       if (ret < 0)
                return ret;
 
        if (!dst_use_tt)
@@ -619,7 +624,7 @@ static void ttm_bo_move_pipeline_evict(struct ttm_buffer_object *bo,
 }
 
 /**
- * ttm_bo_move_accel_cleanup.
+ * ttm_bo_move_accel_cleanup - cleanup helper for hw copies
  *
  * @bo: A pointer to a struct ttm_buffer_object.
  * @fence: A fence object that signals when moving is complete.
@@ -663,7 +668,7 @@ int ttm_bo_move_accel_cleanup(struct ttm_buffer_object *bo,
 EXPORT_SYMBOL(ttm_bo_move_accel_cleanup);
 
 /**
- * ttm_bo_move_sync_cleanup.
+ * ttm_bo_move_sync_cleanup - cleanup by waiting for the move to finish
  *
  * @bo: A pointer to a struct ttm_buffer_object.
  * @new_mem: struct ttm_resource indicating where to move.
@@ -710,8 +715,7 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
                return ret;
 
        /* If already idle, no need for ghost object dance. */
-       ret = ttm_bo_wait(bo, false, true);
-       if (ret != -EBUSY) {
+       if (dma_resv_test_signaled(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP)) {
                if (!bo->ttm) {
                        /* See comment below about clearing. */
                        ret = ttm_tt_create(bo, true);
@@ -748,8 +752,10 @@ int ttm_bo_pipeline_gutting(struct ttm_buffer_object *bo)
 
        ret = dma_resv_copy_fences(&ghost->base._resv, bo->base.resv);
        /* Last resort, wait for the BO to be idle when we are OOM */
-       if (ret)
-               ttm_bo_wait(bo, false, false);
+       if (ret) {
+               dma_resv_wait_timeout(bo->base.resv, DMA_RESV_USAGE_BOOKKEEP,
+                                     false, MAX_SCHEDULE_TIMEOUT);
+       }
 
        dma_resv_unlock(&ghost->base._resv);
        ttm_bo_put(ghost);
index e81352126a0f21510dd6b4334be840dc1c930c87..1506094a800983b7ca1de2e55b895830b1cf879a 100644 (file)
@@ -5,12 +5,12 @@
 
 #include <linux/module.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_gem_shmem_helper.h>
 #include <drm/drm_managed.h>
+#include <drm/drm_modeset_helper.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_probe_helper.h>
 #include <drm/drm_print.h>
index 4b79d44752c9215bbd2ad94abdd081648653e46f..aa02fd2789c3f885946e2c1bb85a0611bc10e556 100644 (file)
@@ -12,7 +12,6 @@
 
 #include <drm/drm_atomic.h>
 #include <drm/drm_atomic_helper.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_edid.h>
index 12fee99dbfe808acd1d85b1acfbe8b44430c8898..4fee15c97c341047cc23f5b069831405f5d483ee 100644 (file)
 #include <linux/vt_kern.h>
 
 #include <drm/drm_aperture.h>
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_drv.h>
 #include <drm/drm_fbdev_generic.h>
 #include <drm/drm_file.h>
 #include <drm/drm_ioctl.h>
 #include <drm/drm_managed.h>
+#include <drm/drm_modeset_helper.h>
 #include <drm/drm_module.h>
 
 #include "vbox_drv.h"
index 3b83e550f4df52c378120148bd103c1857e16269..42c2d8a99509a1dae7749f9264a08aca5d79b665 100644 (file)
@@ -11,7 +11,6 @@
 #include <linux/pci.h>
 #include <linux/vbox_err.h>
 
-#include <drm/drm_crtc_helper.h>
 #include <drm/drm_damage_helper.h>
 
 #include "vbox_drv.h"
diff --git a/drivers/gpu/drm/via/Makefile b/drivers/gpu/drm/via/Makefile
deleted file mode 100644 (file)
index 8b978dd..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0-only
-#
-# Makefile for the drm device driver.  This driver provides support for the
-# Direct Rendering Infrastructure (DRI) in XFree86 4.1.0 and higher.
-
-via-y    := via_dri1.o
-
-obj-$(CONFIG_DRM_VIA)  +=via.o
diff --git a/drivers/gpu/drm/via/via_3d_reg.h b/drivers/gpu/drm/via/via_3d_reg.h
deleted file mode 100644 (file)
index eb84850..0000000
+++ /dev/null
@@ -1,1771 +0,0 @@
-/* SPDX-License-Identifier: MIT */
-/*
- * Copyright 1998-2011 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2011 S3 Graphics, Inc. All Rights Reserved.
- */
-
-#ifndef VIA_3D_REG_H
-#define VIA_3D_REG_H
-#define HC_REG_BASE             0x0400
-
-#define HC_REG_TRANS_SPACE      0x0040
-
-#define HC_ParaN_MASK           0xffffffff
-#define HC_Para_MASK            0x00ffffff
-#define HC_SubA_MASK            0xff000000
-#define HC_SubA_SHIFT           24
-/* Transmission Setting
- */
-#define HC_REG_TRANS_SET        0x003c
-#define HC_ParaSubType_MASK     0xff000000
-#define HC_ParaType_MASK        0x00ff0000
-#define HC_ParaOS_MASK          0x0000ff00
-#define HC_ParaAdr_MASK         0x000000ff
-#define HC_ParaSubType_SHIFT    24
-#define HC_ParaType_SHIFT       16
-#define HC_ParaOS_SHIFT         8
-#define HC_ParaAdr_SHIFT        0
-
-#define HC_ParaType_CmdVdata    0x0000
-#define HC_ParaType_NotTex      0x0001
-#define HC_ParaType_Tex         0x0002
-#define HC_ParaType_Palette     0x0003
-#define HC_ParaType_PreCR       0x0010
-#define HC_ParaType_Auto        0x00fe
-#define INV_ParaType_Dummy          0x00300000
-
-/* Transmission Space
- */
-#define HC_REG_Hpara0           0x0040
-#define HC_REG_HpataAF          0x02fc
-
-/* Read
- */
-#define HC_REG_HREngSt          0x0000
-#define HC_REG_HRFIFOempty      0x0004
-#define HC_REG_HRFIFOfull       0x0008
-#define HC_REG_HRErr            0x000c
-#define HC_REG_FIFOstatus       0x0010
-/* HC_REG_HREngSt          0x0000
- */
-#define HC_HDASZC_MASK          0x00010000
-#define HC_HSGEMI_MASK          0x0000f000
-#define HC_HLGEMISt_MASK        0x00000f00
-#define HC_HCRSt_MASK           0x00000080
-#define HC_HSE0St_MASK          0x00000040
-#define HC_HSE1St_MASK          0x00000020
-#define HC_HPESt_MASK           0x00000010
-#define HC_HXESt_MASK           0x00000008
-#define HC_HBESt_MASK           0x00000004
-#define HC_HE2St_MASK           0x00000002
-#define HC_HE3St_MASK           0x00000001
-/* HC_REG_HRFIFOempty      0x0004
- */
-#define HC_HRZDempty_MASK       0x00000010
-#define HC_HRTXAempty_MASK      0x00000008
-#define HC_HRTXDempty_MASK      0x00000004
-#define HC_HWZDempty_MASK       0x00000002
-#define HC_HWCDempty_MASK       0x00000001
-/* HC_REG_HRFIFOfull       0x0008
- */
-#define HC_HRZDfull_MASK        0x00000010
-#define HC_HRTXAfull_MASK       0x00000008
-#define HC_HRTXDfull_MASK       0x00000004
-#define HC_HWZDfull_MASK        0x00000002
-#define HC_HWCDfull_MASK        0x00000001
-/* HC_REG_HRErr            0x000c
- */
-#define HC_HAGPCMErr_MASK       0x80000000
-#define HC_HAGPCMErrC_MASK      0x70000000
-/* HC_REG_FIFOstatus       0x0010
- */
-#define HC_HRFIFOATall_MASK     0x80000000
-#define HC_HRFIFOATbusy_MASK    0x40000000
-#define HC_HRATFGMDo_MASK       0x00000100
-#define HC_HRATFGMDi_MASK       0x00000080
-#define HC_HRATFRZD_MASK        0x00000040
-#define HC_HRATFRTXA_MASK       0x00000020
-#define HC_HRATFRTXD_MASK       0x00000010
-#define HC_HRATFWZD_MASK        0x00000008
-#define HC_HRATFWCD_MASK        0x00000004
-#define HC_HRATTXTAG_MASK       0x00000002
-#define HC_HRATTXCH_MASK        0x00000001
-
-/* AGP Command Setting
- */
-#define HC_SubA_HAGPBstL        0x0060
-#define HC_SubA_HAGPBendL       0x0061
-#define HC_SubA_HAGPCMNT        0x0062
-#define HC_SubA_HAGPBpL         0x0063
-#define HC_SubA_HAGPBpH         0x0064
-/* HC_SubA_HAGPCMNT        0x0062
- */
-#define HC_HAGPCMNT_MASK        0x00800000
-#define HC_HCmdErrClr_MASK      0x00400000
-#define HC_HAGPBendH_MASK       0x0000ff00
-#define HC_HAGPBstH_MASK        0x000000ff
-#define HC_HAGPBendH_SHIFT      8
-#define HC_HAGPBstH_SHIFT       0
-/* HC_SubA_HAGPBpL         0x0063
- */
-#define HC_HAGPBpL_MASK         0x00fffffc
-#define HC_HAGPBpID_MASK        0x00000003
-#define HC_HAGPBpID_PAUSE       0x00000000
-#define HC_HAGPBpID_JUMP        0x00000001
-#define HC_HAGPBpID_STOP        0x00000002
-/* HC_SubA_HAGPBpH         0x0064
- */
-#define HC_HAGPBpH_MASK         0x00ffffff
-
-/* Miscellaneous Settings
- */
-#define HC_SubA_HClipTB         0x0070
-#define HC_SubA_HClipLR         0x0071
-#define HC_SubA_HFPClipTL       0x0072
-#define HC_SubA_HFPClipBL       0x0073
-#define HC_SubA_HFPClipLL       0x0074
-#define HC_SubA_HFPClipRL       0x0075
-#define HC_SubA_HFPClipTBH      0x0076
-#define HC_SubA_HFPClipLRH      0x0077
-#define HC_SubA_HLP             0x0078
-#define HC_SubA_HLPRF           0x0079
-#define HC_SubA_HSolidCL        0x007a
-#define HC_SubA_HPixGC          0x007b
-#define HC_SubA_HSPXYOS         0x007c
-#define HC_SubA_HVertexCNT      0x007d
-
-#define HC_HClipT_MASK          0x00fff000
-#define HC_HClipT_SHIFT         12
-#define HC_HClipB_MASK          0x00000fff
-#define HC_HClipB_SHIFT         0
-#define HC_HClipL_MASK          0x00fff000
-#define HC_HClipL_SHIFT         12
-#define HC_HClipR_MASK          0x00000fff
-#define HC_HClipR_SHIFT         0
-#define HC_HFPClipBH_MASK       0x0000ff00
-#define HC_HFPClipBH_SHIFT      8
-#define HC_HFPClipTH_MASK       0x000000ff
-#define HC_HFPClipTH_SHIFT      0
-#define HC_HFPClipRH_MASK       0x0000ff00
-#define HC_HFPClipRH_SHIFT      8
-#define HC_HFPClipLH_MASK       0x000000ff
-#define HC_HFPClipLH_SHIFT      0
-#define HC_HSolidCH_MASK        0x000000ff
-#define HC_HPixGC_MASK          0x00800000
-#define HC_HSPXOS_MASK          0x00fff000
-#define HC_HSPXOS_SHIFT         12
-#define HC_HSPYOS_MASK          0x00000fff
-
-/*
- * Command A
- */
-#define HC_HCmdHeader_MASK      0xfe000000  /*0xffe00000 */
-#define HC_HE3Fire_MASK         0x00100000
-#define HC_HPMType_MASK         0x000f0000
-#define HC_HEFlag_MASK          0x0000e000
-#define HC_HShading_MASK        0x00001c00
-#define HC_HPMValidN_MASK       0x00000200
-#define HC_HPLEND_MASK          0x00000100
-#define HC_HVCycle_MASK         0x000000ff
-#define HC_HVCycle_Style_MASK   0x000000c0
-#define HC_HVCycle_ChgA_MASK    0x00000030
-#define HC_HVCycle_ChgB_MASK    0x0000000c
-#define HC_HVCycle_ChgC_MASK    0x00000003
-#define HC_HPMType_Point        0x00000000
-#define HC_HPMType_Line         0x00010000
-#define HC_HPMType_Tri          0x00020000
-#define HC_HPMType_TriWF        0x00040000
-#define HC_HEFlag_NoAA          0x00000000
-#define HC_HEFlag_ab            0x00008000
-#define HC_HEFlag_bc            0x00004000
-#define HC_HEFlag_ca            0x00002000
-#define HC_HShading_Solid       0x00000000
-#define HC_HShading_FlatA       0x00000400
-#define HC_HShading_FlatB       0x00000800
-#define HC_HShading_FlatC       0x00000c00
-#define HC_HShading_Gouraud     0x00001000
-#define HC_HVCycle_Full         0x00000000
-#define HC_HVCycle_AFP          0x00000040
-#define HC_HVCycle_One          0x000000c0
-#define HC_HVCycle_NewA         0x00000000
-#define HC_HVCycle_AA           0x00000010
-#define HC_HVCycle_AB           0x00000020
-#define HC_HVCycle_AC           0x00000030
-#define HC_HVCycle_NewB         0x00000000
-#define HC_HVCycle_BA           0x00000004
-#define HC_HVCycle_BB           0x00000008
-#define HC_HVCycle_BC           0x0000000c
-#define HC_HVCycle_NewC         0x00000000
-#define HC_HVCycle_CA           0x00000001
-#define HC_HVCycle_CB           0x00000002
-#define HC_HVCycle_CC           0x00000003
-
-/* Command B
- */
-#define HC_HLPrst_MASK          0x00010000
-#define HC_HLLastP_MASK         0x00008000
-#define HC_HVPMSK_MASK          0x00007f80
-#define HC_HBFace_MASK          0x00000040
-#define HC_H2nd1VT_MASK         0x0000003f
-#define HC_HVPMSK_X             0x00004000
-#define HC_HVPMSK_Y             0x00002000
-#define HC_HVPMSK_Z             0x00001000
-#define HC_HVPMSK_W             0x00000800
-#define HC_HVPMSK_Cd            0x00000400
-#define HC_HVPMSK_Cs            0x00000200
-#define HC_HVPMSK_S             0x00000100
-#define HC_HVPMSK_T             0x00000080
-
-/* Enable Setting
- */
-#define HC_SubA_HEnable         0x0000
-#define HC_HenForce1P_MASK      0x00800000  /* [Force 1 Pipe] */
-#define HC_HenZDCheck_MASK      0x00400000  /* [Z dirty bit settings] */
-#define HC_HenTXEnvMap_MASK     0x00200000
-#define HC_HenVertexCNT_MASK    0x00100000
-#define HC_HenCPUDAZ_MASK       0x00080000
-#define HC_HenDASZWC_MASK       0x00040000
-#define HC_HenFBCull_MASK       0x00020000
-#define HC_HenCW_MASK           0x00010000
-#define HC_HenAA_MASK           0x00008000
-#define HC_HenST_MASK           0x00004000
-#define HC_HenZT_MASK           0x00002000
-#define HC_HenZW_MASK           0x00001000
-#define HC_HenAT_MASK           0x00000800
-#define HC_HenAW_MASK           0x00000400
-#define HC_HenSP_MASK           0x00000200
-#define HC_HenLP_MASK           0x00000100
-#define HC_HenTXCH_MASK         0x00000080
-#define HC_HenTXMP_MASK         0x00000040
-#define HC_HenTXPP_MASK         0x00000020
-#define HC_HenTXTR_MASK         0x00000010
-#define HC_HenCS_MASK           0x00000008
-#define HC_HenFOG_MASK          0x00000004
-#define HC_HenABL_MASK          0x00000002
-#define HC_HenDT_MASK           0x00000001
-
-/* Z Setting
- */
-#define HC_SubA_HZWBBasL        0x0010
-#define HC_SubA_HZWBBasH        0x0011
-#define HC_SubA_HZWBType        0x0012
-#define HC_SubA_HZBiasL         0x0013
-#define HC_SubA_HZWBend         0x0014
-#define HC_SubA_HZWTMD          0x0015
-#define HC_SubA_HZWCDL          0x0016
-#define HC_SubA_HZWCTAGnum      0x0017
-#define HC_SubA_HZCYNum         0x0018
-#define HC_SubA_HZWCFire        0x0019
-/* HC_SubA_HZWBType
- */
-#define HC_HZWBType_MASK        0x00800000
-#define HC_HZBiasedWB_MASK      0x00400000
-#define HC_HZONEasFF_MASK       0x00200000
-#define HC_HZOONEasFF_MASK      0x00100000
-#define HC_HZWBFM_MASK          0x00030000
-#define HC_HZWBLoc_MASK         0x0000c000
-#define HC_HZWBPit_MASK         0x00003fff
-#define HC_HZWBFM_16            0x00000000
-#define HC_HZWBFM_32            0x00020000
-#define HC_HZWBFM_24            0x00030000
-#define HC_HZWBLoc_Local        0x00000000
-#define HC_HZWBLoc_SyS          0x00004000
-/* HC_SubA_HZWBend
- */
-#define HC_HZWBend_MASK         0x00ffe000
-#define HC_HZBiasH_MASK         0x000000ff
-#define HC_HZWBend_SHIFT        10
-/* HC_SubA_HZWTMD
- */
-#define HC_HZWTMD_MASK          0x00070000
-#define HC_HEBEBias_MASK        0x00007f00
-#define HC_HZNF_MASK            0x000000ff
-#define HC_HZWTMD_NeverPass     0x00000000
-#define HC_HZWTMD_LT            0x00010000
-#define HC_HZWTMD_EQ            0x00020000
-#define HC_HZWTMD_LE            0x00030000
-#define HC_HZWTMD_GT            0x00040000
-#define HC_HZWTMD_NE            0x00050000
-#define HC_HZWTMD_GE            0x00060000
-#define HC_HZWTMD_AllPass       0x00070000
-#define HC_HEBEBias_SHIFT       8
-/* HC_SubA_HZWCDL          0x0016
- */
-#define HC_HZWCDL_MASK          0x00ffffff
-/* HC_SubA_HZWCTAGnum      0x0017
- */
-#define HC_HZWCTAGnum_MASK      0x00ff0000
-#define HC_HZWCTAGnum_SHIFT     16
-#define HC_HZWCDH_MASK          0x000000ff
-#define HC_HZWCDH_SHIFT         0
-/* HC_SubA_HZCYNum         0x0018
- */
-#define HC_HZCYNum_MASK         0x00030000
-#define HC_HZCYNum_SHIFT        16
-#define HC_HZWCQWnum_MASK       0x00003fff
-#define HC_HZWCQWnum_SHIFT      0
-/* HC_SubA_HZWCFire        0x0019
- */
-#define HC_ZWCFire_MASK         0x00010000
-#define HC_HZWCQWnumLast_MASK   0x00003fff
-#define HC_HZWCQWnumLast_SHIFT  0
-
-/* Stencil Setting
- */
-#define HC_SubA_HSTREF          0x0023
-#define HC_SubA_HSTMD           0x0024
-/* HC_SubA_HSBFM
- */
-#define HC_HSBFM_MASK           0x00030000
-#define HC_HSBLoc_MASK          0x0000c000
-#define HC_HSBPit_MASK          0x00003fff
-/* HC_SubA_HSTREF
- */
-#define HC_HSTREF_MASK          0x00ff0000
-#define HC_HSTOPMSK_MASK        0x0000ff00
-#define HC_HSTBMSK_MASK         0x000000ff
-#define HC_HSTREF_SHIFT         16
-#define HC_HSTOPMSK_SHIFT       8
-/* HC_SubA_HSTMD
- */
-#define HC_HSTMD_MASK           0x00070000
-#define HC_HSTOPSF_MASK         0x000001c0
-#define HC_HSTOPSPZF_MASK       0x00000038
-#define HC_HSTOPSPZP_MASK       0x00000007
-#define HC_HSTMD_NeverPass      0x00000000
-#define HC_HSTMD_LT             0x00010000
-#define HC_HSTMD_EQ             0x00020000
-#define HC_HSTMD_LE             0x00030000
-#define HC_HSTMD_GT             0x00040000
-#define HC_HSTMD_NE             0x00050000
-#define HC_HSTMD_GE             0x00060000
-#define HC_HSTMD_AllPass        0x00070000
-#define HC_HSTOPSF_KEEP         0x00000000
-#define HC_HSTOPSF_ZERO         0x00000040
-#define HC_HSTOPSF_REPLACE      0x00000080
-#define HC_HSTOPSF_INCRSAT      0x000000c0
-#define HC_HSTOPSF_DECRSAT      0x00000100
-#define HC_HSTOPSF_INVERT       0x00000140
-#define HC_HSTOPSF_INCR         0x00000180
-#define HC_HSTOPSF_DECR         0x000001c0
-#define HC_HSTOPSPZF_KEEP       0x00000000
-#define HC_HSTOPSPZF_ZERO       0x00000008
-#define HC_HSTOPSPZF_REPLACE    0x00000010
-#define HC_HSTOPSPZF_INCRSAT    0x00000018
-#define HC_HSTOPSPZF_DECRSAT    0x00000020
-#define HC_HSTOPSPZF_INVERT     0x00000028
-#define HC_HSTOPSPZF_INCR       0x00000030
-#define HC_HSTOPSPZF_DECR       0x00000038
-#define HC_HSTOPSPZP_KEEP       0x00000000
-#define HC_HSTOPSPZP_ZERO       0x00000001
-#define HC_HSTOPSPZP_REPLACE    0x00000002
-#define HC_HSTOPSPZP_INCRSAT    0x00000003
-#define HC_HSTOPSPZP_DECRSAT    0x00000004
-#define HC_HSTOPSPZP_INVERT     0x00000005
-#define HC_HSTOPSPZP_INCR       0x00000006
-#define HC_HSTOPSPZP_DECR       0x00000007
-
-/* Alpha Setting
- */
-#define HC_SubA_HABBasL         0x0030
-#define HC_SubA_HABBasH         0x0031
-#define HC_SubA_HABFM           0x0032
-#define HC_SubA_HATMD           0x0033
-#define HC_SubA_HABLCsat        0x0034
-#define HC_SubA_HABLCop         0x0035
-#define HC_SubA_HABLAsat        0x0036
-#define HC_SubA_HABLAop         0x0037
-#define HC_SubA_HABLRCa         0x0038
-#define HC_SubA_HABLRFCa        0x0039
-#define HC_SubA_HABLRCbias      0x003a
-#define HC_SubA_HABLRCb         0x003b
-#define HC_SubA_HABLRFCb        0x003c
-#define HC_SubA_HABLRAa         0x003d
-#define HC_SubA_HABLRAb         0x003e
-/* HC_SubA_HABFM
- */
-#define HC_HABFM_MASK           0x00030000
-#define HC_HABLoc_MASK          0x0000c000
-#define HC_HABPit_MASK          0x000007ff
-/* HC_SubA_HATMD
- */
-#define HC_HATMD_MASK           0x00000700
-#define HC_HATREF_MASK          0x000000ff
-#define HC_HATMD_NeverPass      0x00000000
-#define HC_HATMD_LT             0x00000100
-#define HC_HATMD_EQ             0x00000200
-#define HC_HATMD_LE             0x00000300
-#define HC_HATMD_GT             0x00000400
-#define HC_HATMD_NE             0x00000500
-#define HC_HATMD_GE             0x00000600
-#define HC_HATMD_AllPass        0x00000700
-/* HC_SubA_HABLCsat
- */
-#define HC_HABLCsat_MASK        0x00010000
-#define HC_HABLCa_MASK          0x0000fc00
-#define HC_HABLCa_C_MASK        0x0000c000
-#define HC_HABLCa_OPC_MASK      0x00003c00
-#define HC_HABLFCa_MASK         0x000003f0
-#define HC_HABLFCa_C_MASK       0x00000300
-#define HC_HABLFCa_OPC_MASK     0x000000f0
-#define HC_HABLCbias_MASK       0x0000000f
-#define HC_HABLCbias_C_MASK     0x00000008
-#define HC_HABLCbias_OPC_MASK   0x00000007
-/*-- Define the input color.
- */
-#define HC_XC_Csrc              0x00000000
-#define HC_XC_Cdst              0x00000001
-#define HC_XC_Asrc              0x00000002
-#define HC_XC_Adst              0x00000003
-#define HC_XC_Fog               0x00000004
-#define HC_XC_HABLRC            0x00000005
-#define HC_XC_minSrcDst         0x00000006
-#define HC_XC_maxSrcDst         0x00000007
-#define HC_XC_mimAsrcInvAdst    0x00000008
-#define HC_XC_OPC               0x00000000
-#define HC_XC_InvOPC            0x00000010
-#define HC_XC_OPCp5             0x00000020
-/*-- Define the input Alpha
- */
-#define HC_XA_OPA               0x00000000
-#define HC_XA_InvOPA            0x00000010
-#define HC_XA_OPAp5             0x00000020
-#define HC_XA_0                 0x00000000
-#define HC_XA_Asrc              0x00000001
-#define HC_XA_Adst              0x00000002
-#define HC_XA_Fog               0x00000003
-#define HC_XA_minAsrcFog        0x00000004
-#define HC_XA_minAsrcAdst       0x00000005
-#define HC_XA_maxAsrcFog        0x00000006
-#define HC_XA_maxAsrcAdst       0x00000007
-#define HC_XA_HABLRA            0x00000008
-#define HC_XA_minAsrcInvAdst    0x00000008
-#define HC_XA_HABLFRA           0x00000009
-/*--
- */
-#define HC_HABLCa_OPC           (HC_XC_OPC << 10)
-#define HC_HABLCa_InvOPC        (HC_XC_InvOPC << 10)
-#define HC_HABLCa_OPCp5         (HC_XC_OPCp5 << 10)
-#define HC_HABLCa_Csrc          (HC_XC_Csrc << 10)
-#define HC_HABLCa_Cdst          (HC_XC_Cdst << 10)
-#define HC_HABLCa_Asrc          (HC_XC_Asrc << 10)
-#define HC_HABLCa_Adst          (HC_XC_Adst << 10)
-#define HC_HABLCa_Fog           (HC_XC_Fog << 10)
-#define HC_HABLCa_HABLRCa       (HC_XC_HABLRC << 10)
-#define HC_HABLCa_minSrcDst     (HC_XC_minSrcDst << 10)
-#define HC_HABLCa_maxSrcDst     (HC_XC_maxSrcDst << 10)
-#define HC_HABLFCa_OPC              (HC_XC_OPC << 4)
-#define HC_HABLFCa_InvOPC           (HC_XC_InvOPC << 4)
-#define HC_HABLFCa_OPCp5            (HC_XC_OPCp5 << 4)
-#define HC_HABLFCa_Csrc             (HC_XC_Csrc << 4)
-#define HC_HABLFCa_Cdst             (HC_XC_Cdst << 4)
-#define HC_HABLFCa_Asrc             (HC_XC_Asrc << 4)
-#define HC_HABLFCa_Adst             (HC_XC_Adst << 4)
-#define HC_HABLFCa_Fog              (HC_XC_Fog << 4)
-#define HC_HABLFCa_HABLRCa          (HC_XC_HABLRC << 4)
-#define HC_HABLFCa_minSrcDst        (HC_XC_minSrcDst << 4)
-#define HC_HABLFCa_maxSrcDst        (HC_XC_maxSrcDst << 4)
-#define HC_HABLFCa_mimAsrcInvAdst   (HC_XC_mimAsrcInvAdst << 4)
-#define HC_HABLCbias_HABLRCbias 0x00000000
-#define HC_HABLCbias_Asrc       0x00000001
-#define HC_HABLCbias_Adst       0x00000002
-#define HC_HABLCbias_Fog        0x00000003
-#define HC_HABLCbias_Cin        0x00000004
-/* HC_SubA_HABLCop         0x0035
- */
-#define HC_HABLdot_MASK         0x00010000
-#define HC_HABLCop_MASK         0x00004000
-#define HC_HABLCb_MASK          0x00003f00
-#define HC_HABLCb_C_MASK        0x00003000
-#define HC_HABLCb_OPC_MASK      0x00000f00
-#define HC_HABLFCb_MASK         0x000000fc
-#define HC_HABLFCb_C_MASK       0x000000c0
-#define HC_HABLFCb_OPC_MASK     0x0000003c
-#define HC_HABLCshift_MASK      0x00000003
-#define HC_HABLCb_OPC           (HC_XC_OPC << 8)
-#define HC_HABLCb_InvOPC        (HC_XC_InvOPC << 8)
-#define HC_HABLCb_OPCp5         (HC_XC_OPCp5 << 8)
-#define HC_HABLCb_Csrc          (HC_XC_Csrc << 8)
-#define HC_HABLCb_Cdst          (HC_XC_Cdst << 8)
-#define HC_HABLCb_Asrc          (HC_XC_Asrc << 8)
-#define HC_HABLCb_Adst          (HC_XC_Adst << 8)
-#define HC_HABLCb_Fog           (HC_XC_Fog << 8)
-#define HC_HABLCb_HABLRCa       (HC_XC_HABLRC << 8)
-#define HC_HABLCb_minSrcDst     (HC_XC_minSrcDst << 8)
-#define HC_HABLCb_maxSrcDst     (HC_XC_maxSrcDst << 8)
-#define HC_HABLFCb_OPC              (HC_XC_OPC << 2)
-#define HC_HABLFCb_InvOPC           (HC_XC_InvOPC << 2)
-#define HC_HABLFCb_OPCp5            (HC_XC_OPCp5 << 2)
-#define HC_HABLFCb_Csrc             (HC_XC_Csrc << 2)
-#define HC_HABLFCb_Cdst             (HC_XC_Cdst << 2)
-#define HC_HABLFCb_Asrc             (HC_XC_Asrc << 2)
-#define HC_HABLFCb_Adst             (HC_XC_Adst << 2)
-#define HC_HABLFCb_Fog              (HC_XC_Fog << 2)
-#define HC_HABLFCb_HABLRCb          (HC_XC_HABLRC << 2)
-#define HC_HABLFCb_minSrcDst        (HC_XC_minSrcDst << 2)
-#define HC_HABLFCb_maxSrcDst        (HC_XC_maxSrcDst << 2)
-#define HC_HABLFCb_mimAsrcInvAdst   (HC_XC_mimAsrcInvAdst << 2)
-/* HC_SubA_HABLAsat        0x0036
- */
-#define HC_HABLAsat_MASK        0x00010000
-#define HC_HABLAa_MASK          0x0000fc00
-#define HC_HABLAa_A_MASK        0x0000c000
-#define HC_HABLAa_OPA_MASK      0x00003c00
-#define HC_HABLFAa_MASK         0x000003f0
-#define HC_HABLFAa_A_MASK       0x00000300
-#define HC_HABLFAa_OPA_MASK     0x000000f0
-#define HC_HABLAbias_MASK       0x0000000f
-#define HC_HABLAbias_A_MASK     0x00000008
-#define HC_HABLAbias_OPA_MASK   0x00000007
-#define HC_HABLAa_OPA           (HC_XA_OPA << 10)
-#define HC_HABLAa_InvOPA        (HC_XA_InvOPA << 10)
-#define HC_HABLAa_OPAp5         (HC_XA_OPAp5 << 10)
-#define HC_HABLAa_0             (HC_XA_0 << 10)
-#define HC_HABLAa_Asrc          (HC_XA_Asrc << 10)
-#define HC_HABLAa_Adst          (HC_XA_Adst << 10)
-#define HC_HABLAa_Fog           (HC_XA_Fog << 10)
-#define HC_HABLAa_minAsrcFog    (HC_XA_minAsrcFog << 10)
-#define HC_HABLAa_minAsrcAdst   (HC_XA_minAsrcAdst << 10)
-#define HC_HABLAa_maxAsrcFog    (HC_XA_maxAsrcFog << 10)
-#define HC_HABLAa_maxAsrcAdst   (HC_XA_maxAsrcAdst << 10)
-#define HC_HABLAa_HABLRA        (HC_XA_HABLRA << 10)
-#define HC_HABLFAa_OPA          (HC_XA_OPA << 4)
-#define HC_HABLFAa_InvOPA       (HC_XA_InvOPA << 4)
-#define HC_HABLFAa_OPAp5        (HC_XA_OPAp5 << 4)
-#define HC_HABLFAa_0            (HC_XA_0 << 4)
-#define HC_HABLFAa_Asrc         (HC_XA_Asrc << 4)
-#define HC_HABLFAa_Adst         (HC_XA_Adst << 4)
-#define HC_HABLFAa_Fog          (HC_XA_Fog << 4)
-#define HC_HABLFAa_minAsrcFog   (HC_XA_minAsrcFog << 4)
-#define HC_HABLFAa_minAsrcAdst  (HC_XA_minAsrcAdst << 4)
-#define HC_HABLFAa_maxAsrcFog   (HC_XA_maxAsrcFog << 4)
-#define HC_HABLFAa_maxAsrcAdst  (HC_XA_maxAsrcAdst << 4)
-#define HC_HABLFAa_minAsrcInvAdst   (HC_XA_minAsrcInvAdst << 4)
-#define HC_HABLFAa_HABLFRA          (HC_XA_HABLFRA << 4)
-#define HC_HABLAbias_HABLRAbias 0x00000000
-#define HC_HABLAbias_Asrc       0x00000001
-#define HC_HABLAbias_Adst       0x00000002
-#define HC_HABLAbias_Fog        0x00000003
-#define HC_HABLAbias_Aaa        0x00000004
-/* HC_SubA_HABLAop         0x0037
- */
-#define HC_HABLAop_MASK         0x00004000
-#define HC_HABLAb_MASK          0x00003f00
-#define HC_HABLAb_OPA_MASK      0x00000f00
-#define HC_HABLFAb_MASK         0x000000fc
-#define HC_HABLFAb_OPA_MASK     0x0000003c
-#define HC_HABLAshift_MASK      0x00000003
-#define HC_HABLAb_OPA           (HC_XA_OPA << 8)
-#define HC_HABLAb_InvOPA        (HC_XA_InvOPA << 8)
-#define HC_HABLAb_OPAp5         (HC_XA_OPAp5 << 8)
-#define HC_HABLAb_0             (HC_XA_0 << 8)
-#define HC_HABLAb_Asrc          (HC_XA_Asrc << 8)
-#define HC_HABLAb_Adst          (HC_XA_Adst << 8)
-#define HC_HABLAb_Fog           (HC_XA_Fog << 8)
-#define HC_HABLAb_minAsrcFog    (HC_XA_minAsrcFog << 8)
-#define HC_HABLAb_minAsrcAdst   (HC_XA_minAsrcAdst << 8)
-#define HC_HABLAb_maxAsrcFog    (HC_XA_maxAsrcFog << 8)
-#define HC_HABLAb_maxAsrcAdst   (HC_XA_maxAsrcAdst << 8)
-#define HC_HABLAb_HABLRA        (HC_XA_HABLRA << 8)
-#define HC_HABLFAb_OPA          (HC_XA_OPA << 2)
-#define HC_HABLFAb_InvOPA       (HC_XA_InvOPA << 2)
-#define HC_HABLFAb_OPAp5        (HC_XA_OPAp5 << 2)
-#define HC_HABLFAb_0            (HC_XA_0 << 2)
-#define HC_HABLFAb_Asrc         (HC_XA_Asrc << 2)
-#define HC_HABLFAb_Adst         (HC_XA_Adst << 2)
-#define HC_HABLFAb_Fog          (HC_XA_Fog << 2)
-#define HC_HABLFAb_minAsrcFog   (HC_XA_minAsrcFog << 2)
-#define HC_HABLFAb_minAsrcAdst  (HC_XA_minAsrcAdst << 2)
-#define HC_HABLFAb_maxAsrcFog   (HC_XA_maxAsrcFog << 2)
-#define HC_HABLFAb_maxAsrcAdst  (HC_XA_maxAsrcAdst << 2)
-#define HC_HABLFAb_minAsrcInvAdst   (HC_XA_minAsrcInvAdst << 2)
-#define HC_HABLFAb_HABLFRA          (HC_XA_HABLFRA << 2)
-/* HC_SubA_HABLRAa         0x003d
- */
-#define HC_HABLRAa_MASK         0x00ff0000
-#define HC_HABLRFAa_MASK        0x0000ff00
-#define HC_HABLRAbias_MASK      0x000000ff
-#define HC_HABLRAa_SHIFT        16
-#define HC_HABLRFAa_SHIFT       8
-/* HC_SubA_HABLRAb         0x003e
- */
-#define HC_HABLRAb_MASK         0x0000ff00
-#define HC_HABLRFAb_MASK        0x000000ff
-#define HC_HABLRAb_SHIFT        8
-
-/* Destination Setting
- */
-#define HC_SubA_HDBBasL         0x0040
-#define HC_SubA_HDBBasH         0x0041
-#define HC_SubA_HDBFM           0x0042
-#define HC_SubA_HFBBMSKL        0x0043
-#define HC_SubA_HROP            0x0044
-/* HC_SubA_HDBFM           0x0042
- */
-#define HC_HDBFM_MASK           0x001f0000
-#define HC_HDBLoc_MASK          0x0000c000
-#define HC_HDBPit_MASK          0x00003fff
-#define HC_HDBFM_RGB555         0x00000000
-#define HC_HDBFM_RGB565         0x00010000
-#define HC_HDBFM_ARGB4444       0x00020000
-#define HC_HDBFM_ARGB1555       0x00030000
-#define HC_HDBFM_BGR555         0x00040000
-#define HC_HDBFM_BGR565         0x00050000
-#define HC_HDBFM_ABGR4444       0x00060000
-#define HC_HDBFM_ABGR1555       0x00070000
-#define HC_HDBFM_ARGB0888       0x00080000
-#define HC_HDBFM_ARGB8888       0x00090000
-#define HC_HDBFM_ABGR0888       0x000a0000
-#define HC_HDBFM_ABGR8888       0x000b0000
-#define HC_HDBLoc_Local         0x00000000
-#define HC_HDBLoc_Sys           0x00004000
-/* HC_SubA_HROP            0x0044
- */
-#define HC_HROP_MASK            0x00000f00
-#define HC_HFBBMSKH_MASK        0x000000ff
-#define HC_HROP_BLACK           0x00000000
-#define HC_HROP_DPon            0x00000100
-#define HC_HROP_DPna            0x00000200
-#define HC_HROP_Pn              0x00000300
-#define HC_HROP_PDna            0x00000400
-#define HC_HROP_Dn              0x00000500
-#define HC_HROP_DPx             0x00000600
-#define HC_HROP_DPan            0x00000700
-#define HC_HROP_DPa             0x00000800
-#define HC_HROP_DPxn            0x00000900
-#define HC_HROP_D               0x00000a00
-#define HC_HROP_DPno            0x00000b00
-#define HC_HROP_P               0x00000c00
-#define HC_HROP_PDno            0x00000d00
-#define HC_HROP_DPo             0x00000e00
-#define HC_HROP_WHITE           0x00000f00
-
-/* Fog Setting
- */
-#define HC_SubA_HFogLF          0x0050
-#define HC_SubA_HFogCL          0x0051
-#define HC_SubA_HFogCH          0x0052
-#define HC_SubA_HFogStL         0x0053
-#define HC_SubA_HFogStH         0x0054
-#define HC_SubA_HFogOOdMF       0x0055
-#define HC_SubA_HFogOOdEF       0x0056
-#define HC_SubA_HFogEndL        0x0057
-#define HC_SubA_HFogDenst       0x0058
-/* HC_SubA_FogLF           0x0050
- */
-#define HC_FogLF_MASK           0x00000010
-#define HC_FogEq_MASK           0x00000008
-#define HC_FogMD_MASK           0x00000007
-#define HC_FogMD_LocalFog        0x00000000
-#define HC_FogMD_LinearFog       0x00000002
-#define HC_FogMD_ExponentialFog  0x00000004
-#define HC_FogMD_Exponential2Fog 0x00000005
-/* #define HC_FogMD_FogTable       0x00000003 */
-
-/* HC_SubA_HFogDenst        0x0058
- */
-#define HC_FogDenst_MASK        0x001fff00
-#define HC_FogEndL_MASK         0x000000ff
-
-/* Texture subtype definitions
- */
-#define HC_SubType_Samp0        0x00000020
-#define HC_SubType_Samp1        0x00000021
-
-
-/* Texture subtype definitions
- */
-#define HC_SubType_Tex0         0x00000000
-#define HC_SubType_Tex1         0x00000001
-#define HC_SubType_TexGeneral   0x000000fe
-
-/* Attribute of texture n
- */
-#define HC_SubA_HTXnL0BasL      0x0000
-#define HC_SubA_HTXnL1BasL      0x0001
-#define HC_SubA_HTXnL2BasL      0x0002
-#define HC_SubA_HTXnL3BasL      0x0003
-#define HC_SubA_HTXnL4BasL      0x0004
-#define HC_SubA_HTXnL5BasL      0x0005
-#define HC_SubA_HTXnL6BasL      0x0006
-#define HC_SubA_HTXnL7BasL      0x0007
-#define HC_SubA_HTXnL8BasL      0x0008
-#define HC_SubA_HTXnL9BasL      0x0009
-#define HC_SubA_HTXnLaBasL      0x000a
-#define HC_SubA_HTXnLbBasL      0x000b
-#define HC_SubA_HTXnLcBasL      0x000c
-#define HC_SubA_HTXnLdBasL      0x000d
-#define HC_SubA_HTXnLeBasL      0x000e
-#define HC_SubA_HTXnLfBasL      0x000f
-#define HC_SubA_HTXnL10BasL     0x0010
-#define HC_SubA_HTXnL11BasL     0x0011
-#define HC_SubA_HTXnL012BasH    0x0020
-#define HC_SubA_HTXnL345BasH    0x0021
-#define HC_SubA_HTXnL678BasH    0x0022
-#define HC_SubA_HTXnL9abBasH    0x0023
-#define HC_SubA_HTXnLcdeBasH    0x0024
-#define HC_SubA_HTXnLf1011BasH  0x0025
-#define HC_SubA_HTXnL0Pit       0x002b
-#define HC_SubA_HTXnL1Pit       0x002c
-#define HC_SubA_HTXnL2Pit       0x002d
-#define HC_SubA_HTXnL3Pit       0x002e
-#define HC_SubA_HTXnL4Pit       0x002f
-#define HC_SubA_HTXnL5Pit       0x0030
-#define HC_SubA_HTXnL6Pit       0x0031
-#define HC_SubA_HTXnL7Pit       0x0032
-#define HC_SubA_HTXnL8Pit       0x0033
-#define HC_SubA_HTXnL9Pit       0x0034
-#define HC_SubA_HTXnLaPit       0x0035
-#define HC_SubA_HTXnLbPit       0x0036
-#define HC_SubA_HTXnLcPit       0x0037
-#define HC_SubA_HTXnLdPit       0x0038
-#define HC_SubA_HTXnLePit       0x0039
-#define HC_SubA_HTXnLfPit       0x003a
-#define HC_SubA_HTXnL10Pit      0x003b
-#define HC_SubA_HTXnL11Pit      0x003c
-#define HC_SubA_HTXnL0_5WE      0x004b
-#define HC_SubA_HTXnL6_bWE      0x004c
-#define HC_SubA_HTXnLc_11WE     0x004d
-#define HC_SubA_HTXnL0_5HE      0x0051
-#define HC_SubA_HTXnL6_bHE      0x0052
-#define HC_SubA_HTXnLc_11HE     0x0053
-#define HC_SubA_HTXnL0OS        0x0077
-#define HC_SubA_HTXnTB          0x0078
-#define HC_SubA_HTXnMPMD        0x0079
-#define HC_SubA_HTXnCLODu       0x007a
-#define HC_SubA_HTXnFM          0x007b
-#define HC_SubA_HTXnTRCH        0x007c
-#define HC_SubA_HTXnTRCL        0x007d
-#define HC_SubA_HTXnTBC         0x007e
-#define HC_SubA_HTXnTRAH        0x007f
-#define HC_SubA_HTXnTBLCsat     0x0080
-#define HC_SubA_HTXnTBLCop      0x0081
-#define HC_SubA_HTXnTBLMPfog    0x0082
-#define HC_SubA_HTXnTBLAsat     0x0083
-#define HC_SubA_HTXnTBLRCa      0x0085
-#define HC_SubA_HTXnTBLRCb      0x0086
-#define HC_SubA_HTXnTBLRCc      0x0087
-#define HC_SubA_HTXnTBLRCbias   0x0088
-#define HC_SubA_HTXnTBLRAa      0x0089
-#define HC_SubA_HTXnTBLRFog     0x008a
-#define HC_SubA_HTXnBumpM00     0x0090
-#define HC_SubA_HTXnBumpM01     0x0091
-#define HC_SubA_HTXnBumpM10     0x0092
-#define HC_SubA_HTXnBumpM11     0x0093
-#define HC_SubA_HTXnLScale      0x0094
-
-#define HC_SubA_HTXSMD             0x0000
-#define HC_SubA_HTXYUV2RGB1        0x0001
-#define HC_SubA_HTXYUV2RGB2        0x0002
-#define HC_SubA_HTXYUV2RGB3        0x0003
-#define HTXYUV2RGB4BT601           (1<<23)
-#define HTXYUV2RGB4BT709           (1<<22)
-/* HC_SubA_HTXnL012BasH    0x0020
- */
-#define HC_HTXnL0BasH_MASK      0x000000ff
-#define HC_HTXnL1BasH_MASK      0x0000ff00
-#define HC_HTXnL2BasH_MASK      0x00ff0000
-#define HC_HTXnL1BasH_SHIFT     8
-#define HC_HTXnL2BasH_SHIFT     16
-/* HC_SubA_HTXnL345BasH    0x0021
- */
-#define HC_HTXnL3BasH_MASK      0x000000ff
-#define HC_HTXnL4BasH_MASK      0x0000ff00
-#define HC_HTXnL5BasH_MASK      0x00ff0000
-#define HC_HTXnL4BasH_SHIFT     8
-#define HC_HTXnL5BasH_SHIFT     16
-/* HC_SubA_HTXnL678BasH    0x0022
- */
-#define HC_HTXnL6BasH_MASK      0x000000ff
-#define HC_HTXnL7BasH_MASK      0x0000ff00
-#define HC_HTXnL8BasH_MASK      0x00ff0000
-#define HC_HTXnL7BasH_SHIFT     8
-#define HC_HTXnL8BasH_SHIFT     16
-/* HC_SubA_HTXnL9abBasH    0x0023
- */
-#define HC_HTXnL9BasH_MASK      0x000000ff
-#define HC_HTXnLaBasH_MASK      0x0000ff00
-#define HC_HTXnLbBasH_MASK      0x00ff0000
-#define HC_HTXnLaBasH_SHIFT     8
-#define HC_HTXnLbBasH_SHIFT     16
-/* HC_SubA_HTXnLcdeBasH    0x0024
- */
-#define HC_HTXnLcBasH_MASK      0x000000ff
-#define HC_HTXnLdBasH_MASK      0x0000ff00
-#define HC_HTXnLeBasH_MASK      0x00ff0000
-#define HC_HTXnLdBasH_SHIFT     8
-#define HC_HTXnLeBasH_SHIFT     16
-/* HC_SubA_HTXnLcdeBasH    0x0025
- */
-#define HC_HTXnLfBasH_MASK      0x000000ff
-#define HC_HTXnL10BasH_MASK      0x0000ff00
-#define HC_HTXnL11BasH_MASK      0x00ff0000
-#define HC_HTXnL10BasH_SHIFT     8
-#define HC_HTXnL11BasH_SHIFT     16
-/* HC_SubA_HTXnL0Pit       0x002b
- */
-#define HC_HTXnLnPit_MASK       0x00003fff
-#define HC_HTXnEnPit_MASK       0x00080000
-#define HC_HTXnLnPitE_MASK      0x00f00000
-#define HC_HTXnLnPitE_SHIFT     20
-/* HC_SubA_HTXnL0_5WE      0x004b
- */
-#define HC_HTXnL0WE_MASK        0x0000000f
-#define HC_HTXnL1WE_MASK        0x000000f0
-#define HC_HTXnL2WE_MASK        0x00000f00
-#define HC_HTXnL3WE_MASK        0x0000f000
-#define HC_HTXnL4WE_MASK        0x000f0000
-#define HC_HTXnL5WE_MASK        0x00f00000
-#define HC_HTXnL1WE_SHIFT       4
-#define HC_HTXnL2WE_SHIFT       8
-#define HC_HTXnL3WE_SHIFT       12
-#define HC_HTXnL4WE_SHIFT       16
-#define HC_HTXnL5WE_SHIFT       20
-/* HC_SubA_HTXnL6_bWE      0x004c
- */
-#define HC_HTXnL6WE_MASK        0x0000000f
-#define HC_HTXnL7WE_MASK        0x000000f0
-#define HC_HTXnL8WE_MASK        0x00000f00
-#define HC_HTXnL9WE_MASK        0x0000f000
-#define HC_HTXnLaWE_MASK        0x000f0000
-#define HC_HTXnLbWE_MASK        0x00f00000
-#define HC_HTXnL7WE_SHIFT       4
-#define HC_HTXnL8WE_SHIFT       8
-#define HC_HTXnL9WE_SHIFT       12
-#define HC_HTXnLaWE_SHIFT       16
-#define HC_HTXnLbWE_SHIFT       20
-/* HC_SubA_HTXnLc_11WE      0x004d
- */
-#define HC_HTXnLcWE_MASK        0x0000000f
-#define HC_HTXnLdWE_MASK        0x000000f0
-#define HC_HTXnLeWE_MASK        0x00000f00
-#define HC_HTXnLfWE_MASK        0x0000f000
-#define HC_HTXnL10WE_MASK       0x000f0000
-#define HC_HTXnL11WE_MASK       0x00f00000
-#define HC_HTXnLdWE_SHIFT       4
-#define HC_HTXnLeWE_SHIFT       8
-#define HC_HTXnLfWE_SHIFT       12
-#define HC_HTXnL10WE_SHIFT      16
-#define HC_HTXnL11WE_SHIFT      20
-/* HC_SubA_HTXnL0_5HE      0x0051
- */
-#define HC_HTXnL0HE_MASK        0x0000000f
-#define HC_HTXnL1HE_MASK        0x000000f0
-#define HC_HTXnL2HE_MASK        0x00000f00
-#define HC_HTXnL3HE_MASK        0x0000f000
-#define HC_HTXnL4HE_MASK        0x000f0000
-#define HC_HTXnL5HE_MASK        0x00f00000
-#define HC_HTXnL1HE_SHIFT       4
-#define HC_HTXnL2HE_SHIFT       8
-#define HC_HTXnL3HE_SHIFT       12
-#define HC_HTXnL4HE_SHIFT       16
-#define HC_HTXnL5HE_SHIFT       20
-/* HC_SubA_HTXnL6_bHE      0x0052
- */
-#define HC_HTXnL6HE_MASK        0x0000000f
-#define HC_HTXnL7HE_MASK        0x000000f0
-#define HC_HTXnL8HE_MASK        0x00000f00
-#define HC_HTXnL9HE_MASK        0x0000f000
-#define HC_HTXnLaHE_MASK        0x000f0000
-#define HC_HTXnLbHE_MASK        0x00f00000
-#define HC_HTXnL7HE_SHIFT       4
-#define HC_HTXnL8HE_SHIFT       8
-#define HC_HTXnL9HE_SHIFT       12
-#define HC_HTXnLaHE_SHIFT       16
-#define HC_HTXnLbHE_SHIFT       20
-/* HC_SubA_HTXnLc_11HE      0x0053
- */
-#define HC_HTXnLcHE_MASK        0x0000000f
-#define HC_HTXnLdHE_MASK        0x000000f0
-#define HC_HTXnLeHE_MASK        0x00000f00
-#define HC_HTXnLfHE_MASK        0x0000f000
-#define HC_HTXnL10HE_MASK       0x000f0000
-#define HC_HTXnL11HE_MASK       0x00f00000
-#define HC_HTXnLdHE_SHIFT       4
-#define HC_HTXnLeHE_SHIFT       8
-#define HC_HTXnLfHE_SHIFT       12
-#define HC_HTXnL10HE_SHIFT      16
-#define HC_HTXnL11HE_SHIFT      20
-/* HC_SubA_HTXnL0OS        0x0077
- */
-#define HC_HTXnL0OS_MASK        0x003ff000
-#define HC_HTXnLVmax_MASK       0x00000fc0
-#define HC_HTXnLVmin_MASK       0x0000003f
-#define HC_HTXnL0OS_SHIFT       12
-#define HC_HTXnLVmax_SHIFT      6
-/* HC_SubA_HTXnTB          0x0078
- */
-#define HC_HTXnTB_MASK          0x00f00000
-#define HC_HTXnFLSe_MASK        0x0000e000
-#define HC_HTXnFLSs_MASK        0x00001c00
-#define HC_HTXnFLTe_MASK        0x00000380
-#define HC_HTXnFLTs_MASK        0x00000070
-#define HC_HTXnFLDs_MASK        0x0000000f
-#define HC_HTXnTB_NoTB          0x00000000
-#define HC_HTXnTB_TBC_S         0x00100000
-#define HC_HTXnTB_TBC_T         0x00200000
-#define HC_HTXnTB_TB_S          0x00400000
-#define HC_HTXnTB_TB_T          0x00800000
-#define HC_HTXnFLSe_Nearest     0x00000000
-#define HC_HTXnFLSe_Linear      0x00002000
-#define HC_HTXnFLSe_NonLinear   0x00004000
-#define HC_HTXnFLSe_Sharp       0x00008000
-#define HC_HTXnFLSe_Flat_Gaussian_Cubic 0x0000c000
-#define HC_HTXnFLSs_Nearest     0x00000000
-#define HC_HTXnFLSs_Linear      0x00000400
-#define HC_HTXnFLSs_NonLinear   0x00000800
-#define HC_HTXnFLSs_Flat_Gaussian_Cubic 0x00001800
-#define HC_HTXnFLTe_Nearest     0x00000000
-#define HC_HTXnFLTe_Linear      0x00000080
-#define HC_HTXnFLTe_NonLinear   0x00000100
-#define HC_HTXnFLTe_Sharp       0x00000180
-#define HC_HTXnFLTe_Flat_Gaussian_Cubic 0x00000300
-#define HC_HTXnFLTs_Nearest     0x00000000
-#define HC_HTXnFLTs_Linear      0x00000010
-#define HC_HTXnFLTs_NonLinear   0x00000020
-#define HC_HTXnFLTs_Flat_Gaussian_Cubic 0x00000060
-#define HC_HTXnFLDs_Tex0        0x00000000
-#define HC_HTXnFLDs_Nearest     0x00000001
-#define HC_HTXnFLDs_Linear      0x00000002
-#define HC_HTXnFLDs_NonLinear   0x00000003
-#define HC_HTXnFLDs_Dither      0x00000004
-#define HC_HTXnFLDs_ConstLOD    0x00000005
-#define HC_HTXnFLDs_Ani         0x00000006
-#define HC_HTXnFLDs_AniDither   0x00000007
-/* HC_SubA_HTXnMPMD        0x0079
- */
-#define HC_HTXnMPMD_SMASK       0x00070000
-#define HC_HTXnMPMD_TMASK       0x00380000
-#define HC_HTXnLODDTf_MASK      0x00000007
-#define HC_HTXnXY2ST_MASK       0x00000008
-#define HC_HTXnMPMD_Tsingle     0x00000000
-#define HC_HTXnMPMD_Tclamp      0x00080000
-#define HC_HTXnMPMD_Trepeat     0x00100000
-#define HC_HTXnMPMD_Tmirror     0x00180000
-#define HC_HTXnMPMD_Twrap       0x00200000
-#define HC_HTXnMPMD_Ssingle     0x00000000
-#define HC_HTXnMPMD_Sclamp      0x00010000
-#define HC_HTXnMPMD_Srepeat     0x00020000
-#define HC_HTXnMPMD_Smirror     0x00030000
-#define HC_HTXnMPMD_Swrap       0x00040000
-/* HC_SubA_HTXnCLODu       0x007a
- */
-#define HC_HTXnCLODu_MASK       0x000ffc00
-#define HC_HTXnCLODd_MASK       0x000003ff
-#define HC_HTXnCLODu_SHIFT      10
-/* HC_SubA_HTXnFM          0x007b
- */
-#define HC_HTXnFM_MASK          0x00ff0000
-#define HC_HTXnLoc_MASK         0x00000003
-#define HC_HTXnFM_INDEX         0x00000000
-#define HC_HTXnFM_Intensity     0x00080000
-#define HC_HTXnFM_Lum           0x00100000
-#define HC_HTXnFM_Alpha         0x00180000
-#define HC_HTXnFM_DX            0x00280000
-#define HC_HTXnFM_YUV           0x00300000
-#define HC_HTXnFM_ARGB16        0x00880000
-#define HC_HTXnFM_ARGB32        0x00980000
-#define HC_HTXnFM_ABGR16        0x00a80000
-#define HC_HTXnFM_ABGR32        0x00b80000
-#define HC_HTXnFM_RGBA16        0x00c80000
-#define HC_HTXnFM_RGBA32        0x00d80000
-#define HC_HTXnFM_BGRA16        0x00e80000
-#define HC_HTXnFM_BGRA32        0x00f80000
-#define HC_HTXnFM_BUMPMAP       0x00380000
-#define HC_HTXnFM_Index1        (HC_HTXnFM_INDEX     | 0x00000000)
-#define HC_HTXnFM_Index2        (HC_HTXnFM_INDEX     | 0x00010000)
-#define HC_HTXnFM_Index4        (HC_HTXnFM_INDEX     | 0x00020000)
-#define HC_HTXnFM_Index8        (HC_HTXnFM_INDEX     | 0x00030000)
-#define HC_HTXnFM_T1            (HC_HTXnFM_Intensity | 0x00000000)
-#define HC_HTXnFM_T2            (HC_HTXnFM_Intensity | 0x00010000)
-#define HC_HTXnFM_T4            (HC_HTXnFM_Intensity | 0x00020000)
-#define HC_HTXnFM_T8            (HC_HTXnFM_Intensity | 0x00030000)
-#define HC_HTXnFM_L1            (HC_HTXnFM_Lum       | 0x00000000)
-#define HC_HTXnFM_L2            (HC_HTXnFM_Lum       | 0x00010000)
-#define HC_HTXnFM_L4            (HC_HTXnFM_Lum       | 0x00020000)
-#define HC_HTXnFM_L8            (HC_HTXnFM_Lum       | 0x00030000)
-#define HC_HTXnFM_AL44          (HC_HTXnFM_Lum       | 0x00040000)
-#define HC_HTXnFM_AL88          (HC_HTXnFM_Lum       | 0x00050000)
-#define HC_HTXnFM_A1            (HC_HTXnFM_Alpha     | 0x00000000)
-#define HC_HTXnFM_A2            (HC_HTXnFM_Alpha     | 0x00010000)
-#define HC_HTXnFM_A4            (HC_HTXnFM_Alpha     | 0x00020000)
-#define HC_HTXnFM_A8            (HC_HTXnFM_Alpha     | 0x00030000)
-#define HC_HTXnFM_DX1           (HC_HTXnFM_DX        | 0x00010000)
-#define HC_HTXnFM_DX23          (HC_HTXnFM_DX        | 0x00020000)
-#define HC_HTXnFM_DX45          (HC_HTXnFM_DX        | 0x00030000)
-/* YUV package mode */
-#define HC_HTXnFM_YUY2          (HC_HTXnFM_YUV           | 0x00000000)
-/* YUV planner mode */
-#define HC_HTXnFM_YV12          (HC_HTXnFM_YUV           | 0x00040000)
-/* YUV planner mode */
-#define HC_HTXnFM_IYUV          (HC_HTXnFM_YUV           | 0x00040000)
-#define HC_HTXnFM_RGB555        (HC_HTXnFM_ARGB16    | 0x00000000)
-#define HC_HTXnFM_RGB565        (HC_HTXnFM_ARGB16    | 0x00010000)
-#define HC_HTXnFM_ARGB1555      (HC_HTXnFM_ARGB16    | 0x00020000)
-#define HC_HTXnFM_ARGB4444      (HC_HTXnFM_ARGB16    | 0x00030000)
-#define HC_HTXnFM_ARGB0888      (HC_HTXnFM_ARGB32    | 0x00000000)
-#define HC_HTXnFM_ARGB8888      (HC_HTXnFM_ARGB32    | 0x00010000)
-#define HC_HTXnFM_BGR555        (HC_HTXnFM_ABGR16    | 0x00000000)
-#define HC_HTXnFM_BGR565        (HC_HTXnFM_ABGR16    | 0x00010000)
-#define HC_HTXnFM_ABGR1555      (HC_HTXnFM_ABGR16    | 0x00020000)
-#define HC_HTXnFM_ABGR4444      (HC_HTXnFM_ABGR16    | 0x00030000)
-#define HC_HTXnFM_ABGR0888      (HC_HTXnFM_ABGR32    | 0x00000000)
-#define HC_HTXnFM_ABGR8888      (HC_HTXnFM_ABGR32    | 0x00010000)
-#define HC_HTXnFM_RGBA5550      (HC_HTXnFM_RGBA16    | 0x00000000)
-#define HC_HTXnFM_RGBA5551      (HC_HTXnFM_RGBA16    | 0x00020000)
-#define HC_HTXnFM_RGBA4444      (HC_HTXnFM_RGBA16    | 0x00030000)
-#define HC_HTXnFM_RGBA8880      (HC_HTXnFM_RGBA32    | 0x00000000)
-#define HC_HTXnFM_RGBA8888      (HC_HTXnFM_RGBA32    | 0x00010000)
-#define HC_HTXnFM_BGRA5550      (HC_HTXnFM_BGRA16    | 0x00000000)
-#define HC_HTXnFM_BGRA5551      (HC_HTXnFM_BGRA16    | 0x00020000)
-#define HC_HTXnFM_BGRA4444      (HC_HTXnFM_BGRA16    | 0x00030000)
-#define HC_HTXnFM_BGRA8880      (HC_HTXnFM_BGRA32    | 0x00000000)
-#define HC_HTXnFM_BGRA8888      (HC_HTXnFM_BGRA32    | 0x00010000)
-#define HC_HTXnFM_VU88          (HC_HTXnFM_BUMPMAP   | 0x00000000)
-#define HC_HTXnFM_LVU655        (HC_HTXnFM_BUMPMAP   | 0x00010000)
-#define HC_HTXnFM_LVU888        (HC_HTXnFM_BUMPMAP   | 0x00020000)
-#define HC_HTXnLoc_Local        0x00000000
-#define HC_HTXnLoc_Sys          0x00000002
-#define HC_HTXnLoc_AGP          0x00000003
-
-/* Video Texture */
-#define HC_HTXnYUV2RGBMode_RGB          0x00000000
-#define HC_HTXnYUV2RGBMode_SDTV         0x00000001
-#define HC_HTXnYUV2RGBMode_HDTV         0x00000002
-#define HC_HTXnYUV2RGBMode_TABLE        0x00000003
-
-/* HC_SubA_HTXnTRAH        0x007f
- */
-#define HC_HTXnTRAH_MASK        0x00ff0000
-#define HC_HTXnTRAL_MASK        0x0000ff00
-#define HC_HTXnTBA_MASK         0x000000ff
-#define HC_HTXnTRAH_SHIFT       16
-#define HC_HTXnTRAL_SHIFT       8
-/* HC_SubA_HTXnTBLCsat     0x0080
- *-- Define the input texture.
- */
-#define HC_XTC_TOPC             0x00000000
-#define HC_XTC_InvTOPC          0x00000010
-#define HC_XTC_TOPCp5           0x00000020
-#define HC_XTC_Cbias            0x00000000
-#define HC_XTC_InvCbias         0x00000010
-#define HC_XTC_0                0x00000000
-#define HC_XTC_Dif              0x00000001
-#define HC_XTC_Spec             0x00000002
-#define HC_XTC_Tex              0x00000003
-#define HC_XTC_Cur              0x00000004
-#define HC_XTC_Adif             0x00000005
-#define HC_XTC_Fog              0x00000006
-#define HC_XTC_Atex             0x00000007
-#define HC_XTC_Acur             0x00000008
-#define HC_XTC_HTXnTBLRC        0x00000009
-#define HC_XTC_Ctexnext         0x0000000a
-/*--
- */
-#define HC_HTXnTBLCsat_MASK     0x00800000
-#define HC_HTXnTBLCa_MASK       0x000fc000
-#define HC_HTXnTBLCb_MASK       0x00001f80
-#define HC_HTXnTBLCc_MASK       0x0000003f
-#define HC_HTXnTBLCa_TOPC       (HC_XTC_TOPC << 14)
-#define HC_HTXnTBLCa_InvTOPC    (HC_XTC_InvTOPC << 14)
-#define HC_HTXnTBLCa_TOPCp5     (HC_XTC_TOPCp5 << 14)
-#define HC_HTXnTBLCa_0          (HC_XTC_0 << 14)
-#define HC_HTXnTBLCa_Dif        (HC_XTC_Dif << 14)
-#define HC_HTXnTBLCa_Spec       (HC_XTC_Spec << 14)
-#define HC_HTXnTBLCa_Tex        (HC_XTC_Tex << 14)
-#define HC_HTXnTBLCa_Cur        (HC_XTC_Cur << 14)
-#define HC_HTXnTBLCa_Adif       (HC_XTC_Adif << 14)
-#define HC_HTXnTBLCa_Fog        (HC_XTC_Fog << 14)
-#define HC_HTXnTBLCa_Atex       (HC_XTC_Atex << 14)
-#define HC_HTXnTBLCa_Acur       (HC_XTC_Acur << 14)
-#define HC_HTXnTBLCa_HTXnTBLRC  (HC_XTC_HTXnTBLRC << 14)
-#define HC_HTXnTBLCa_Ctexnext   (HC_XTC_Ctexnext << 14)
-#define HC_HTXnTBLCb_TOPC       (HC_XTC_TOPC << 7)
-#define HC_HTXnTBLCb_InvTOPC    (HC_XTC_InvTOPC << 7)
-#define HC_HTXnTBLCb_TOPCp5     (HC_XTC_TOPCp5 << 7)
-#define HC_HTXnTBLCb_0          (HC_XTC_0 << 7)
-#define HC_HTXnTBLCb_Dif        (HC_XTC_Dif << 7)
-#define HC_HTXnTBLCb_Spec       (HC_XTC_Spec << 7)
-#define HC_HTXnTBLCb_Tex        (HC_XTC_Tex << 7)
-#define HC_HTXnTBLCb_Cur        (HC_XTC_Cur << 7)
-#define HC_HTXnTBLCb_Adif       (HC_XTC_Adif << 7)
-#define HC_HTXnTBLCb_Fog        (HC_XTC_Fog << 7)
-#define HC_HTXnTBLCb_Atex       (HC_XTC_Atex << 7)
-#define HC_HTXnTBLCb_Acur       (HC_XTC_Acur << 7)
-#define HC_HTXnTBLCb_HTXnTBLRC  (HC_XTC_HTXnTBLRC << 7)
-#define HC_HTXnTBLCb_Ctexnext   (HC_XTC_Ctexnext << 7)
-#define HC_HTXnTBLCc_TOPC       (HC_XTC_TOPC << 0)
-#define HC_HTXnTBLCc_InvTOPC    (HC_XTC_InvTOPC << 0)
-#define HC_HTXnTBLCc_TOPCp5     (HC_XTC_TOPCp5 << 0)
-#define HC_HTXnTBLCc_0          (HC_XTC_0 << 0)
-#define HC_HTXnTBLCc_Dif        (HC_XTC_Dif << 0)
-#define HC_HTXnTBLCc_Spec       (HC_XTC_Spec << 0)
-#define HC_HTXnTBLCc_Tex        (HC_XTC_Tex << 0)
-#define HC_HTXnTBLCc_Cur        (HC_XTC_Cur << 0)
-#define HC_HTXnTBLCc_Adif       (HC_XTC_Adif << 0)
-#define HC_HTXnTBLCc_Fog        (HC_XTC_Fog << 0)
-#define HC_HTXnTBLCc_Atex       (HC_XTC_Atex << 0)
-#define HC_HTXnTBLCc_Acur       (HC_XTC_Acur << 0)
-#define HC_HTXnTBLCc_HTXnTBLRC  (HC_XTC_HTXnTBLRC << 0)
-#define HC_HTXnTBLCc_Ctexnext   (HC_XTC_Ctexnext << 0)
-/* HC_SubA_HTXnTBLCop      0x0081
- */
-#define HC_HTXnTBLdot_MASK      0x00c00000
-#define HC_HTXnTBLCop_MASK      0x00380000
-#define HC_HTXnTBLCbias_MASK    0x0007c000
-#define HC_HTXnTBLCshift_MASK   0x00001800
-#define HC_HTXnTBLAop_MASK      0x00000380
-#define HC_HTXnTBLAbias_MASK    0x00000078
-#define HC_HTXnTBLAshift_MASK   0x00000003
-#define HC_HTXnTBLCop_Add       0x00000000
-#define HC_HTXnTBLCop_Sub       0x00080000
-#define HC_HTXnTBLCop_Min       0x00100000
-#define HC_HTXnTBLCop_Max       0x00180000
-#define HC_HTXnTBLCop_Mask      0x00200000
-#define HC_HTXnTBLCbias_Cbias           (HC_XTC_Cbias << 14)
-#define HC_HTXnTBLCbias_InvCbias        (HC_XTC_InvCbias << 14)
-#define HC_HTXnTBLCbias_0               (HC_XTC_0 << 14)
-#define HC_HTXnTBLCbias_Dif             (HC_XTC_Dif << 14)
-#define HC_HTXnTBLCbias_Spec            (HC_XTC_Spec << 14)
-#define HC_HTXnTBLCbias_Tex             (HC_XTC_Tex << 14)
-#define HC_HTXnTBLCbias_Cur             (HC_XTC_Cur << 14)
-#define HC_HTXnTBLCbias_Adif            (HC_XTC_Adif << 14)
-#define HC_HTXnTBLCbias_Fog             (HC_XTC_Fog << 14)
-#define HC_HTXnTBLCbias_Atex            (HC_XTC_Atex << 14)
-#define HC_HTXnTBLCbias_Acur            (HC_XTC_Acur << 14)
-#define HC_HTXnTBLCbias_HTXnTBLRC       (HC_XTC_HTXnTBLRC << 14)
-#define HC_HTXnTBLCshift_1      0x00000000
-#define HC_HTXnTBLCshift_2      0x00000800
-#define HC_HTXnTBLCshift_No     0x00001000
-#define HC_HTXnTBLCshift_DotP   0x00001800
-/*=* John Sheng [2003.7.18] texture combine *=*/
-#define HC_HTXnTBLDOT3   0x00080000
-#define HC_HTXnTBLDOT4   0x000C0000
-
-#define HC_HTXnTBLAop_Add       0x00000000
-#define HC_HTXnTBLAop_Sub       0x00000080
-#define HC_HTXnTBLAop_Min       0x00000100
-#define HC_HTXnTBLAop_Max       0x00000180
-#define HC_HTXnTBLAop_Mask      0x00000200
-#define HC_HTXnTBLAbias_Inv             0x00000040
-#define HC_HTXnTBLAbias_Adif            0x00000000
-#define HC_HTXnTBLAbias_Fog             0x00000008
-#define HC_HTXnTBLAbias_Acur            0x00000010
-#define HC_HTXnTBLAbias_HTXnTBLRAbias   0x00000018
-#define HC_HTXnTBLAbias_Atex            0x00000020
-#define HC_HTXnTBLAshift_1      0x00000000
-#define HC_HTXnTBLAshift_2      0x00000001
-#define HC_HTXnTBLAshift_No     0x00000002
-/* #define HC_HTXnTBLAshift_DotP   0x00000003 */
-/* HC_SubA_HTXnTBLMPFog    0x0082
- */
-#define HC_HTXnTBLMPfog_MASK    0x00e00000
-#define HC_HTXnTBLMPfog_0       0x00000000
-#define HC_HTXnTBLMPfog_Adif    0x00200000
-#define HC_HTXnTBLMPfog_Fog     0x00400000
-#define HC_HTXnTBLMPfog_Atex    0x00600000
-#define HC_HTXnTBLMPfog_Acur    0x00800000
-#define HC_HTXnTBLMPfog_GHTXnTBLRFog    0x00a00000
-/* HC_SubA_HTXnTBLAsat     0x0083
- *-- Define the texture alpha input.
- */
-#define HC_XTA_TOPA             0x00000000
-#define HC_XTA_InvTOPA          0x00000008
-#define HC_XTA_TOPAp5           0x00000010
-#define HC_XTA_Adif             0x00000000
-#define HC_XTA_Fog              0x00000001
-#define HC_XTA_Acur             0x00000002
-#define HC_XTA_HTXnTBLRA        0x00000003
-#define HC_XTA_Atex             0x00000004
-#define HC_XTA_Atexnext         0x00000005
-/*--
- */
-#define HC_HTXnTBLAsat_MASK     0x00800000
-#define HC_HTXnTBLAMB_MASK      0x00700000
-#define HC_HTXnTBLAa_MASK       0x0007c000
-#define HC_HTXnTBLAb_MASK       0x00000f80
-#define HC_HTXnTBLAc_MASK       0x0000001f
-#define HC_HTXnTBLAMB_SHIFT     20
-#define HC_HTXnTBLAa_TOPA       (HC_XTA_TOPA << 14)
-#define HC_HTXnTBLAa_InvTOPA    (HC_XTA_InvTOPA << 14)
-#define HC_HTXnTBLAa_TOPAp5     (HC_XTA_TOPAp5 << 14)
-#define HC_HTXnTBLAa_Adif       (HC_XTA_Adif << 14)
-#define HC_HTXnTBLAa_Fog        (HC_XTA_Fog << 14)
-#define HC_HTXnTBLAa_Acur       (HC_XTA_Acur << 14)
-#define HC_HTXnTBLAa_HTXnTBLRA  (HC_XTA_HTXnTBLRA << 14)
-#define HC_HTXnTBLAa_Atex       (HC_XTA_Atex << 14)
-#define HC_HTXnTBLAa_Atexnext   (HC_XTA_Atexnext << 14)
-#define HC_HTXnTBLAb_TOPA       (HC_XTA_TOPA << 7)
-#define HC_HTXnTBLAb_InvTOPA    (HC_XTA_InvTOPA << 7)
-#define HC_HTXnTBLAb_TOPAp5     (HC_XTA_TOPAp5 << 7)
-#define HC_HTXnTBLAb_Adif       (HC_XTA_Adif << 7)
-#define HC_HTXnTBLAb_Fog        (HC_XTA_Fog << 7)
-#define HC_HTXnTBLAb_Acur       (HC_XTA_Acur << 7)
-#define HC_HTXnTBLAb_HTXnTBLRA  (HC_XTA_HTXnTBLRA << 7)
-#define HC_HTXnTBLAb_Atex       (HC_XTA_Atex << 7)
-#define HC_HTXnTBLAb_Atexnext   (HC_XTA_Atexnext << 7)
-#define HC_HTXnTBLAc_TOPA       (HC_XTA_TOPA << 0)
-#define HC_HTXnTBLAc_InvTOPA    (HC_XTA_InvTOPA << 0)
-#define HC_HTXnTBLAc_TOPAp5     (HC_XTA_TOPAp5 << 0)
-#define HC_HTXnTBLAc_Adif       (HC_XTA_Adif << 0)
-#define HC_HTXnTBLAc_Fog        (HC_XTA_Fog << 0)
-#define HC_HTXnTBLAc_Acur       (HC_XTA_Acur << 0)
-#define HC_HTXnTBLAc_HTXnTBLRA  (HC_XTA_HTXnTBLRA << 0)
-#define HC_HTXnTBLAc_Atex       (HC_XTA_Atex << 0)
-#define HC_HTXnTBLAc_Atexnext   (HC_XTA_Atexnext << 0)
-/* HC_SubA_HTXnTBLRAa      0x0089
- */
-#define HC_HTXnTBLRAa_MASK      0x00ff0000
-#define HC_HTXnTBLRAb_MASK      0x0000ff00
-#define HC_HTXnTBLRAc_MASK      0x000000ff
-#define HC_HTXnTBLRAa_SHIFT     16
-#define HC_HTXnTBLRAb_SHIFT     8
-#define HC_HTXnTBLRAc_SHIFT     0
-/* HC_SubA_HTXnTBLRFog     0x008a
- */
-#define HC_HTXnTBLRFog_MASK     0x0000ff00
-#define HC_HTXnTBLRAbias_MASK   0x000000ff
-#define HC_HTXnTBLRFog_SHIFT    8
-#define HC_HTXnTBLRAbias_SHIFT  0
-/* HC_SubA_HTXnLScale      0x0094
- */
-#define HC_HTXnLScale_MASK      0x0007fc00
-#define HC_HTXnLOff_MASK        0x000001ff
-#define HC_HTXnLScale_SHIFT     10
-/* HC_SubA_HTXSMD          0x0000
- */
-#define HC_HTXSMD_MASK          0x00000080
-#define HC_HTXTMD_MASK          0x00000040
-#define HC_HTXNum_MASK          0x00000038
-#define HC_HTXTRMD_MASK         0x00000006
-#define HC_HTXCHCLR_MASK        0x00000001
-#define HC_HTXNum_SHIFT         3
-
-/* Texture Palette n
- */
-#define HC_SubType_TexPalette0  0x00000000
-#define HC_SubType_TexPalette1  0x00000001
-#define HC_SubType_FogTable     0x00000010
-#define HC_SubType_Stipple      0x00000014
-/* HC_SubA_TexPalette0     0x0000
- */
-#define HC_HTPnA_MASK           0xff000000
-#define HC_HTPnR_MASK           0x00ff0000
-#define HC_HTPnG_MASK           0x0000ff00
-#define HC_HTPnB_MASK           0x000000ff
-/* HC_SubA_FogTable        0x0010
- */
-#define HC_HFPn3_MASK           0xff000000
-#define HC_HFPn2_MASK           0x00ff0000
-#define HC_HFPn1_MASK           0x0000ff00
-#define HC_HFPn_MASK            0x000000ff
-#define HC_HFPn3_SHIFT          24
-#define HC_HFPn2_SHIFT          16
-#define HC_HFPn1_SHIFT          8
-
-/* Auto Testing & Security
- */
-#define HC_SubA_HenFIFOAT       0x0000
-#define HC_SubA_HFBDrawFirst    0x0004
-#define HC_SubA_HFBBasL         0x0005
-#define HC_SubA_HFBDst          0x0006
-/* HC_SubA_HenFIFOAT       0x0000
- */
-#define HC_HenFIFOAT_MASK       0x00000020
-#define HC_HenGEMILock_MASK     0x00000010
-#define HC_HenFBASwap_MASK      0x00000008
-#define HC_HenOT_MASK           0x00000004
-#define HC_HenCMDQ_MASK         0x00000002
-#define HC_HenTXCTSU_MASK       0x00000001
-/* HC_SubA_HFBDrawFirst    0x0004
- */
-#define HC_HFBDrawFirst_MASK    0x00000800
-#define HC_HFBQueue_MASK        0x00000400
-#define HC_HFBLock_MASK         0x00000200
-#define HC_HEOF_MASK            0x00000100
-#define HC_HFBBasH_MASK         0x000000ff
-
-/* GEMI Setting
- */
-#define HC_SubA_HTArbRCM        0x0008
-#define HC_SubA_HTArbRZ         0x000a
-#define HC_SubA_HTArbWZ         0x000b
-#define HC_SubA_HTArbRTX        0x000c
-#define HC_SubA_HTArbRCW        0x000d
-#define HC_SubA_HTArbE2         0x000e
-#define HC_SubA_HArbRQCM        0x0010
-#define HC_SubA_HArbWQCM        0x0011
-#define HC_SubA_HGEMITout       0x0020
-#define HC_SubA_HFthRTXD        0x0040
-#define HC_SubA_HFthRTXA        0x0044
-#define HC_SubA_HCMDQstL        0x0050
-#define HC_SubA_HCMDQendL       0x0051
-#define HC_SubA_HCMDQLen        0x0052
-/* HC_SubA_HTArbRCM        0x0008
- */
-#define HC_HTArbRCM_MASK        0x0000ffff
-/* HC_SubA_HTArbRZ         0x000a
- */
-#define HC_HTArbRZ_MASK         0x0000ffff
-/* HC_SubA_HTArbWZ         0x000b
- */
-#define HC_HTArbWZ_MASK         0x0000ffff
-/* HC_SubA_HTArbRTX        0x000c
- */
-#define HC_HTArbRTX_MASK        0x0000ffff
-/* HC_SubA_HTArbRCW        0x000d
- */
-#define HC_HTArbRCW_MASK        0x0000ffff
-/* HC_SubA_HTArbE2         0x000e
- */
-#define HC_HTArbE2_MASK         0x0000ffff
-/* HC_SubA_HArbRQCM        0x0010
- */
-#define HC_HTArbRQCM_MASK       0x0000ffff
-/* HC_SubA_HArbWQCM        0x0011
- */
-#define HC_HArbWQCM_MASK        0x0000ffff
-/* HC_SubA_HGEMITout       0x0020
- */
-#define HC_HGEMITout_MASK       0x000f0000
-#define HC_HNPArbZC_MASK        0x0000ffff
-#define HC_HGEMITout_SHIFT      16
-/* HC_SubA_HFthRTXD        0x0040
- */
-#define HC_HFthRTXD_MASK        0x00ff0000
-#define HC_HFthRZD_MASK         0x0000ff00
-#define HC_HFthWZD_MASK         0x000000ff
-#define HC_HFthRTXD_SHIFT       16
-#define HC_HFthRZD_SHIFT        8
-/* HC_SubA_HFthRTXA        0x0044
- */
-#define HC_HFthRTXA_MASK        0x000000ff
-
-/****************************************************************************
- * Define the Halcyon Internal register access constants. For simulator only.
- ***************************************************************************/
-#define HC_SIMA_HAGPBstL        0x0000
-#define HC_SIMA_HAGPBendL       0x0001
-#define HC_SIMA_HAGPCMNT        0x0002
-#define HC_SIMA_HAGPBpL         0x0003
-#define HC_SIMA_HAGPBpH         0x0004
-#define HC_SIMA_HClipTB         0x0005
-#define HC_SIMA_HClipLR         0x0006
-#define HC_SIMA_HFPClipTL       0x0007
-#define HC_SIMA_HFPClipBL       0x0008
-#define HC_SIMA_HFPClipLL       0x0009
-#define HC_SIMA_HFPClipRL       0x000a
-#define HC_SIMA_HFPClipTBH      0x000b
-#define HC_SIMA_HFPClipLRH      0x000c
-#define HC_SIMA_HLP             0x000d
-#define HC_SIMA_HLPRF           0x000e
-#define HC_SIMA_HSolidCL        0x000f
-#define HC_SIMA_HPixGC          0x0010
-#define HC_SIMA_HSPXYOS         0x0011
-#define HC_SIMA_HCmdA           0x0012
-#define HC_SIMA_HCmdB           0x0013
-#define HC_SIMA_HEnable         0x0014
-#define HC_SIMA_HZWBBasL        0x0015
-#define HC_SIMA_HZWBBasH        0x0016
-#define HC_SIMA_HZWBType        0x0017
-#define HC_SIMA_HZBiasL         0x0018
-#define HC_SIMA_HZWBend         0x0019
-#define HC_SIMA_HZWTMD          0x001a
-#define HC_SIMA_HZWCDL          0x001b
-#define HC_SIMA_HZWCTAGnum      0x001c
-#define HC_SIMA_HZCYNum         0x001d
-#define HC_SIMA_HZWCFire        0x001e
-/* #define HC_SIMA_HSBBasL         0x001d */
-/* #define HC_SIMA_HSBBasH         0x001e */
-/* #define HC_SIMA_HSBFM           0x001f */
-#define HC_SIMA_HSTREF          0x0020
-#define HC_SIMA_HSTMD           0x0021
-#define HC_SIMA_HABBasL         0x0022
-#define HC_SIMA_HABBasH         0x0023
-#define HC_SIMA_HABFM           0x0024
-#define HC_SIMA_HATMD           0x0025
-#define HC_SIMA_HABLCsat        0x0026
-#define HC_SIMA_HABLCop         0x0027
-#define HC_SIMA_HABLAsat        0x0028
-#define HC_SIMA_HABLAop         0x0029
-#define HC_SIMA_HABLRCa         0x002a
-#define HC_SIMA_HABLRFCa        0x002b
-#define HC_SIMA_HABLRCbias      0x002c
-#define HC_SIMA_HABLRCb         0x002d
-#define HC_SIMA_HABLRFCb        0x002e
-#define HC_SIMA_HABLRAa         0x002f
-#define HC_SIMA_HABLRAb         0x0030
-#define HC_SIMA_HDBBasL         0x0031
-#define HC_SIMA_HDBBasH         0x0032
-#define HC_SIMA_HDBFM           0x0033
-#define HC_SIMA_HFBBMSKL        0x0034
-#define HC_SIMA_HROP            0x0035
-#define HC_SIMA_HFogLF          0x0036
-#define HC_SIMA_HFogCL          0x0037
-#define HC_SIMA_HFogCH          0x0038
-#define HC_SIMA_HFogStL         0x0039
-#define HC_SIMA_HFogStH         0x003a
-#define HC_SIMA_HFogOOdMF       0x003b
-#define HC_SIMA_HFogOOdEF       0x003c
-#define HC_SIMA_HFogEndL        0x003d
-#define HC_SIMA_HFogDenst       0x003e
-/*---- start of texture 0 setting ----
- */
-#define HC_SIMA_HTX0L0BasL      0x0040
-#define HC_SIMA_HTX0L1BasL      0x0041
-#define HC_SIMA_HTX0L2BasL      0x0042
-#define HC_SIMA_HTX0L3BasL      0x0043
-#define HC_SIMA_HTX0L4BasL      0x0044
-#define HC_SIMA_HTX0L5BasL      0x0045
-#define HC_SIMA_HTX0L6BasL      0x0046
-#define HC_SIMA_HTX0L7BasL      0x0047
-#define HC_SIMA_HTX0L8BasL      0x0048
-#define HC_SIMA_HTX0L9BasL      0x0049
-#define HC_SIMA_HTX0LaBasL      0x004a
-#define HC_SIMA_HTX0LbBasL      0x004b
-#define HC_SIMA_HTX0LcBasL      0x004c
-#define HC_SIMA_HTX0LdBasL      0x004d
-#define HC_SIMA_HTX0LeBasL      0x004e
-#define HC_SIMA_HTX0LfBasL      0x004f
-#define HC_SIMA_HTX0L10BasL     0x0050
-#define HC_SIMA_HTX0L11BasL     0x0051
-#define HC_SIMA_HTX0L012BasH    0x0052
-#define HC_SIMA_HTX0L345BasH    0x0053
-#define HC_SIMA_HTX0L678BasH    0x0054
-#define HC_SIMA_HTX0L9abBasH    0x0055
-#define HC_SIMA_HTX0LcdeBasH    0x0056
-#define HC_SIMA_HTX0Lf1011BasH  0x0057
-#define HC_SIMA_HTX0L0Pit       0x0058
-#define HC_SIMA_HTX0L1Pit       0x0059
-#define HC_SIMA_HTX0L2Pit       0x005a
-#define HC_SIMA_HTX0L3Pit       0x005b
-#define HC_SIMA_HTX0L4Pit       0x005c
-#define HC_SIMA_HTX0L5Pit       0x005d
-#define HC_SIMA_HTX0L6Pit       0x005e
-#define HC_SIMA_HTX0L7Pit       0x005f
-#define HC_SIMA_HTX0L8Pit       0x0060
-#define HC_SIMA_HTX0L9Pit       0x0061
-#define HC_SIMA_HTX0LaPit       0x0062
-#define HC_SIMA_HTX0LbPit       0x0063
-#define HC_SIMA_HTX0LcPit       0x0064
-#define HC_SIMA_HTX0LdPit       0x0065
-#define HC_SIMA_HTX0LePit       0x0066
-#define HC_SIMA_HTX0LfPit       0x0067
-#define HC_SIMA_HTX0L10Pit      0x0068
-#define HC_SIMA_HTX0L11Pit      0x0069
-#define HC_SIMA_HTX0L0_5WE      0x006a
-#define HC_SIMA_HTX0L6_bWE      0x006b
-#define HC_SIMA_HTX0Lc_11WE     0x006c
-#define HC_SIMA_HTX0L0_5HE      0x006d
-#define HC_SIMA_HTX0L6_bHE      0x006e
-#define HC_SIMA_HTX0Lc_11HE     0x006f
-#define HC_SIMA_HTX0L0OS        0x0070
-#define HC_SIMA_HTX0TB          0x0071
-#define HC_SIMA_HTX0MPMD        0x0072
-#define HC_SIMA_HTX0CLODu       0x0073
-#define HC_SIMA_HTX0FM          0x0074
-#define HC_SIMA_HTX0TRCH        0x0075
-#define HC_SIMA_HTX0TRCL        0x0076
-#define HC_SIMA_HTX0TBC         0x0077
-#define HC_SIMA_HTX0TRAH        0x0078
-#define HC_SIMA_HTX0TBLCsat     0x0079
-#define HC_SIMA_HTX0TBLCop      0x007a
-#define HC_SIMA_HTX0TBLMPfog    0x007b
-#define HC_SIMA_HTX0TBLAsat     0x007c
-#define HC_SIMA_HTX0TBLRCa      0x007d
-#define HC_SIMA_HTX0TBLRCb      0x007e
-#define HC_SIMA_HTX0TBLRCc      0x007f
-#define HC_SIMA_HTX0TBLRCbias   0x0080
-#define HC_SIMA_HTX0TBLRAa      0x0081
-#define HC_SIMA_HTX0TBLRFog     0x0082
-#define HC_SIMA_HTX0BumpM00     0x0083
-#define HC_SIMA_HTX0BumpM01     0x0084
-#define HC_SIMA_HTX0BumpM10     0x0085
-#define HC_SIMA_HTX0BumpM11     0x0086
-#define HC_SIMA_HTX0LScale      0x0087
-/*---- end of texture 0 setting ----      0x008f
- */
-#define HC_SIMA_TX0TX1_OFF      0x0050
-/*---- start of texture 1 setting ----
- */
-#define HC_SIMA_HTX1L0BasL       (HC_SIMA_HTX0L0BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L1BasL       (HC_SIMA_HTX0L1BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L2BasL       (HC_SIMA_HTX0L2BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L3BasL       (HC_SIMA_HTX0L3BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L4BasL       (HC_SIMA_HTX0L4BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L5BasL       (HC_SIMA_HTX0L5BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L6BasL       (HC_SIMA_HTX0L6BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L7BasL       (HC_SIMA_HTX0L7BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L8BasL       (HC_SIMA_HTX0L8BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L9BasL       (HC_SIMA_HTX0L9BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LaBasL       (HC_SIMA_HTX0LaBasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LbBasL       (HC_SIMA_HTX0LbBasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LcBasL       (HC_SIMA_HTX0LcBasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LdBasL       (HC_SIMA_HTX0LdBasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LeBasL       (HC_SIMA_HTX0LeBasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LfBasL       (HC_SIMA_HTX0LfBasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L10BasL      (HC_SIMA_HTX0L10BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L11BasL      (HC_SIMA_HTX0L11BasL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L012BasH     (HC_SIMA_HTX0L012BasH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L345BasH     (HC_SIMA_HTX0L345BasH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L678BasH     (HC_SIMA_HTX0L678BasH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L9abBasH     (HC_SIMA_HTX0L9abBasH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LcdeBasH     (HC_SIMA_HTX0LcdeBasH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1Lf1011BasH   (HC_SIMA_HTX0Lf1011BasH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L0Pit        (HC_SIMA_HTX0L0Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L1Pit        (HC_SIMA_HTX0L1Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L2Pit        (HC_SIMA_HTX0L2Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L3Pit        (HC_SIMA_HTX0L3Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L4Pit        (HC_SIMA_HTX0L4Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L5Pit        (HC_SIMA_HTX0L5Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L6Pit        (HC_SIMA_HTX0L6Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L7Pit        (HC_SIMA_HTX0L7Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L8Pit        (HC_SIMA_HTX0L8Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L9Pit        (HC_SIMA_HTX0L9Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LaPit        (HC_SIMA_HTX0LaPit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LbPit        (HC_SIMA_HTX0LbPit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LcPit        (HC_SIMA_HTX0LcPit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LdPit        (HC_SIMA_HTX0LdPit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LePit        (HC_SIMA_HTX0LePit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LfPit        (HC_SIMA_HTX0LfPit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L10Pit       (HC_SIMA_HTX0L10Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L11Pit       (HC_SIMA_HTX0L11Pit + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L0_5WE       (HC_SIMA_HTX0L0_5WE + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L6_bWE       (HC_SIMA_HTX0L6_bWE + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1Lc_11WE      (HC_SIMA_HTX0Lc_11WE + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L0_5HE       (HC_SIMA_HTX0L0_5HE + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L6_bHE       (HC_SIMA_HTX0L6_bHE + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1Lc_11HE      (HC_SIMA_HTX0Lc_11HE + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1L0OS         (HC_SIMA_HTX0L0OS + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TB           (HC_SIMA_HTX0TB + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1MPMD         (HC_SIMA_HTX0MPMD + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1CLODu        (HC_SIMA_HTX0CLODu + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1FM           (HC_SIMA_HTX0FM + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TRCH         (HC_SIMA_HTX0TRCH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TRCL         (HC_SIMA_HTX0TRCL + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBC          (HC_SIMA_HTX0TBC + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TRAH         (HC_SIMA_HTX0TRAH + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LTC          (HC_SIMA_HTX0LTC + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LTA          (HC_SIMA_HTX0LTA + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLCsat      (HC_SIMA_HTX0TBLCsat + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLCop       (HC_SIMA_HTX0TBLCop + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLMPfog     (HC_SIMA_HTX0TBLMPfog + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLAsat      (HC_SIMA_HTX0TBLAsat + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLRCa       (HC_SIMA_HTX0TBLRCa + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLRCb       (HC_SIMA_HTX0TBLRCb + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLRCc       (HC_SIMA_HTX0TBLRCc + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLRCbias    (HC_SIMA_HTX0TBLRCbias + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLRAa       (HC_SIMA_HTX0TBLRAa + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1TBLRFog      (HC_SIMA_HTX0TBLRFog + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1BumpM00      (HC_SIMA_HTX0BumpM00 + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1BumpM01      (HC_SIMA_HTX0BumpM01 + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1BumpM10      (HC_SIMA_HTX0BumpM10 + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1BumpM11      (HC_SIMA_HTX0BumpM11 + HC_SIMA_TX0TX1_OFF)
-#define HC_SIMA_HTX1LScale       (HC_SIMA_HTX0LScale + HC_SIMA_TX0TX1_OFF)
-/*---- end of texture 1 setting ---- 0xaf
- */
-#define HC_SIMA_HTXSMD          0x00b0
-#define HC_SIMA_HenFIFOAT       0x00b1
-#define HC_SIMA_HFBDrawFirst    0x00b2
-#define HC_SIMA_HFBBasL         0x00b3
-#define HC_SIMA_HTArbRCM        0x00b4
-#define HC_SIMA_HTArbRZ         0x00b5
-#define HC_SIMA_HTArbWZ         0x00b6
-#define HC_SIMA_HTArbRTX        0x00b7
-#define HC_SIMA_HTArbRCW        0x00b8
-#define HC_SIMA_HTArbE2         0x00b9
-#define HC_SIMA_HGEMITout       0x00ba
-#define HC_SIMA_HFthRTXD        0x00bb
-#define HC_SIMA_HFthRTXA        0x00bc
-/* Define the texture palette 0
- */
-#define HC_SIMA_HTP0            0x0100
-#define HC_SIMA_HTP1            0x0200
-#define HC_SIMA_FOGTABLE        0x0300
-#define HC_SIMA_STIPPLE         0x0400
-#define HC_SIMA_HE3Fire         0x0440
-#define HC_SIMA_TRANS_SET       0x0441
-#define HC_SIMA_HREngSt         0x0442
-#define HC_SIMA_HRFIFOempty     0x0443
-#define HC_SIMA_HRFIFOfull      0x0444
-#define HC_SIMA_HRErr           0x0445
-#define HC_SIMA_FIFOstatus      0x0446
-
-/****************************************************************************
- * Define the AGP command header.
- ***************************************************************************/
-#define HC_ACMD_MASK            0xfe000000
-#define HC_ACMD_SUB_MASK        0x0c000000
-#define HC_ACMD_HCmdA           0xee000000
-#define HC_ACMD_HCmdB           0xec000000
-#define HC_ACMD_HCmdC           0xea000000
-#define HC_ACMD_H1              0xf0000000
-#define HC_ACMD_H2              0xf2000000
-#define HC_ACMD_H3              0xf4000000
-#define HC_ACMD_H4              0xf6000000
-
-#define HC_ACMD_H1IO_MASK       0x000001ff
-#define HC_ACMD_H2IO1_MASK      0x001ff000
-#define HC_ACMD_H2IO2_MASK      0x000001ff
-#define HC_ACMD_H2IO1_SHIFT     12
-#define HC_ACMD_H2IO2_SHIFT     0
-#define HC_ACMD_H3IO_MASK       0x000001ff
-#define HC_ACMD_H3COUNT_MASK    0x01fff000
-#define HC_ACMD_H3COUNT_SHIFT   12
-#define HC_ACMD_H4ID_MASK       0x000001ff
-#define HC_ACMD_H4COUNT_MASK    0x01fffe00
-#define HC_ACMD_H4COUNT_SHIFT   9
-
-/*****************************************************************************
- * Define Header
- ****************************************************************************/
-#define HC_HEADER2        0xF210F110
-
-/*****************************************************************************
- * Define Dummy Value
- ****************************************************************************/
-#define HC_DUMMY        0xCCCCCCCC
-/*****************************************************************************
- * Define for DMA use
- ****************************************************************************/
-#define HALCYON_HEADER2     0XF210F110
-#define HALCYON_FIRECMD     0XEE100000
-#define HALCYON_FIREMASK    0XFFF00000
-#define HALCYON_CMDB        0XEC000000
-#define HALCYON_CMDBMASK    0XFFFE0000
-#define HALCYON_SUB_ADDR0   0X00000000
-#define HALCYON_HEADER1MASK 0XFFFFFC00
-#define HALCYON_HEADER1     0XF0000000
-#define HC_SubA_HAGPBstL        0x0060
-#define HC_SubA_HAGPBendL       0x0061
-#define HC_SubA_HAGPCMNT        0x0062
-#define HC_SubA_HAGPBpL         0x0063
-#define HC_SubA_HAGPBpH         0x0064
-#define HC_HAGPCMNT_MASK        0x00800000
-#define HC_HCmdErrClr_MASK      0x00400000
-#define HC_HAGPBendH_MASK       0x0000ff00
-#define HC_HAGPBstH_MASK        0x000000ff
-#define HC_HAGPBendH_SHIFT      8
-#define HC_HAGPBstH_SHIFT       0
-#define HC_HAGPBpL_MASK         0x00fffffc
-#define HC_HAGPBpID_MASK        0x00000003
-#define HC_HAGPBpID_PAUSE       0x00000000
-#define HC_HAGPBpID_JUMP        0x00000001
-#define HC_HAGPBpID_STOP        0x00000002
-#define HC_HAGPBpH_MASK         0x00ffffff
-
-
-#define VIA_VIDEO_HEADER5       0xFE040000
-#define VIA_VIDEO_HEADER6       0xFE050000
-#define VIA_VIDEO_HEADER7       0xFE060000
-#define VIA_VIDEOMASK           0xFFFF0000
-
-/*****************************************************************************
- * Define for H5 DMA use
- ****************************************************************************/
-#define H5_HC_DUMMY                    0xCC000000
-
-/* Command Header Type */
-#define INV_DUMMY_MASK         0xFF000000
-#define INV_AGPHeader0              0xFE000000
-#define INV_AGPHeader1              0xFE010000
-#define INV_AGPHeader2              0xFE020000
-#define INV_AGPHeader3              0xFE030000
-#define INV_AGPHeader4              0xFE040000
-#define INV_AGPHeader5              0xFE050000
-#define INV_AGPHeader6              0xFE060000
-#define INV_AGPHeader7              0xFE070000
-#define INV_AGPHeader9              0xFE090000
-#define INV_AGPHeaderA              0xFE0A0000
-#define INV_AGPHeader40             0xFE400000
-#define INV_AGPHeader41             0xFE410000
-#define INV_AGPHeader43             0xFE430000
-#define INV_AGPHeader45             0xFE450000
-#define INV_AGPHeader47             0xFE470000
-#define INV_AGPHeader4A             0xFE4A0000
-#define INV_AGPHeader82             0xFE820000
-#define INV_AGPHeader83             0xFE830000
-#define INV_AGPHeader_MASK          0xFFFF0000
-#define INV_AGPHeader2A             0xFE2A0000
-#define INV_AGPHeader25             0xFE250000
-#define INV_AGPHeader20             0xFE200000
-#define INV_AGPHeader23             0xFE230000
-#define INV_AGPHeaderE2             0xFEE20000
-#define INV_AGPHeaderE3             0xFEE30000
-
-/*Transmission IO Space*/
-#define INV_REG_CR_TRANS            0x041C
-#define INV_REG_CR_BEGIN            0x0420
-#define INV_REG_CR_END              0x0438
-
-#define INV_REG_3D_TRANS            0x043C
-#define INV_REG_3D_BEGIN            0x0440
-#define INV_REG_3D_END              0x06FC
-
-#define INV_ParaType_CmdVdata        0x0000
-
-/* H5 Enable Setting
- */
-#define INV_HC_SubA_HEnable1        0x00
-
-#define INV_HC_HenAT4ALLRT_MASK     0x00100000
-#define INV_HC_HenATMRT3_MASK       0x00080000
-#define INV_HC_HenATMRT2_MASK       0x00040000
-#define INV_HC_HenATMRT1_MASK       0x00020000
-#define INV_HC_HenATMRT0_MASK        0x00010000
-#define INV_HC_HenSCMRT3_MASK        0x00008000
-#define INV_HC_HenSCMRT2_MASK        0x00004000
-#define INV_HC_HenSCMRT1_MASK        0x00002000
-#define INV_HC_HenSCMRT0_MASK        0x00001000
-#define INV_HC_HenFOGMRT3_MASK        0x00000800
-#define INV_HC_HenFOGMRT2_MASK        0x00000400
-#define INV_HC_HenFOGMRT1_MASK        0x00000200
-#define INV_HC_HenFOGMRT0_MASK        0x00000100
-#define INV_HC_HenABLMRT3_MASK        0x00000080
-#define INV_HC_HenABLMRT2_MASK        0x00000040
-#define INV_HC_HenABLMRT1_MASK        0x00000020
-#define INV_HC_HenABLMRT0_MASK        0x00000010
-#define INV_HC_HenDTMRT3_MASK        0x00000008
-#define INV_HC_HenDTMRT2_MASK        0x00000004
-#define INV_HC_HenDTMRT1_MASK        0x00000002
-#define INV_HC_HenDTMRT0_MASK        0x00000001
-
-#define INV_HC_SubA_HEnable2        0x01
-
-#define INV_HC_HenLUL2DR_MASK         0x00800000
-#define INV_HC_HenLDIAMOND_MASK     0x00400000
-#define INV_HC_HenPSPRITE_MASK         0x00200000
-#define INV_HC_HenC2S_MASK             0x00100000
-#define INV_HC_HenFOGPP_MASK           0x00080000
-#define INV_HC_HenSCPP_MASK           0x00040000
-#define INV_HC_HenCPP_MASK           0x00020000
-#define INV_HC_HenCZ_MASK            0x00002000
-#define INV_HC_HenVC_MASK            0x00001000
-#define INV_HC_HenCL_MASK            0x00000800
-#define INV_HC_HenPS_MASK            0x00000400
-#define INV_HC_HenWCZ_MASK            0x00000200
-#define INV_HC_HenTXCH_MASK            0x00000100
-#define INV_HC_HenBFCULL_MASK        0x00000080
-#define INV_HC_HenCW_MASK            0x00000040
-#define INV_HC_HenAA_MASK            0x00000020
-#define INV_HC_HenST_MASK            0x00000010
-#define INV_HC_HenZT_MASK            0x00000008
-#define INV_HC_HenZW_MASK            0x00000004
-#define INV_HC_HenSP_MASK            0x00000002
-#define INV_HC_HenLP_MASK            0x00000001
-
-/* H5 Miscellaneous Settings
- */
-#define INV_HC_SubA_HCClipTL           0x0080
-#define INV_HC_SubA_HCClipBL           0x0081
-#define INV_HC_SubA_HSClipTL           0x0082
-#define INV_HC_SubA_HSClipBL           0x0083
-#define INV_HC_SubA_HSolidCL        0x0086
-#define INV_HC_SubA_HSolidCH        0x0087
-#define INV_HC_SubA_HGBClipGL       0x0088
-#define INV_HC_SubA_HGBClipGR       0x0089
-
-
-#define INV_HC_ParaType_Vetex        0x00040000
-
-#endif
diff --git a/drivers/gpu/drm/via/via_dri1.c b/drivers/gpu/drm/via/via_dri1.c
deleted file mode 100644 (file)
index 217d1e8..0000000
+++ /dev/null
@@ -1,3630 +0,0 @@
-/*
- * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
- * Copyright 2002 Tungsten Graphics, Inc.
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. All Rights Reserved.
- * Copyright 2006 Tungsten Graphics Inc., Bismarck, ND., USA.
- * Copyright 2004 Digeo, Inc., Palo Alto, CA, U.S.A. All Rights Reserved.
- * Copyright 2004 The Unichrome project. All Rights Reserved.
- * Copyright 2004 BEAM Ltd.
- * Copyright 2005 Thomas Hellstrom. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-#include <linux/delay.h>
-#include <linux/module.h>
-#include <linux/pci.h>
-#include <linux/vmalloc.h>
-
-#include <drm/drm_drv.h>
-#include <drm/drm_file.h>
-#include <drm/drm_ioctl.h>
-#include <drm/drm_legacy.h>
-#include <drm/drm_mm.h>
-#include <drm/drm_pciids.h>
-#include <drm/drm_print.h>
-#include <drm/drm_vblank.h>
-#include <drm/via_drm.h>
-
-#include "via_3d_reg.h"
-
-#define DRIVER_AUTHOR  "Various"
-
-#define DRIVER_NAME            "via"
-#define DRIVER_DESC            "VIA Unichrome / Pro"
-#define DRIVER_DATE            "20070202"
-
-#define DRIVER_MAJOR           2
-#define DRIVER_MINOR           11
-#define DRIVER_PATCHLEVEL      1
-
-typedef enum {
-       no_sequence = 0,
-       z_address,
-       dest_address,
-       tex_address
-} drm_via_sequence_t;
-
-typedef struct {
-       unsigned texture;
-       uint32_t z_addr;
-       uint32_t d_addr;
-       uint32_t t_addr[2][10];
-       uint32_t pitch[2][10];
-       uint32_t height[2][10];
-       uint32_t tex_level_lo[2];
-       uint32_t tex_level_hi[2];
-       uint32_t tex_palette_size[2];
-       uint32_t tex_npot[2];
-       drm_via_sequence_t unfinished;
-       int agp_texture;
-       int multitex;
-       struct drm_device *dev;
-       drm_local_map_t *map_cache;
-       uint32_t vertex_count;
-       int agp;
-       const uint32_t *buf_start;
-} drm_via_state_t;
-
-#define VIA_PCI_BUF_SIZE 60000
-#define VIA_FIRE_BUF_SIZE  1024
-#define VIA_NUM_IRQS 4
-
-
-#define VIA_NUM_BLIT_ENGINES 2
-#define VIA_NUM_BLIT_SLOTS 8
-
-struct _drm_via_descriptor;
-
-typedef struct _drm_via_sg_info {
-       struct page **pages;
-       unsigned long num_pages;
-       struct _drm_via_descriptor **desc_pages;
-       int num_desc_pages;
-       int num_desc;
-       enum dma_data_direction direction;
-       unsigned char *bounce_buffer;
-       dma_addr_t chain_start;
-       uint32_t free_on_sequence;
-       unsigned int descriptors_per_page;
-       int aborted;
-       enum {
-               dr_via_device_mapped,
-               dr_via_desc_pages_alloc,
-               dr_via_pages_locked,
-               dr_via_pages_alloc,
-               dr_via_sg_init
-       } state;
-} drm_via_sg_info_t;
-
-typedef struct _drm_via_blitq {
-       struct drm_device *dev;
-       uint32_t cur_blit_handle;
-       uint32_t done_blit_handle;
-       unsigned serviced;
-       unsigned head;
-       unsigned cur;
-       unsigned num_free;
-       unsigned num_outstanding;
-       unsigned long end;
-       int aborting;
-       int is_active;
-       drm_via_sg_info_t *blits[VIA_NUM_BLIT_SLOTS];
-       spinlock_t blit_lock;
-       wait_queue_head_t blit_queue[VIA_NUM_BLIT_SLOTS];
-       wait_queue_head_t busy_queue;
-       struct work_struct wq;
-       struct timer_list poll_timer;
-} drm_via_blitq_t;
-
-typedef struct drm_via_ring_buffer {
-       drm_local_map_t map;
-       char *virtual_start;
-} drm_via_ring_buffer_t;
-
-typedef uint32_t maskarray_t[5];
-
-typedef struct drm_via_irq {
-       atomic_t irq_received;
-       uint32_t pending_mask;
-       uint32_t enable_mask;
-       wait_queue_head_t irq_queue;
-} drm_via_irq_t;
-
-typedef struct drm_via_private {
-       drm_via_sarea_t *sarea_priv;
-       drm_local_map_t *sarea;
-       drm_local_map_t *fb;
-       drm_local_map_t *mmio;
-       unsigned long agpAddr;
-       wait_queue_head_t decoder_queue[VIA_NR_XVMC_LOCKS];
-       char *dma_ptr;
-       unsigned int dma_low;
-       unsigned int dma_high;
-       unsigned int dma_offset;
-       uint32_t dma_wrap;
-       volatile uint32_t *last_pause_ptr;
-       volatile uint32_t *hw_addr_ptr;
-       drm_via_ring_buffer_t ring;
-       ktime_t last_vblank;
-       int last_vblank_valid;
-       ktime_t nsec_per_vblank;
-       atomic_t vbl_received;
-       drm_via_state_t hc_state;
-       char pci_buf[VIA_PCI_BUF_SIZE];
-       const uint32_t *fire_offsets[VIA_FIRE_BUF_SIZE];
-       uint32_t num_fire_offsets;
-       int chipset;
-       drm_via_irq_t via_irqs[VIA_NUM_IRQS];
-       unsigned num_irqs;
-       maskarray_t *irq_masks;
-       uint32_t irq_enable_mask;
-       uint32_t irq_pending_mask;
-       int *irq_map;
-       unsigned int idle_fault;
-       int vram_initialized;
-       struct drm_mm vram_mm;
-       int agp_initialized;
-       struct drm_mm agp_mm;
-       /** Mapping of userspace keys to mm objects */
-       struct idr object_idr;
-       unsigned long vram_offset;
-       unsigned long agp_offset;
-       drm_via_blitq_t blit_queues[VIA_NUM_BLIT_ENGINES];
-       uint32_t dma_diff;
-} drm_via_private_t;
-
-struct via_file_private {
-       struct list_head obj_list;
-};
-
-enum via_family {
-  VIA_OTHER = 0,     /* Baseline */
-  VIA_PRO_GROUP_A,   /* Another video engine and DMA commands */
-  VIA_DX9_0          /* Same video as pro_group_a, but 3D is unsupported */
-};
-
-/* VIA MMIO register access */
-static inline u32 via_read(struct drm_via_private *dev_priv, u32 reg)
-{
-       return readl((void __iomem *)(dev_priv->mmio->handle + reg));
-}
-
-static inline void via_write(struct drm_via_private *dev_priv, u32 reg,
-                            u32 val)
-{
-       writel(val, (void __iomem *)(dev_priv->mmio->handle + reg));
-}
-
-static inline void via_write8(struct drm_via_private *dev_priv, u32 reg,
-                             u32 val)
-{
-       writeb(val, (void __iomem *)(dev_priv->mmio->handle + reg));
-}
-
-static inline void via_write8_mask(struct drm_via_private *dev_priv,
-                                  u32 reg, u32 mask, u32 val)
-{
-       u32 tmp;
-
-       tmp = readb((void __iomem *)(dev_priv->mmio->handle + reg));
-       tmp = (tmp & ~mask) | (val & mask);
-       writeb(tmp, (void __iomem *)(dev_priv->mmio->handle + reg));
-}
-
-/*
- * Poll in a loop waiting for 'contidition' to be true.
- * Note: A direct replacement with wait_event_interruptible_timeout()
- *       will not work unless driver is updated to emit wake_up()
- *       in relevant places that can impact the 'condition'
- *
- * Returns:
- *   ret keeps current value if 'condition' becomes true
- *   ret = -BUSY if timeout happens
- *   ret = -EINTR if a signal interrupted the waiting period
- */
-#define VIA_WAIT_ON( ret, queue, timeout, condition )          \
-do {                                                           \
-       DECLARE_WAITQUEUE(entry, current);                      \
-       unsigned long end = jiffies + (timeout);                \
-       add_wait_queue(&(queue), &entry);                       \
-                                                               \
-       for (;;) {                                              \
-               __set_current_state(TASK_INTERRUPTIBLE);        \
-               if (condition)                                  \
-                       break;                                  \
-               if (time_after_eq(jiffies, end)) {              \
-                       ret = -EBUSY;                           \
-                       break;                                  \
-               }                                               \
-               schedule_timeout((HZ/100 > 1) ? HZ/100 : 1);    \
-               if (signal_pending(current)) {                  \
-                       ret = -EINTR;                           \
-                       break;                                  \
-               }                                               \
-       }                                                       \
-       __set_current_state(TASK_RUNNING);                      \
-       remove_wait_queue(&(queue), &entry);                    \
-} while (0)
-
-int via_do_cleanup_map(struct drm_device *dev);
-
-int via_dma_cleanup(struct drm_device *dev);
-int via_driver_dma_quiescent(struct drm_device *dev);
-
-#define CMDBUF_ALIGNMENT_SIZE   (0x100)
-#define CMDBUF_ALIGNMENT_MASK   (0x0ff)
-
-/* defines for VIA 3D registers */
-#define VIA_REG_STATUS          0x400
-#define VIA_REG_TRANSET         0x43C
-#define VIA_REG_TRANSPACE       0x440
-
-/* VIA_REG_STATUS(0x400): Engine Status */
-#define VIA_CMD_RGTR_BUSY       0x00000080     /* Command Regulator is busy */
-#define VIA_2D_ENG_BUSY         0x00000001     /* 2D Engine is busy */
-#define VIA_3D_ENG_BUSY         0x00000002     /* 3D Engine is busy */
-#define VIA_VR_QUEUE_BUSY       0x00020000     /* Virtual Queue is busy */
-
-#define SetReg2DAGP(nReg, nData) {                             \
-       *((uint32_t *)(vb)) = ((nReg) >> 2) | HALCYON_HEADER1;  \
-       *((uint32_t *)(vb) + 1) = (nData);                      \
-       vb = ((uint32_t *)vb) + 2;                              \
-       dev_priv->dma_low += 8;                                 \
-}
-
-#define via_flush_write_combine() mb()
-
-#define VIA_OUT_RING_QW(w1, w2)        do {            \
-       *vb++ = (w1);                           \
-       *vb++ = (w2);                           \
-       dev_priv->dma_low += 8;                 \
-} while (0)
-
-#define VIA_MM_ALIGN_SHIFT 4
-#define VIA_MM_ALIGN_MASK ((1 << VIA_MM_ALIGN_SHIFT) - 1)
-
-struct via_memblock {
-       struct drm_mm_node mm_node;
-       struct list_head owner_list;
-};
-
-#define VIA_REG_INTERRUPT       0x200
-
-/* VIA_REG_INTERRUPT */
-#define VIA_IRQ_GLOBAL   (1 << 31)
-#define VIA_IRQ_VBLANK_ENABLE   (1 << 19)
-#define VIA_IRQ_VBLANK_PENDING  (1 << 3)
-#define VIA_IRQ_HQV0_ENABLE     (1 << 11)
-#define VIA_IRQ_HQV1_ENABLE     (1 << 25)
-#define VIA_IRQ_HQV0_PENDING    (1 << 9)
-#define VIA_IRQ_HQV1_PENDING    (1 << 10)
-#define VIA_IRQ_DMA0_DD_ENABLE  (1 << 20)
-#define VIA_IRQ_DMA0_TD_ENABLE  (1 << 21)
-#define VIA_IRQ_DMA1_DD_ENABLE  (1 << 22)
-#define VIA_IRQ_DMA1_TD_ENABLE  (1 << 23)
-#define VIA_IRQ_DMA0_DD_PENDING (1 << 4)
-#define VIA_IRQ_DMA0_TD_PENDING (1 << 5)
-#define VIA_IRQ_DMA1_DD_PENDING (1 << 6)
-#define VIA_IRQ_DMA1_TD_PENDING (1 << 7)
-
-/*
- *  PCI DMA Registers
- *  Channels 2 & 3 don't seem to be implemented in hardware.
- */
-
-#define VIA_PCI_DMA_MAR0            0xE40   /* Memory Address Register of Channel 0 */
-#define VIA_PCI_DMA_DAR0            0xE44   /* Device Address Register of Channel 0 */
-#define VIA_PCI_DMA_BCR0            0xE48   /* Byte Count Register of Channel 0 */
-#define VIA_PCI_DMA_DPR0            0xE4C   /* Descriptor Pointer Register of Channel 0 */
-
-#define VIA_PCI_DMA_MAR1            0xE50   /* Memory Address Register of Channel 1 */
-#define VIA_PCI_DMA_DAR1            0xE54   /* Device Address Register of Channel 1 */
-#define VIA_PCI_DMA_BCR1            0xE58   /* Byte Count Register of Channel 1 */
-#define VIA_PCI_DMA_DPR1            0xE5C   /* Descriptor Pointer Register of Channel 1 */
-
-#define VIA_PCI_DMA_MAR2            0xE60   /* Memory Address Register of Channel 2 */
-#define VIA_PCI_DMA_DAR2            0xE64   /* Device Address Register of Channel 2 */
-#define VIA_PCI_DMA_BCR2            0xE68   /* Byte Count Register of Channel 2 */
-#define VIA_PCI_DMA_DPR2            0xE6C   /* Descriptor Pointer Register of Channel 2 */
-
-#define VIA_PCI_DMA_MAR3            0xE70   /* Memory Address Register of Channel 3 */
-#define VIA_PCI_DMA_DAR3            0xE74   /* Device Address Register of Channel 3 */
-#define VIA_PCI_DMA_BCR3            0xE78   /* Byte Count Register of Channel 3 */
-#define VIA_PCI_DMA_DPR3            0xE7C   /* Descriptor Pointer Register of Channel 3 */
-
-#define VIA_PCI_DMA_MR0             0xE80   /* Mode Register of Channel 0 */
-#define VIA_PCI_DMA_MR1             0xE84   /* Mode Register of Channel 1 */
-#define VIA_PCI_DMA_MR2             0xE88   /* Mode Register of Channel 2 */
-#define VIA_PCI_DMA_MR3             0xE8C   /* Mode Register of Channel 3 */
-
-#define VIA_PCI_DMA_CSR0            0xE90   /* Command/Status Register of Channel 0 */
-#define VIA_PCI_DMA_CSR1            0xE94   /* Command/Status Register of Channel 1 */
-#define VIA_PCI_DMA_CSR2            0xE98   /* Command/Status Register of Channel 2 */
-#define VIA_PCI_DMA_CSR3            0xE9C   /* Command/Status Register of Channel 3 */
-
-#define VIA_PCI_DMA_PTR             0xEA0   /* Priority Type Register */
-
-/* Define for DMA engine */
-/* DPR */
-#define VIA_DMA_DPR_EC         (1<<1)  /* end of chain */
-#define VIA_DMA_DPR_DDIE       (1<<2)  /* descriptor done interrupt enable */
-#define VIA_DMA_DPR_DT         (1<<3)  /* direction of transfer (RO) */
-
-/* MR */
-#define VIA_DMA_MR_CM          (1<<0)  /* chaining mode */
-#define VIA_DMA_MR_TDIE                (1<<1)  /* transfer done interrupt enable */
-#define VIA_DMA_MR_HENDMACMD           (1<<7) /* ? */
-
-/* CSR */
-#define VIA_DMA_CSR_DE         (1<<0)  /* DMA enable */
-#define VIA_DMA_CSR_TS         (1<<1)  /* transfer start */
-#define VIA_DMA_CSR_TA         (1<<2)  /* transfer abort */
-#define VIA_DMA_CSR_TD         (1<<3)  /* transfer done */
-#define VIA_DMA_CSR_DD         (1<<4)  /* descriptor done */
-#define VIA_DMA_DPR_EC          (1<<1)  /* end of chain */
-
-/*
- * Device-specific IRQs go here. This type might need to be extended with
- * the register if there are multiple IRQ control registers.
- * Currently we activate the HQV interrupts of  Unichrome Pro group A.
- */
-
-static maskarray_t via_pro_group_a_irqs[] = {
-       {VIA_IRQ_HQV0_ENABLE, VIA_IRQ_HQV0_PENDING, 0x000003D0, 0x00008010,
-        0x00000000 },
-       {VIA_IRQ_HQV1_ENABLE, VIA_IRQ_HQV1_PENDING, 0x000013D0, 0x00008010,
-        0x00000000 },
-       {VIA_IRQ_DMA0_TD_ENABLE, VIA_IRQ_DMA0_TD_PENDING, VIA_PCI_DMA_CSR0,
-        VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008},
-       {VIA_IRQ_DMA1_TD_ENABLE, VIA_IRQ_DMA1_TD_PENDING, VIA_PCI_DMA_CSR1,
-        VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008},
-};
-static int via_num_pro_group_a = ARRAY_SIZE(via_pro_group_a_irqs);
-static int via_irqmap_pro_group_a[] = {0, 1, -1, 2, -1, 3};
-
-static maskarray_t via_unichrome_irqs[] = {
-       {VIA_IRQ_DMA0_TD_ENABLE, VIA_IRQ_DMA0_TD_PENDING, VIA_PCI_DMA_CSR0,
-        VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008},
-       {VIA_IRQ_DMA1_TD_ENABLE, VIA_IRQ_DMA1_TD_PENDING, VIA_PCI_DMA_CSR1,
-        VIA_DMA_CSR_TA | VIA_DMA_CSR_TD, 0x00000008}
-};
-static int via_num_unichrome = ARRAY_SIZE(via_unichrome_irqs);
-static int via_irqmap_unichrome[] = {-1, -1, -1, 0, -1, 1};
-
-
-/*
- * Unmaps the DMA mappings.
- * FIXME: Is this a NoOp on x86? Also
- * FIXME: What happens if this one is called and a pending blit has previously done
- * the same DMA mappings?
- */
-#define VIA_PGDN(x)         (((unsigned long)(x)) & PAGE_MASK)
-#define VIA_PGOFF(x)       (((unsigned long)(x)) & ~PAGE_MASK)
-#define VIA_PFN(x)           ((unsigned long)(x) >> PAGE_SHIFT)
-
-typedef struct _drm_via_descriptor {
-       uint32_t mem_addr;
-       uint32_t dev_addr;
-       uint32_t size;
-       uint32_t next;
-} drm_via_descriptor_t;
-
-typedef enum {
-       state_command,
-       state_header2,
-       state_header1,
-       state_vheader5,
-       state_vheader6,
-       state_error
-} verifier_state_t;
-
-typedef enum {
-       no_check = 0,
-       check_for_header2,
-       check_for_header1,
-       check_for_header2_err,
-       check_for_header1_err,
-       check_for_fire,
-       check_z_buffer_addr0,
-       check_z_buffer_addr1,
-       check_z_buffer_addr_mode,
-       check_destination_addr0,
-       check_destination_addr1,
-       check_destination_addr_mode,
-       check_for_dummy,
-       check_for_dd,
-       check_texture_addr0,
-       check_texture_addr1,
-       check_texture_addr2,
-       check_texture_addr3,
-       check_texture_addr4,
-       check_texture_addr5,
-       check_texture_addr6,
-       check_texture_addr7,
-       check_texture_addr8,
-       check_texture_addr_mode,
-       check_for_vertex_count,
-       check_number_texunits,
-       forbidden_command
-} hazard_t;
-
-/*
- * Associates each hazard above with a possible multi-command
- * sequence. For example an address that is split over multiple
- * commands and that needs to be checked at the first command
- * that does not include any part of the address.
- */
-
-static drm_via_sequence_t seqs[] = {
-       no_sequence,
-       no_sequence,
-       no_sequence,
-       no_sequence,
-       no_sequence,
-       no_sequence,
-       z_address,
-       z_address,
-       z_address,
-       dest_address,
-       dest_address,
-       dest_address,
-       no_sequence,
-       no_sequence,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       tex_address,
-       no_sequence
-};
-
-typedef struct {
-       unsigned int code;
-       hazard_t hz;
-} hz_init_t;
-
-static hz_init_t init_table1[] = {
-       {0xf2, check_for_header2_err},
-       {0xf0, check_for_header1_err},
-       {0xee, check_for_fire},
-       {0xcc, check_for_dummy},
-       {0xdd, check_for_dd},
-       {0x00, no_check},
-       {0x10, check_z_buffer_addr0},
-       {0x11, check_z_buffer_addr1},
-       {0x12, check_z_buffer_addr_mode},
-       {0x13, no_check},
-       {0x14, no_check},
-       {0x15, no_check},
-       {0x23, no_check},
-       {0x24, no_check},
-       {0x33, no_check},
-       {0x34, no_check},
-       {0x35, no_check},
-       {0x36, no_check},
-       {0x37, no_check},
-       {0x38, no_check},
-       {0x39, no_check},
-       {0x3A, no_check},
-       {0x3B, no_check},
-       {0x3C, no_check},
-       {0x3D, no_check},
-       {0x3E, no_check},
-       {0x40, check_destination_addr0},
-       {0x41, check_destination_addr1},
-       {0x42, check_destination_addr_mode},
-       {0x43, no_check},
-       {0x44, no_check},
-       {0x50, no_check},
-       {0x51, no_check},
-       {0x52, no_check},
-       {0x53, no_check},
-       {0x54, no_check},
-       {0x55, no_check},
-       {0x56, no_check},
-       {0x57, no_check},
-       {0x58, no_check},
-       {0x70, no_check},
-       {0x71, no_check},
-       {0x78, no_check},
-       {0x79, no_check},
-       {0x7A, no_check},
-       {0x7B, no_check},
-       {0x7C, no_check},
-       {0x7D, check_for_vertex_count}
-};
-
-static hz_init_t init_table2[] = {
-       {0xf2, check_for_header2_err},
-       {0xf0, check_for_header1_err},
-       {0xee, check_for_fire},
-       {0xcc, check_for_dummy},
-       {0x00, check_texture_addr0},
-       {0x01, check_texture_addr0},
-       {0x02, check_texture_addr0},
-       {0x03, check_texture_addr0},
-       {0x04, check_texture_addr0},
-       {0x05, check_texture_addr0},
-       {0x06, check_texture_addr0},
-       {0x07, check_texture_addr0},
-       {0x08, check_texture_addr0},
-       {0x09, check_texture_addr0},
-       {0x20, check_texture_addr1},
-       {0x21, check_texture_addr1},
-       {0x22, check_texture_addr1},
-       {0x23, check_texture_addr4},
-       {0x2B, check_texture_addr3},
-       {0x2C, check_texture_addr3},
-       {0x2D, check_texture_addr3},
-       {0x2E, check_texture_addr3},
-       {0x2F, check_texture_addr3},
-       {0x30, check_texture_addr3},
-       {0x31, check_texture_addr3},
-       {0x32, check_texture_addr3},
-       {0x33, check_texture_addr3},
-       {0x34, check_texture_addr3},
-       {0x4B, check_texture_addr5},
-       {0x4C, check_texture_addr6},
-       {0x51, check_texture_addr7},
-       {0x52, check_texture_addr8},
-       {0x77, check_texture_addr2},
-       {0x78, no_check},
-       {0x79, no_check},
-       {0x7A, no_check},
-       {0x7B, check_texture_addr_mode},
-       {0x7C, no_check},
-       {0x7D, no_check},
-       {0x7E, no_check},
-       {0x7F, no_check},
-       {0x80, no_check},
-       {0x81, no_check},
-       {0x82, no_check},
-       {0x83, no_check},
-       {0x85, no_check},
-       {0x86, no_check},
-       {0x87, no_check},
-       {0x88, no_check},
-       {0x89, no_check},
-       {0x8A, no_check},
-       {0x90, no_check},
-       {0x91, no_check},
-       {0x92, no_check},
-       {0x93, no_check}
-};
-
-static hz_init_t init_table3[] = {
-       {0xf2, check_for_header2_err},
-       {0xf0, check_for_header1_err},
-       {0xcc, check_for_dummy},
-       {0x00, check_number_texunits}
-};
-
-static hazard_t table1[256];
-static hazard_t table2[256];
-static hazard_t table3[256];
-
-static __inline__ int
-eat_words(const uint32_t **buf, const uint32_t *buf_end, unsigned num_words)
-{
-       if ((buf_end - *buf) >= num_words) {
-               *buf += num_words;
-               return 0;
-       }
-       DRM_ERROR("Illegal termination of DMA command buffer\n");
-       return 1;
-}
-
-/*
- * Partially stolen from drm_memory.h
- */
-
-static __inline__ drm_local_map_t *via_drm_lookup_agp_map(drm_via_state_t *seq,
-                                                   unsigned long offset,
-                                                   unsigned long size,
-                                                   struct drm_device *dev)
-{
-       struct drm_map_list *r_list;
-       drm_local_map_t *map = seq->map_cache;
-
-       if (map && map->offset <= offset
-           && (offset + size) <= (map->offset + map->size)) {
-               return map;
-       }
-
-       list_for_each_entry(r_list, &dev->maplist, head) {
-               map = r_list->map;
-               if (!map)
-                       continue;
-               if (map->offset <= offset
-                   && (offset + size) <= (map->offset + map->size)
-                   && !(map->flags & _DRM_RESTRICTED)
-                   && (map->type == _DRM_AGP)) {
-                       seq->map_cache = map;
-                       return map;
-               }
-       }
-       return NULL;
-}
-
-/*
- * Require that all AGP texture levels reside in the same AGP map which should
- * be mappable by the client. This is not a big restriction.
- * FIXME: To actually enforce this security policy strictly, drm_rmmap
- * would have to wait for dma quiescent before removing an AGP map.
- * The via_drm_lookup_agp_map call in reality seems to take
- * very little CPU time.
- */
-
-static __inline__ int finish_current_sequence(drm_via_state_t * cur_seq)
-{
-       switch (cur_seq->unfinished) {
-       case z_address:
-               DRM_DEBUG("Z Buffer start address is 0x%x\n", cur_seq->z_addr);
-               break;
-       case dest_address:
-               DRM_DEBUG("Destination start address is 0x%x\n",
-                         cur_seq->d_addr);
-               break;
-       case tex_address:
-               if (cur_seq->agp_texture) {
-                       unsigned start =
-                           cur_seq->tex_level_lo[cur_seq->texture];
-                       unsigned end = cur_seq->tex_level_hi[cur_seq->texture];
-                       unsigned long lo = ~0, hi = 0, tmp;
-                       uint32_t *addr, *pitch, *height, tex;
-                       unsigned i;
-                       int npot;
-
-                       if (end > 9)
-                               end = 9;
-                       if (start > 9)
-                               start = 9;
-
-                       addr =
-                           &(cur_seq->t_addr[tex = cur_seq->texture][start]);
-                       pitch = &(cur_seq->pitch[tex][start]);
-                       height = &(cur_seq->height[tex][start]);
-                       npot = cur_seq->tex_npot[tex];
-                       for (i = start; i <= end; ++i) {
-                               tmp = *addr++;
-                               if (tmp < lo)
-                                       lo = tmp;
-                               if (i == 0 && npot)
-                                       tmp += (*height++ * *pitch++);
-                               else
-                                       tmp += (*height++ << *pitch++);
-                               if (tmp > hi)
-                                       hi = tmp;
-                       }
-
-                       if (!via_drm_lookup_agp_map
-                           (cur_seq, lo, hi - lo, cur_seq->dev)) {
-                               DRM_ERROR
-                                   ("AGP texture is not in allowed map\n");
-                               return 2;
-                       }
-               }
-               break;
-       default:
-               break;
-       }
-       cur_seq->unfinished = no_sequence;
-       return 0;
-}
-
-static __inline__ int
-investigate_hazard(uint32_t cmd, hazard_t hz, drm_via_state_t *cur_seq)
-{
-       register uint32_t tmp, *tmp_addr;
-
-       if (cur_seq->unfinished && (cur_seq->unfinished != seqs[hz])) {
-               int ret;
-               if ((ret = finish_current_sequence(cur_seq)))
-                       return ret;
-       }
-
-       switch (hz) {
-       case check_for_header2:
-               if (cmd == HALCYON_HEADER2)
-                       return 1;
-               return 0;
-       case check_for_header1:
-               if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1)
-                       return 1;
-               return 0;
-       case check_for_header2_err:
-               if (cmd == HALCYON_HEADER2)
-                       return 1;
-               DRM_ERROR("Illegal DMA HALCYON_HEADER2 command\n");
-               break;
-       case check_for_header1_err:
-               if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1)
-                       return 1;
-               DRM_ERROR("Illegal DMA HALCYON_HEADER1 command\n");
-               break;
-       case check_for_fire:
-               if ((cmd & HALCYON_FIREMASK) == HALCYON_FIRECMD)
-                       return 1;
-               DRM_ERROR("Illegal DMA HALCYON_FIRECMD command\n");
-               break;
-       case check_for_dummy:
-               if (HC_DUMMY == cmd)
-                       return 0;
-               DRM_ERROR("Illegal DMA HC_DUMMY command\n");
-               break;
-       case check_for_dd:
-               if (0xdddddddd == cmd)
-                       return 0;
-               DRM_ERROR("Illegal DMA 0xdddddddd command\n");
-               break;
-       case check_z_buffer_addr0:
-               cur_seq->unfinished = z_address;
-               cur_seq->z_addr = (cur_seq->z_addr & 0xFF000000) |
-                   (cmd & 0x00FFFFFF);
-               return 0;
-       case check_z_buffer_addr1:
-               cur_seq->unfinished = z_address;
-               cur_seq->z_addr = (cur_seq->z_addr & 0x00FFFFFF) |
-                   ((cmd & 0xFF) << 24);
-               return 0;
-       case check_z_buffer_addr_mode:
-               cur_seq->unfinished = z_address;
-               if ((cmd & 0x0000C000) == 0)
-                       return 0;
-               DRM_ERROR("Attempt to place Z buffer in system memory\n");
-               return 2;
-       case check_destination_addr0:
-               cur_seq->unfinished = dest_address;
-               cur_seq->d_addr = (cur_seq->d_addr & 0xFF000000) |
-                   (cmd & 0x00FFFFFF);
-               return 0;
-       case check_destination_addr1:
-               cur_seq->unfinished = dest_address;
-               cur_seq->d_addr = (cur_seq->d_addr & 0x00FFFFFF) |
-                   ((cmd & 0xFF) << 24);
-               return 0;
-       case check_destination_addr_mode:
-               cur_seq->unfinished = dest_address;
-               if ((cmd & 0x0000C000) == 0)
-                       return 0;
-               DRM_ERROR
-                   ("Attempt to place 3D drawing buffer in system memory\n");
-               return 2;
-       case check_texture_addr0:
-               cur_seq->unfinished = tex_address;
-               tmp = (cmd >> 24);
-               tmp_addr = &cur_seq->t_addr[cur_seq->texture][tmp];
-               *tmp_addr = (*tmp_addr & 0xFF000000) | (cmd & 0x00FFFFFF);
-               return 0;
-       case check_texture_addr1:
-               cur_seq->unfinished = tex_address;
-               tmp = ((cmd >> 24) - 0x20);
-               tmp += tmp << 1;
-               tmp_addr = &cur_seq->t_addr[cur_seq->texture][tmp];
-               *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF) << 24);
-               tmp_addr++;
-               *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF00) << 16);
-               tmp_addr++;
-               *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF0000) << 8);
-               return 0;
-       case check_texture_addr2:
-               cur_seq->unfinished = tex_address;
-               cur_seq->tex_level_lo[tmp = cur_seq->texture] = cmd & 0x3F;
-               cur_seq->tex_level_hi[tmp] = (cmd & 0xFC0) >> 6;
-               return 0;
-       case check_texture_addr3:
-               cur_seq->unfinished = tex_address;
-               tmp = ((cmd >> 24) - HC_SubA_HTXnL0Pit);
-               if (tmp == 0 &&
-                   (cmd & HC_HTXnEnPit_MASK)) {
-                       cur_seq->pitch[cur_seq->texture][tmp] =
-                               (cmd & HC_HTXnLnPit_MASK);
-                       cur_seq->tex_npot[cur_seq->texture] = 1;
-               } else {
-                       cur_seq->pitch[cur_seq->texture][tmp] =
-                               (cmd & HC_HTXnLnPitE_MASK) >> HC_HTXnLnPitE_SHIFT;
-                       cur_seq->tex_npot[cur_seq->texture] = 0;
-                       if (cmd & 0x000FFFFF) {
-                               DRM_ERROR
-                                       ("Unimplemented texture level 0 pitch mode.\n");
-                               return 2;
-                       }
-               }
-               return 0;
-       case check_texture_addr4:
-               cur_seq->unfinished = tex_address;
-               tmp_addr = &cur_seq->t_addr[cur_seq->texture][9];
-               *tmp_addr = (*tmp_addr & 0x00FFFFFF) | ((cmd & 0xFF) << 24);
-               return 0;
-       case check_texture_addr5:
-       case check_texture_addr6:
-               cur_seq->unfinished = tex_address;
-               /*
-                * Texture width. We don't care since we have the pitch.
-                */
-               return 0;
-       case check_texture_addr7:
-               cur_seq->unfinished = tex_address;
-               tmp_addr = &(cur_seq->height[cur_seq->texture][0]);
-               tmp_addr[5] = 1 << ((cmd & 0x00F00000) >> 20);
-               tmp_addr[4] = 1 << ((cmd & 0x000F0000) >> 16);
-               tmp_addr[3] = 1 << ((cmd & 0x0000F000) >> 12);
-               tmp_addr[2] = 1 << ((cmd & 0x00000F00) >> 8);
-               tmp_addr[1] = 1 << ((cmd & 0x000000F0) >> 4);
-               tmp_addr[0] = 1 << (cmd & 0x0000000F);
-               return 0;
-       case check_texture_addr8:
-               cur_seq->unfinished = tex_address;
-               tmp_addr = &(cur_seq->height[cur_seq->texture][0]);
-               tmp_addr[9] = 1 << ((cmd & 0x0000F000) >> 12);
-               tmp_addr[8] = 1 << ((cmd & 0x00000F00) >> 8);
-               tmp_addr[7] = 1 << ((cmd & 0x000000F0) >> 4);
-               tmp_addr[6] = 1 << (cmd & 0x0000000F);
-               return 0;
-       case check_texture_addr_mode:
-               cur_seq->unfinished = tex_address;
-               if (2 == (tmp = cmd & 0x00000003)) {
-                       DRM_ERROR
-                           ("Attempt to fetch texture from system memory.\n");
-                       return 2;
-               }
-               cur_seq->agp_texture = (tmp == 3);
-               cur_seq->tex_palette_size[cur_seq->texture] =
-                   (cmd >> 16) & 0x000000007;
-               return 0;
-       case check_for_vertex_count:
-               cur_seq->vertex_count = cmd & 0x0000FFFF;
-               return 0;
-       case check_number_texunits:
-               cur_seq->multitex = (cmd >> 3) & 1;
-               return 0;
-       default:
-               DRM_ERROR("Illegal DMA data: 0x%x\n", cmd);
-               return 2;
-       }
-       return 2;
-}
-
-static __inline__ int
-via_check_prim_list(uint32_t const **buffer, const uint32_t * buf_end,
-                   drm_via_state_t *cur_seq)
-{
-       drm_via_private_t *dev_priv =
-           (drm_via_private_t *) cur_seq->dev->dev_private;
-       uint32_t a_fire, bcmd, dw_count;
-       int ret = 0;
-       int have_fire;
-       const uint32_t *buf = *buffer;
-
-       while (buf < buf_end) {
-               have_fire = 0;
-               if ((buf_end - buf) < 2) {
-                       DRM_ERROR
-                           ("Unexpected termination of primitive list.\n");
-                       ret = 1;
-                       break;
-               }
-               if ((*buf & HC_ACMD_MASK) != HC_ACMD_HCmdB)
-                       break;
-               bcmd = *buf++;
-               if ((*buf & HC_ACMD_MASK) != HC_ACMD_HCmdA) {
-                       DRM_ERROR("Expected Vertex List A command, got 0x%x\n",
-                                 *buf);
-                       ret = 1;
-                       break;
-               }
-               a_fire =
-                   *buf++ | HC_HPLEND_MASK | HC_HPMValidN_MASK |
-                   HC_HE3Fire_MASK;
-
-               /*
-                * How many dwords per vertex ?
-                */
-
-               if (cur_seq->agp && ((bcmd & (0xF << 11)) == 0)) {
-                       DRM_ERROR("Illegal B command vertex data for AGP.\n");
-                       ret = 1;
-                       break;
-               }
-
-               dw_count = 0;
-               if (bcmd & (1 << 7))
-                       dw_count += (cur_seq->multitex) ? 2 : 1;
-               if (bcmd & (1 << 8))
-                       dw_count += (cur_seq->multitex) ? 2 : 1;
-               if (bcmd & (1 << 9))
-                       dw_count++;
-               if (bcmd & (1 << 10))
-                       dw_count++;
-               if (bcmd & (1 << 11))
-                       dw_count++;
-               if (bcmd & (1 << 12))
-                       dw_count++;
-               if (bcmd & (1 << 13))
-                       dw_count++;
-               if (bcmd & (1 << 14))
-                       dw_count++;
-
-               while (buf < buf_end) {
-                       if (*buf == a_fire) {
-                               if (dev_priv->num_fire_offsets >=
-                                   VIA_FIRE_BUF_SIZE) {
-                                       DRM_ERROR("Fire offset buffer full.\n");
-                                       ret = 1;
-                                       break;
-                               }
-                               dev_priv->fire_offsets[dev_priv->
-                                                      num_fire_offsets++] =
-                                   buf;
-                               have_fire = 1;
-                               buf++;
-                               if (buf < buf_end && *buf == a_fire)
-                                       buf++;
-                               break;
-                       }
-                       if ((*buf == HALCYON_HEADER2) ||
-                           ((*buf & HALCYON_FIREMASK) == HALCYON_FIRECMD)) {
-                               DRM_ERROR("Missing Vertex Fire command, "
-                                         "Stray Vertex Fire command  or verifier "
-                                         "lost sync.\n");
-                               ret = 1;
-                               break;
-                       }
-                       if ((ret = eat_words(&buf, buf_end, dw_count)))
-                               break;
-               }
-               if (buf >= buf_end && !have_fire) {
-                       DRM_ERROR("Missing Vertex Fire command or verifier "
-                                 "lost sync.\n");
-                       ret = 1;
-                       break;
-               }
-               if (cur_seq->agp && ((buf - cur_seq->buf_start) & 0x01)) {
-                       DRM_ERROR("AGP Primitive list end misaligned.\n");
-                       ret = 1;
-                       break;
-               }
-       }
-       *buffer = buf;
-       return ret;
-}
-
-static __inline__ verifier_state_t
-via_check_header2(uint32_t const **buffer, const uint32_t *buf_end,
-                 drm_via_state_t *hc_state)
-{
-       uint32_t cmd;
-       int hz_mode;
-       hazard_t hz;
-       const uint32_t *buf = *buffer;
-       const hazard_t *hz_table;
-
-       if ((buf_end - buf) < 2) {
-               DRM_ERROR
-                   ("Illegal termination of DMA HALCYON_HEADER2 sequence.\n");
-               return state_error;
-       }
-       buf++;
-       cmd = (*buf++ & 0xFFFF0000) >> 16;
-
-       switch (cmd) {
-       case HC_ParaType_CmdVdata:
-               if (via_check_prim_list(&buf, buf_end, hc_state))
-                       return state_error;
-               *buffer = buf;
-               return state_command;
-       case HC_ParaType_NotTex:
-               hz_table = table1;
-               break;
-       case HC_ParaType_Tex:
-               hc_state->texture = 0;
-               hz_table = table2;
-               break;
-       case (HC_ParaType_Tex | (HC_SubType_Tex1 << 8)):
-               hc_state->texture = 1;
-               hz_table = table2;
-               break;
-       case (HC_ParaType_Tex | (HC_SubType_TexGeneral << 8)):
-               hz_table = table3;
-               break;
-       case HC_ParaType_Auto:
-               if (eat_words(&buf, buf_end, 2))
-                       return state_error;
-               *buffer = buf;
-               return state_command;
-       case (HC_ParaType_Palette | (HC_SubType_Stipple << 8)):
-               if (eat_words(&buf, buf_end, 32))
-                       return state_error;
-               *buffer = buf;
-               return state_command;
-       case (HC_ParaType_Palette | (HC_SubType_TexPalette0 << 8)):
-       case (HC_ParaType_Palette | (HC_SubType_TexPalette1 << 8)):
-               DRM_ERROR("Texture palettes are rejected because of "
-                         "lack of info how to determine their size.\n");
-               return state_error;
-       case (HC_ParaType_Palette | (HC_SubType_FogTable << 8)):
-               DRM_ERROR("Fog factor palettes are rejected because of "
-                         "lack of info how to determine their size.\n");
-               return state_error;
-       default:
-
-               /*
-                * There are some unimplemented HC_ParaTypes here, that
-                * need to be implemented if the Mesa driver is extended.
-                */
-
-               DRM_ERROR("Invalid or unimplemented HALCYON_HEADER2 "
-                         "DMA subcommand: 0x%x. Previous dword: 0x%x\n",
-                         cmd, *(buf - 2));
-               *buffer = buf;
-               return state_error;
-       }
-
-       while (buf < buf_end) {
-               cmd = *buf++;
-               if ((hz = hz_table[cmd >> 24])) {
-                       if ((hz_mode = investigate_hazard(cmd, hz, hc_state))) {
-                               if (hz_mode == 1) {
-                                       buf--;
-                                       break;
-                               }
-                               return state_error;
-                       }
-               } else if (hc_state->unfinished &&
-                          finish_current_sequence(hc_state)) {
-                       return state_error;
-               }
-       }
-       if (hc_state->unfinished && finish_current_sequence(hc_state))
-               return state_error;
-       *buffer = buf;
-       return state_command;
-}
-
-static __inline__ verifier_state_t
-via_parse_header2(drm_via_private_t *dev_priv, uint32_t const **buffer,
-                 const uint32_t *buf_end, int *fire_count)
-{
-       uint32_t cmd;
-       const uint32_t *buf = *buffer;
-       const uint32_t *next_fire;
-       int burst = 0;
-
-       next_fire = dev_priv->fire_offsets[*fire_count];
-       buf++;
-       cmd = (*buf & 0xFFFF0000) >> 16;
-       via_write(dev_priv, HC_REG_TRANS_SET + HC_REG_BASE, *buf++);
-       switch (cmd) {
-       case HC_ParaType_CmdVdata:
-               while ((buf < buf_end) &&
-                      (*fire_count < dev_priv->num_fire_offsets) &&
-                      (*buf & HC_ACMD_MASK) == HC_ACMD_HCmdB) {
-                       while (buf <= next_fire) {
-                               via_write(dev_priv, HC_REG_TRANS_SPACE + HC_REG_BASE +
-                                         (burst & 63), *buf++);
-                               burst += 4;
-                       }
-                       if ((buf < buf_end)
-                           && ((*buf & HALCYON_FIREMASK) == HALCYON_FIRECMD))
-                               buf++;
-
-                       if (++(*fire_count) < dev_priv->num_fire_offsets)
-                               next_fire = dev_priv->fire_offsets[*fire_count];
-               }
-               break;
-       default:
-               while (buf < buf_end) {
-
-                       if (*buf == HC_HEADER2 ||
-                           (*buf & HALCYON_HEADER1MASK) == HALCYON_HEADER1 ||
-                           (*buf & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5 ||
-                           (*buf & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6)
-                               break;
-
-                       via_write(dev_priv, HC_REG_TRANS_SPACE + HC_REG_BASE +
-                                 (burst & 63), *buf++);
-                       burst += 4;
-               }
-       }
-       *buffer = buf;
-       return state_command;
-}
-
-static __inline__ int verify_mmio_address(uint32_t address)
-{
-       if ((address > 0x3FF) && (address < 0xC00)) {
-               DRM_ERROR("Invalid VIDEO DMA command. "
-                         "Attempt to access 3D- or command burst area.\n");
-               return 1;
-       } else if ((address > 0xCFF) && (address < 0x1300)) {
-               DRM_ERROR("Invalid VIDEO DMA command. "
-                         "Attempt to access PCI DMA area.\n");
-               return 1;
-       } else if (address > 0x13FF) {
-               DRM_ERROR("Invalid VIDEO DMA command. "
-                         "Attempt to access VGA registers.\n");
-               return 1;
-       }
-       return 0;
-}
-
-static __inline__ int
-verify_video_tail(uint32_t const **buffer, const uint32_t * buf_end,
-                 uint32_t dwords)
-{
-       const uint32_t *buf = *buffer;
-
-       if (buf_end - buf < dwords) {
-               DRM_ERROR("Illegal termination of video command.\n");
-               return 1;
-       }
-       while (dwords--) {
-               if (*buf++) {
-                       DRM_ERROR("Illegal video command tail.\n");
-                       return 1;
-               }
-       }
-       *buffer = buf;
-       return 0;
-}
-
-static __inline__ verifier_state_t
-via_check_header1(uint32_t const **buffer, const uint32_t * buf_end)
-{
-       uint32_t cmd;
-       const uint32_t *buf = *buffer;
-       verifier_state_t ret = state_command;
-
-       while (buf < buf_end) {
-               cmd = *buf;
-               if ((cmd > ((0x3FF >> 2) | HALCYON_HEADER1)) &&
-                   (cmd < ((0xC00 >> 2) | HALCYON_HEADER1))) {
-                       if ((cmd & HALCYON_HEADER1MASK) != HALCYON_HEADER1)
-                               break;
-                       DRM_ERROR("Invalid HALCYON_HEADER1 command. "
-                                 "Attempt to access 3D- or command burst area.\n");
-                       ret = state_error;
-                       break;
-               } else if (cmd > ((0xCFF >> 2) | HALCYON_HEADER1)) {
-                       if ((cmd & HALCYON_HEADER1MASK) != HALCYON_HEADER1)
-                               break;
-                       DRM_ERROR("Invalid HALCYON_HEADER1 command. "
-                                 "Attempt to access VGA registers.\n");
-                       ret = state_error;
-                       break;
-               } else {
-                       buf += 2;
-               }
-       }
-       *buffer = buf;
-       return ret;
-}
-
-static __inline__ verifier_state_t
-via_parse_header1(drm_via_private_t *dev_priv, uint32_t const **buffer,
-                 const uint32_t *buf_end)
-{
-       register uint32_t cmd;
-       const uint32_t *buf = *buffer;
-
-       while (buf < buf_end) {
-               cmd = *buf;
-               if ((cmd & HALCYON_HEADER1MASK) != HALCYON_HEADER1)
-                       break;
-               via_write(dev_priv, (cmd & ~HALCYON_HEADER1MASK) << 2, *++buf);
-               buf++;
-       }
-       *buffer = buf;
-       return state_command;
-}
-
-static __inline__ verifier_state_t
-via_check_vheader5(uint32_t const **buffer, const uint32_t *buf_end)
-{
-       uint32_t data;
-       const uint32_t *buf = *buffer;
-
-       if (buf_end - buf < 4) {
-               DRM_ERROR("Illegal termination of video header5 command\n");
-               return state_error;
-       }
-
-       data = *buf++ & ~VIA_VIDEOMASK;
-       if (verify_mmio_address(data))
-               return state_error;
-
-       data = *buf++;
-       if (*buf++ != 0x00F50000) {
-               DRM_ERROR("Illegal header5 header data\n");
-               return state_error;
-       }
-       if (*buf++ != 0x00000000) {
-               DRM_ERROR("Illegal header5 header data\n");
-               return state_error;
-       }
-       if (eat_words(&buf, buf_end, data))
-               return state_error;
-       if ((data & 3) && verify_video_tail(&buf, buf_end, 4 - (data & 3)))
-               return state_error;
-       *buffer = buf;
-       return state_command;
-
-}
-
-static __inline__ verifier_state_t
-via_parse_vheader5(drm_via_private_t *dev_priv, uint32_t const **buffer,
-                  const uint32_t *buf_end)
-{
-       uint32_t addr, count, i;
-       const uint32_t *buf = *buffer;
-
-       addr = *buf++ & ~VIA_VIDEOMASK;
-       i = count = *buf;
-       buf += 3;
-       while (i--)
-               via_write(dev_priv, addr, *buf++);
-       if (count & 3)
-               buf += 4 - (count & 3);
-       *buffer = buf;
-       return state_command;
-}
-
-static __inline__ verifier_state_t
-via_check_vheader6(uint32_t const **buffer, const uint32_t * buf_end)
-{
-       uint32_t data;
-       const uint32_t *buf = *buffer;
-       uint32_t i;
-
-       if (buf_end - buf < 4) {
-               DRM_ERROR("Illegal termination of video header6 command\n");
-               return state_error;
-       }
-       buf++;
-       data = *buf++;
-       if (*buf++ != 0x00F60000) {
-               DRM_ERROR("Illegal header6 header data\n");
-               return state_error;
-       }
-       if (*buf++ != 0x00000000) {
-               DRM_ERROR("Illegal header6 header data\n");
-               return state_error;
-       }
-       if ((buf_end - buf) < (data << 1)) {
-               DRM_ERROR("Illegal termination of video header6 command\n");
-               return state_error;
-       }
-       for (i = 0; i < data; ++i) {
-               if (verify_mmio_address(*buf++))
-                       return state_error;
-               buf++;
-       }
-       data <<= 1;
-       if ((data & 3) && verify_video_tail(&buf, buf_end, 4 - (data & 3)))
-               return state_error;
-       *buffer = buf;
-       return state_command;
-}
-
-static __inline__ verifier_state_t
-via_parse_vheader6(drm_via_private_t *dev_priv, uint32_t const **buffer,
-                  const uint32_t *buf_end)
-{
-
-       uint32_t addr, count, i;
-       const uint32_t *buf = *buffer;
-
-       i = count = *++buf;
-       buf += 3;
-       while (i--) {
-               addr = *buf++;
-               via_write(dev_priv, addr, *buf++);
-       }
-       count <<= 1;
-       if (count & 3)
-               buf += 4 - (count & 3);
-       *buffer = buf;
-       return state_command;
-}
-
-static int
-via_verify_command_stream(const uint32_t * buf, unsigned int size,
-                         struct drm_device * dev, int agp)
-{
-
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       drm_via_state_t *hc_state = &dev_priv->hc_state;
-       drm_via_state_t saved_state = *hc_state;
-       uint32_t cmd;
-       const uint32_t *buf_end = buf + (size >> 2);
-       verifier_state_t state = state_command;
-       int cme_video;
-       int supported_3d;
-
-       cme_video = (dev_priv->chipset == VIA_PRO_GROUP_A ||
-                    dev_priv->chipset == VIA_DX9_0);
-
-       supported_3d = dev_priv->chipset != VIA_DX9_0;
-
-       hc_state->dev = dev;
-       hc_state->unfinished = no_sequence;
-       hc_state->map_cache = NULL;
-       hc_state->agp = agp;
-       hc_state->buf_start = buf;
-       dev_priv->num_fire_offsets = 0;
-
-       while (buf < buf_end) {
-
-               switch (state) {
-               case state_header2:
-                       state = via_check_header2(&buf, buf_end, hc_state);
-                       break;
-               case state_header1:
-                       state = via_check_header1(&buf, buf_end);
-                       break;
-               case state_vheader5:
-                       state = via_check_vheader5(&buf, buf_end);
-                       break;
-               case state_vheader6:
-                       state = via_check_vheader6(&buf, buf_end);
-                       break;
-               case state_command:
-                       cmd = *buf;
-                       if ((cmd == HALCYON_HEADER2) && supported_3d)
-                               state = state_header2;
-                       else if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1)
-                               state = state_header1;
-                       else if (cme_video
-                                && (cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5)
-                               state = state_vheader5;
-                       else if (cme_video
-                                && (cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6)
-                               state = state_vheader6;
-                       else if ((cmd == HALCYON_HEADER2) && !supported_3d) {
-                               DRM_ERROR("Accelerated 3D is not supported on this chipset yet.\n");
-                               state = state_error;
-                       } else {
-                               DRM_ERROR
-                                   ("Invalid / Unimplemented DMA HEADER command. 0x%x\n",
-                                    cmd);
-                               state = state_error;
-                       }
-                       break;
-               case state_error:
-               default:
-                       *hc_state = saved_state;
-                       return -EINVAL;
-               }
-       }
-       if (state == state_error) {
-               *hc_state = saved_state;
-               return -EINVAL;
-       }
-       return 0;
-}
-
-static int
-via_parse_command_stream(struct drm_device *dev, const uint32_t *buf,
-                        unsigned int size)
-{
-
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       uint32_t cmd;
-       const uint32_t *buf_end = buf + (size >> 2);
-       verifier_state_t state = state_command;
-       int fire_count = 0;
-
-       while (buf < buf_end) {
-
-               switch (state) {
-               case state_header2:
-                       state =
-                           via_parse_header2(dev_priv, &buf, buf_end,
-                                             &fire_count);
-                       break;
-               case state_header1:
-                       state = via_parse_header1(dev_priv, &buf, buf_end);
-                       break;
-               case state_vheader5:
-                       state = via_parse_vheader5(dev_priv, &buf, buf_end);
-                       break;
-               case state_vheader6:
-                       state = via_parse_vheader6(dev_priv, &buf, buf_end);
-                       break;
-               case state_command:
-                       cmd = *buf;
-                       if (cmd == HALCYON_HEADER2)
-                               state = state_header2;
-                       else if ((cmd & HALCYON_HEADER1MASK) == HALCYON_HEADER1)
-                               state = state_header1;
-                       else if ((cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER5)
-                               state = state_vheader5;
-                       else if ((cmd & VIA_VIDEOMASK) == VIA_VIDEO_HEADER6)
-                               state = state_vheader6;
-                       else {
-                               DRM_ERROR
-                                   ("Invalid / Unimplemented DMA HEADER command. 0x%x\n",
-                                    cmd);
-                               state = state_error;
-                       }
-                       break;
-               case state_error:
-               default:
-                       return -EINVAL;
-               }
-       }
-       if (state == state_error)
-               return -EINVAL;
-       return 0;
-}
-
-static void
-setup_hazard_table(hz_init_t init_table[], hazard_t table[], int size)
-{
-       int i;
-
-       for (i = 0; i < 256; ++i)
-               table[i] = forbidden_command;
-
-       for (i = 0; i < size; ++i)
-               table[init_table[i].code] = init_table[i].hz;
-}
-
-static void via_init_command_verifier(void)
-{
-       setup_hazard_table(init_table1, table1, ARRAY_SIZE(init_table1));
-       setup_hazard_table(init_table2, table2, ARRAY_SIZE(init_table2));
-       setup_hazard_table(init_table3, table3, ARRAY_SIZE(init_table3));
-}
-/*
- * Unmap a DMA mapping.
- */
-static void
-via_unmap_blit_from_device(struct pci_dev *pdev, drm_via_sg_info_t *vsg)
-{
-       int num_desc = vsg->num_desc;
-       unsigned cur_descriptor_page = num_desc / vsg->descriptors_per_page;
-       unsigned descriptor_this_page = num_desc % vsg->descriptors_per_page;
-       drm_via_descriptor_t *desc_ptr = vsg->desc_pages[cur_descriptor_page] +
-               descriptor_this_page;
-       dma_addr_t next = vsg->chain_start;
-
-       while (num_desc--) {
-               if (descriptor_this_page-- == 0) {
-                       cur_descriptor_page--;
-                       descriptor_this_page = vsg->descriptors_per_page - 1;
-                       desc_ptr = vsg->desc_pages[cur_descriptor_page] +
-                               descriptor_this_page;
-               }
-               dma_unmap_single(&pdev->dev, next, sizeof(*desc_ptr), DMA_TO_DEVICE);
-               dma_unmap_page(&pdev->dev, desc_ptr->mem_addr, desc_ptr->size, vsg->direction);
-               next = (dma_addr_t) desc_ptr->next;
-               desc_ptr--;
-       }
-}
-
-/*
- * If mode = 0, count how many descriptors are needed.
- * If mode = 1, Map the DMA pages for the device, put together and map also the descriptors.
- * Descriptors are run in reverse order by the hardware because we are not allowed to update the
- * 'next' field without syncing calls when the descriptor is already mapped.
- */
-static void
-via_map_blit_for_device(struct pci_dev *pdev,
-                  const drm_via_dmablit_t *xfer,
-                  drm_via_sg_info_t *vsg,
-                  int mode)
-{
-       unsigned cur_descriptor_page = 0;
-       unsigned num_descriptors_this_page = 0;
-       unsigned char *mem_addr = xfer->mem_addr;
-       unsigned char *cur_mem;
-       unsigned char *first_addr = (unsigned char *)VIA_PGDN(mem_addr);
-       uint32_t fb_addr = xfer->fb_addr;
-       uint32_t cur_fb;
-       unsigned long line_len;
-       unsigned remaining_len;
-       int num_desc = 0;
-       int cur_line;
-       dma_addr_t next = 0 | VIA_DMA_DPR_EC;
-       drm_via_descriptor_t *desc_ptr = NULL;
-
-       if (mode == 1)
-               desc_ptr = vsg->desc_pages[cur_descriptor_page];
-
-       for (cur_line = 0; cur_line < xfer->num_lines; ++cur_line) {
-
-               line_len = xfer->line_length;
-               cur_fb = fb_addr;
-               cur_mem = mem_addr;
-
-               while (line_len > 0) {
-
-                       remaining_len = min(PAGE_SIZE-VIA_PGOFF(cur_mem), line_len);
-                       line_len -= remaining_len;
-
-                       if (mode == 1) {
-                               desc_ptr->mem_addr =
-                                       dma_map_page(&pdev->dev,
-                                                    vsg->pages[VIA_PFN(cur_mem) -
-                                                               VIA_PFN(first_addr)],
-                                                    VIA_PGOFF(cur_mem), remaining_len,
-                                                    vsg->direction);
-                               desc_ptr->dev_addr = cur_fb;
-
-                               desc_ptr->size = remaining_len;
-                               desc_ptr->next = (uint32_t) next;
-                               next = dma_map_single(&pdev->dev, desc_ptr, sizeof(*desc_ptr),
-                                                     DMA_TO_DEVICE);
-                               desc_ptr++;
-                               if (++num_descriptors_this_page >= vsg->descriptors_per_page) {
-                                       num_descriptors_this_page = 0;
-                                       desc_ptr = vsg->desc_pages[++cur_descriptor_page];
-                               }
-                       }
-
-                       num_desc++;
-                       cur_mem += remaining_len;
-                       cur_fb += remaining_len;
-               }
-
-               mem_addr += xfer->mem_stride;
-               fb_addr += xfer->fb_stride;
-       }
-
-       if (mode == 1) {
-               vsg->chain_start = next;
-               vsg->state = dr_via_device_mapped;
-       }
-       vsg->num_desc = num_desc;
-}
-
-/*
- * Function that frees up all resources for a blit. It is usable even if the
- * blit info has only been partially built as long as the status enum is consistent
- * with the actual status of the used resources.
- */
-static void
-via_free_sg_info(struct pci_dev *pdev, drm_via_sg_info_t *vsg)
-{
-       int i;
-
-       switch (vsg->state) {
-       case dr_via_device_mapped:
-               via_unmap_blit_from_device(pdev, vsg);
-               fallthrough;
-       case dr_via_desc_pages_alloc:
-               for (i = 0; i < vsg->num_desc_pages; ++i) {
-                       if (vsg->desc_pages[i] != NULL)
-                               free_page((unsigned long)vsg->desc_pages[i]);
-               }
-               kfree(vsg->desc_pages);
-               fallthrough;
-       case dr_via_pages_locked:
-               unpin_user_pages_dirty_lock(vsg->pages, vsg->num_pages,
-                                          (vsg->direction == DMA_FROM_DEVICE));
-               fallthrough;
-       case dr_via_pages_alloc:
-               vfree(vsg->pages);
-               fallthrough;
-       default:
-               vsg->state = dr_via_sg_init;
-       }
-       vfree(vsg->bounce_buffer);
-       vsg->bounce_buffer = NULL;
-       vsg->free_on_sequence = 0;
-}
-
-/*
- * Fire a blit engine.
- */
-static void
-via_fire_dmablit(struct drm_device *dev, drm_via_sg_info_t *vsg, int engine)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-
-       via_write(dev_priv, VIA_PCI_DMA_MAR0 + engine*0x10, 0);
-       via_write(dev_priv, VIA_PCI_DMA_DAR0 + engine*0x10, 0);
-       via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DD | VIA_DMA_CSR_TD |
-                 VIA_DMA_CSR_DE);
-       via_write(dev_priv, VIA_PCI_DMA_MR0  + engine*0x04, VIA_DMA_MR_CM | VIA_DMA_MR_TDIE);
-       via_write(dev_priv, VIA_PCI_DMA_BCR0 + engine*0x10, 0);
-       via_write(dev_priv, VIA_PCI_DMA_DPR0 + engine*0x10, vsg->chain_start);
-       wmb();
-       via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_DE | VIA_DMA_CSR_TS);
-       via_read(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04);
-}
-
-/*
- * Obtain a page pointer array and lock all pages into system memory. A segmentation violation will
- * occur here if the calling user does not have access to the submitted address.
- */
-static int
-via_lock_all_dma_pages(drm_via_sg_info_t *vsg,  drm_via_dmablit_t *xfer)
-{
-       int ret;
-       unsigned long first_pfn = VIA_PFN(xfer->mem_addr);
-       vsg->num_pages = VIA_PFN(xfer->mem_addr + (xfer->num_lines * xfer->mem_stride - 1)) -
-               first_pfn + 1;
-
-       vsg->pages = vzalloc(array_size(sizeof(struct page *), vsg->num_pages));
-       if (NULL == vsg->pages)
-               return -ENOMEM;
-       ret = pin_user_pages_fast((unsigned long)xfer->mem_addr,
-                       vsg->num_pages,
-                       vsg->direction == DMA_FROM_DEVICE ? FOLL_WRITE : 0,
-                       vsg->pages);
-       if (ret != vsg->num_pages) {
-               if (ret < 0)
-                       return ret;
-               vsg->state = dr_via_pages_locked;
-               return -EINVAL;
-       }
-       vsg->state = dr_via_pages_locked;
-       DRM_DEBUG("DMA pages locked\n");
-       return 0;
-}
-
-/*
- * Allocate DMA capable memory for the blit descriptor chain, and an array that keeps track of the
- * pages we allocate. We don't want to use kmalloc for the descriptor chain because it may be
- * quite large for some blits, and pages don't need to be contiguous.
- */
-static int
-via_alloc_desc_pages(drm_via_sg_info_t *vsg)
-{
-       int i;
-
-       vsg->descriptors_per_page = PAGE_SIZE / sizeof(drm_via_descriptor_t);
-       vsg->num_desc_pages = (vsg->num_desc + vsg->descriptors_per_page - 1) /
-               vsg->descriptors_per_page;
-
-       if (NULL ==  (vsg->desc_pages = kcalloc(vsg->num_desc_pages, sizeof(void *), GFP_KERNEL)))
-               return -ENOMEM;
-
-       vsg->state = dr_via_desc_pages_alloc;
-       for (i = 0; i < vsg->num_desc_pages; ++i) {
-               if (NULL == (vsg->desc_pages[i] =
-                            (drm_via_descriptor_t *) __get_free_page(GFP_KERNEL)))
-                       return -ENOMEM;
-       }
-       DRM_DEBUG("Allocated %d pages for %d descriptors.\n", vsg->num_desc_pages,
-                 vsg->num_desc);
-       return 0;
-}
-
-static void
-via_abort_dmablit(struct drm_device *dev, int engine)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-
-       via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TA);
-}
-
-static void
-via_dmablit_engine_off(struct drm_device *dev, int engine)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-
-       via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04, VIA_DMA_CSR_TD | VIA_DMA_CSR_DD);
-}
-
-/*
- * The dmablit part of the IRQ handler. Trying to do only reasonably fast things here.
- * The rest, like unmapping and freeing memory for done blits is done in a separate workqueue
- * task. Basically the task of the interrupt handler is to submit a new blit to the engine, while
- * the workqueue task takes care of processing associated with the old blit.
- */
-static void
-via_dmablit_handler(struct drm_device *dev, int engine, int from_irq)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-       drm_via_blitq_t *blitq = dev_priv->blit_queues + engine;
-       int cur;
-       int done_transfer;
-       unsigned long irqsave = 0;
-       uint32_t status = 0;
-
-       DRM_DEBUG("DMA blit handler called. engine = %d, from_irq = %d, blitq = 0x%lx\n",
-                 engine, from_irq, (unsigned long) blitq);
-
-       if (from_irq)
-               spin_lock(&blitq->blit_lock);
-       else
-               spin_lock_irqsave(&blitq->blit_lock, irqsave);
-
-       done_transfer = blitq->is_active &&
-         ((status = via_read(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04)) & VIA_DMA_CSR_TD);
-       done_transfer = done_transfer || (blitq->aborting && !(status & VIA_DMA_CSR_DE));
-
-       cur = blitq->cur;
-       if (done_transfer) {
-
-               blitq->blits[cur]->aborted = blitq->aborting;
-               blitq->done_blit_handle++;
-               wake_up(blitq->blit_queue + cur);
-
-               cur++;
-               if (cur >= VIA_NUM_BLIT_SLOTS)
-                       cur = 0;
-               blitq->cur = cur;
-
-               /*
-                * Clear transfer done flag.
-                */
-
-               via_write(dev_priv, VIA_PCI_DMA_CSR0 + engine*0x04,  VIA_DMA_CSR_TD);
-
-               blitq->is_active = 0;
-               blitq->aborting = 0;
-               schedule_work(&blitq->wq);
-
-       } else if (blitq->is_active && time_after_eq(jiffies, blitq->end)) {
-
-               /*
-                * Abort transfer after one second.
-                */
-
-               via_abort_dmablit(dev, engine);
-               blitq->aborting = 1;
-               blitq->end = jiffies + HZ;
-       }
-
-       if (!blitq->is_active) {
-               if (blitq->num_outstanding) {
-                       via_fire_dmablit(dev, blitq->blits[cur], engine);
-                       blitq->is_active = 1;
-                       blitq->cur = cur;
-                       blitq->num_outstanding--;
-                       blitq->end = jiffies + HZ;
-                       if (!timer_pending(&blitq->poll_timer))
-                               mod_timer(&blitq->poll_timer, jiffies + 1);
-               } else {
-                       if (timer_pending(&blitq->poll_timer))
-                               del_timer(&blitq->poll_timer);
-                       via_dmablit_engine_off(dev, engine);
-               }
-       }
-
-       if (from_irq)
-               spin_unlock(&blitq->blit_lock);
-       else
-               spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-}
-
-/*
- * Check whether this blit is still active, performing necessary locking.
- */
-static int
-via_dmablit_active(drm_via_blitq_t *blitq, int engine, uint32_t handle, wait_queue_head_t **queue)
-{
-       unsigned long irqsave;
-       uint32_t slot;
-       int active;
-
-       spin_lock_irqsave(&blitq->blit_lock, irqsave);
-
-       /*
-        * Allow for handle wraparounds.
-        */
-
-       active = ((blitq->done_blit_handle - handle) > (1 << 23)) &&
-               ((blitq->cur_blit_handle - handle) <= (1 << 23));
-
-       if (queue && active) {
-               slot = handle - blitq->done_blit_handle + blitq->cur - 1;
-               if (slot >= VIA_NUM_BLIT_SLOTS)
-                       slot -= VIA_NUM_BLIT_SLOTS;
-               *queue = blitq->blit_queue + slot;
-       }
-
-       spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-
-       return active;
-}
-
-/*
- * Sync. Wait for at least three seconds for the blit to be performed.
- */
-static int
-via_dmablit_sync(struct drm_device *dev, uint32_t handle, int engine)
-{
-
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-       drm_via_blitq_t *blitq = dev_priv->blit_queues + engine;
-       wait_queue_head_t *queue;
-       int ret = 0;
-
-       if (via_dmablit_active(blitq, engine, handle, &queue)) {
-               VIA_WAIT_ON(ret, *queue, 3 * HZ,
-                           !via_dmablit_active(blitq, engine, handle, NULL));
-       }
-       DRM_DEBUG("DMA blit sync handle 0x%x engine %d returned %d\n",
-                 handle, engine, ret);
-
-       return ret;
-}
-
-/*
- * A timer that regularly polls the blit engine in cases where we don't have interrupts:
- * a) Broken hardware (typically those that don't have any video capture facility).
- * b) Blit abort. The hardware doesn't send an interrupt when a blit is aborted.
- * The timer and hardware IRQ's can and do work in parallel. If the hardware has
- * irqs, it will shorten the latency somewhat.
- */
-static void
-via_dmablit_timer(struct timer_list *t)
-{
-       drm_via_blitq_t *blitq = from_timer(blitq, t, poll_timer);
-       struct drm_device *dev = blitq->dev;
-       int engine = (int)
-               (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues);
-
-       DRM_DEBUG("Polling timer called for engine %d, jiffies %lu\n", engine,
-                 (unsigned long) jiffies);
-
-       via_dmablit_handler(dev, engine, 0);
-
-       if (!timer_pending(&blitq->poll_timer)) {
-               mod_timer(&blitq->poll_timer, jiffies + 1);
-
-              /*
-               * Rerun handler to delete timer if engines are off, and
-               * to shorten abort latency. This is a little nasty.
-               */
-
-              via_dmablit_handler(dev, engine, 0);
-
-       }
-}
-
-/*
- * Workqueue task that frees data and mappings associated with a blit.
- * Also wakes up waiting processes. Each of these tasks handles one
- * blit engine only and may not be called on each interrupt.
- */
-static void
-via_dmablit_workqueue(struct work_struct *work)
-{
-       drm_via_blitq_t *blitq = container_of(work, drm_via_blitq_t, wq);
-       struct drm_device *dev = blitq->dev;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       unsigned long irqsave;
-       drm_via_sg_info_t *cur_sg;
-       int cur_released;
-
-
-       DRM_DEBUG("Workqueue task called for blit engine %ld\n", (unsigned long)
-                 (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues));
-
-       spin_lock_irqsave(&blitq->blit_lock, irqsave);
-
-       while (blitq->serviced != blitq->cur) {
-
-               cur_released = blitq->serviced++;
-
-               DRM_DEBUG("Releasing blit slot %d\n", cur_released);
-
-               if (blitq->serviced >= VIA_NUM_BLIT_SLOTS)
-                       blitq->serviced = 0;
-
-               cur_sg = blitq->blits[cur_released];
-               blitq->num_free++;
-
-               spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-
-               wake_up(&blitq->busy_queue);
-
-               via_free_sg_info(pdev, cur_sg);
-               kfree(cur_sg);
-
-               spin_lock_irqsave(&blitq->blit_lock, irqsave);
-       }
-
-       spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-}
-
-/*
- * Init all blit engines. Currently we use two, but some hardware have 4.
- */
-static void
-via_init_dmablit(struct drm_device *dev)
-{
-       int i, j;
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       drm_via_blitq_t *blitq;
-
-       pci_set_master(pdev);
-
-       for (i = 0; i < VIA_NUM_BLIT_ENGINES; ++i) {
-               blitq = dev_priv->blit_queues + i;
-               blitq->dev = dev;
-               blitq->cur_blit_handle = 0;
-               blitq->done_blit_handle = 0;
-               blitq->head = 0;
-               blitq->cur = 0;
-               blitq->serviced = 0;
-               blitq->num_free = VIA_NUM_BLIT_SLOTS - 1;
-               blitq->num_outstanding = 0;
-               blitq->is_active = 0;
-               blitq->aborting = 0;
-               spin_lock_init(&blitq->blit_lock);
-               for (j = 0; j < VIA_NUM_BLIT_SLOTS; ++j)
-                       init_waitqueue_head(blitq->blit_queue + j);
-               init_waitqueue_head(&blitq->busy_queue);
-               INIT_WORK(&blitq->wq, via_dmablit_workqueue);
-               timer_setup(&blitq->poll_timer, via_dmablit_timer, 0);
-       }
-}
-
-/*
- * Build all info and do all mappings required for a blit.
- */
-static int
-via_build_sg_info(struct drm_device *dev, drm_via_sg_info_t *vsg, drm_via_dmablit_t *xfer)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       int draw = xfer->to_fb;
-       int ret = 0;
-
-       vsg->direction = (draw) ? DMA_TO_DEVICE : DMA_FROM_DEVICE;
-       vsg->bounce_buffer = NULL;
-
-       vsg->state = dr_via_sg_init;
-
-       if (xfer->num_lines <= 0 || xfer->line_length <= 0) {
-               DRM_ERROR("Zero size bitblt.\n");
-               return -EINVAL;
-       }
-
-       /*
-        * Below check is a driver limitation, not a hardware one. We
-        * don't want to lock unused pages, and don't want to incoporate the
-        * extra logic of avoiding them. Make sure there are no.
-        * (Not a big limitation anyway.)
-        */
-
-       if ((xfer->mem_stride - xfer->line_length) > 2*PAGE_SIZE) {
-               DRM_ERROR("Too large system memory stride. Stride: %d, "
-                         "Length: %d\n", xfer->mem_stride, xfer->line_length);
-               return -EINVAL;
-       }
-
-       if ((xfer->mem_stride == xfer->line_length) &&
-          (xfer->fb_stride == xfer->line_length)) {
-               xfer->mem_stride *= xfer->num_lines;
-               xfer->line_length = xfer->mem_stride;
-               xfer->fb_stride = xfer->mem_stride;
-               xfer->num_lines = 1;
-       }
-
-       /*
-        * Don't lock an arbitrary large number of pages, since that causes a
-        * DOS security hole.
-        */
-
-       if (xfer->num_lines > 2048 || (xfer->num_lines*xfer->mem_stride > (2048*2048*4))) {
-               DRM_ERROR("Too large PCI DMA bitblt.\n");
-               return -EINVAL;
-       }
-
-       /*
-        * we allow a negative fb stride to allow flipping of images in
-        * transfer.
-        */
-
-       if (xfer->mem_stride < xfer->line_length ||
-               abs(xfer->fb_stride) < xfer->line_length) {
-               DRM_ERROR("Invalid frame-buffer / memory stride.\n");
-               return -EINVAL;
-       }
-
-       /*
-        * A hardware bug seems to be worked around if system memory addresses start on
-        * 16 byte boundaries. This seems a bit restrictive however. VIA is contacted
-        * about this. Meanwhile, impose the following restrictions:
-        */
-
-#ifdef VIA_BUGFREE
-       if ((((unsigned long)xfer->mem_addr & 3) != ((unsigned long)xfer->fb_addr & 3)) ||
-           ((xfer->num_lines > 1) && ((xfer->mem_stride & 3) != (xfer->fb_stride & 3)))) {
-               DRM_ERROR("Invalid DRM bitblt alignment.\n");
-               return -EINVAL;
-       }
-#else
-       if ((((unsigned long)xfer->mem_addr & 15) ||
-             ((unsigned long)xfer->fb_addr & 3)) ||
-          ((xfer->num_lines > 1) &&
-          ((xfer->mem_stride & 15) || (xfer->fb_stride & 3)))) {
-               DRM_ERROR("Invalid DRM bitblt alignment.\n");
-               return -EINVAL;
-       }
-#endif
-
-       if (0 != (ret = via_lock_all_dma_pages(vsg, xfer))) {
-               DRM_ERROR("Could not lock DMA pages.\n");
-               via_free_sg_info(pdev, vsg);
-               return ret;
-       }
-
-       via_map_blit_for_device(pdev, xfer, vsg, 0);
-       if (0 != (ret = via_alloc_desc_pages(vsg))) {
-               DRM_ERROR("Could not allocate DMA descriptor pages.\n");
-               via_free_sg_info(pdev, vsg);
-               return ret;
-       }
-       via_map_blit_for_device(pdev, xfer, vsg, 1);
-
-       return 0;
-}
-
-/*
- * Reserve one free slot in the blit queue. Will wait for one second for one
- * to become available. Otherwise -EBUSY is returned.
- */
-static int
-via_dmablit_grab_slot(drm_via_blitq_t *blitq, int engine)
-{
-       int ret = 0;
-       unsigned long irqsave;
-
-       DRM_DEBUG("Num free is %d\n", blitq->num_free);
-       spin_lock_irqsave(&blitq->blit_lock, irqsave);
-       while (blitq->num_free == 0) {
-               spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-
-               VIA_WAIT_ON(ret, blitq->busy_queue, HZ, blitq->num_free > 0);
-               if (ret)
-                       return (-EINTR == ret) ? -EAGAIN : ret;
-
-               spin_lock_irqsave(&blitq->blit_lock, irqsave);
-       }
-
-       blitq->num_free--;
-       spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-
-       return 0;
-}
-
-/*
- * Hand back a free slot if we changed our mind.
- */
-static void
-via_dmablit_release_slot(drm_via_blitq_t *blitq)
-{
-       unsigned long irqsave;
-
-       spin_lock_irqsave(&blitq->blit_lock, irqsave);
-       blitq->num_free++;
-       spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-       wake_up(&blitq->busy_queue);
-}
-
-/*
- * Grab a free slot. Build blit info and queue a blit.
- */
-static int
-via_dmablit(struct drm_device *dev, drm_via_dmablit_t *xfer)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *)dev->dev_private;
-       drm_via_sg_info_t *vsg;
-       drm_via_blitq_t *blitq;
-       int ret;
-       int engine;
-       unsigned long irqsave;
-
-       if (dev_priv == NULL) {
-               DRM_ERROR("Called without initialization.\n");
-               return -EINVAL;
-       }
-
-       engine = (xfer->to_fb) ? 0 : 1;
-       blitq = dev_priv->blit_queues + engine;
-       if (0 != (ret = via_dmablit_grab_slot(blitq, engine)))
-               return ret;
-       if (NULL == (vsg = kmalloc(sizeof(*vsg), GFP_KERNEL))) {
-               via_dmablit_release_slot(blitq);
-               return -ENOMEM;
-       }
-       if (0 != (ret = via_build_sg_info(dev, vsg, xfer))) {
-               via_dmablit_release_slot(blitq);
-               kfree(vsg);
-               return ret;
-       }
-       spin_lock_irqsave(&blitq->blit_lock, irqsave);
-
-       blitq->blits[blitq->head++] = vsg;
-       if (blitq->head >= VIA_NUM_BLIT_SLOTS)
-               blitq->head = 0;
-       blitq->num_outstanding++;
-       xfer->sync.sync_handle = ++blitq->cur_blit_handle;
-
-       spin_unlock_irqrestore(&blitq->blit_lock, irqsave);
-       xfer->sync.engine = engine;
-
-       via_dmablit_handler(dev, engine, 0);
-
-       return 0;
-}
-
-/*
- * Sync on a previously submitted blit. Note that the X server use signals extensively, and
- * that there is a very big probability that this IOCTL will be interrupted by a signal. In that
- * case it returns with -EAGAIN for the signal to be delivered.
- * The caller should then reissue the IOCTL. This is similar to what is being done for drmGetLock().
- */
-static int
-via_dma_blit_sync(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_blitsync_t *sync = data;
-       int err;
-
-       if (sync->engine >= VIA_NUM_BLIT_ENGINES)
-               return -EINVAL;
-
-       err = via_dmablit_sync(dev, sync->sync_handle, sync->engine);
-
-       if (-EINTR == err)
-               err = -EAGAIN;
-
-       return err;
-}
-
-/*
- * Queue a blit and hand back a handle to be used for sync. This IOCTL may be interrupted by a signal
- * while waiting for a free slot in the blit queue. In that case it returns with -EAGAIN and should
- * be reissued. See the above IOCTL code.
- */
-static int
-via_dma_blit(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_dmablit_t *xfer = data;
-       int err;
-
-       err = via_dmablit(dev, xfer);
-
-       return err;
-}
-
-static u32 via_get_vblank_counter(struct drm_device *dev, unsigned int pipe)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-
-       if (pipe != 0)
-               return 0;
-
-       return atomic_read(&dev_priv->vbl_received);
-}
-
-static irqreturn_t via_driver_irq_handler(int irq, void *arg)
-{
-       struct drm_device *dev = (struct drm_device *) arg;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       u32 status;
-       int handled = 0;
-       ktime_t cur_vblank;
-       drm_via_irq_t *cur_irq = dev_priv->via_irqs;
-       int i;
-
-       status = via_read(dev_priv, VIA_REG_INTERRUPT);
-       if (status & VIA_IRQ_VBLANK_PENDING) {
-               atomic_inc(&dev_priv->vbl_received);
-               if (!(atomic_read(&dev_priv->vbl_received) & 0x0F)) {
-                       cur_vblank = ktime_get();
-                       if (dev_priv->last_vblank_valid) {
-                               dev_priv->nsec_per_vblank =
-                                       ktime_sub(cur_vblank,
-                                               dev_priv->last_vblank) >> 4;
-                       }
-                       dev_priv->last_vblank = cur_vblank;
-                       dev_priv->last_vblank_valid = 1;
-               }
-               if (!(atomic_read(&dev_priv->vbl_received) & 0xFF)) {
-                       DRM_DEBUG("nsec per vblank is: %llu\n",
-                                 ktime_to_ns(dev_priv->nsec_per_vblank));
-               }
-               drm_handle_vblank(dev, 0);
-               handled = 1;
-       }
-
-       for (i = 0; i < dev_priv->num_irqs; ++i) {
-               if (status & cur_irq->pending_mask) {
-                       atomic_inc(&cur_irq->irq_received);
-                       wake_up(&cur_irq->irq_queue);
-                       handled = 1;
-                       if (dev_priv->irq_map[drm_via_irq_dma0_td] == i)
-                               via_dmablit_handler(dev, 0, 1);
-                       else if (dev_priv->irq_map[drm_via_irq_dma1_td] == i)
-                               via_dmablit_handler(dev, 1, 1);
-               }
-               cur_irq++;
-       }
-
-       /* Acknowledge interrupts */
-       via_write(dev_priv, VIA_REG_INTERRUPT, status);
-
-
-       if (handled)
-               return IRQ_HANDLED;
-       else
-               return IRQ_NONE;
-}
-
-static __inline__ void viadrv_acknowledge_irqs(drm_via_private_t *dev_priv)
-{
-       u32 status;
-
-       if (dev_priv) {
-               /* Acknowledge interrupts */
-               status = via_read(dev_priv, VIA_REG_INTERRUPT);
-               via_write(dev_priv, VIA_REG_INTERRUPT, status |
-                         dev_priv->irq_pending_mask);
-       }
-}
-
-static int via_enable_vblank(struct drm_device *dev, unsigned int pipe)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-       u32 status;
-
-       if (pipe != 0) {
-               DRM_ERROR("%s:  bad crtc %u\n", __func__, pipe);
-               return -EINVAL;
-       }
-
-       status = via_read(dev_priv, VIA_REG_INTERRUPT);
-       via_write(dev_priv, VIA_REG_INTERRUPT, status | VIA_IRQ_VBLANK_ENABLE);
-
-       via_write8(dev_priv, 0x83d4, 0x11);
-       via_write8_mask(dev_priv, 0x83d5, 0x30, 0x30);
-
-       return 0;
-}
-
-static void via_disable_vblank(struct drm_device *dev, unsigned int pipe)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-       u32 status;
-
-       status = via_read(dev_priv, VIA_REG_INTERRUPT);
-       via_write(dev_priv, VIA_REG_INTERRUPT, status & ~VIA_IRQ_VBLANK_ENABLE);
-
-       via_write8(dev_priv, 0x83d4, 0x11);
-       via_write8_mask(dev_priv, 0x83d5, 0x30, 0);
-
-       if (pipe != 0)
-               DRM_ERROR("%s:  bad crtc %u\n", __func__, pipe);
-}
-
-static int
-via_driver_irq_wait(struct drm_device *dev, unsigned int irq, int force_sequence,
-                   unsigned int *sequence)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       unsigned int cur_irq_sequence;
-       drm_via_irq_t *cur_irq;
-       int ret = 0;
-       maskarray_t *masks;
-       int real_irq;
-
-       DRM_DEBUG("\n");
-
-       if (!dev_priv) {
-               DRM_ERROR("called with no initialization\n");
-               return -EINVAL;
-       }
-
-       if (irq >= drm_via_irq_num) {
-               DRM_ERROR("Trying to wait on unknown irq %d\n", irq);
-               return -EINVAL;
-       }
-
-       real_irq = dev_priv->irq_map[irq];
-
-       if (real_irq < 0) {
-               DRM_ERROR("Video IRQ %d not available on this hardware.\n",
-                         irq);
-               return -EINVAL;
-       }
-
-       masks = dev_priv->irq_masks;
-       cur_irq = dev_priv->via_irqs + real_irq;
-
-       if (masks[real_irq][2] && !force_sequence) {
-               VIA_WAIT_ON(ret, cur_irq->irq_queue, 3 * HZ,
-                           ((via_read(dev_priv, masks[irq][2]) & masks[irq][3]) ==
-                            masks[irq][4]));
-               cur_irq_sequence = atomic_read(&cur_irq->irq_received);
-       } else {
-               VIA_WAIT_ON(ret, cur_irq->irq_queue, 3 * HZ,
-                           (((cur_irq_sequence =
-                              atomic_read(&cur_irq->irq_received)) -
-                             *sequence) <= (1 << 23)));
-       }
-       *sequence = cur_irq_sequence;
-       return ret;
-}
-
-
-/*
- * drm_dma.h hooks
- */
-
-static void via_driver_irq_preinstall(struct drm_device *dev)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       u32 status;
-       drm_via_irq_t *cur_irq;
-       int i;
-
-       DRM_DEBUG("dev_priv: %p\n", dev_priv);
-       if (dev_priv) {
-               cur_irq = dev_priv->via_irqs;
-
-               dev_priv->irq_enable_mask = VIA_IRQ_VBLANK_ENABLE;
-               dev_priv->irq_pending_mask = VIA_IRQ_VBLANK_PENDING;
-
-               if (dev_priv->chipset == VIA_PRO_GROUP_A ||
-                   dev_priv->chipset == VIA_DX9_0) {
-                       dev_priv->irq_masks = via_pro_group_a_irqs;
-                       dev_priv->num_irqs = via_num_pro_group_a;
-                       dev_priv->irq_map = via_irqmap_pro_group_a;
-               } else {
-                       dev_priv->irq_masks = via_unichrome_irqs;
-                       dev_priv->num_irqs = via_num_unichrome;
-                       dev_priv->irq_map = via_irqmap_unichrome;
-               }
-
-               for (i = 0; i < dev_priv->num_irqs; ++i) {
-                       atomic_set(&cur_irq->irq_received, 0);
-                       cur_irq->enable_mask = dev_priv->irq_masks[i][0];
-                       cur_irq->pending_mask = dev_priv->irq_masks[i][1];
-                       init_waitqueue_head(&cur_irq->irq_queue);
-                       dev_priv->irq_enable_mask |= cur_irq->enable_mask;
-                       dev_priv->irq_pending_mask |= cur_irq->pending_mask;
-                       cur_irq++;
-
-                       DRM_DEBUG("Initializing IRQ %d\n", i);
-               }
-
-               dev_priv->last_vblank_valid = 0;
-
-               /* Clear VSync interrupt regs */
-               status = via_read(dev_priv, VIA_REG_INTERRUPT);
-               via_write(dev_priv, VIA_REG_INTERRUPT, status &
-                         ~(dev_priv->irq_enable_mask));
-
-               /* Clear bits if they're already high */
-               viadrv_acknowledge_irqs(dev_priv);
-       }
-}
-
-static int via_driver_irq_postinstall(struct drm_device *dev)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       u32 status;
-
-       DRM_DEBUG("fun: %s\n", __func__);
-       if (!dev_priv)
-               return -EINVAL;
-
-       status = via_read(dev_priv, VIA_REG_INTERRUPT);
-       via_write(dev_priv, VIA_REG_INTERRUPT, status | VIA_IRQ_GLOBAL
-                 | dev_priv->irq_enable_mask);
-
-       /* Some magic, oh for some data sheets ! */
-       via_write8(dev_priv, 0x83d4, 0x11);
-       via_write8_mask(dev_priv, 0x83d5, 0x30, 0x30);
-
-       return 0;
-}
-
-static void via_driver_irq_uninstall(struct drm_device *dev)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       u32 status;
-
-       DRM_DEBUG("\n");
-       if (dev_priv) {
-
-               /* Some more magic, oh for some data sheets ! */
-
-               via_write8(dev_priv, 0x83d4, 0x11);
-               via_write8_mask(dev_priv, 0x83d5, 0x30, 0);
-
-               status = via_read(dev_priv, VIA_REG_INTERRUPT);
-               via_write(dev_priv, VIA_REG_INTERRUPT, status &
-                         ~(VIA_IRQ_VBLANK_ENABLE | dev_priv->irq_enable_mask));
-       }
-}
-
-static int via_wait_irq(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_irqwait_t *irqwait = data;
-       struct timespec64 now;
-       int ret = 0;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       drm_via_irq_t *cur_irq = dev_priv->via_irqs;
-       int force_sequence;
-
-       if (irqwait->request.irq >= dev_priv->num_irqs) {
-               DRM_ERROR("Trying to wait on unknown irq %d\n",
-                         irqwait->request.irq);
-               return -EINVAL;
-       }
-
-       cur_irq += irqwait->request.irq;
-
-       switch (irqwait->request.type & ~VIA_IRQ_FLAGS_MASK) {
-       case VIA_IRQ_RELATIVE:
-               irqwait->request.sequence +=
-                       atomic_read(&cur_irq->irq_received);
-               irqwait->request.type &= ~_DRM_VBLANK_RELATIVE;
-               break;
-       case VIA_IRQ_ABSOLUTE:
-               break;
-       default:
-               return -EINVAL;
-       }
-
-       if (irqwait->request.type & VIA_IRQ_SIGNAL) {
-               DRM_ERROR("Signals on Via IRQs not implemented yet.\n");
-               return -EINVAL;
-       }
-
-       force_sequence = (irqwait->request.type & VIA_IRQ_FORCE_SEQUENCE);
-
-       ret = via_driver_irq_wait(dev, irqwait->request.irq, force_sequence,
-                                 &irqwait->request.sequence);
-       ktime_get_ts64(&now);
-       irqwait->reply.tval_sec = now.tv_sec;
-       irqwait->reply.tval_usec = now.tv_nsec / NSEC_PER_USEC;
-
-       return ret;
-}
-
-static void via_init_futex(drm_via_private_t *dev_priv)
-{
-       unsigned int i;
-
-       DRM_DEBUG("\n");
-
-       for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) {
-               init_waitqueue_head(&(dev_priv->decoder_queue[i]));
-               XVMCLOCKPTR(dev_priv->sarea_priv, i)->lock = 0;
-       }
-}
-
-static void via_cleanup_futex(drm_via_private_t *dev_priv)
-{
-}
-
-static void via_release_futex(drm_via_private_t *dev_priv, int context)
-{
-       unsigned int i;
-       volatile int *lock;
-
-       if (!dev_priv->sarea_priv)
-               return;
-
-       for (i = 0; i < VIA_NR_XVMC_LOCKS; ++i) {
-               lock = (volatile int *)XVMCLOCKPTR(dev_priv->sarea_priv, i);
-               if ((_DRM_LOCKING_CONTEXT(*lock) == context)) {
-                       if (_DRM_LOCK_IS_HELD(*lock)
-                           && (*lock & _DRM_LOCK_CONT)) {
-                               wake_up(&(dev_priv->decoder_queue[i]));
-                       }
-                       *lock = 0;
-               }
-       }
-}
-
-static int via_decoder_futex(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_futex_t *fx = data;
-       volatile int *lock;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       drm_via_sarea_t *sAPriv = dev_priv->sarea_priv;
-       int ret = 0;
-
-       DRM_DEBUG("\n");
-
-       if (fx->lock >= VIA_NR_XVMC_LOCKS)
-               return -EFAULT;
-
-       lock = (volatile int *)XVMCLOCKPTR(sAPriv, fx->lock);
-
-       switch (fx->func) {
-       case VIA_FUTEX_WAIT:
-               VIA_WAIT_ON(ret, dev_priv->decoder_queue[fx->lock],
-                           (fx->ms / 10) * (HZ / 100), *lock != fx->val);
-               return ret;
-       case VIA_FUTEX_WAKE:
-               wake_up(&(dev_priv->decoder_queue[fx->lock]));
-               return 0;
-       }
-       return 0;
-}
-
-static int via_agp_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_agp_t *agp = data;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-
-       mutex_lock(&dev->struct_mutex);
-       drm_mm_init(&dev_priv->agp_mm, 0, agp->size >> VIA_MM_ALIGN_SHIFT);
-
-       dev_priv->agp_initialized = 1;
-       dev_priv->agp_offset = agp->offset;
-       mutex_unlock(&dev->struct_mutex);
-
-       DRM_DEBUG("offset = %u, size = %u\n", agp->offset, agp->size);
-       return 0;
-}
-
-static int via_fb_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_fb_t *fb = data;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-
-       mutex_lock(&dev->struct_mutex);
-       drm_mm_init(&dev_priv->vram_mm, 0, fb->size >> VIA_MM_ALIGN_SHIFT);
-
-       dev_priv->vram_initialized = 1;
-       dev_priv->vram_offset = fb->offset;
-
-       mutex_unlock(&dev->struct_mutex);
-       DRM_DEBUG("offset = %u, size = %u\n", fb->offset, fb->size);
-
-       return 0;
-
-}
-
-static int via_final_context(struct drm_device *dev, int context)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-
-       via_release_futex(dev_priv, context);
-
-       /* Linux specific until context tracking code gets ported to BSD */
-       /* Last context, perform cleanup */
-       if (list_is_singular(&dev->ctxlist)) {
-               DRM_DEBUG("Last Context\n");
-               drm_legacy_irq_uninstall(dev);
-               via_cleanup_futex(dev_priv);
-               via_do_cleanup_map(dev);
-       }
-       return 1;
-}
-
-static void via_lastclose(struct drm_device *dev)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-
-       if (!dev_priv)
-               return;
-
-       mutex_lock(&dev->struct_mutex);
-       if (dev_priv->vram_initialized) {
-               drm_mm_takedown(&dev_priv->vram_mm);
-               dev_priv->vram_initialized = 0;
-       }
-       if (dev_priv->agp_initialized) {
-               drm_mm_takedown(&dev_priv->agp_mm);
-               dev_priv->agp_initialized = 0;
-       }
-       mutex_unlock(&dev->struct_mutex);
-}
-
-static int via_mem_alloc(struct drm_device *dev, void *data,
-                 struct drm_file *file)
-{
-       drm_via_mem_t *mem = data;
-       int retval = 0, user_key;
-       struct via_memblock *item;
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       struct via_file_private *file_priv = file->driver_priv;
-       unsigned long tmpSize;
-
-       if (mem->type > VIA_MEM_AGP) {
-               DRM_ERROR("Unknown memory type allocation\n");
-               return -EINVAL;
-       }
-       mutex_lock(&dev->struct_mutex);
-       if (0 == ((mem->type == VIA_MEM_VIDEO) ? dev_priv->vram_initialized :
-                     dev_priv->agp_initialized)) {
-               mutex_unlock(&dev->struct_mutex);
-               DRM_ERROR
-                   ("Attempt to allocate from uninitialized memory manager.\n");
-               return -EINVAL;
-       }
-
-       item = kzalloc(sizeof(*item), GFP_KERNEL);
-       if (!item) {
-               retval = -ENOMEM;
-               goto fail_alloc;
-       }
-
-       tmpSize = (mem->size + VIA_MM_ALIGN_MASK) >> VIA_MM_ALIGN_SHIFT;
-       if (mem->type == VIA_MEM_AGP)
-               retval = drm_mm_insert_node(&dev_priv->agp_mm,
-                                           &item->mm_node,
-                                           tmpSize);
-       else
-               retval = drm_mm_insert_node(&dev_priv->vram_mm,
-                                           &item->mm_node,
-                                           tmpSize);
-       if (retval)
-               goto fail_alloc;
-
-       retval = idr_alloc(&dev_priv->object_idr, item, 1, 0, GFP_KERNEL);
-       if (retval < 0)
-               goto fail_idr;
-       user_key = retval;
-
-       list_add(&item->owner_list, &file_priv->obj_list);
-       mutex_unlock(&dev->struct_mutex);
-
-       mem->offset = ((mem->type == VIA_MEM_VIDEO) ?
-                     dev_priv->vram_offset : dev_priv->agp_offset) +
-           ((item->mm_node.start) << VIA_MM_ALIGN_SHIFT);
-       mem->index = user_key;
-
-       return 0;
-
-fail_idr:
-       drm_mm_remove_node(&item->mm_node);
-fail_alloc:
-       kfree(item);
-       mutex_unlock(&dev->struct_mutex);
-
-       mem->offset = 0;
-       mem->size = 0;
-       mem->index = 0;
-       DRM_DEBUG("Video memory allocation failed\n");
-
-       return retval;
-}
-
-static int via_mem_free(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-       drm_via_mem_t *mem = data;
-       struct via_memblock *obj;
-
-       mutex_lock(&dev->struct_mutex);
-       obj = idr_find(&dev_priv->object_idr, mem->index);
-       if (obj == NULL) {
-               mutex_unlock(&dev->struct_mutex);
-               return -EINVAL;
-       }
-
-       idr_remove(&dev_priv->object_idr, mem->index);
-       list_del(&obj->owner_list);
-       drm_mm_remove_node(&obj->mm_node);
-       kfree(obj);
-       mutex_unlock(&dev->struct_mutex);
-
-       DRM_DEBUG("free = 0x%lx\n", mem->index);
-
-       return 0;
-}
-
-
-static void via_reclaim_buffers_locked(struct drm_device *dev,
-                               struct drm_file *file)
-{
-       struct via_file_private *file_priv = file->driver_priv;
-       struct via_memblock *entry, *next;
-
-       if (!(dev->master && file->master->lock.hw_lock))
-               return;
-
-       drm_legacy_idlelock_take(&file->master->lock);
-
-       mutex_lock(&dev->struct_mutex);
-       if (list_empty(&file_priv->obj_list)) {
-               mutex_unlock(&dev->struct_mutex);
-               drm_legacy_idlelock_release(&file->master->lock);
-
-               return;
-       }
-
-       via_driver_dma_quiescent(dev);
-
-       list_for_each_entry_safe(entry, next, &file_priv->obj_list,
-                                owner_list) {
-               list_del(&entry->owner_list);
-               drm_mm_remove_node(&entry->mm_node);
-               kfree(entry);
-       }
-       mutex_unlock(&dev->struct_mutex);
-
-       drm_legacy_idlelock_release(&file->master->lock);
-
-       return;
-}
-
-static int via_do_init_map(struct drm_device *dev, drm_via_init_t *init)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-
-       DRM_DEBUG("\n");
-
-       dev_priv->sarea = drm_legacy_getsarea(dev);
-       if (!dev_priv->sarea) {
-               DRM_ERROR("could not find sarea!\n");
-               dev->dev_private = (void *)dev_priv;
-               via_do_cleanup_map(dev);
-               return -EINVAL;
-       }
-
-       dev_priv->fb = drm_legacy_findmap(dev, init->fb_offset);
-       if (!dev_priv->fb) {
-               DRM_ERROR("could not find framebuffer!\n");
-               dev->dev_private = (void *)dev_priv;
-               via_do_cleanup_map(dev);
-               return -EINVAL;
-       }
-       dev_priv->mmio = drm_legacy_findmap(dev, init->mmio_offset);
-       if (!dev_priv->mmio) {
-               DRM_ERROR("could not find mmio region!\n");
-               dev->dev_private = (void *)dev_priv;
-               via_do_cleanup_map(dev);
-               return -EINVAL;
-       }
-
-       dev_priv->sarea_priv =
-           (drm_via_sarea_t *) ((u8 *) dev_priv->sarea->handle +
-                                init->sarea_priv_offset);
-
-       dev_priv->agpAddr = init->agpAddr;
-
-       via_init_futex(dev_priv);
-
-       via_init_dmablit(dev);
-
-       dev->dev_private = (void *)dev_priv;
-       return 0;
-}
-
-int via_do_cleanup_map(struct drm_device *dev)
-{
-       via_dma_cleanup(dev);
-
-       return 0;
-}
-
-static int via_map_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_init_t *init = data;
-
-       DRM_DEBUG("\n");
-
-       switch (init->func) {
-       case VIA_INIT_MAP:
-               return via_do_init_map(dev, init);
-       case VIA_CLEANUP_MAP:
-               return via_do_cleanup_map(dev);
-       }
-
-       return -EINVAL;
-}
-
-static int via_driver_load(struct drm_device *dev, unsigned long chipset)
-{
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       drm_via_private_t *dev_priv;
-       int ret = 0;
-
-       dev_priv = kzalloc(sizeof(drm_via_private_t), GFP_KERNEL);
-       if (dev_priv == NULL)
-               return -ENOMEM;
-
-       idr_init_base(&dev_priv->object_idr, 1);
-       dev->dev_private = (void *)dev_priv;
-
-       dev_priv->chipset = chipset;
-
-       pci_set_master(pdev);
-
-       ret = drm_vblank_init(dev, 1);
-       if (ret) {
-               kfree(dev_priv);
-               return ret;
-       }
-
-       return 0;
-}
-
-static void via_driver_unload(struct drm_device *dev)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-
-       idr_destroy(&dev_priv->object_idr);
-
-       kfree(dev_priv);
-}
-
-static void via_cmdbuf_start(drm_via_private_t *dev_priv);
-static void via_cmdbuf_pause(drm_via_private_t *dev_priv);
-static void via_cmdbuf_reset(drm_via_private_t *dev_priv);
-static void via_cmdbuf_rewind(drm_via_private_t *dev_priv);
-static int via_wait_idle(drm_via_private_t *dev_priv);
-static void via_pad_cache(drm_via_private_t *dev_priv, int qwords);
-
-/*
- * Free space in command buffer.
- */
-
-static uint32_t via_cmdbuf_space(drm_via_private_t *dev_priv)
-{
-       uint32_t agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr;
-       uint32_t hw_addr = *(dev_priv->hw_addr_ptr) - agp_base;
-
-       return ((hw_addr <= dev_priv->dma_low) ?
-               (dev_priv->dma_high + hw_addr - dev_priv->dma_low) :
-               (hw_addr - dev_priv->dma_low));
-}
-
-/*
- * How much does the command regulator lag behind?
- */
-
-static uint32_t via_cmdbuf_lag(drm_via_private_t *dev_priv)
-{
-       uint32_t agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr;
-       uint32_t hw_addr = *(dev_priv->hw_addr_ptr) - agp_base;
-
-       return ((hw_addr <= dev_priv->dma_low) ?
-               (dev_priv->dma_low - hw_addr) :
-               (dev_priv->dma_wrap + dev_priv->dma_low - hw_addr));
-}
-
-/*
- * Check that the given size fits in the buffer, otherwise wait.
- */
-
-static inline int
-via_cmdbuf_wait(drm_via_private_t *dev_priv, unsigned int size)
-{
-       uint32_t agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr;
-       uint32_t cur_addr, hw_addr, next_addr;
-       volatile uint32_t *hw_addr_ptr;
-       uint32_t count;
-       hw_addr_ptr = dev_priv->hw_addr_ptr;
-       cur_addr = dev_priv->dma_low;
-       next_addr = cur_addr + size + 512 * 1024;
-       count = 1000000;
-       do {
-               hw_addr = *hw_addr_ptr - agp_base;
-               if (count-- == 0) {
-                       DRM_ERROR
-                           ("via_cmdbuf_wait timed out hw %x cur_addr %x next_addr %x\n",
-                            hw_addr, cur_addr, next_addr);
-                       return -1;
-               }
-               if  ((cur_addr < hw_addr) && (next_addr >= hw_addr))
-                       msleep(1);
-       } while ((cur_addr < hw_addr) && (next_addr >= hw_addr));
-       return 0;
-}
-
-/*
- * Checks whether buffer head has reach the end. Rewind the ring buffer
- * when necessary.
- *
- * Returns virtual pointer to ring buffer.
- */
-
-static inline uint32_t *via_check_dma(drm_via_private_t * dev_priv,
-                                     unsigned int size)
-{
-       if ((dev_priv->dma_low + size + 4 * CMDBUF_ALIGNMENT_SIZE) >
-           dev_priv->dma_high) {
-               via_cmdbuf_rewind(dev_priv);
-       }
-       if (via_cmdbuf_wait(dev_priv, size) != 0)
-               return NULL;
-
-       return (uint32_t *) (dev_priv->dma_ptr + dev_priv->dma_low);
-}
-
-int via_dma_cleanup(struct drm_device *dev)
-{
-       if (dev->dev_private) {
-               drm_via_private_t *dev_priv =
-                   (drm_via_private_t *) dev->dev_private;
-
-               if (dev_priv->ring.virtual_start && dev_priv->mmio) {
-                       via_cmdbuf_reset(dev_priv);
-
-                       drm_legacy_ioremapfree(&dev_priv->ring.map, dev);
-                       dev_priv->ring.virtual_start = NULL;
-               }
-
-       }
-
-       return 0;
-}
-
-static int via_initialize(struct drm_device *dev,
-                         drm_via_private_t *dev_priv,
-                         drm_via_dma_init_t *init)
-{
-       if (!dev_priv || !dev_priv->mmio) {
-               DRM_ERROR("via_dma_init called before via_map_init\n");
-               return -EFAULT;
-       }
-
-       if (dev_priv->ring.virtual_start != NULL) {
-               DRM_ERROR("called again without calling cleanup\n");
-               return -EFAULT;
-       }
-
-       if (!dev->agp || !dev->agp->base) {
-               DRM_ERROR("called with no agp memory available\n");
-               return -EFAULT;
-       }
-
-       if (dev_priv->chipset == VIA_DX9_0) {
-               DRM_ERROR("AGP DMA is not supported on this chip\n");
-               return -EINVAL;
-       }
-
-       dev_priv->ring.map.offset = dev->agp->base + init->offset;
-       dev_priv->ring.map.size = init->size;
-       dev_priv->ring.map.type = 0;
-       dev_priv->ring.map.flags = 0;
-       dev_priv->ring.map.mtrr = 0;
-
-       drm_legacy_ioremap(&dev_priv->ring.map, dev);
-
-       if (dev_priv->ring.map.handle == NULL) {
-               via_dma_cleanup(dev);
-               DRM_ERROR("can not ioremap virtual address for"
-                         " ring buffer\n");
-               return -ENOMEM;
-       }
-
-       dev_priv->ring.virtual_start = dev_priv->ring.map.handle;
-
-       dev_priv->dma_ptr = dev_priv->ring.virtual_start;
-       dev_priv->dma_low = 0;
-       dev_priv->dma_high = init->size;
-       dev_priv->dma_wrap = init->size;
-       dev_priv->dma_offset = init->offset;
-       dev_priv->last_pause_ptr = NULL;
-       dev_priv->hw_addr_ptr =
-               (volatile uint32_t *)((char *)dev_priv->mmio->handle +
-               init->reg_pause_addr);
-
-       via_cmdbuf_start(dev_priv);
-
-       return 0;
-}
-
-static int via_dma_init(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_private_t *dev_priv = (drm_via_private_t *) dev->dev_private;
-       drm_via_dma_init_t *init = data;
-       int retcode = 0;
-
-       switch (init->func) {
-       case VIA_INIT_DMA:
-               if (!capable(CAP_SYS_ADMIN))
-                       retcode = -EPERM;
-               else
-                       retcode = via_initialize(dev, dev_priv, init);
-               break;
-       case VIA_CLEANUP_DMA:
-               if (!capable(CAP_SYS_ADMIN))
-                       retcode = -EPERM;
-               else
-                       retcode = via_dma_cleanup(dev);
-               break;
-       case VIA_DMA_INITIALIZED:
-               retcode = (dev_priv->ring.virtual_start != NULL) ?
-                       0 : -EFAULT;
-               break;
-       default:
-               retcode = -EINVAL;
-               break;
-       }
-
-       return retcode;
-}
-
-static int via_dispatch_cmdbuffer(struct drm_device *dev, drm_via_cmdbuffer_t *cmd)
-{
-       drm_via_private_t *dev_priv;
-       uint32_t *vb;
-       int ret;
-
-       dev_priv = (drm_via_private_t *) dev->dev_private;
-
-       if (dev_priv->ring.virtual_start == NULL) {
-               DRM_ERROR("called without initializing AGP ring buffer.\n");
-               return -EFAULT;
-       }
-
-       if (cmd->size > VIA_PCI_BUF_SIZE)
-               return -ENOMEM;
-
-       if (copy_from_user(dev_priv->pci_buf, cmd->buf, cmd->size))
-               return -EFAULT;
-
-       /*
-        * Running this function on AGP memory is dead slow. Therefore
-        * we run it on a temporary cacheable system memory buffer and
-        * copy it to AGP memory when ready.
-        */
-
-       if ((ret =
-            via_verify_command_stream((uint32_t *) dev_priv->pci_buf,
-                                      cmd->size, dev, 1))) {
-               return ret;
-       }
-
-       vb = via_check_dma(dev_priv, (cmd->size < 0x100) ? 0x102 : cmd->size);
-       if (vb == NULL)
-               return -EAGAIN;
-
-       memcpy(vb, dev_priv->pci_buf, cmd->size);
-
-       dev_priv->dma_low += cmd->size;
-
-       /*
-        * Small submissions somehow stalls the CPU. (AGP cache effects?)
-        * pad to greater size.
-        */
-
-       if (cmd->size < 0x100)
-               via_pad_cache(dev_priv, (0x100 - cmd->size) >> 3);
-       via_cmdbuf_pause(dev_priv);
-
-       return 0;
-}
-
-int via_driver_dma_quiescent(struct drm_device *dev)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-
-       if (!via_wait_idle(dev_priv))
-               return -EBUSY;
-       return 0;
-}
-
-static int via_flush_ioctl(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       return via_driver_dma_quiescent(dev);
-}
-
-static int via_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_cmdbuffer_t *cmdbuf = data;
-       int ret;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DRM_DEBUG("buf %p size %lu\n", cmdbuf->buf, cmdbuf->size);
-
-       ret = via_dispatch_cmdbuffer(dev, cmdbuf);
-       return ret;
-}
-
-static int via_dispatch_pci_cmdbuffer(struct drm_device *dev,
-                                     drm_via_cmdbuffer_t *cmd)
-{
-       drm_via_private_t *dev_priv = dev->dev_private;
-       int ret;
-
-       if (cmd->size > VIA_PCI_BUF_SIZE)
-               return -ENOMEM;
-       if (copy_from_user(dev_priv->pci_buf, cmd->buf, cmd->size))
-               return -EFAULT;
-
-       if ((ret =
-            via_verify_command_stream((uint32_t *) dev_priv->pci_buf,
-                                      cmd->size, dev, 0))) {
-               return ret;
-       }
-
-       ret =
-           via_parse_command_stream(dev, (const uint32_t *)dev_priv->pci_buf,
-                                    cmd->size);
-       return ret;
-}
-
-static int via_pci_cmdbuffer(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_cmdbuffer_t *cmdbuf = data;
-       int ret;
-
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       DRM_DEBUG("buf %p size %lu\n", cmdbuf->buf, cmdbuf->size);
-
-       ret = via_dispatch_pci_cmdbuffer(dev, cmdbuf);
-       return ret;
-}
-
-static inline uint32_t *via_align_buffer(drm_via_private_t *dev_priv,
-                                        uint32_t * vb, int qw_count)
-{
-       for (; qw_count > 0; --qw_count)
-               VIA_OUT_RING_QW(HC_DUMMY, HC_DUMMY);
-       return vb;
-}
-
-/*
- * This function is used internally by ring buffer management code.
- *
- * Returns virtual pointer to ring buffer.
- */
-static inline uint32_t *via_get_dma(drm_via_private_t *dev_priv)
-{
-       return (uint32_t *) (dev_priv->dma_ptr + dev_priv->dma_low);
-}
-
-/*
- * Hooks a segment of data into the tail of the ring-buffer by
- * modifying the pause address stored in the buffer itself. If
- * the regulator has already paused, restart it.
- */
-static int via_hook_segment(drm_via_private_t *dev_priv,
-                           uint32_t pause_addr_hi, uint32_t pause_addr_lo,
-                           int no_pci_fire)
-{
-       int paused, count;
-       volatile uint32_t *paused_at = dev_priv->last_pause_ptr;
-       uint32_t reader, ptr;
-       uint32_t diff;
-
-       paused = 0;
-       via_flush_write_combine();
-       (void) *(volatile uint32_t *)(via_get_dma(dev_priv) - 1);
-
-       *paused_at = pause_addr_lo;
-       via_flush_write_combine();
-       (void) *paused_at;
-
-       reader = *(dev_priv->hw_addr_ptr);
-       ptr = ((volatile char *)paused_at - dev_priv->dma_ptr) +
-               dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4;
-
-       dev_priv->last_pause_ptr = via_get_dma(dev_priv) - 1;
-
-       /*
-        * If there is a possibility that the command reader will
-        * miss the new pause address and pause on the old one,
-        * In that case we need to program the new start address
-        * using PCI.
-        */
-
-       diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff;
-       count = 10000000;
-       while (diff == 0 && count--) {
-               paused = (via_read(dev_priv, 0x41c) & 0x80000000);
-               if (paused)
-                       break;
-               reader = *(dev_priv->hw_addr_ptr);
-               diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff;
-       }
-
-       paused = via_read(dev_priv, 0x41c) & 0x80000000;
-
-       if (paused && !no_pci_fire) {
-               reader = *(dev_priv->hw_addr_ptr);
-               diff = (uint32_t) (ptr - reader) - dev_priv->dma_diff;
-               diff &= (dev_priv->dma_high - 1);
-               if (diff != 0 && diff < (dev_priv->dma_high >> 1)) {
-                       DRM_ERROR("Paused at incorrect address. "
-                                 "0x%08x, 0x%08x 0x%08x\n",
-                                 ptr, reader, dev_priv->dma_diff);
-               } else if (diff == 0) {
-                       /*
-                        * There is a concern that these writes may stall the PCI bus
-                        * if the GPU is not idle. However, idling the GPU first
-                        * doesn't make a difference.
-                        */
-
-                       via_write(dev_priv, VIA_REG_TRANSET, (HC_ParaType_PreCR << 16));
-                       via_write(dev_priv, VIA_REG_TRANSPACE, pause_addr_hi);
-                       via_write(dev_priv, VIA_REG_TRANSPACE, pause_addr_lo);
-                       via_read(dev_priv, VIA_REG_TRANSPACE);
-               }
-       }
-       return paused;
-}
-
-static int via_wait_idle(drm_via_private_t *dev_priv)
-{
-       int count = 10000000;
-
-       while (!(via_read(dev_priv, VIA_REG_STATUS) & VIA_VR_QUEUE_BUSY) && --count)
-               ;
-
-       while (count && (via_read(dev_priv, VIA_REG_STATUS) &
-                          (VIA_CMD_RGTR_BUSY | VIA_2D_ENG_BUSY |
-                           VIA_3D_ENG_BUSY)))
-               --count;
-       return count;
-}
-
-static uint32_t *via_align_cmd(drm_via_private_t *dev_priv, uint32_t cmd_type,
-                              uint32_t addr, uint32_t *cmd_addr_hi,
-                              uint32_t *cmd_addr_lo, int skip_wait)
-{
-       uint32_t agp_base;
-       uint32_t cmd_addr, addr_lo, addr_hi;
-       uint32_t *vb;
-       uint32_t qw_pad_count;
-
-       if (!skip_wait)
-               via_cmdbuf_wait(dev_priv, 2 * CMDBUF_ALIGNMENT_SIZE);
-
-       vb = via_get_dma(dev_priv);
-       VIA_OUT_RING_QW(HC_HEADER2 | ((VIA_REG_TRANSET >> 2) << 12) |
-                       (VIA_REG_TRANSPACE >> 2), HC_ParaType_PreCR << 16);
-       agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr;
-       qw_pad_count = (CMDBUF_ALIGNMENT_SIZE >> 3) -
-           ((dev_priv->dma_low & CMDBUF_ALIGNMENT_MASK) >> 3);
-
-       cmd_addr = (addr) ? addr :
-           agp_base + dev_priv->dma_low - 8 + (qw_pad_count << 3);
-       addr_lo = ((HC_SubA_HAGPBpL << 24) | (cmd_type & HC_HAGPBpID_MASK) |
-                  (cmd_addr & HC_HAGPBpL_MASK));
-       addr_hi = ((HC_SubA_HAGPBpH << 24) | (cmd_addr >> 24));
-
-       vb = via_align_buffer(dev_priv, vb, qw_pad_count - 1);
-       VIA_OUT_RING_QW(*cmd_addr_hi = addr_hi, *cmd_addr_lo = addr_lo);
-       return vb;
-}
-
-static void via_cmdbuf_start(drm_via_private_t *dev_priv)
-{
-       uint32_t pause_addr_lo, pause_addr_hi;
-       uint32_t start_addr, start_addr_lo;
-       uint32_t end_addr, end_addr_lo;
-       uint32_t command;
-       uint32_t agp_base;
-       uint32_t ptr;
-       uint32_t reader;
-       int count;
-
-       dev_priv->dma_low = 0;
-
-       agp_base = dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr;
-       start_addr = agp_base;
-       end_addr = agp_base + dev_priv->dma_high;
-
-       start_addr_lo = ((HC_SubA_HAGPBstL << 24) | (start_addr & 0xFFFFFF));
-       end_addr_lo = ((HC_SubA_HAGPBendL << 24) | (end_addr & 0xFFFFFF));
-       command = ((HC_SubA_HAGPCMNT << 24) | (start_addr >> 24) |
-                  ((end_addr & 0xff000000) >> 16));
-
-       dev_priv->last_pause_ptr =
-           via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0,
-                         &pause_addr_hi, &pause_addr_lo, 1) - 1;
-
-       via_flush_write_combine();
-       (void) *(volatile uint32_t *)dev_priv->last_pause_ptr;
-
-       via_write(dev_priv, VIA_REG_TRANSET, (HC_ParaType_PreCR << 16));
-       via_write(dev_priv, VIA_REG_TRANSPACE, command);
-       via_write(dev_priv, VIA_REG_TRANSPACE, start_addr_lo);
-       via_write(dev_priv, VIA_REG_TRANSPACE, end_addr_lo);
-
-       via_write(dev_priv, VIA_REG_TRANSPACE, pause_addr_hi);
-       via_write(dev_priv, VIA_REG_TRANSPACE, pause_addr_lo);
-       wmb();
-       via_write(dev_priv, VIA_REG_TRANSPACE, command | HC_HAGPCMNT_MASK);
-       via_read(dev_priv, VIA_REG_TRANSPACE);
-
-       dev_priv->dma_diff = 0;
-
-       count = 10000000;
-       while (!(via_read(dev_priv, 0x41c) & 0x80000000) && count--);
-
-       reader = *(dev_priv->hw_addr_ptr);
-       ptr = ((volatile char *)dev_priv->last_pause_ptr - dev_priv->dma_ptr) +
-           dev_priv->dma_offset + (uint32_t) dev_priv->agpAddr + 4;
-
-       /*
-        * This is the difference between where we tell the
-        * command reader to pause and where it actually pauses.
-        * This differs between hw implementation so we need to
-        * detect it.
-        */
-
-       dev_priv->dma_diff = ptr - reader;
-}
-
-static void via_pad_cache(drm_via_private_t *dev_priv, int qwords)
-{
-       uint32_t *vb;
-
-       via_cmdbuf_wait(dev_priv, qwords + 2);
-       vb = via_get_dma(dev_priv);
-       VIA_OUT_RING_QW(HC_HEADER2, HC_ParaType_NotTex << 16);
-       via_align_buffer(dev_priv, vb, qwords);
-}
-
-static inline void via_dummy_bitblt(drm_via_private_t *dev_priv)
-{
-       uint32_t *vb = via_get_dma(dev_priv);
-       SetReg2DAGP(0x0C, (0 | (0 << 16)));
-       SetReg2DAGP(0x10, 0 | (0 << 16));
-       SetReg2DAGP(0x0, 0x1 | 0x2000 | 0xAA000000);
-}
-
-static void via_cmdbuf_jump(drm_via_private_t *dev_priv)
-{
-       uint32_t pause_addr_lo, pause_addr_hi;
-       uint32_t jump_addr_lo, jump_addr_hi;
-       volatile uint32_t *last_pause_ptr;
-       uint32_t dma_low_save1, dma_low_save2;
-
-       via_align_cmd(dev_priv, HC_HAGPBpID_JUMP, 0, &jump_addr_hi,
-                     &jump_addr_lo, 0);
-
-       dev_priv->dma_wrap = dev_priv->dma_low;
-
-       /*
-        * Wrap command buffer to the beginning.
-        */
-
-       dev_priv->dma_low = 0;
-       if (via_cmdbuf_wait(dev_priv, CMDBUF_ALIGNMENT_SIZE) != 0)
-               DRM_ERROR("via_cmdbuf_jump failed\n");
-
-       via_dummy_bitblt(dev_priv);
-       via_dummy_bitblt(dev_priv);
-
-       last_pause_ptr =
-           via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi,
-                         &pause_addr_lo, 0) - 1;
-       via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi,
-                     &pause_addr_lo, 0);
-
-       *last_pause_ptr = pause_addr_lo;
-       dma_low_save1 = dev_priv->dma_low;
-
-       /*
-        * Now, set a trap that will pause the regulator if it tries to rerun the old
-        * command buffer. (Which may happen if via_hook_segment detecs a command regulator pause
-        * and reissues the jump command over PCI, while the regulator has already taken the jump
-        * and actually paused at the current buffer end).
-        * There appears to be no other way to detect this condition, since the hw_addr_pointer
-        * does not seem to get updated immediately when a jump occurs.
-        */
-
-       last_pause_ptr =
-               via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi,
-                             &pause_addr_lo, 0) - 1;
-       via_align_cmd(dev_priv, HC_HAGPBpID_PAUSE, 0, &pause_addr_hi,
-                     &pause_addr_lo, 0);
-       *last_pause_ptr = pause_addr_lo;
-
-       dma_low_save2 = dev_priv->dma_low;
-       dev_priv->dma_low = dma_low_save1;
-       via_hook_segment(dev_priv, jump_addr_hi, jump_addr_lo, 0);
-       dev_priv->dma_low = dma_low_save2;
-       via_hook_segment(dev_priv, pause_addr_hi, pause_addr_lo, 0);
-}
-
-
-static void via_cmdbuf_rewind(drm_via_private_t *dev_priv)
-{
-       via_cmdbuf_jump(dev_priv);
-}
-
-static void via_cmdbuf_flush(drm_via_private_t *dev_priv, uint32_t cmd_type)
-{
-       uint32_t pause_addr_lo, pause_addr_hi;
-
-       via_align_cmd(dev_priv, cmd_type, 0, &pause_addr_hi, &pause_addr_lo, 0);
-       via_hook_segment(dev_priv, pause_addr_hi, pause_addr_lo, 0);
-}
-
-static void via_cmdbuf_pause(drm_via_private_t *dev_priv)
-{
-       via_cmdbuf_flush(dev_priv, HC_HAGPBpID_PAUSE);
-}
-
-static void via_cmdbuf_reset(drm_via_private_t *dev_priv)
-{
-       via_cmdbuf_flush(dev_priv, HC_HAGPBpID_STOP);
-       via_wait_idle(dev_priv);
-}
-
-/*
- * User interface to the space and lag functions.
- */
-
-static int via_cmdbuf_size(struct drm_device *dev, void *data, struct drm_file *file_priv)
-{
-       drm_via_cmdbuf_size_t *d_siz = data;
-       int ret = 0;
-       uint32_t tmp_size, count;
-       drm_via_private_t *dev_priv;
-
-       DRM_DEBUG("\n");
-       LOCK_TEST_WITH_RETURN(dev, file_priv);
-
-       dev_priv = (drm_via_private_t *) dev->dev_private;
-
-       if (dev_priv->ring.virtual_start == NULL) {
-               DRM_ERROR("called without initializing AGP ring buffer.\n");
-               return -EFAULT;
-       }
-
-       count = 1000000;
-       tmp_size = d_siz->size;
-       switch (d_siz->func) {
-       case VIA_CMDBUF_SPACE:
-               while (((tmp_size = via_cmdbuf_space(dev_priv)) < d_siz->size)
-                      && --count) {
-                       if (!d_siz->wait)
-                               break;
-               }
-               if (!count) {
-                       DRM_ERROR("VIA_CMDBUF_SPACE timed out.\n");
-                       ret = -EAGAIN;
-               }
-               break;
-       case VIA_CMDBUF_LAG:
-               while (((tmp_size = via_cmdbuf_lag(dev_priv)) > d_siz->size)
-                      && --count) {
-                       if (!d_siz->wait)
-                               break;
-               }
-               if (!count) {
-                       DRM_ERROR("VIA_CMDBUF_LAG timed out.\n");
-                       ret = -EAGAIN;
-               }
-               break;
-       default:
-               ret = -EFAULT;
-       }
-       d_siz->size = tmp_size;
-
-       return ret;
-}
-
-static const struct drm_ioctl_desc via_ioctls[] = {
-       DRM_IOCTL_DEF_DRV(VIA_ALLOCMEM, via_mem_alloc, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_FREEMEM, via_mem_free, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_AGP_INIT, via_agp_init, DRM_AUTH|DRM_MASTER),
-       DRM_IOCTL_DEF_DRV(VIA_FB_INIT, via_fb_init, DRM_AUTH|DRM_MASTER),
-       DRM_IOCTL_DEF_DRV(VIA_MAP_INIT, via_map_init, DRM_AUTH|DRM_MASTER),
-       DRM_IOCTL_DEF_DRV(VIA_DEC_FUTEX, via_decoder_futex, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_DMA_INIT, via_dma_init, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_CMDBUFFER, via_cmdbuffer, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_FLUSH, via_flush_ioctl, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_PCICMD, via_pci_cmdbuffer, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_CMDBUF_SIZE, via_cmdbuf_size, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_WAIT_IRQ, via_wait_irq, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_DMA_BLIT, via_dma_blit, DRM_AUTH),
-       DRM_IOCTL_DEF_DRV(VIA_BLIT_SYNC, via_dma_blit_sync, DRM_AUTH)
-};
-
-static int via_max_ioctl = ARRAY_SIZE(via_ioctls);
-static int via_driver_open(struct drm_device *dev, struct drm_file *file)
-{
-       struct via_file_private *file_priv;
-
-       DRM_DEBUG_DRIVER("\n");
-       file_priv = kmalloc(sizeof(*file_priv), GFP_KERNEL);
-       if (!file_priv)
-               return -ENOMEM;
-
-       file->driver_priv = file_priv;
-
-       INIT_LIST_HEAD(&file_priv->obj_list);
-
-       return 0;
-}
-
-static void via_driver_postclose(struct drm_device *dev, struct drm_file *file)
-{
-       struct via_file_private *file_priv = file->driver_priv;
-
-       kfree(file_priv);
-}
-
-static struct pci_device_id pciidlist[] = {
-       viadrv_PCI_IDS
-};
-
-static const struct file_operations via_driver_fops = {
-       .owner = THIS_MODULE,
-       .open = drm_open,
-       .release = drm_release,
-       .unlocked_ioctl = drm_ioctl,
-       .mmap = drm_legacy_mmap,
-       .poll = drm_poll,
-       .compat_ioctl = drm_compat_ioctl,
-       .llseek = noop_llseek,
-};
-
-static struct drm_driver driver = {
-       .driver_features =
-           DRIVER_USE_AGP | DRIVER_HAVE_IRQ | DRIVER_LEGACY,
-       .load = via_driver_load,
-       .unload = via_driver_unload,
-       .open = via_driver_open,
-       .preclose = via_reclaim_buffers_locked,
-       .postclose = via_driver_postclose,
-       .context_dtor = via_final_context,
-       .get_vblank_counter = via_get_vblank_counter,
-       .enable_vblank = via_enable_vblank,
-       .disable_vblank = via_disable_vblank,
-       .irq_preinstall = via_driver_irq_preinstall,
-       .irq_postinstall = via_driver_irq_postinstall,
-       .irq_uninstall = via_driver_irq_uninstall,
-       .irq_handler = via_driver_irq_handler,
-       .dma_quiescent = via_driver_dma_quiescent,
-       .lastclose = via_lastclose,
-       .ioctls = via_ioctls,
-       .fops = &via_driver_fops,
-       .name = DRIVER_NAME,
-       .desc = DRIVER_DESC,
-       .date = DRIVER_DATE,
-       .major = DRIVER_MAJOR,
-       .minor = DRIVER_MINOR,
-       .patchlevel = DRIVER_PATCHLEVEL,
-};
-
-static struct pci_driver via_pci_driver = {
-       .name = DRIVER_NAME,
-       .id_table = pciidlist,
-};
-
-static int __init via_init(void)
-{
-       driver.num_ioctls = via_max_ioctl;
-       via_init_command_verifier();
-       return drm_legacy_pci_init(&driver, &via_pci_driver);
-}
-
-static void __exit via_exit(void)
-{
-       drm_legacy_pci_exit(&driver, &via_pci_driver);
-}
-
-module_init(via_init);
-module_exit(via_exit);
-
-MODULE_AUTHOR(DRIVER_AUTHOR);
-MODULE_DESCRIPTION(DRIVER_DESC);
-MODULE_LICENSE("GPL and additional rights");
index f0ebbe340ad698307faf369dd690ea74e121c502..95a9679f9d396de464e8fac07fc461c3ac1c160d 100644 (file)
@@ -42,6 +42,8 @@
 #include <linux/list.h>
 #include <linux/rcupdate.h>
 
+#include <drm/ttm/ttm_bo.h>
+
 /**
  * enum ttm_object_type
  *
@@ -321,4 +323,13 @@ static inline void ttm_base_object_noref_release(void)
        __acquire(RCU);
        rcu_read_unlock();
 }
+
+static inline int ttm_bo_wait(struct ttm_buffer_object *bo, bool intr,
+                             bool no_wait)
+{
+       struct ttm_operation_ctx ctx = { intr, no_wait };
+
+       return ttm_bo_wait_ctx(bo, &ctx);
+}
+
 #endif
index a1061c2f16406e2e610bd3991731fa4967962b18..45c75ff01eca4d938a496f0d37cc46d165aa717e 100644 (file)
@@ -251,16 +251,8 @@ static int clps711x_fb_probe(struct platform_device *pdev)
                goto out_fb_release;
        }
 
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto out_fb_release;
-       }
-
        cfb->buffsize = resource_size(res);
        info->fix.smem_start = res->start;
-       info->apertures->ranges[0].base = info->fix.smem_start;
-       info->apertures->ranges[0].size = cfb->buffsize;
 
        cfb->clk = devm_clk_get(dev, NULL);
        if (IS_ERR(cfb->clk)) {
@@ -345,7 +337,7 @@ static int clps711x_fb_probe(struct platform_device *pdev)
                                       &clps711x_lcd_ops);
        if (!IS_ERR(lcd))
                return 0;
-       
+
        ret = PTR_ERR(lcd);
        unregister_framebuffer(info);
 
index 14a7d404062c38e006933da5d42a729b8f9fbf07..c411a91453e30b12b8cc43b506eb329773c23a91 100644 (file)
@@ -26,7 +26,7 @@
  *
  *  Hardware cursor support added by Emmanuel Marty (core@ggi-project.org)
  *  Smart redraw scrolling, arbitrary font width support, 512char font support
- *  and software scrollback added by 
+ *  and software scrollback added by
  *                         Jakub Jelinek (jj@ultra.linux.cz)
  *
  *  Random hacking by Martin Mares <mj@ucw.cz>
@@ -127,7 +127,7 @@ static int logo_shown = FBCON_LOGO_CANSHOW;
 /* console mappings */
 static unsigned int first_fb_vc;
 static unsigned int last_fb_vc = MAX_NR_CONSOLES - 1;
-static int fbcon_is_default = 1; 
+static int fbcon_is_default = 1;
 static int primary_device = -1;
 static int fbcon_has_console_bind;
 
@@ -415,12 +415,12 @@ static int __init fb_console_setup(char *this_opt)
                        strscpy(fontname, options + 5, sizeof(fontname));
                        continue;
                }
-               
+
                if (!strncmp(options, "scrollback:", 11)) {
                        pr_warn("Ignoring scrollback size option\n");
                        continue;
                }
-               
+
                if (!strncmp(options, "map:", 4)) {
                        options += 4;
                        if (*options) {
@@ -446,7 +446,7 @@ static int __init fb_console_setup(char *this_opt)
                                last_fb_vc = simple_strtoul(options, &options, 10) - 1;
                        if (last_fb_vc < first_fb_vc || last_fb_vc >= MAX_NR_CONSOLES)
                                last_fb_vc = MAX_NR_CONSOLES - 1;
-                       fbcon_is_default = 0; 
+                       fbcon_is_default = 0;
                        continue;
                }
 
@@ -940,7 +940,7 @@ static const char *fbcon_startup(void)
        info = fbcon_registered_fb[info_idx];
        if (!info)
                return NULL;
-       
+
        if (fbcon_open(info))
                return NULL;
 
@@ -958,7 +958,7 @@ static const char *fbcon_startup(void)
        set_blitting_type(vc, info);
 
        /* Setup default font */
-       if (!p->fontdata && !vc->vc_font.data) {
+       if (!p->fontdata) {
                if (!fontname[0] || !(font = find_font(fontname)))
                        font = get_default_font(info->var.xres,
                                                info->var.yres,
@@ -968,8 +968,6 @@ static const char *fbcon_startup(void)
                vc->vc_font.height = font->height;
                vc->vc_font.data = (void *)(p->fontdata = font->data);
                vc->vc_font.charcount = font->charcount;
-       } else {
-               p->fontdata = vc->vc_font.data;
        }
 
        cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
@@ -1135,9 +1133,9 @@ static void fbcon_init(struct vc_data *vc, int init)
        ops->p = &fb_display[fg_console];
 }
 
-static void fbcon_free_font(struct fbcon_display *p, bool freefont)
+static void fbcon_free_font(struct fbcon_display *p)
 {
-       if (freefont && p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
+       if (p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
                kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int));
        p->fontdata = NULL;
        p->userfont = 0;
@@ -1172,8 +1170,8 @@ static void fbcon_deinit(struct vc_data *vc)
        struct fb_info *info;
        struct fbcon_ops *ops;
        int idx;
-       bool free_font = true;
 
+       fbcon_free_font(p);
        idx = con2fb_map[vc->vc_num];
 
        if (idx == -1)
@@ -1184,8 +1182,6 @@ static void fbcon_deinit(struct vc_data *vc)
        if (!info)
                goto finished;
 
-       if (info->flags & FBINFO_MISC_FIRMWARE)
-               free_font = false;
        ops = info->fbcon_par;
 
        if (!ops)
@@ -1197,9 +1193,8 @@ static void fbcon_deinit(struct vc_data *vc)
        ops->initialized = false;
 finished:
 
-       fbcon_free_font(p, free_font);
-       if (free_font)
-               vc->vc_font.data = NULL;
+       fbcon_free_font(p);
+       vc->vc_font.data = NULL;
 
        if (vc->vc_hi_font_mask && vc->vc_screenbuf)
                set_vc_hi_font(vc, false);
@@ -1999,7 +1994,7 @@ static void updatescrollmode(struct fbcon_display *p,
 #define PITCH(w) (((w) + 7) >> 3)
 #define CALC_FONTSZ(h, p, c) ((h) * (p) * (c)) /* size = height * pitch * charcount */
 
-static int fbcon_resize(struct vc_data *vc, unsigned int width, 
+static int fbcon_resize(struct vc_data *vc, unsigned int width,
                        unsigned int height, unsigned int user)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
@@ -2174,7 +2169,7 @@ static int fbcon_switch(struct vc_data *vc)
            ops->update_start(info);
        }
 
-       fbcon_set_palette(vc, color_table);     
+       fbcon_set_palette(vc, color_table);
        fbcon_clear_margins(vc, 0);
 
        if (logo_shown == FBCON_LOGO_DRAW) {
@@ -2343,7 +2338,7 @@ static void set_vc_hi_font(struct vc_data *vc, bool set)
                        vc->vc_complement_mask >>= 1;
                        vc->vc_s_complement_mask >>= 1;
                }
-                       
+
                /* ++Edmund: reorder the attribute bits */
                if (vc->vc_can_do_color) {
                        unsigned short *cp =
@@ -2366,7 +2361,7 @@ static void set_vc_hi_font(struct vc_data *vc, bool set)
                        vc->vc_complement_mask <<= 1;
                        vc->vc_s_complement_mask <<= 1;
                }
-                       
+
                /* ++Edmund: reorder the attribute bits */
                {
                        unsigned short *cp =
@@ -2528,7 +2523,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
        /* Check if the same font is on some other console already */
        for (i = first_fb_vc; i <= last_fb_vc; i++) {
                struct vc_data *tmp = vc_cons[i].d;
-               
+
                if (fb_display[i].userfont &&
                    fb_display[i].fontdata &&
                    FNTSUM(fb_display[i].fontdata) == csum &&
@@ -3436,5 +3431,5 @@ void __exit fb_console_exit(void)
 
        do_unregister_con_driver(&fb_con);
        console_unlock();
-}      
+}
 #endif
index 3a6c8458eb8d5349c84230f4a9b8e30b5a20882a..02217c33d15211484c5535dd21d421ce919e7e2e 100644 (file)
@@ -13,7 +13,6 @@
 
 #include <linux/module.h>
 
-#include <linux/aperture.h>
 #include <linux/compat.h>
 #include <linux/types.h>
 #include <linux/errno.h>
@@ -1653,32 +1652,6 @@ static void do_unregister_framebuffer(struct fb_info *fb_info)
        put_fb_info(fb_info);
 }
 
-static int fb_aperture_acquire_for_platform_device(struct fb_info *fb_info)
-{
-       struct apertures_struct *ap = fb_info->apertures;
-       struct device *dev = fb_info->device;
-       struct platform_device *pdev;
-       unsigned int i;
-       int ret;
-
-       if (!ap)
-               return 0;
-
-       if (!dev_is_platform(dev))
-               return 0;
-
-       pdev = to_platform_device(dev);
-
-       for (ret = 0, i = 0; i < ap->count; ++i) {
-               ret = devm_aperture_acquire_for_platform_device(pdev, ap->ranges[i].base,
-                                                               ap->ranges[i].size);
-               if (ret)
-                       break;
-       }
-
-       return ret;
-}
-
 /**
  *     register_framebuffer - registers a frame buffer device
  *     @fb_info: frame buffer info structure
@@ -1693,12 +1666,6 @@ register_framebuffer(struct fb_info *fb_info)
 {
        int ret;
 
-       if (fb_info->flags & FBINFO_MISC_FIRMWARE) {
-               ret = fb_aperture_acquire_for_platform_device(fb_info);
-               if (ret)
-                       return ret;
-       }
-
        mutex_lock(&registration_lock);
        ret = do_register_framebuffer(fb_info);
        mutex_unlock(&registration_lock);
index 4d7f63892dcc4381a78433577cb62a06f305c06c..0c33c4adcd798be80babd9bfc513ece7f588bb4a 100644 (file)
@@ -88,7 +88,6 @@ void framebuffer_release(struct fb_info *info)
        mutex_destroy(&info->bl_curve_mutex);
 #endif
 
-       kfree(info->apertures);
        kfree(info);
 }
 EXPORT_SYMBOL(framebuffer_release);
index 16c1aaae9afa45680c6bd79ef8c87c2c4987c5ee..a5779fb453a219e6294e63595bf6c3c297e747b2 100644 (file)
@@ -7,6 +7,7 @@
  *
  */
 
+#include <linux/aperture.h>
 #include <linux/kernel.h>
 #include <linux/efi.h>
 #include <linux/efi-bgrt.h>
@@ -49,6 +50,12 @@ static u64 mem_flags = EFI_MEMORY_WC | EFI_MEMORY_UC;
 
 static struct pci_dev *efifb_pci_dev;  /* dev with BAR covering the efifb */
 
+struct efifb_par {
+       u32 pseudo_palette[16];
+       resource_size_t base;
+       resource_size_t size;
+};
+
 static struct fb_var_screeninfo efifb_defined = {
        .activate               = FB_ACTIVATE_NOW,
        .height                 = -1,
@@ -249,6 +256,8 @@ static inline void efifb_show_boot_graphics(struct fb_info *info) {}
  */
 static void efifb_destroy(struct fb_info *info)
 {
+       struct efifb_par *par = info->par;
+
        if (efifb_pci_dev)
                pm_runtime_put(&efifb_pci_dev->dev);
 
@@ -260,8 +269,7 @@ static void efifb_destroy(struct fb_info *info)
        }
 
        if (request_mem_succeeded)
-               release_mem_region(info->apertures->ranges[0].base,
-                                  info->apertures->ranges[0].size);
+               release_mem_region(par->base, par->size);
        fb_dealloc_cmap(&info->cmap);
 
        framebuffer_release(info);
@@ -351,6 +359,7 @@ static u64 bar_offset;
 static int efifb_probe(struct platform_device *dev)
 {
        struct fb_info *info;
+       struct efifb_par *par;
        int err, orientation;
        unsigned int size_vmode;
        unsigned int size_remap;
@@ -447,22 +456,17 @@ static int efifb_probe(struct platform_device *dev)
                        efifb_fix.smem_start);
        }
 
-       info = framebuffer_alloc(sizeof(u32) * 16, &dev->dev);
+       info = framebuffer_alloc(sizeof(*par), &dev->dev);
        if (!info) {
                err = -ENOMEM;
                goto err_release_mem;
        }
        platform_set_drvdata(dev, info);
-       info->pseudo_palette = info->par;
-       info->par = NULL;
+       par = info->par;
+       info->pseudo_palette = par->pseudo_palette;
 
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               err = -ENOMEM;
-               goto err_release_fb;
-       }
-       info->apertures->ranges[0].base = efifb_fix.smem_start;
-       info->apertures->ranges[0].size = size_remap;
+       par->base = efifb_fix.smem_start;
+       par->size = size_remap;
 
        if (efi_enabled(EFI_MEMMAP) &&
            !efi_mem_desc_lookup(efifb_fix.smem_start, &md)) {
@@ -551,7 +555,7 @@ static int efifb_probe(struct platform_device *dev)
        info->fbops = &efifb_ops;
        info->var = efifb_defined;
        info->fix = efifb_fix;
-       info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE;
+       info->flags = FBINFO_FLAG_DEFAULT;
 
        orientation = drm_get_panel_orientation_quirk(efifb_defined.xres,
                                                      efifb_defined.yres);
@@ -584,6 +588,11 @@ static int efifb_probe(struct platform_device *dev)
        if (efifb_pci_dev)
                WARN_ON(pm_runtime_get_sync(&efifb_pci_dev->dev) < 0);
 
+       err = devm_aperture_acquire_for_platform_device(dev, par->base, par->size);
+       if (err) {
+               pr_err("efifb: cannot acquire aperture\n");
+               goto err_put_rpm_ref;
+       }
        err = register_framebuffer(info);
        if (err < 0) {
                pr_err("efifb: cannot register framebuffer\n");
index fdbf02b42723c00a377e9ebcf9c11b7a359d4a63..4a6a3303b6b4e59efa0b3a6a756e00392a39e6d9 100644 (file)
@@ -994,13 +994,10 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
        struct pci_dev *pdev  = NULL;
        void __iomem *fb_virt;
        int gen2vm = efi_enabled(EFI_BOOT);
+       resource_size_t base, size;
        phys_addr_t paddr;
        int ret;
 
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures)
-               return -ENOMEM;
-
        if (!gen2vm) {
                pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
                        PCI_DEVICE_ID_HYPERV_VIDEO, NULL);
@@ -1009,8 +1006,8 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
                        return -ENODEV;
                }
 
-               info->apertures->ranges[0].base = pci_resource_start(pdev, 0);
-               info->apertures->ranges[0].size = pci_resource_len(pdev, 0);
+               base = pci_resource_start(pdev, 0);
+               size = pci_resource_len(pdev, 0);
 
                /*
                 * For Gen 1 VM, we can directly use the contiguous memory
@@ -1033,8 +1030,8 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
                }
                pr_info("Unable to allocate enough contiguous physical memory on Gen 1 VM. Using MMIO instead.\n");
        } else {
-               info->apertures->ranges[0].base = screen_info.lfb_base;
-               info->apertures->ranges[0].size = screen_info.lfb_size;
+               base = screen_info.lfb_base;
+               size = screen_info.lfb_size;
        }
 
        /*
@@ -1076,9 +1073,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
        info->screen_size = dio_fb_size;
 
 getmem_done:
-       aperture_remove_conflicting_devices(info->apertures->ranges[0].base,
-                                           info->apertures->ranges[0].size,
-                                           false, KBUILD_MODNAME);
+       aperture_remove_conflicting_devices(base, size, false, KBUILD_MODNAME);
 
        if (gen2vm) {
                /* framebuffer is reallocated, clear screen_info to avoid misuse from kexec */
index 91001990e351c292634fd44227e9a8ed26b0a5fc..f7ad6bc9d02d718e3c10818000554005f3978e49 100644 (file)
@@ -12,6 +12,7 @@
  *  more details.
  */
 
+#include <linux/aperture.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -53,10 +54,11 @@ struct offb_par {
        volatile void __iomem *cmap_data;
        int cmap_type;
        int blanked;
+       u32 pseudo_palette[16];
+       resource_size_t base;
+       resource_size_t size;
 };
 
-struct offb_par default_par;
-
 #ifdef CONFIG_PPC32
 extern boot_infos_t *boot_infos;
 #endif
@@ -280,9 +282,11 @@ static int offb_set_par(struct fb_info *info)
 
 static void offb_destroy(struct fb_info *info)
 {
+       struct offb_par *par = info->par;
+
        if (info->screen_base)
                iounmap(info->screen_base);
-       release_mem_region(info->apertures->ranges[0].base, info->apertures->ranges[0].size);
+       release_mem_region(par->base, par->size);
        fb_dealloc_cmap(&info->cmap);
        framebuffer_release(info);
 }
@@ -393,11 +397,11 @@ static void offb_init_fb(struct platform_device *parent, const char *name,
                         int foreign_endian, struct device_node *dp)
 {
        unsigned long res_size = pitch * height;
-       struct offb_par *par = &default_par;
        unsigned long res_start = address;
        struct fb_fix_screeninfo *fix;
        struct fb_var_screeninfo *var;
        struct fb_info *info;
+       struct offb_par *par;
 
        if (!request_mem_region(res_start, res_size, "offb"))
                return;
@@ -411,17 +415,15 @@ static void offb_init_fb(struct platform_device *parent, const char *name,
                return;
        }
 
-       info = framebuffer_alloc(sizeof(u32) * 16, &parent->dev);
-
+       info = framebuffer_alloc(sizeof(*par), &parent->dev);
        if (!info) {
                release_mem_region(res_start, res_size);
                return;
        }
        platform_set_drvdata(parent, info);
-
+       par = info->par;
        fix = &info->fix;
        var = &info->var;
-       info->par = par;
 
        if (name) {
                strcpy(fix->id, "OFfb ");
@@ -506,20 +508,18 @@ static void offb_init_fb(struct platform_device *parent, const char *name,
        var->sync = 0;
        var->vmode = FB_VMODE_NONINTERLACED;
 
-       /* set offb aperture size for generic probing */
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures)
-               goto out_aper;
-       info->apertures->ranges[0].base = address;
-       info->apertures->ranges[0].size = fix->smem_len;
+       par->base = address;
+       par->size = fix->smem_len;
 
        info->fbops = &offb_ops;
        info->screen_base = ioremap(address, fix->smem_len);
-       info->pseudo_palette = (void *) (info + 1);
-       info->flags = FBINFO_DEFAULT | FBINFO_MISC_FIRMWARE | foreign_endian;
+       info->pseudo_palette = par->pseudo_palette;
+       info->flags = FBINFO_DEFAULT | foreign_endian;
 
        fb_alloc_cmap(&info->cmap, 256, 0);
 
+       if (devm_aperture_acquire_for_platform_device(parent, par->base, par->size) < 0)
+               goto out_err;
        if (register_framebuffer(info) < 0)
                goto out_err;
 
@@ -529,7 +529,6 @@ static void offb_init_fb(struct platform_device *parent, const char *name,
 out_err:
        fb_dealloc_cmap(&info->cmap);
        iounmap(info->screen_base);
-out_aper:
        iounmap(par->cmap_adr);
        par->cmap_adr = NULL;
        framebuffer_release(info);
index e770b4a356b57cb0dd4cff8981ebca0f4d1ee332..10d71879d340ede8e9bccc6375af72de16bade32 100644 (file)
@@ -12,6 +12,7 @@
  * Copyright (C) 1996 Paul Mackerras
  */
 
+#include <linux/aperture.h>
 #include <linux/errno.h>
 #include <linux/fb.h>
 #include <linux/io.h>
@@ -68,6 +69,8 @@ static int simplefb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
 
 struct simplefb_par {
        u32 palette[PSEUDO_PALETTE_SIZE];
+       resource_size_t base;
+       resource_size_t size;
        struct resource *mem;
 #if defined CONFIG_OF && defined CONFIG_COMMON_CLK
        bool clks_enabled;
@@ -472,16 +475,11 @@ static int simplefb_probe(struct platform_device *pdev)
        info->var.blue = params.format->blue;
        info->var.transp = params.format->transp;
 
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto error_fb_release;
-       }
-       info->apertures->ranges[0].base = info->fix.smem_start;
-       info->apertures->ranges[0].size = info->fix.smem_len;
+       par->base = info->fix.smem_start;
+       par->size = info->fix.smem_len;
 
        info->fbops = &simplefb_ops;
-       info->flags = FBINFO_DEFAULT | FBINFO_MISC_FIRMWARE;
+       info->flags = FBINFO_DEFAULT;
        info->screen_base = ioremap_wc(info->fix.smem_start,
                                       info->fix.smem_len);
        if (!info->screen_base) {
@@ -511,6 +509,11 @@ static int simplefb_probe(struct platform_device *pdev)
        if (mem != res)
                par->mem = mem; /* release in clean-up handler */
 
+       ret = devm_aperture_acquire_for_platform_device(pdev, par->base, par->size);
+       if (ret) {
+               dev_err(&pdev->dev, "Unable to acquire aperture: %d\n", ret);
+               goto error_regulators;
+       }
        ret = register_framebuffer(info);
        if (ret < 0) {
                dev_err(&pdev->dev, "Unable to register simplefb: %d\n", ret);
index 929d4775cb4bcc73048d6a342c116dc422b71238..3f8bdfcf51f048337ebbc0c9754e2316ec47c247 100644 (file)
@@ -9,6 +9,7 @@
  *
  */
 
+#include <linux/aperture.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -31,6 +32,8 @@
 
 struct vesafb_par {
        u32 pseudo_palette[256];
+       resource_size_t base;
+       resource_size_t size;
        int wc_cookie;
        struct resource *region;
 };
@@ -140,7 +143,7 @@ static int vesafb_setcolreg(unsigned regno, unsigned red, unsigned green,
         *  (according to the entries in the `var' structure). Return
         *  != 0 for invalid regno.
         */
-       
+
        if (regno >= info->cmap.len)
                return 1;
 
@@ -191,7 +194,7 @@ static void vesafb_destroy(struct fb_info *info)
        arch_phys_wc_del(par->wc_cookie);
        if (info->screen_base)
                iounmap(info->screen_base);
-       release_mem_region(info->apertures->ranges[0].base, info->apertures->ranges[0].size);
+       release_mem_region(par->base, par->size);
 
        framebuffer_release(info);
 }
@@ -209,13 +212,13 @@ static struct fb_ops vesafb_ops = {
 static int vesafb_setup(char *options)
 {
        char *this_opt;
-       
+
        if (!options || !*options)
                return 0;
-       
+
        while ((this_opt = strsep(&options, ",")) != NULL) {
                if (!*this_opt) continue;
-               
+
                if (! strcmp(this_opt, "inverse"))
                        inverse=1;
                else if (! strcmp(this_opt, "redraw"))
@@ -316,14 +319,8 @@ static int vesafb_probe(struct platform_device *dev)
        par = info->par;
        info->pseudo_palette = par->pseudo_palette;
 
-       /* set vesafb aperture size for generic probing */
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               err = -ENOMEM;
-               goto err;
-       }
-       info->apertures->ranges[0].base = screen_info.lfb_base;
-       info->apertures->ranges[0].size = size_total;
+       par->base = screen_info.lfb_base;
+       par->size = size_total;
 
        printk(KERN_INFO "vesafb: mode is %dx%dx%d, linelength=%d, pages=%d\n",
               vesafb_defined.xres, vesafb_defined.yres, vesafb_defined.bits_per_pixel, vesafb_fix.line_length, screen_info.pages);
@@ -381,7 +378,7 @@ static int vesafb_probe(struct platform_device *dev)
        vesafb_defined.pixclock     = 10000000 / vesafb_defined.xres * 1000 / vesafb_defined.yres;
        vesafb_defined.left_margin  = (vesafb_defined.xres / 8) & 0xf8;
        vesafb_defined.hsync_len    = (vesafb_defined.xres / 8) & 0xf8;
-       
+
        vesafb_defined.red.offset    = screen_info.red_pos;
        vesafb_defined.red.length    = screen_info.red_size;
        vesafb_defined.green.offset  = screen_info.green_pos;
@@ -460,27 +457,29 @@ static int vesafb_probe(struct platform_device *dev)
        info->fbops = &vesafb_ops;
        info->var = vesafb_defined;
        info->fix = vesafb_fix;
-       info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE |
-               (ypan ? FBINFO_HWACCEL_YPAN : 0);
+       info->flags = FBINFO_FLAG_DEFAULT | (ypan ? FBINFO_HWACCEL_YPAN : 0);
 
        if (fb_alloc_cmap(&info->cmap, 256, 0) < 0) {
                err = -ENOMEM;
                goto err_release_region;
        }
+       err = devm_aperture_acquire_for_platform_device(dev, par->base, par->size);
+       if (err)
+               goto err_fb_dealloc_cmap;
        if (register_framebuffer(info)<0) {
                err = -EINVAL;
-               fb_dealloc_cmap(&info->cmap);
-               goto err_release_region;
+               goto err_fb_dealloc_cmap;
        }
        fb_info(info, "%s frame buffer device\n", info->fix.id);
        return 0;
+err_fb_dealloc_cmap:
+       fb_dealloc_cmap(&info->cmap);
 err_release_region:
        arch_phys_wc_del(par->wc_cookie);
        if (info->screen_base)
                iounmap(info->screen_base);
        if (par->region)
                release_region(0x3c0, 32);
-err:
        framebuffer_release(info);
        release_mem_region(vesafb_fix.smem_start, size_total);
        return err;
index af47f82170956740292e935e55e5829fc03787d6..1a8ffdb2be262ff5c68025e00e326016be5b78cf 100644 (file)
@@ -10,6 +10,7 @@
  * archive for more details.
  */
 
+#include <linux/aperture.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -1324,11 +1325,6 @@ static int vga16fb_probe(struct platform_device *dev)
                ret = -ENOMEM;
                goto err_fb_alloc;
        }
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto err_ioremap;
-       }
 
        /* XXX share VGA_FB_PHYS_BASE and I/O region with vgacon and others */
        info->screen_base = (void __iomem *)VGA_MAP_MEM(VGA_FB_PHYS_BASE, 0);
@@ -1363,8 +1359,7 @@ static int vga16fb_probe(struct platform_device *dev)
        info->fix = vga16fb_fix;
        /* supports rectangles with widths of multiples of 8 */
        info->pixmap.blit_x = 1 << 7 | 1 << 15 | 1 << 23 | 1 << 31;
-       info->flags = FBINFO_FLAG_DEFAULT | FBINFO_MISC_FIRMWARE |
-               FBINFO_HWACCEL_YPAN;
+       info->flags = FBINFO_FLAG_DEFAULT | FBINFO_HWACCEL_YPAN;
 
        i = (info->var.bits_per_pixel == 8) ? 256 : 16;
        ret = fb_alloc_cmap(&info->cmap, i, 0);
@@ -1382,9 +1377,9 @@ static int vga16fb_probe(struct platform_device *dev)
 
        vga16fb_update_fix(info);
 
-       info->apertures->ranges[0].base = VGA_FB_PHYS_BASE;
-       info->apertures->ranges[0].size = VGA_FB_PHYS_SIZE;
-
+       ret = devm_aperture_acquire_for_platform_device(dev, VGA_FB_PHYS_BASE, VGA_FB_PHYS_SIZE);
+       if (ret)
+               goto err_check_var;
        if (register_framebuffer(info) < 0) {
                printk(KERN_ERR "vga16fb: unable to register framebuffer\n");
                ret = -EINVAL;
index 1840db247f69d51dbea7d1eaa836e8b9ef9cbd21..8c886fc46ef229e59ef37b0df51a0da66618f5b0 100644 (file)
 #ifndef __DRM_CRTC_HELPER_H__
 #define __DRM_CRTC_HELPER_H__
 
-#include <linux/spinlock.h>
 #include <linux/types.h>
-#include <linux/idr.h>
 
-#include <linux/fb.h>
-
-#include <drm/drm_crtc.h>
-#include <drm/drm_modeset_helper_vtables.h>
-#include <drm/drm_modeset_helper.h>
+struct drm_atomic_state;
+struct drm_connector;
+struct drm_crtc;
+struct drm_device;
+struct drm_display_mode;
+struct drm_encoder;
+struct drm_framebuffer;
+struct drm_mode_set;
+struct drm_modeset_acquire_ctx;
 
 void drm_helper_disable_unused_functions(struct drm_device *dev);
 int drm_crtc_helper_set_config(struct drm_mode_set *set,
index d7c521e8860f07a532b932150a53e1360c4c514e..1d76d0686b032e725014c6fdc95c6fd322f4799f 100644 (file)
@@ -149,13 +149,6 @@ enum drm_driver_feature {
         * Legacy irq support. Only for legacy drivers. Do not use.
         */
        DRIVER_HAVE_IRQ                 = BIT(30),
-       /**
-        * @DRIVER_KMS_LEGACY_CONTEXT:
-        *
-        * Used only by nouveau for backwards compatibility with existing
-        * userspace.  Do not use.
-        */
-       DRIVER_KMS_LEGACY_CONTEXT       = BIT(31),
 };
 
 /**
index b111dc7ada78d72dddec80cd7143a0744f277773..f443e1f11654d2733ac2a913f0342911898e09e0 100644 (file)
@@ -37,11 +37,6 @@ struct drm_fb_helper;
 
 #include <drm/drm_client.h>
 
-enum mode_set_atomic {
-       LEAVE_ATOMIC_MODE_SET,
-       ENTER_ATOMIC_MODE_SET,
-};
-
 /**
  * struct drm_fb_helper_surface_size - describes fbdev size and scanout surface size
  * @fb_width: fbdev width
index 553210c02ee0f655fd28b8ae64d370e7cee2fc70..255645c1f9a89c28304317783f348baa8fe9e15f 100644 (file)
@@ -25,6 +25,7 @@
 #ifndef DRM_FIXED_H
 #define DRM_FIXED_H
 
+#include <linux/kernel.h>
 #include <linux/math64.h>
 
 typedef union dfixed {
index 4f503d99f668a3e0aa49a3f58ff5b6be6678bb6c..16f30975b22b47829ffa4483e4a00411ab08d62a 100644 (file)
@@ -296,6 +296,10 @@ int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device *dsi,
                                        u16 brightness);
 int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device *dsi,
                                        u16 *brightness);
+int mipi_dsi_dcs_set_display_brightness_large(struct mipi_dsi_device *dsi,
+                                            u16 brightness);
+int mipi_dsi_dcs_get_display_brightness_large(struct mipi_dsi_device *dsi,
+                                            u16 *brightness);
 
 /**
  * mipi_dsi_generic_write_seq - transmit data using a generic write packet
index 77a540ad7dcd741718ce481e31bcde2cb7a1c373..206f495bbf06af49c598427f0720b2cdd5437cbd 100644 (file)
  * To make this clear all the helper vtables are pulled together in this location here.
  */
 
-enum mode_set_atomic;
 struct drm_writeback_connector;
 struct drm_writeback_job;
 
+enum mode_set_atomic {
+       LEAVE_ATOMIC_MODE_SET,
+       ENTER_ATOMIC_MODE_SET,
+};
+
 /**
  * struct drm_crtc_helper_funcs - helper operations for CRTCs
  *
index b7e899ce44f0ee17164babfcc4f4a22909b0ab8b..90e8abc086530cdd3e1775b6b4338468b4bfdee7 100644 (file)
        {0x1002, 0x99A2, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0x1002, 0x99A4, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARUBA|RADEON_NEW_MEMMAP|RADEON_IS_IGP}, \
        {0, 0, 0}
-
-#define r128_PCI_IDS \
-       {0x1002, 0x4c45, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x4c46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x4d46, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x4d4c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5041, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5042, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5043, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5044, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5045, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5046, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5047, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5048, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5049, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x504A, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x504B, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x504C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x504D, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x504E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x504F, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5050, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5051, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5052, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5053, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5054, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5055, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5056, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5057, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5058, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5245, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5246, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5247, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x524b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x524c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x534d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5446, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x544C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1002, 0x5452, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0, 0, 0}
-
-#define mga_PCI_IDS \
-       {0x102b, 0x0520, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MGA_CARD_TYPE_G200}, \
-       {0x102b, 0x0521, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MGA_CARD_TYPE_G200}, \
-       {0x102b, 0x0525, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MGA_CARD_TYPE_G400}, \
-       {0x102b, 0x2527, PCI_ANY_ID, PCI_ANY_ID, 0, 0, MGA_CARD_TYPE_G550}, \
-       {0, 0, 0}
-
-#define sisdrv_PCI_IDS \
-       {0x1039, 0x0300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1039, 0x5300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1039, 0x6300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1039, 0x6330, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_CHIP_315}, \
-       {0x1039, 0x6351, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1039, 0x7300, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x18CA, 0x0040, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_CHIP_315}, \
-       {0x18CA, 0x0042, PCI_ANY_ID, PCI_ANY_ID, 0, 0, SIS_CHIP_315}, \
-       {0, 0, 0}
-
-#define tdfx_PCI_IDS \
-       {0x121a, 0x0003, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x121a, 0x0004, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x121a, 0x0005, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x121a, 0x0007, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x121a, 0x0009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x121a, 0x000b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0, 0, 0}
-
-#define viadrv_PCI_IDS \
-       {0x1106, 0x3022, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1106, 0x3118, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_PRO_GROUP_A}, \
-       {0x1106, 0x3122, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1106, 0x7205, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1106, 0x3108, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1106, 0x3344, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1106, 0x3343, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x1106, 0x3230, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_DX9_0}, \
-       {0x1106, 0x3157, PCI_ANY_ID, PCI_ANY_ID, 0, 0, VIA_PRO_GROUP_A}, \
-       {0, 0, 0}
-
-#define i810_PCI_IDS \
-       {0x8086, 0x7121, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x8086, 0x7123, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x8086, 0x7125, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0x8086, 0x1132, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
-       {0, 0, 0}
-
-#define savage_PCI_IDS \
-       {0x5333, 0x8a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE3D}, \
-       {0x5333, 0x8a21, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE3D}, \
-       {0x5333, 0x8a22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE4}, \
-       {0x5333, 0x8a23, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE4}, \
-       {0x5333, 0x8c10, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE_MX}, \
-       {0x5333, 0x8c11, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE_MX}, \
-       {0x5333, 0x8c12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE_MX}, \
-       {0x5333, 0x8c13, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SAVAGE_MX}, \
-       {0x5333, 0x8c22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c24, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c2a, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c2b, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c2c, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8c2f, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_SUPERSAVAGE}, \
-       {0x5333, 0x8a25, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGE}, \
-       {0x5333, 0x8a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGE}, \
-       {0x5333, 0x8d01, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_TWISTER}, \
-       {0x5333, 0x8d02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_TWISTER}, \
-       {0x5333, 0x8d03, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGEDDR}, \
-       {0x5333, 0x8d04, PCI_ANY_ID, PCI_ANY_ID, 0, 0, S3_PROSAVAGEDDR}, \
-       {0, 0, 0}
index a44fb7ef257f64eb08404d1438dabe77649101c1..c3753da97c4ece3823d422b3c905dc9b8f08c0e8 100644 (file)
@@ -605,9 +605,6 @@ void __drm_err(const char *format, ...);
 #define drm_dbg_kms_ratelimited(drm, fmt, ...) \
        __DRM_DEFINE_DBG_RATELIMITED(KMS, drm, fmt, ## __VA_ARGS__)
 
-/* NOTE: this is deprecated in favor of drm_dbg_kms_ratelimited(NULL, ...). */
-#define DRM_DEBUG_KMS_RATELIMITED(fmt, ...) drm_dbg_kms_ratelimited(NULL, fmt, ## __VA_ARGS__)
-
 /*
  * struct drm_device based WARNs
  *
index ca857ec9e7eba39a394c7fec8f81af1e08e164ea..9935d1e2ff69a38437de9d5729d15fd6b64b0d18 100644 (file)
@@ -538,7 +538,6 @@ void drm_sched_increase_karma_ext(struct drm_sched_job *bad, int type);
 bool drm_sched_dependency_optimized(struct dma_fence* fence,
                                    struct drm_sched_entity *entity);
 void drm_sched_fault(struct drm_gpu_scheduler *sched);
-void drm_sched_job_kickout(struct drm_sched_job *s_job);
 
 void drm_sched_rq_add_entity(struct drm_sched_rq *rq,
                             struct drm_sched_entity *entity);
index d87232472435cffd7dc29ef444963b58c4e2f945..8b113c3842364a5d52edcb6373b87a5b3d5368a8 100644 (file)
@@ -347,7 +347,6 @@ static inline void *ttm_kmap_obj_virtual(struct ttm_bo_kmap_obj *map,
        return map->virtual;
 }
 
-int ttm_bo_wait(struct ttm_buffer_object *bo, bool interruptible, bool no_wait);
 int ttm_bo_wait_ctx(struct ttm_buffer_object *bo,
                    struct ttm_operation_ctx *ctx);
 int ttm_bo_validate(struct ttm_buffer_object *bo,
index 96b96323e9cba93bfa8e10f8c0e749f69aa17a3e..30183fd259ae77743f94725e9bf4ea6c07fa5b6c 100644 (file)
@@ -423,8 +423,6 @@ struct fb_tile_ops {
  */
 #define FBINFO_MISC_ALWAYS_SETPAR   0x40000
 
-/* where the fb is a firmware driver, and can be replaced with a proper one */
-#define FBINFO_MISC_FIRMWARE        0x80000
 /*
  * Host and GPU endianness differ.
  */
@@ -499,30 +497,10 @@ struct fb_info {
        void *fbcon_par;                /* fbcon use-only private area */
        /* From here on everything is device dependent */
        void *par;
-       /* we need the PCI or similar aperture base/size not
-          smem_start/size as smem_start may just be an object
-          allocated inside the aperture so may not actually overlap */
-       struct apertures_struct {
-               unsigned int count;
-               struct aperture {
-                       resource_size_t base;
-                       resource_size_t size;
-               } ranges[0];
-       } *apertures;
 
        bool skip_vt_switch; /* no VT switch on suspend/resume required */
 };
 
-static inline struct apertures_struct *alloc_apertures(unsigned int max_num) {
-       struct apertures_struct *a;
-
-       a = kzalloc(struct_size(a, ranges, max_num), GFP_KERNEL);
-       if (!a)
-               return NULL;
-       a->count = max_num;
-       return a;
-}
-
 #define FBINFO_FLAG_DEFAULT    FBINFO_DEFAULT
 
 /* This will go away
diff --git a/include/uapi/drm/i810_drm.h b/include/uapi/drm/i810_drm.h
deleted file mode 100644 (file)
index d285d5e..0000000
+++ /dev/null
@@ -1,292 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
-#ifndef _I810_DRM_H_
-#define _I810_DRM_H_
-
-#include "drm.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* WARNING: These defines must be the same as what the Xserver uses.
- * if you change them, you must change the defines in the Xserver.
- */
-
-#ifndef _I810_DEFINES_
-#define _I810_DEFINES_
-
-#define I810_DMA_BUF_ORDER             12
-#define I810_DMA_BUF_SZ                (1<<I810_DMA_BUF_ORDER)
-#define I810_DMA_BUF_NR                256
-#define I810_NR_SAREA_CLIPRECTS        8
-
-/* Each region is a minimum of 64k, and there are at most 64 of them.
- */
-#define I810_NR_TEX_REGIONS 64
-#define I810_LOG_MIN_TEX_REGION_SIZE 16
-#endif
-
-#define I810_UPLOAD_TEX0IMAGE  0x1     /* handled clientside */
-#define I810_UPLOAD_TEX1IMAGE  0x2     /* handled clientside */
-#define I810_UPLOAD_CTX        0x4
-#define I810_UPLOAD_BUFFERS    0x8
-#define I810_UPLOAD_TEX0       0x10
-#define I810_UPLOAD_TEX1       0x20
-#define I810_UPLOAD_CLIPRECTS  0x40
-
-/* Indices into buf.Setup where various bits of state are mirrored per
- * context and per buffer.  These can be fired at the card as a unit,
- * or in a piecewise fashion as required.
- */
-
-/* Destbuffer state
- *    - backbuffer linear offset and pitch -- invarient in the current dri
- *    - zbuffer linear offset and pitch -- also invarient
- *    - drawing origin in back and depth buffers.
- *
- * Keep the depth/back buffer state here to accommodate private buffers
- * in the future.
- */
-#define I810_DESTREG_DI0  0    /* CMD_OP_DESTBUFFER_INFO (2 dwords) */
-#define I810_DESTREG_DI1  1
-#define I810_DESTREG_DV0  2    /* GFX_OP_DESTBUFFER_VARS (2 dwords) */
-#define I810_DESTREG_DV1  3
-#define I810_DESTREG_DR0  4    /* GFX_OP_DRAWRECT_INFO (4 dwords) */
-#define I810_DESTREG_DR1  5
-#define I810_DESTREG_DR2  6
-#define I810_DESTREG_DR3  7
-#define I810_DESTREG_DR4  8
-#define I810_DEST_SETUP_SIZE 10
-
-/* Context state
- */
-#define I810_CTXREG_CF0   0    /* GFX_OP_COLOR_FACTOR */
-#define I810_CTXREG_CF1   1
-#define I810_CTXREG_ST0   2    /* GFX_OP_STIPPLE */
-#define I810_CTXREG_ST1   3
-#define I810_CTXREG_VF    4    /* GFX_OP_VERTEX_FMT */
-#define I810_CTXREG_MT    5    /* GFX_OP_MAP_TEXELS */
-#define I810_CTXREG_MC0   6    /* GFX_OP_MAP_COLOR_STAGES - stage 0 */
-#define I810_CTXREG_MC1   7    /* GFX_OP_MAP_COLOR_STAGES - stage 1 */
-#define I810_CTXREG_MC2   8    /* GFX_OP_MAP_COLOR_STAGES - stage 2 */
-#define I810_CTXREG_MA0   9    /* GFX_OP_MAP_ALPHA_STAGES - stage 0 */
-#define I810_CTXREG_MA1   10   /* GFX_OP_MAP_ALPHA_STAGES - stage 1 */
-#define I810_CTXREG_MA2   11   /* GFX_OP_MAP_ALPHA_STAGES - stage 2 */
-#define I810_CTXREG_SDM   12   /* GFX_OP_SRC_DEST_MONO */
-#define I810_CTXREG_FOG   13   /* GFX_OP_FOG_COLOR */
-#define I810_CTXREG_B1    14   /* GFX_OP_BOOL_1 */
-#define I810_CTXREG_B2    15   /* GFX_OP_BOOL_2 */
-#define I810_CTXREG_LCS   16   /* GFX_OP_LINEWIDTH_CULL_SHADE_MODE */
-#define I810_CTXREG_PV    17   /* GFX_OP_PV_RULE -- Invarient! */
-#define I810_CTXREG_ZA    18   /* GFX_OP_ZBIAS_ALPHAFUNC */
-#define I810_CTXREG_AA    19   /* GFX_OP_ANTIALIAS */
-#define I810_CTX_SETUP_SIZE 20
-
-/* Texture state (per tex unit)
- */
-#define I810_TEXREG_MI0  0     /* GFX_OP_MAP_INFO (4 dwords) */
-#define I810_TEXREG_MI1  1
-#define I810_TEXREG_MI2  2
-#define I810_TEXREG_MI3  3
-#define I810_TEXREG_MF   4     /* GFX_OP_MAP_FILTER */
-#define I810_TEXREG_MLC  5     /* GFX_OP_MAP_LOD_CTL */
-#define I810_TEXREG_MLL  6     /* GFX_OP_MAP_LOD_LIMITS */
-#define I810_TEXREG_MCS  7     /* GFX_OP_MAP_COORD_SETS ??? */
-#define I810_TEX_SETUP_SIZE 8
-
-/* Flags for clear ioctl
- */
-#define I810_FRONT   0x1
-#define I810_BACK    0x2
-#define I810_DEPTH   0x4
-
-typedef enum _drm_i810_init_func {
-       I810_INIT_DMA = 0x01,
-       I810_CLEANUP_DMA = 0x02,
-       I810_INIT_DMA_1_4 = 0x03
-} drm_i810_init_func_t;
-
-/* This is the init structure after v1.2 */
-typedef struct _drm_i810_init {
-       drm_i810_init_func_t func;
-       unsigned int mmio_offset;
-       unsigned int buffers_offset;
-       int sarea_priv_offset;
-       unsigned int ring_start;
-       unsigned int ring_end;
-       unsigned int ring_size;
-       unsigned int front_offset;
-       unsigned int back_offset;
-       unsigned int depth_offset;
-       unsigned int overlay_offset;
-       unsigned int overlay_physical;
-       unsigned int w;
-       unsigned int h;
-       unsigned int pitch;
-       unsigned int pitch_bits;
-} drm_i810_init_t;
-
-/* This is the init structure prior to v1.2 */
-typedef struct _drm_i810_pre12_init {
-       drm_i810_init_func_t func;
-       unsigned int mmio_offset;
-       unsigned int buffers_offset;
-       int sarea_priv_offset;
-       unsigned int ring_start;
-       unsigned int ring_end;
-       unsigned int ring_size;
-       unsigned int front_offset;
-       unsigned int back_offset;
-       unsigned int depth_offset;
-       unsigned int w;
-       unsigned int h;
-       unsigned int pitch;
-       unsigned int pitch_bits;
-} drm_i810_pre12_init_t;
-
-/* Warning: If you change the SAREA structure you must change the Xserver
- * structure as well */
-
-typedef struct _drm_i810_tex_region {
-       unsigned char next, prev;       /* indices to form a circular LRU  */
-       unsigned char in_use;   /* owned by a client, or free? */
-       int age;                /* tracked by clients to update local LRU's */
-} drm_i810_tex_region_t;
-
-typedef struct _drm_i810_sarea {
-       unsigned int ContextState[I810_CTX_SETUP_SIZE];
-       unsigned int BufferState[I810_DEST_SETUP_SIZE];
-       unsigned int TexState[2][I810_TEX_SETUP_SIZE];
-       unsigned int dirty;
-
-       unsigned int nbox;
-       struct drm_clip_rect boxes[I810_NR_SAREA_CLIPRECTS];
-
-       /* Maintain an LRU of contiguous regions of texture space.  If
-        * you think you own a region of texture memory, and it has an
-        * age different to the one you set, then you are mistaken and
-        * it has been stolen by another client.  If global texAge
-        * hasn't changed, there is no need to walk the list.
-        *
-        * These regions can be used as a proxy for the fine-grained
-        * texture information of other clients - by maintaining them
-        * in the same lru which is used to age their own textures,
-        * clients have an approximate lru for the whole of global
-        * texture space, and can make informed decisions as to which
-        * areas to kick out.  There is no need to choose whether to
-        * kick out your own texture or someone else's - simply eject
-        * them all in LRU order.
-        */
-
-       drm_i810_tex_region_t texList[I810_NR_TEX_REGIONS + 1];
-       /* Last elt is sentinal */
-       int texAge;             /* last time texture was uploaded */
-       int last_enqueue;       /* last time a buffer was enqueued */
-       int last_dispatch;      /* age of the most recently dispatched buffer */
-       int last_quiescent;     /*  */
-       int ctxOwner;           /* last context to upload state */
-
-       int vertex_prim;
-
-       int pf_enabled;         /* is pageflipping allowed? */
-       int pf_active;
-       int pf_current_page;    /* which buffer is being displayed? */
-} drm_i810_sarea_t;
-
-/* WARNING: If you change any of these defines, make sure to change the
- * defines in the Xserver file (xf86drmMga.h)
- */
-
-/* i810 specific ioctls
- * The device specific ioctl range is 0x40 to 0x79.
- */
-#define DRM_I810_INIT          0x00
-#define DRM_I810_VERTEX                0x01
-#define DRM_I810_CLEAR         0x02
-#define DRM_I810_FLUSH         0x03
-#define DRM_I810_GETAGE                0x04
-#define DRM_I810_GETBUF                0x05
-#define DRM_I810_SWAP          0x06
-#define DRM_I810_COPY          0x07
-#define DRM_I810_DOCOPY                0x08
-#define DRM_I810_OV0INFO       0x09
-#define DRM_I810_FSTATUS       0x0a
-#define DRM_I810_OV0FLIP       0x0b
-#define DRM_I810_MC            0x0c
-#define DRM_I810_RSTATUS       0x0d
-#define DRM_I810_FLIP          0x0e
-
-#define DRM_IOCTL_I810_INIT            DRM_IOW( DRM_COMMAND_BASE + DRM_I810_INIT, drm_i810_init_t)
-#define DRM_IOCTL_I810_VERTEX          DRM_IOW( DRM_COMMAND_BASE + DRM_I810_VERTEX, drm_i810_vertex_t)
-#define DRM_IOCTL_I810_CLEAR           DRM_IOW( DRM_COMMAND_BASE + DRM_I810_CLEAR, drm_i810_clear_t)
-#define DRM_IOCTL_I810_FLUSH           DRM_IO(  DRM_COMMAND_BASE + DRM_I810_FLUSH)
-#define DRM_IOCTL_I810_GETAGE          DRM_IO(  DRM_COMMAND_BASE + DRM_I810_GETAGE)
-#define DRM_IOCTL_I810_GETBUF          DRM_IOWR(DRM_COMMAND_BASE + DRM_I810_GETBUF, drm_i810_dma_t)
-#define DRM_IOCTL_I810_SWAP            DRM_IO(  DRM_COMMAND_BASE + DRM_I810_SWAP)
-#define DRM_IOCTL_I810_COPY            DRM_IOW( DRM_COMMAND_BASE + DRM_I810_COPY, drm_i810_copy_t)
-#define DRM_IOCTL_I810_DOCOPY          DRM_IO(  DRM_COMMAND_BASE + DRM_I810_DOCOPY)
-#define DRM_IOCTL_I810_OV0INFO         DRM_IOR( DRM_COMMAND_BASE + DRM_I810_OV0INFO, drm_i810_overlay_t)
-#define DRM_IOCTL_I810_FSTATUS         DRM_IO ( DRM_COMMAND_BASE + DRM_I810_FSTATUS)
-#define DRM_IOCTL_I810_OV0FLIP         DRM_IO ( DRM_COMMAND_BASE + DRM_I810_OV0FLIP)
-#define DRM_IOCTL_I810_MC              DRM_IOW( DRM_COMMAND_BASE + DRM_I810_MC, drm_i810_mc_t)
-#define DRM_IOCTL_I810_RSTATUS         DRM_IO ( DRM_COMMAND_BASE + DRM_I810_RSTATUS)
-#define DRM_IOCTL_I810_FLIP             DRM_IO ( DRM_COMMAND_BASE + DRM_I810_FLIP)
-
-typedef struct _drm_i810_clear {
-       int clear_color;
-       int clear_depth;
-       int flags;
-} drm_i810_clear_t;
-
-/* These may be placeholders if we have more cliprects than
- * I810_NR_SAREA_CLIPRECTS.  In that case, the client sets discard to
- * false, indicating that the buffer will be dispatched again with a
- * new set of cliprects.
- */
-typedef struct _drm_i810_vertex {
-       int idx;                /* buffer index */
-       int used;               /* nr bytes in use */
-       int discard;            /* client is finished with the buffer? */
-} drm_i810_vertex_t;
-
-typedef struct _drm_i810_copy_t {
-       int idx;                /* buffer index */
-       int used;               /* nr bytes in use */
-       void *address;          /* Address to copy from */
-} drm_i810_copy_t;
-
-#define PR_TRIANGLES         (0x0<<18)
-#define PR_TRISTRIP_0        (0x1<<18)
-#define PR_TRISTRIP_1        (0x2<<18)
-#define PR_TRIFAN            (0x3<<18)
-#define PR_POLYGON           (0x4<<18)
-#define PR_LINES             (0x5<<18)
-#define PR_LINESTRIP         (0x6<<18)
-#define PR_RECTS             (0x7<<18)
-#define PR_MASK              (0x7<<18)
-
-typedef struct drm_i810_dma {
-       void *virtual;
-       int request_idx;
-       int request_size;
-       int granted;
-} drm_i810_dma_t;
-
-typedef struct _drm_i810_overlay_t {
-       unsigned int offset;    /* Address of the Overlay Regs */
-       unsigned int physical;
-} drm_i810_overlay_t;
-
-typedef struct _drm_i810_mc {
-       int idx;                /* buffer index */
-       int used;               /* nr bytes in use */
-       int num_blocks;         /* number of GFXBlocks */
-       int *length;            /* List of lengths for GFXBlocks (FUTURE) */
-       unsigned int last_render;       /* Last Render Request */
-} drm_i810_mc_t;
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif                         /* _I810_DRM_H_ */
diff --git a/include/uapi/drm/mga_drm.h b/include/uapi/drm/mga_drm.h
deleted file mode 100644 (file)
index bb31567..0000000
+++ /dev/null
@@ -1,429 +0,0 @@
-/* mga_drm.h -- Public header for the Matrox g200/g400 driver -*- linux-c -*-
- * Created: Tue Jan 25 01:50:01 1999 by jhartmann@precisioninsight.com
- *
- * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
- * OTHER DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Jeff Hartmann <jhartmann@valinux.com>
- *    Keith Whitwell <keith@tungstengraphics.com>
- *
- * Rewritten by:
- *    Gareth Hughes <gareth@valinux.com>
- */
-
-#ifndef __MGA_DRM_H__
-#define __MGA_DRM_H__
-
-#include "drm.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* WARNING: If you change any of these defines, make sure to change the
- * defines in the Xserver file (mga_sarea.h)
- */
-
-#ifndef __MGA_SAREA_DEFINES__
-#define __MGA_SAREA_DEFINES__
-
-/* WARP pipe flags
- */
-#define MGA_F                  0x1     /* fog */
-#define MGA_A                  0x2     /* alpha */
-#define MGA_S                  0x4     /* specular */
-#define MGA_T2                 0x8     /* multitexture */
-
-#define MGA_WARP_TGZ           0
-#define MGA_WARP_TGZF          (MGA_F)
-#define MGA_WARP_TGZA          (MGA_A)
-#define MGA_WARP_TGZAF         (MGA_F|MGA_A)
-#define MGA_WARP_TGZS          (MGA_S)
-#define MGA_WARP_TGZSF         (MGA_S|MGA_F)
-#define MGA_WARP_TGZSA         (MGA_S|MGA_A)
-#define MGA_WARP_TGZSAF                (MGA_S|MGA_F|MGA_A)
-#define MGA_WARP_T2GZ          (MGA_T2)
-#define MGA_WARP_T2GZF         (MGA_T2|MGA_F)
-#define MGA_WARP_T2GZA         (MGA_T2|MGA_A)
-#define MGA_WARP_T2GZAF                (MGA_T2|MGA_A|MGA_F)
-#define MGA_WARP_T2GZS         (MGA_T2|MGA_S)
-#define MGA_WARP_T2GZSF                (MGA_T2|MGA_S|MGA_F)
-#define MGA_WARP_T2GZSA                (MGA_T2|MGA_S|MGA_A)
-#define MGA_WARP_T2GZSAF       (MGA_T2|MGA_S|MGA_F|MGA_A)
-
-#define MGA_MAX_G200_PIPES     8       /* no multitex */
-#define MGA_MAX_G400_PIPES     16
-#define MGA_MAX_WARP_PIPES     MGA_MAX_G400_PIPES
-#define MGA_WARP_UCODE_SIZE    32768   /* in bytes */
-
-#define MGA_CARD_TYPE_G200     1
-#define MGA_CARD_TYPE_G400     2
-#define MGA_CARD_TYPE_G450     3       /* not currently used */
-#define MGA_CARD_TYPE_G550     4
-
-#define MGA_FRONT              0x1
-#define MGA_BACK               0x2
-#define MGA_DEPTH              0x4
-
-/* What needs to be changed for the current vertex dma buffer?
- */
-#define MGA_UPLOAD_CONTEXT     0x1
-#define MGA_UPLOAD_TEX0                0x2
-#define MGA_UPLOAD_TEX1                0x4
-#define MGA_UPLOAD_PIPE                0x8
-#define MGA_UPLOAD_TEX0IMAGE   0x10    /* handled client-side */
-#define MGA_UPLOAD_TEX1IMAGE   0x20    /* handled client-side */
-#define MGA_UPLOAD_2D          0x40
-#define MGA_WAIT_AGE           0x80    /* handled client-side */
-#define MGA_UPLOAD_CLIPRECTS   0x100   /* handled client-side */
-#if 0
-#define MGA_DMA_FLUSH          0x200   /* set when someone gets the lock
-                                          quiescent */
-#endif
-
-/* 32 buffers of 64k each, total 2 meg.
- */
-#define MGA_BUFFER_SIZE                (1 << 16)
-#define MGA_NUM_BUFFERS                128
-
-/* Keep these small for testing.
- */
-#define MGA_NR_SAREA_CLIPRECTS 8
-
-/* 2 heaps (1 for card, 1 for agp), each divided into up to 128
- * regions, subject to a minimum region size of (1<<16) == 64k.
- *
- * Clients may subdivide regions internally, but when sharing between
- * clients, the region size is the minimum granularity.
- */
-
-#define MGA_CARD_HEAP                  0
-#define MGA_AGP_HEAP                   1
-#define MGA_NR_TEX_HEAPS               2
-#define MGA_NR_TEX_REGIONS             16
-#define MGA_LOG_MIN_TEX_REGION_SIZE    16
-
-#define  DRM_MGA_IDLE_RETRY          2048
-
-#endif                         /* __MGA_SAREA_DEFINES__ */
-
-/* Setup registers for 3D context
- */
-typedef struct {
-       unsigned int dstorg;
-       unsigned int maccess;
-       unsigned int plnwt;
-       unsigned int dwgctl;
-       unsigned int alphactrl;
-       unsigned int fogcolor;
-       unsigned int wflag;
-       unsigned int tdualstage0;
-       unsigned int tdualstage1;
-       unsigned int fcol;
-       unsigned int stencil;
-       unsigned int stencilctl;
-} drm_mga_context_regs_t;
-
-/* Setup registers for 2D, X server
- */
-typedef struct {
-       unsigned int pitch;
-} drm_mga_server_regs_t;
-
-/* Setup registers for each texture unit
- */
-typedef struct {
-       unsigned int texctl;
-       unsigned int texctl2;
-       unsigned int texfilter;
-       unsigned int texbordercol;
-       unsigned int texorg;
-       unsigned int texwidth;
-       unsigned int texheight;
-       unsigned int texorg1;
-       unsigned int texorg2;
-       unsigned int texorg3;
-       unsigned int texorg4;
-} drm_mga_texture_regs_t;
-
-/* General aging mechanism
- */
-typedef struct {
-       unsigned int head;      /* Position of head pointer          */
-       unsigned int wrap;      /* Primary DMA wrap count            */
-} drm_mga_age_t;
-
-typedef struct _drm_mga_sarea {
-       /* The channel for communication of state information to the kernel
-        * on firing a vertex dma buffer.
-        */
-       drm_mga_context_regs_t context_state;
-       drm_mga_server_regs_t server_state;
-       drm_mga_texture_regs_t tex_state[2];
-       unsigned int warp_pipe;
-       unsigned int dirty;
-       unsigned int vertsize;
-
-       /* The current cliprects, or a subset thereof.
-        */
-       struct drm_clip_rect boxes[MGA_NR_SAREA_CLIPRECTS];
-       unsigned int nbox;
-
-       /* Information about the most recently used 3d drawable.  The
-        * client fills in the req_* fields, the server fills in the
-        * exported_ fields and puts the cliprects into boxes, above.
-        *
-        * The client clears the exported_drawable field before
-        * clobbering the boxes data.
-        */
-       unsigned int req_drawable;      /* the X drawable id */
-       unsigned int req_draw_buffer;   /* MGA_FRONT or MGA_BACK */
-
-       unsigned int exported_drawable;
-       unsigned int exported_index;
-       unsigned int exported_stamp;
-       unsigned int exported_buffers;
-       unsigned int exported_nfront;
-       unsigned int exported_nback;
-       int exported_back_x, exported_front_x, exported_w;
-       int exported_back_y, exported_front_y, exported_h;
-       struct drm_clip_rect exported_boxes[MGA_NR_SAREA_CLIPRECTS];
-
-       /* Counters for aging textures and for client-side throttling.
-        */
-       unsigned int status[4];
-       unsigned int last_wrap;
-
-       drm_mga_age_t last_frame;
-       unsigned int last_enqueue;      /* last time a buffer was enqueued */
-       unsigned int last_dispatch;     /* age of the most recently dispatched buffer */
-       unsigned int last_quiescent;    /*  */
-
-       /* LRU lists for texture memory in agp space and on the card.
-        */
-       struct drm_tex_region texList[MGA_NR_TEX_HEAPS][MGA_NR_TEX_REGIONS + 1];
-       unsigned int texAge[MGA_NR_TEX_HEAPS];
-
-       /* Mechanism to validate card state.
-        */
-       int ctxOwner;
-} drm_mga_sarea_t;
-
-/* MGA specific ioctls
- * The device specific ioctl range is 0x40 to 0x79.
- */
-#define DRM_MGA_INIT     0x00
-#define DRM_MGA_FLUSH    0x01
-#define DRM_MGA_RESET    0x02
-#define DRM_MGA_SWAP     0x03
-#define DRM_MGA_CLEAR    0x04
-#define DRM_MGA_VERTEX   0x05
-#define DRM_MGA_INDICES  0x06
-#define DRM_MGA_ILOAD    0x07
-#define DRM_MGA_BLIT     0x08
-#define DRM_MGA_GETPARAM 0x09
-
-/* 3.2:
- * ioctls for operating on fences.
- */
-#define DRM_MGA_SET_FENCE      0x0a
-#define DRM_MGA_WAIT_FENCE     0x0b
-#define DRM_MGA_DMA_BOOTSTRAP  0x0c
-
-#define DRM_IOCTL_MGA_INIT     DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_INIT, drm_mga_init_t)
-#define DRM_IOCTL_MGA_FLUSH    DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_FLUSH, struct drm_lock)
-#define DRM_IOCTL_MGA_RESET    DRM_IO(  DRM_COMMAND_BASE + DRM_MGA_RESET)
-#define DRM_IOCTL_MGA_SWAP     DRM_IO(  DRM_COMMAND_BASE + DRM_MGA_SWAP)
-#define DRM_IOCTL_MGA_CLEAR    DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_CLEAR, drm_mga_clear_t)
-#define DRM_IOCTL_MGA_VERTEX   DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_VERTEX, drm_mga_vertex_t)
-#define DRM_IOCTL_MGA_INDICES  DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_INDICES, drm_mga_indices_t)
-#define DRM_IOCTL_MGA_ILOAD    DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_ILOAD, drm_mga_iload_t)
-#define DRM_IOCTL_MGA_BLIT     DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_BLIT, drm_mga_blit_t)
-#define DRM_IOCTL_MGA_GETPARAM DRM_IOWR(DRM_COMMAND_BASE + DRM_MGA_GETPARAM, drm_mga_getparam_t)
-#define DRM_IOCTL_MGA_SET_FENCE     DRM_IOW( DRM_COMMAND_BASE + DRM_MGA_SET_FENCE, __u32)
-#define DRM_IOCTL_MGA_WAIT_FENCE    DRM_IOWR(DRM_COMMAND_BASE + DRM_MGA_WAIT_FENCE, __u32)
-#define DRM_IOCTL_MGA_DMA_BOOTSTRAP DRM_IOWR(DRM_COMMAND_BASE + DRM_MGA_DMA_BOOTSTRAP, drm_mga_dma_bootstrap_t)
-
-typedef struct _drm_mga_warp_index {
-       int installed;
-       unsigned long phys_addr;
-       int size;
-} drm_mga_warp_index_t;
-
-typedef struct drm_mga_init {
-       enum {
-               MGA_INIT_DMA = 0x01,
-               MGA_CLEANUP_DMA = 0x02
-       } func;
-
-       unsigned long sarea_priv_offset;
-
-       __struct_group(/* no tag */, always32bit, /* no attrs */,
-               int chipset;
-               int sgram;
-
-               unsigned int maccess;
-
-               unsigned int fb_cpp;
-               unsigned int front_offset, front_pitch;
-               unsigned int back_offset, back_pitch;
-
-               unsigned int depth_cpp;
-               unsigned int depth_offset, depth_pitch;
-
-               unsigned int texture_offset[MGA_NR_TEX_HEAPS];
-               unsigned int texture_size[MGA_NR_TEX_HEAPS];
-       );
-
-       unsigned long fb_offset;
-       unsigned long mmio_offset;
-       unsigned long status_offset;
-       unsigned long warp_offset;
-       unsigned long primary_offset;
-       unsigned long buffers_offset;
-} drm_mga_init_t;
-
-typedef struct drm_mga_dma_bootstrap {
-       /**
-        * \name AGP texture region
-        *
-        * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, these fields will
-        * be filled in with the actual AGP texture settings.
-        *
-        * \warning
-        * If these fields are non-zero, but dma_mga_dma_bootstrap::agp_mode
-        * is zero, it means that PCI memory (most likely through the use of
-        * an IOMMU) is being used for "AGP" textures.
-        */
-       /*@{ */
-       unsigned long texture_handle; /**< Handle used to map AGP textures. */
-       __u32 texture_size;           /**< Size of the AGP texture region. */
-       /*@} */
-
-       /**
-        * Requested size of the primary DMA region.
-        *
-        * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, this field will be
-        * filled in with the actual AGP mode.  If AGP was not available
-        */
-       __u32 primary_size;
-
-       /**
-        * Requested number of secondary DMA buffers.
-        *
-        * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, this field will be
-        * filled in with the actual number of secondary DMA buffers
-        * allocated.  Particularly when PCI DMA is used, this may be
-        * (subtantially) less than the number requested.
-        */
-       __u32 secondary_bin_count;
-
-       /**
-        * Requested size of each secondary DMA buffer.
-        *
-        * While the kernel \b is free to reduce
-        * dma_mga_dma_bootstrap::secondary_bin_count, it is \b not allowed
-        * to reduce dma_mga_dma_bootstrap::secondary_bin_size.
-        */
-       __u32 secondary_bin_size;
-
-       /**
-        * Bit-wise mask of AGPSTAT2_* values.  Currently only \c AGPSTAT2_1X,
-        * \c AGPSTAT2_2X, and \c AGPSTAT2_4X are supported.  If this value is
-        * zero, it means that PCI DMA should be used, even if AGP is
-        * possible.
-        *
-        * On return from the DRM_MGA_DMA_BOOTSTRAP ioctl, this field will be
-        * filled in with the actual AGP mode.  If AGP was not available
-        * (i.e., PCI DMA was used), this value will be zero.
-        */
-       __u32 agp_mode;
-
-       /**
-        * Desired AGP GART size, measured in megabytes.
-        */
-       __u8 agp_size;
-} drm_mga_dma_bootstrap_t;
-
-typedef struct drm_mga_clear {
-       unsigned int flags;
-       unsigned int clear_color;
-       unsigned int clear_depth;
-       unsigned int color_mask;
-       unsigned int depth_mask;
-} drm_mga_clear_t;
-
-typedef struct drm_mga_vertex {
-       int idx;                /* buffer to queue */
-       int used;               /* bytes in use */
-       int discard;            /* client finished with buffer?  */
-} drm_mga_vertex_t;
-
-typedef struct drm_mga_indices {
-       int idx;                /* buffer to queue */
-       unsigned int start;
-       unsigned int end;
-       int discard;            /* client finished with buffer?  */
-} drm_mga_indices_t;
-
-typedef struct drm_mga_iload {
-       int idx;
-       unsigned int dstorg;
-       unsigned int length;
-} drm_mga_iload_t;
-
-typedef struct _drm_mga_blit {
-       unsigned int planemask;
-       unsigned int srcorg;
-       unsigned int dstorg;
-       int src_pitch, dst_pitch;
-       int delta_sx, delta_sy;
-       int delta_dx, delta_dy;
-       int height, ydir;       /* flip image vertically */
-       int source_pitch, dest_pitch;
-} drm_mga_blit_t;
-
-/* 3.1: An ioctl to get parameters that aren't available to the 3d
- * client any other way.
- */
-#define MGA_PARAM_IRQ_NR            1
-
-/* 3.2: Query the actual card type.  The DDX only distinguishes between
- * G200 chips and non-G200 chips, which it calls G400.  It turns out that
- * there are some very sublte differences between the G4x0 chips and the G550
- * chips.  Using this parameter query, a client-side driver can detect the
- * difference between a G4x0 and a G550.
- */
-#define MGA_PARAM_CARD_TYPE         2
-
-typedef struct drm_mga_getparam {
-       int param;
-       void __user *value;
-} drm_mga_getparam_t;
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/include/uapi/drm/r128_drm.h b/include/uapi/drm/r128_drm.h
deleted file mode 100644 (file)
index 690e9c6..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-/* r128_drm.h -- Public header for the r128 driver -*- linux-c -*-
- * Created: Wed Apr  5 19:24:19 2000 by kevin@precisioninsight.com
- */
-/*
- * Copyright 2000 Precision Insight, Inc., Cedar Park, Texas.
- * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
- * All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Gareth Hughes <gareth@valinux.com>
- *    Kevin E. Martin <martin@valinux.com>
- */
-
-#ifndef __R128_DRM_H__
-#define __R128_DRM_H__
-
-#include "drm.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* WARNING: If you change any of these defines, make sure to change the
- * defines in the X server file (r128_sarea.h)
- */
-#ifndef __R128_SAREA_DEFINES__
-#define __R128_SAREA_DEFINES__
-
-/* What needs to be changed for the current vertex buffer?
- */
-#define R128_UPLOAD_CONTEXT            0x001
-#define R128_UPLOAD_SETUP              0x002
-#define R128_UPLOAD_TEX0               0x004
-#define R128_UPLOAD_TEX1               0x008
-#define R128_UPLOAD_TEX0IMAGES         0x010
-#define R128_UPLOAD_TEX1IMAGES         0x020
-#define R128_UPLOAD_CORE               0x040
-#define R128_UPLOAD_MASKS              0x080
-#define R128_UPLOAD_WINDOW             0x100
-#define R128_UPLOAD_CLIPRECTS          0x200   /* handled client-side */
-#define R128_REQUIRE_QUIESCENCE                0x400
-#define R128_UPLOAD_ALL                        0x7ff
-
-#define R128_FRONT                     0x1
-#define R128_BACK                      0x2
-#define R128_DEPTH                     0x4
-
-/* Primitive types
- */
-#define R128_POINTS                    0x1
-#define R128_LINES                     0x2
-#define R128_LINE_STRIP                        0x3
-#define R128_TRIANGLES                 0x4
-#define R128_TRIANGLE_FAN              0x5
-#define R128_TRIANGLE_STRIP            0x6
-
-/* Vertex/indirect buffer size
- */
-#define R128_BUFFER_SIZE               16384
-
-/* Byte offsets for indirect buffer data
- */
-#define R128_INDEX_PRIM_OFFSET         20
-#define R128_HOSTDATA_BLIT_OFFSET      32
-
-/* Keep these small for testing.
- */
-#define R128_NR_SAREA_CLIPRECTS                12
-
-/* There are 2 heaps (local/AGP).  Each region within a heap is a
- *  minimum of 64k, and there are at most 64 of them per heap.
- */
-#define R128_LOCAL_TEX_HEAP            0
-#define R128_AGP_TEX_HEAP              1
-#define R128_NR_TEX_HEAPS              2
-#define R128_NR_TEX_REGIONS            64
-#define R128_LOG_TEX_GRANULARITY       16
-
-#define R128_NR_CONTEXT_REGS           12
-
-#define R128_MAX_TEXTURE_LEVELS                11
-#define R128_MAX_TEXTURE_UNITS         2
-
-#endif                         /* __R128_SAREA_DEFINES__ */
-
-typedef struct {
-       /* Context state - can be written in one large chunk */
-       unsigned int dst_pitch_offset_c;
-       unsigned int dp_gui_master_cntl_c;
-       unsigned int sc_top_left_c;
-       unsigned int sc_bottom_right_c;
-       unsigned int z_offset_c;
-       unsigned int z_pitch_c;
-       unsigned int z_sten_cntl_c;
-       unsigned int tex_cntl_c;
-       unsigned int misc_3d_state_cntl_reg;
-       unsigned int texture_clr_cmp_clr_c;
-       unsigned int texture_clr_cmp_msk_c;
-       unsigned int fog_color_c;
-
-       /* Texture state */
-       unsigned int tex_size_pitch_c;
-       unsigned int constant_color_c;
-
-       /* Setup state */
-       unsigned int pm4_vc_fpu_setup;
-       unsigned int setup_cntl;
-
-       /* Mask state */
-       unsigned int dp_write_mask;
-       unsigned int sten_ref_mask_c;
-       unsigned int plane_3d_mask_c;
-
-       /* Window state */
-       unsigned int window_xy_offset;
-
-       /* Core state */
-       unsigned int scale_3d_cntl;
-} drm_r128_context_regs_t;
-
-/* Setup registers for each texture unit
- */
-typedef struct {
-       unsigned int tex_cntl;
-       unsigned int tex_combine_cntl;
-       unsigned int tex_size_pitch;
-       unsigned int tex_offset[R128_MAX_TEXTURE_LEVELS];
-       unsigned int tex_border_color;
-} drm_r128_texture_regs_t;
-
-typedef struct drm_r128_sarea {
-       /* The channel for communication of state information to the kernel
-        * on firing a vertex buffer.
-        */
-       drm_r128_context_regs_t context_state;
-       drm_r128_texture_regs_t tex_state[R128_MAX_TEXTURE_UNITS];
-       unsigned int dirty;
-       unsigned int vertsize;
-       unsigned int vc_format;
-
-       /* The current cliprects, or a subset thereof.
-        */
-       struct drm_clip_rect boxes[R128_NR_SAREA_CLIPRECTS];
-       unsigned int nbox;
-
-       /* Counters for client-side throttling of rendering clients.
-        */
-       unsigned int last_frame;
-       unsigned int last_dispatch;
-
-       struct drm_tex_region tex_list[R128_NR_TEX_HEAPS][R128_NR_TEX_REGIONS + 1];
-       unsigned int tex_age[R128_NR_TEX_HEAPS];
-       int ctx_owner;
-       int pfAllowPageFlip;    /* number of 3d windows (0,1,2 or more) */
-       int pfCurrentPage;      /* which buffer is being displayed? */
-} drm_r128_sarea_t;
-
-/* WARNING: If you change any of these defines, make sure to change the
- * defines in the Xserver file (xf86drmR128.h)
- */
-
-/* Rage 128 specific ioctls
- * The device specific ioctl range is 0x40 to 0x79.
- */
-#define DRM_R128_INIT       0x00
-#define DRM_R128_CCE_START  0x01
-#define DRM_R128_CCE_STOP   0x02
-#define DRM_R128_CCE_RESET  0x03
-#define DRM_R128_CCE_IDLE   0x04
-/* 0x05 not used */
-#define DRM_R128_RESET      0x06
-#define DRM_R128_SWAP       0x07
-#define DRM_R128_CLEAR      0x08
-#define DRM_R128_VERTEX     0x09
-#define DRM_R128_INDICES    0x0a
-#define DRM_R128_BLIT       0x0b
-#define DRM_R128_DEPTH      0x0c
-#define DRM_R128_STIPPLE    0x0d
-/* 0x0e not used */
-#define DRM_R128_INDIRECT   0x0f
-#define DRM_R128_FULLSCREEN 0x10
-#define DRM_R128_CLEAR2     0x11
-#define DRM_R128_GETPARAM   0x12
-#define DRM_R128_FLIP       0x13
-
-#define DRM_IOCTL_R128_INIT       DRM_IOW( DRM_COMMAND_BASE + DRM_R128_INIT, drm_r128_init_t)
-#define DRM_IOCTL_R128_CCE_START  DRM_IO(  DRM_COMMAND_BASE + DRM_R128_CCE_START)
-#define DRM_IOCTL_R128_CCE_STOP   DRM_IOW( DRM_COMMAND_BASE + DRM_R128_CCE_STOP, drm_r128_cce_stop_t)
-#define DRM_IOCTL_R128_CCE_RESET  DRM_IO(  DRM_COMMAND_BASE + DRM_R128_CCE_RESET)
-#define DRM_IOCTL_R128_CCE_IDLE   DRM_IO(  DRM_COMMAND_BASE + DRM_R128_CCE_IDLE)
-/* 0x05 not used */
-#define DRM_IOCTL_R128_RESET      DRM_IO(  DRM_COMMAND_BASE + DRM_R128_RESET)
-#define DRM_IOCTL_R128_SWAP       DRM_IO(  DRM_COMMAND_BASE + DRM_R128_SWAP)
-#define DRM_IOCTL_R128_CLEAR      DRM_IOW( DRM_COMMAND_BASE + DRM_R128_CLEAR, drm_r128_clear_t)
-#define DRM_IOCTL_R128_VERTEX     DRM_IOW( DRM_COMMAND_BASE + DRM_R128_VERTEX, drm_r128_vertex_t)
-#define DRM_IOCTL_R128_INDICES    DRM_IOW( DRM_COMMAND_BASE + DRM_R128_INDICES, drm_r128_indices_t)
-#define DRM_IOCTL_R128_BLIT       DRM_IOW( DRM_COMMAND_BASE + DRM_R128_BLIT, drm_r128_blit_t)
-#define DRM_IOCTL_R128_DEPTH      DRM_IOW( DRM_COMMAND_BASE + DRM_R128_DEPTH, drm_r128_depth_t)
-#define DRM_IOCTL_R128_STIPPLE    DRM_IOW( DRM_COMMAND_BASE + DRM_R128_STIPPLE, drm_r128_stipple_t)
-/* 0x0e not used */
-#define DRM_IOCTL_R128_INDIRECT   DRM_IOWR(DRM_COMMAND_BASE + DRM_R128_INDIRECT, drm_r128_indirect_t)
-#define DRM_IOCTL_R128_FULLSCREEN DRM_IOW( DRM_COMMAND_BASE + DRM_R128_FULLSCREEN, drm_r128_fullscreen_t)
-#define DRM_IOCTL_R128_CLEAR2     DRM_IOW( DRM_COMMAND_BASE + DRM_R128_CLEAR2, drm_r128_clear2_t)
-#define DRM_IOCTL_R128_GETPARAM   DRM_IOWR( DRM_COMMAND_BASE + DRM_R128_GETPARAM, drm_r128_getparam_t)
-#define DRM_IOCTL_R128_FLIP       DRM_IO(  DRM_COMMAND_BASE + DRM_R128_FLIP)
-
-typedef struct drm_r128_init {
-       enum {
-               R128_INIT_CCE = 0x01,
-               R128_CLEANUP_CCE = 0x02
-       } func;
-       unsigned long sarea_priv_offset;
-       int is_pci;
-       int cce_mode;
-       int cce_secure;
-       int ring_size;
-       int usec_timeout;
-
-       unsigned int fb_bpp;
-       unsigned int front_offset, front_pitch;
-       unsigned int back_offset, back_pitch;
-       unsigned int depth_bpp;
-       unsigned int depth_offset, depth_pitch;
-       unsigned int span_offset;
-
-       unsigned long fb_offset;
-       unsigned long mmio_offset;
-       unsigned long ring_offset;
-       unsigned long ring_rptr_offset;
-       unsigned long buffers_offset;
-       unsigned long agp_textures_offset;
-} drm_r128_init_t;
-
-typedef struct drm_r128_cce_stop {
-       int flush;
-       int idle;
-} drm_r128_cce_stop_t;
-
-typedef struct drm_r128_clear {
-       unsigned int flags;
-       unsigned int clear_color;
-       unsigned int clear_depth;
-       unsigned int color_mask;
-       unsigned int depth_mask;
-} drm_r128_clear_t;
-
-typedef struct drm_r128_vertex {
-       int prim;
-       int idx;                /* Index of vertex buffer */
-       int count;              /* Number of vertices in buffer */
-       int discard;            /* Client finished with buffer? */
-} drm_r128_vertex_t;
-
-typedef struct drm_r128_indices {
-       int prim;
-       int idx;
-       int start;
-       int end;
-       int discard;            /* Client finished with buffer? */
-} drm_r128_indices_t;
-
-typedef struct drm_r128_blit {
-       int idx;
-       int pitch;
-       int offset;
-       int format;
-       unsigned short x, y;
-       unsigned short width, height;
-} drm_r128_blit_t;
-
-typedef struct drm_r128_depth {
-       enum {
-               R128_WRITE_SPAN = 0x01,
-               R128_WRITE_PIXELS = 0x02,
-               R128_READ_SPAN = 0x03,
-               R128_READ_PIXELS = 0x04
-       } func;
-       int n;
-       int __user *x;
-       int __user *y;
-       unsigned int __user *buffer;
-       unsigned char __user *mask;
-} drm_r128_depth_t;
-
-typedef struct drm_r128_stipple {
-       unsigned int __user *mask;
-} drm_r128_stipple_t;
-
-typedef struct drm_r128_indirect {
-       int idx;
-       int start;
-       int end;
-       int discard;
-} drm_r128_indirect_t;
-
-typedef struct drm_r128_fullscreen {
-       enum {
-               R128_INIT_FULLSCREEN = 0x01,
-               R128_CLEANUP_FULLSCREEN = 0x02
-       } func;
-} drm_r128_fullscreen_t;
-
-/* 2.3: An ioctl to get parameters that aren't available to the 3d
- * client any other way.
- */
-#define R128_PARAM_IRQ_NR            1
-
-typedef struct drm_r128_getparam {
-       int param;
-       void __user *value;
-} drm_r128_getparam_t;
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/include/uapi/drm/savage_drm.h b/include/uapi/drm/savage_drm.h
deleted file mode 100644 (file)
index 0f6edde..0000000
+++ /dev/null
@@ -1,220 +0,0 @@
-/* savage_drm.h -- Public header for the savage driver
- *
- * Copyright 2004  Felix Kuehling
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL FELIX KUEHLING BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
- * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
- * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef __SAVAGE_DRM_H__
-#define __SAVAGE_DRM_H__
-
-#include "drm.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifndef __SAVAGE_SAREA_DEFINES__
-#define __SAVAGE_SAREA_DEFINES__
-
-/* 2 heaps (1 for card, 1 for agp), each divided into up to 128
- * regions, subject to a minimum region size of (1<<16) == 64k.
- *
- * Clients may subdivide regions internally, but when sharing between
- * clients, the region size is the minimum granularity.
- */
-
-#define SAVAGE_CARD_HEAP               0
-#define SAVAGE_AGP_HEAP                        1
-#define SAVAGE_NR_TEX_HEAPS            2
-#define SAVAGE_NR_TEX_REGIONS          16
-#define SAVAGE_LOG_MIN_TEX_REGION_SIZE 16
-
-#endif                         /* __SAVAGE_SAREA_DEFINES__ */
-
-typedef struct _drm_savage_sarea {
-       /* LRU lists for texture memory in agp space and on the card.
-        */
-       struct drm_tex_region texList[SAVAGE_NR_TEX_HEAPS][SAVAGE_NR_TEX_REGIONS +
-                                                     1];
-       unsigned int texAge[SAVAGE_NR_TEX_HEAPS];
-
-       /* Mechanism to validate card state.
-        */
-       int ctxOwner;
-} drm_savage_sarea_t, *drm_savage_sarea_ptr;
-
-/* Savage-specific ioctls
- */
-#define DRM_SAVAGE_BCI_INIT            0x00
-#define DRM_SAVAGE_BCI_CMDBUF           0x01
-#define DRM_SAVAGE_BCI_EVENT_EMIT      0x02
-#define DRM_SAVAGE_BCI_EVENT_WAIT      0x03
-
-#define DRM_IOCTL_SAVAGE_BCI_INIT              DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_INIT, drm_savage_init_t)
-#define DRM_IOCTL_SAVAGE_BCI_CMDBUF            DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_CMDBUF, drm_savage_cmdbuf_t)
-#define DRM_IOCTL_SAVAGE_BCI_EVENT_EMIT        DRM_IOWR(DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_EMIT, drm_savage_event_emit_t)
-#define DRM_IOCTL_SAVAGE_BCI_EVENT_WAIT        DRM_IOW( DRM_COMMAND_BASE + DRM_SAVAGE_BCI_EVENT_WAIT, drm_savage_event_wait_t)
-
-#define SAVAGE_DMA_PCI 1
-#define SAVAGE_DMA_AGP 3
-typedef struct drm_savage_init {
-       enum {
-               SAVAGE_INIT_BCI = 1,
-               SAVAGE_CLEANUP_BCI = 2
-       } func;
-       unsigned int sarea_priv_offset;
-
-       /* some parameters */
-       unsigned int cob_size;
-       unsigned int bci_threshold_lo, bci_threshold_hi;
-       unsigned int dma_type;
-
-       /* frame buffer layout */
-       unsigned int fb_bpp;
-       unsigned int front_offset, front_pitch;
-       unsigned int back_offset, back_pitch;
-       unsigned int depth_bpp;
-       unsigned int depth_offset, depth_pitch;
-
-       /* local textures */
-       unsigned int texture_offset;
-       unsigned int texture_size;
-
-       /* physical locations of non-permanent maps */
-       unsigned long status_offset;
-       unsigned long buffers_offset;
-       unsigned long agp_textures_offset;
-       unsigned long cmd_dma_offset;
-} drm_savage_init_t;
-
-typedef union drm_savage_cmd_header drm_savage_cmd_header_t;
-typedef struct drm_savage_cmdbuf {
-       /* command buffer in client's address space */
-       drm_savage_cmd_header_t __user *cmd_addr;
-       unsigned int size;      /* size of the command buffer in 64bit units */
-
-       unsigned int dma_idx;   /* DMA buffer index to use */
-       int discard;            /* discard DMA buffer when done */
-       /* vertex buffer in client's address space */
-       unsigned int __user *vb_addr;
-       unsigned int vb_size;   /* size of client vertex buffer in bytes */
-       unsigned int vb_stride; /* stride of vertices in 32bit words */
-       /* boxes in client's address space */
-       struct drm_clip_rect __user *box_addr;
-       unsigned int nbox;      /* number of clipping boxes */
-} drm_savage_cmdbuf_t;
-
-#define SAVAGE_WAIT_2D  0x1    /* wait for 2D idle before updating event tag */
-#define SAVAGE_WAIT_3D  0x2    /* wait for 3D idle before updating event tag */
-#define SAVAGE_WAIT_IRQ 0x4    /* emit or wait for IRQ, not implemented yet */
-typedef struct drm_savage_event {
-       unsigned int count;
-       unsigned int flags;
-} drm_savage_event_emit_t, drm_savage_event_wait_t;
-
-/* Commands for the cmdbuf ioctl
- */
-#define SAVAGE_CMD_STATE       0       /* a range of state registers */
-#define SAVAGE_CMD_DMA_PRIM    1       /* vertices from DMA buffer */
-#define SAVAGE_CMD_VB_PRIM     2       /* vertices from client vertex buffer */
-#define SAVAGE_CMD_DMA_IDX     3       /* indexed vertices from DMA buffer */
-#define SAVAGE_CMD_VB_IDX      4       /* indexed vertices client vertex buffer */
-#define SAVAGE_CMD_CLEAR       5       /* clear buffers */
-#define SAVAGE_CMD_SWAP                6       /* swap buffers */
-
-/* Primitive types
-*/
-#define SAVAGE_PRIM_TRILIST    0       /* triangle list */
-#define SAVAGE_PRIM_TRISTRIP   1       /* triangle strip */
-#define SAVAGE_PRIM_TRIFAN     2       /* triangle fan */
-#define SAVAGE_PRIM_TRILIST_201        3       /* reorder verts for correct flat
-                                        * shading on s3d */
-
-/* Skip flags (vertex format)
- */
-#define SAVAGE_SKIP_Z          0x01
-#define SAVAGE_SKIP_W          0x02
-#define SAVAGE_SKIP_C0         0x04
-#define SAVAGE_SKIP_C1         0x08
-#define SAVAGE_SKIP_S0         0x10
-#define SAVAGE_SKIP_T0         0x20
-#define SAVAGE_SKIP_ST0                0x30
-#define SAVAGE_SKIP_S1         0x40
-#define SAVAGE_SKIP_T1         0x80
-#define SAVAGE_SKIP_ST1                0xc0
-#define SAVAGE_SKIP_ALL_S3D    0x3f
-#define SAVAGE_SKIP_ALL_S4     0xff
-
-/* Buffer names for clear command
- */
-#define SAVAGE_FRONT           0x1
-#define SAVAGE_BACK            0x2
-#define SAVAGE_DEPTH           0x4
-
-/* 64-bit command header
- */
-union drm_savage_cmd_header {
-       struct {
-               unsigned char cmd;      /* command */
-               unsigned char pad0;
-               unsigned short pad1;
-               unsigned short pad2;
-               unsigned short pad3;
-       } cmd;                  /* generic */
-       struct {
-               unsigned char cmd;
-               unsigned char global;   /* need idle engine? */
-               unsigned short count;   /* number of consecutive registers */
-               unsigned short start;   /* first register */
-               unsigned short pad3;
-       } state;                /* SAVAGE_CMD_STATE */
-       struct {
-               unsigned char cmd;
-               unsigned char prim;     /* primitive type */
-               unsigned short skip;    /* vertex format (skip flags) */
-               unsigned short count;   /* number of vertices */
-               unsigned short start;   /* first vertex in DMA/vertex buffer */
-       } prim;                 /* SAVAGE_CMD_DMA_PRIM, SAVAGE_CMD_VB_PRIM */
-       struct {
-               unsigned char cmd;
-               unsigned char prim;
-               unsigned short skip;
-               unsigned short count;   /* number of indices that follow */
-               unsigned short pad3;
-       } idx;                  /* SAVAGE_CMD_DMA_IDX, SAVAGE_CMD_VB_IDX */
-       struct {
-               unsigned char cmd;
-               unsigned char pad0;
-               unsigned short pad1;
-               unsigned int flags;
-       } clear0;               /* SAVAGE_CMD_CLEAR */
-       struct {
-               unsigned int mask;
-               unsigned int value;
-       } clear1;               /* SAVAGE_CMD_CLEAR data */
-};
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif
diff --git a/include/uapi/drm/sis_drm.h b/include/uapi/drm/sis_drm.h
deleted file mode 100644 (file)
index 3e3f7e9..0000000
+++ /dev/null
@@ -1,77 +0,0 @@
-/* sis_drv.h -- Private header for sis driver -*- linux-c -*- */
-/*
- * Copyright 2005 Eric Anholt
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- */
-
-#ifndef __SIS_DRM_H__
-#define __SIS_DRM_H__
-
-#include "drm.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* SiS specific ioctls */
-#define NOT_USED_0_3
-#define DRM_SIS_FB_ALLOC       0x04
-#define DRM_SIS_FB_FREE                0x05
-#define NOT_USED_6_12
-#define DRM_SIS_AGP_INIT       0x13
-#define DRM_SIS_AGP_ALLOC      0x14
-#define DRM_SIS_AGP_FREE       0x15
-#define DRM_SIS_FB_INIT                0x16
-
-#define DRM_IOCTL_SIS_FB_ALLOC         DRM_IOWR(DRM_COMMAND_BASE + DRM_SIS_FB_ALLOC, drm_sis_mem_t)
-#define DRM_IOCTL_SIS_FB_FREE          DRM_IOW( DRM_COMMAND_BASE + DRM_SIS_FB_FREE, drm_sis_mem_t)
-#define DRM_IOCTL_SIS_AGP_INIT         DRM_IOWR(DRM_COMMAND_BASE + DRM_SIS_AGP_INIT, drm_sis_agp_t)
-#define DRM_IOCTL_SIS_AGP_ALLOC                DRM_IOWR(DRM_COMMAND_BASE + DRM_SIS_AGP_ALLOC, drm_sis_mem_t)
-#define DRM_IOCTL_SIS_AGP_FREE         DRM_IOW( DRM_COMMAND_BASE + DRM_SIS_AGP_FREE, drm_sis_mem_t)
-#define DRM_IOCTL_SIS_FB_INIT          DRM_IOW( DRM_COMMAND_BASE + DRM_SIS_FB_INIT, drm_sis_fb_t)
-/*
-#define DRM_IOCTL_SIS_FLIP             DRM_IOW( 0x48, drm_sis_flip_t)
-#define DRM_IOCTL_SIS_FLIP_INIT                DRM_IO(  0x49)
-#define DRM_IOCTL_SIS_FLIP_FINAL       DRM_IO(  0x50)
-*/
-
-typedef struct {
-       int context;
-       unsigned long offset;
-       unsigned long size;
-       unsigned long free;
-} drm_sis_mem_t;
-
-typedef struct {
-       unsigned long offset, size;
-} drm_sis_agp_t;
-
-typedef struct {
-       unsigned long offset, size;
-} drm_sis_fb_t;
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif                         /* __SIS_DRM_H__ */
diff --git a/include/uapi/drm/via_drm.h b/include/uapi/drm/via_drm.h
deleted file mode 100644 (file)
index a1e125d..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright 1998-2003 VIA Technologies, Inc. All Rights Reserved.
- * Copyright 2001-2003 S3 Graphics, Inc. All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
- * VIA, S3 GRAPHICS, AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
- * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
- * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-#ifndef _VIA_DRM_H_
-#define _VIA_DRM_H_
-
-#include "drm.h"
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/* WARNING: These defines must be the same as what the Xserver uses.
- * if you change them, you must change the defines in the Xserver.
- */
-
-#ifndef _VIA_DEFINES_
-#define _VIA_DEFINES_
-
-
-#define VIA_NR_SAREA_CLIPRECTS         8
-#define VIA_NR_XVMC_PORTS               10
-#define VIA_NR_XVMC_LOCKS               5
-#define VIA_MAX_CACHELINE_SIZE          64
-#define XVMCLOCKPTR(saPriv,lockNo)                                     \
-       ((volatile struct drm_hw_lock *)(((((unsigned long) (saPriv)->XvMCLockArea) + \
-                                     (VIA_MAX_CACHELINE_SIZE - 1)) &   \
-                                    ~(VIA_MAX_CACHELINE_SIZE - 1)) +   \
-                                   VIA_MAX_CACHELINE_SIZE*(lockNo)))
-
-/* Each region is a minimum of 64k, and there are at most 64 of them.
- */
-#define VIA_NR_TEX_REGIONS 64
-#define VIA_LOG_MIN_TEX_REGION_SIZE 16
-#endif
-
-#define VIA_UPLOAD_TEX0IMAGE  0x1      /* handled clientside */
-#define VIA_UPLOAD_TEX1IMAGE  0x2      /* handled clientside */
-#define VIA_UPLOAD_CTX        0x4
-#define VIA_UPLOAD_BUFFERS    0x8
-#define VIA_UPLOAD_TEX0       0x10
-#define VIA_UPLOAD_TEX1       0x20
-#define VIA_UPLOAD_CLIPRECTS  0x40
-#define VIA_UPLOAD_ALL        0xff
-
-/* VIA specific ioctls */
-#define DRM_VIA_ALLOCMEM       0x00
-#define DRM_VIA_FREEMEM                0x01
-#define DRM_VIA_AGP_INIT       0x02
-#define DRM_VIA_FB_INIT                0x03
-#define DRM_VIA_MAP_INIT       0x04
-#define DRM_VIA_DEC_FUTEX       0x05
-#define NOT_USED
-#define DRM_VIA_DMA_INIT       0x07
-#define DRM_VIA_CMDBUFFER      0x08
-#define DRM_VIA_FLUSH          0x09
-#define DRM_VIA_PCICMD         0x0a
-#define DRM_VIA_CMDBUF_SIZE    0x0b
-#define NOT_USED
-#define DRM_VIA_WAIT_IRQ        0x0d
-#define DRM_VIA_DMA_BLIT        0x0e
-#define DRM_VIA_BLIT_SYNC       0x0f
-
-#define DRM_IOCTL_VIA_ALLOCMEM   DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_ALLOCMEM, drm_via_mem_t)
-#define DRM_IOCTL_VIA_FREEMEM    DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_FREEMEM, drm_via_mem_t)
-#define DRM_IOCTL_VIA_AGP_INIT   DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_AGP_INIT, drm_via_agp_t)
-#define DRM_IOCTL_VIA_FB_INIT    DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_FB_INIT, drm_via_fb_t)
-#define DRM_IOCTL_VIA_MAP_INIT   DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_MAP_INIT, drm_via_init_t)
-#define DRM_IOCTL_VIA_DEC_FUTEX   DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_DEC_FUTEX, drm_via_futex_t)
-#define DRM_IOCTL_VIA_DMA_INIT   DRM_IOWR(DRM_COMMAND_BASE + DRM_VIA_DMA_INIT, drm_via_dma_init_t)
-#define DRM_IOCTL_VIA_CMDBUFFER          DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_CMDBUFFER, drm_via_cmdbuffer_t)
-#define DRM_IOCTL_VIA_FLUSH      DRM_IO(  DRM_COMMAND_BASE + DRM_VIA_FLUSH)
-#define DRM_IOCTL_VIA_PCICMD     DRM_IOW( DRM_COMMAND_BASE + DRM_VIA_PCICMD, drm_via_cmdbuffer_t)
-#define DRM_IOCTL_VIA_CMDBUF_SIZE DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_CMDBUF_SIZE, \
-                                           drm_via_cmdbuf_size_t)
-#define DRM_IOCTL_VIA_WAIT_IRQ    DRM_IOWR( DRM_COMMAND_BASE + DRM_VIA_WAIT_IRQ, drm_via_irqwait_t)
-#define DRM_IOCTL_VIA_DMA_BLIT    DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_DMA_BLIT, drm_via_dmablit_t)
-#define DRM_IOCTL_VIA_BLIT_SYNC   DRM_IOW(DRM_COMMAND_BASE + DRM_VIA_BLIT_SYNC, drm_via_blitsync_t)
-
-/* Indices into buf.Setup where various bits of state are mirrored per
- * context and per buffer.  These can be fired at the card as a unit,
- * or in a piecewise fashion as required.
- */
-
-#define VIA_TEX_SETUP_SIZE 8
-
-/* Flags for clear ioctl
- */
-#define VIA_FRONT   0x1
-#define VIA_BACK    0x2
-#define VIA_DEPTH   0x4
-#define VIA_STENCIL 0x8
-#define VIA_MEM_VIDEO   0      /* matches drm constant */
-#define VIA_MEM_AGP     1      /* matches drm constant */
-#define VIA_MEM_SYSTEM  2
-#define VIA_MEM_MIXED   3
-#define VIA_MEM_UNKNOWN 4
-
-typedef struct {
-       __u32 offset;
-       __u32 size;
-} drm_via_agp_t;
-
-typedef struct {
-       __u32 offset;
-       __u32 size;
-} drm_via_fb_t;
-
-typedef struct {
-       __u32 context;
-       __u32 type;
-       __u32 size;
-       unsigned long index;
-       unsigned long offset;
-} drm_via_mem_t;
-
-typedef struct _drm_via_init {
-       enum {
-               VIA_INIT_MAP = 0x01,
-               VIA_CLEANUP_MAP = 0x02
-       } func;
-
-       unsigned long sarea_priv_offset;
-       unsigned long fb_offset;
-       unsigned long mmio_offset;
-       unsigned long agpAddr;
-} drm_via_init_t;
-
-typedef struct _drm_via_futex {
-       enum {
-               VIA_FUTEX_WAIT = 0x00,
-               VIA_FUTEX_WAKE = 0X01
-       } func;
-       __u32 ms;
-       __u32 lock;
-       __u32 val;
-} drm_via_futex_t;
-
-typedef struct _drm_via_dma_init {
-       enum {
-               VIA_INIT_DMA = 0x01,
-               VIA_CLEANUP_DMA = 0x02,
-               VIA_DMA_INITIALIZED = 0x03
-       } func;
-
-       unsigned long offset;
-       unsigned long size;
-       unsigned long reg_pause_addr;
-} drm_via_dma_init_t;
-
-typedef struct _drm_via_cmdbuffer {
-       char __user *buf;
-       unsigned long size;
-} drm_via_cmdbuffer_t;
-
-/* Warning: If you change the SAREA structure you must change the Xserver
- * structure as well */
-
-typedef struct _drm_via_tex_region {
-       unsigned char next, prev;       /* indices to form a circular LRU  */
-       unsigned char inUse;    /* owned by a client, or free? */
-       int age;                /* tracked by clients to update local LRU's */
-} drm_via_tex_region_t;
-
-typedef struct _drm_via_sarea {
-       unsigned int dirty;
-       unsigned int nbox;
-       struct drm_clip_rect boxes[VIA_NR_SAREA_CLIPRECTS];
-       drm_via_tex_region_t texList[VIA_NR_TEX_REGIONS + 1];
-       int texAge;             /* last time texture was uploaded */
-       int ctxOwner;           /* last context to upload state */
-       int vertexPrim;
-
-       /*
-        * Below is for XvMC.
-        * We want the lock integers alone on, and aligned to, a cache line.
-        * Therefore this somewhat strange construct.
-        */
-
-       char XvMCLockArea[VIA_MAX_CACHELINE_SIZE * (VIA_NR_XVMC_LOCKS + 1)];
-
-       unsigned int XvMCDisplaying[VIA_NR_XVMC_PORTS];
-       unsigned int XvMCSubPicOn[VIA_NR_XVMC_PORTS];
-       unsigned int XvMCCtxNoGrabbed;  /* Last context to hold decoder */
-
-       /* Used by the 3d driver only at this point, for pageflipping:
-        */
-       unsigned int pfCurrentOffset;
-} drm_via_sarea_t;
-
-typedef struct _drm_via_cmdbuf_size {
-       enum {
-               VIA_CMDBUF_SPACE = 0x01,
-               VIA_CMDBUF_LAG = 0x02
-       } func;
-       int wait;
-       __u32 size;
-} drm_via_cmdbuf_size_t;
-
-typedef enum {
-       VIA_IRQ_ABSOLUTE = 0x0,
-       VIA_IRQ_RELATIVE = 0x1,
-       VIA_IRQ_SIGNAL = 0x10000000,
-       VIA_IRQ_FORCE_SEQUENCE = 0x20000000
-} via_irq_seq_type_t;
-
-#define VIA_IRQ_FLAGS_MASK 0xF0000000
-
-enum drm_via_irqs {
-       drm_via_irq_hqv0 = 0,
-       drm_via_irq_hqv1,
-       drm_via_irq_dma0_dd,
-       drm_via_irq_dma0_td,
-       drm_via_irq_dma1_dd,
-       drm_via_irq_dma1_td,
-       drm_via_irq_num
-};
-
-struct drm_via_wait_irq_request {
-       unsigned irq;
-       via_irq_seq_type_t type;
-       __u32 sequence;
-       __u32 signal;
-};
-
-typedef union drm_via_irqwait {
-       struct drm_via_wait_irq_request request;
-       struct drm_wait_vblank_reply reply;
-} drm_via_irqwait_t;
-
-typedef struct drm_via_blitsync {
-       __u32 sync_handle;
-       unsigned engine;
-} drm_via_blitsync_t;
-
-/* - * Below,"flags" is currently unused but will be used for possible future
- * extensions like kernel space bounce buffers for bad alignments and
- * blit engine busy-wait polling for better latency in the absence of
- * interrupts.
- */
-
-typedef struct drm_via_dmablit {
-       __u32 num_lines;
-       __u32 line_length;
-
-       __u32 fb_addr;
-       __u32 fb_stride;
-
-       unsigned char *mem_addr;
-       __u32 mem_stride;
-
-       __u32 flags;
-       int to_fb;
-
-       drm_via_blitsync_t sync;
-} drm_via_dmablit_t;
-
-#if defined(__cplusplus)
-}
-#endif
-
-#endif                         /* _VIA_DRM_H_ */
index 4eb7aa11cfbb23113c7607639249220714c32ef6..3c8001b9e407ea58cfce1819060537cc42a21ccf 100644 (file)
@@ -161,14 +161,6 @@ static int mdpy_fb_probe(struct pci_dev *pdev,
                goto err_release_fb;
        }
 
-       info->apertures = alloc_apertures(1);
-       if (!info->apertures) {
-               ret = -ENOMEM;
-               goto err_unmap;
-       }
-       info->apertures->ranges[0].base = info->fix.smem_start;
-       info->apertures->ranges[0].size = info->fix.smem_len;
-
        info->fbops = &mdpy_fb_ops;
        info->flags = FBINFO_DEFAULT;
        info->pseudo_palette = par->palette;