All of lore.kernel.org
 help / color / mirror / Atom feed
From: Helge Deller <deller@gmx.de>
To: linux-parisc@vger.kernel.org, linux-fbdev@vger.kernel.org
Cc: Sven Schnelle <svens@stackframe.org>
Subject: [PATCH v3] fbdev: visfxfb: HP Visualize-FX framebufffer driver
Date: Mon, 24 Apr 2023 00:00:48 +0200	[thread overview]
Message-ID: <ZEWqkJekzyIlhBlW@p100> (raw)

A framebuffer driver for HP's Visualize-FX series of cards. The aim is
to support all FX2 - FX10 types but currently only FX5 is tested.

This driver is an updated version of the one which Sven Schnelle
originally posted here:
https://lore.kernel.org/all/20211031195347.13754-1-svens@stackframe.org/

Additional changes:
- added support for 32bpp
- added copyarea to bitblt from screen to screen
- allows screen sizes of up to 1920x1600 pixel
- lots of minor fixes (and probably new bugs)

This driver is still under development, nevertheless it would be great if
people could test.
This driver will not work on FX-10 cards yet.

Signed-off-by: Sven Schnelle <svens@stackframe.org>
Signed-off-by: Helge Deller <deller@gmx.de>

diff --git a/arch/parisc/include/asm/fb.h b/arch/parisc/include/asm/fb.h
index 55d29c4f716e..a41b257d70c8 100644
--- a/arch/parisc/include/asm/fb.h
+++ b/arch/parisc/include/asm/fb.h
@@ -12,7 +12,7 @@ static inline void fb_pgprotect(struct file *file, struct vm_area_struct *vma,
 	pgprot_val(vma->vm_page_prot) |= _PAGE_NO_CACHE;
 }

-#if defined(CONFIG_FB_STI)
+#if defined(CONFIG_FB_STI) || defined(FB_VISUALIZEFX)
 int fb_is_primary_device(struct fb_info *info);
 #else
 static inline int fb_is_primary_device(struct fb_info *info)
diff --git a/drivers/video/console/sticore.c b/drivers/video/console/sticore.c
index db568f67e4dc..562fb7bebd85 100644
--- a/drivers/video/console/sticore.c
+++ b/drivers/video/console/sticore.c
@@ -1148,7 +1148,7 @@ int sti_call(const struct sti_struct *sti, unsigned long func,
 	return ret;
 }

-#if defined(CONFIG_FB_STI)
+#if defined(CONFIG_FB_STI) || defined(FB_VISUALIZEFX)
 /* check if given fb_info is the primary device */
 int fb_is_primary_device(struct fb_info *info)
 {
diff --git a/drivers/video/fbdev/Kconfig b/drivers/video/fbdev/Kconfig
index 974e862cd20d..aa4d3626087b 100644
--- a/drivers/video/fbdev/Kconfig
+++ b/drivers/video/fbdev/Kconfig
@@ -561,6 +561,18 @@ config FB_STI

 	  It is safe to enable this option, so you should probably say "Y".

+config FB_VISUALIZEFX
+	tristate "HP Visualize FX support"
+	depends on FB && PCI && PARISC
+	select RATIONAL
+	select FB_CFB_IMAGEBLIT
+	  help
+	    Frame buffer driver for the HP Visualize FX cards. These cards are
+	    commonly found in PA-RISC workstations. Currently only FX5 has been
+	    tested.
+
+	    Say Y if you have such a card.
+
 config FB_MAC
 	bool "Generic Macintosh display support"
 	depends on (FB = y) && MAC
diff --git a/drivers/video/fbdev/Makefile b/drivers/video/fbdev/Makefile
index 7795c4126706..ad4b24cd437c 100644
--- a/drivers/video/fbdev/Makefile
+++ b/drivers/video/fbdev/Makefile
@@ -129,6 +129,6 @@ obj-$(CONFIG_FB_MX3)		  += mx3fb.o
 obj-$(CONFIG_FB_DA8XX)		  += da8xx-fb.o
 obj-$(CONFIG_FB_SSD1307)	  += ssd1307fb.o
 obj-$(CONFIG_FB_SIMPLE)           += simplefb.o
-
+obj-$(CONFIG_FB_VISUALIZEFX)	  += visfxfb.o
 # the test framebuffer is last
 obj-$(CONFIG_FB_VIRTUAL)          += vfb.o
diff --git a/drivers/video/fbdev/visfxfb.c b/drivers/video/fbdev/visfxfb.c
new file mode 100644
index 000000000000..45eb44c04f30
--- /dev/null
+++ b/drivers/video/fbdev/visfxfb.c
@@ -0,0 +1,1967 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * Framebuffer driver for Visualize FX cards commonly found in PA-RISC machines
+ *
+ * Copyright (c) 2021-2023 Sven Schnelle <svens@stackframe.org>
+ * Copyright (c) 2022-2023 Helge Deller <deller@gmx.de>
+ */
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/types.h>
+#include <linux/pci.h>
+#include <linux/fb.h>
+#include <linux/delay.h>
+#include <linux/rational.h>
+#include <asm/grfioctl.h>
+#include "sticore.h"
+
+#define VISFX_CARDTYPE_FX5	CRT_ID_LEGO
+
+#define UP_CONTROL_TO		BIT(13)
+#define UP_CONTROL_TCE		BIT(12)
+#define UP_CONTROL_SOFT_RST	BIT(8)
+
+#define UB_STATUS_FAULT		BIT(27)
+#define UB_STATUS_WPNE		BIT(24)
+
+#define VISFX_DFP_ENABLE		0x10000
+#define VISFX_HSYNC_POSITIVE		0x40000
+#define VISFX_VSYNC_POSITIVE		0x80000
+
+#define VISFX_SYNC_PLL_BASE		49383 /* 20.25MHz in ps */
+
+#define VISFX_FB_LENGTH			0x01000000
+#define VISFX_FB_OFFSET			0x01000000
+
+#define MIN_XRES	640
+#define MIN_YRES	480
+
+#define DEFAULT_BPP	8
+
+/* Visualize-FX hardware registers */
+#define UB_CP				  0x00400000 /* Cursor Position Register (W) */
+#define UB_CA				  0x00400004 /* Cursor Address Register (W) */
+#define UB_CD				  0x00400008 /* Cursor Data Register (W) */
+#define UB_CF				  0x0040000C /* Cursor Foreground Register (W) */
+#define UB_CB				  0x00400010 /* Cursor Background Register (W) */
+
+#define B2_BABoth			  0x00A00804 /* DBA & SBA (reads return DBA) (W) */
+#define B2_DBA				  0x00A00808 /* Destination Bitmap Access Register (W) */
+#define B2_SBA				  0x00A0080C /* Source Bitmap Access Register (W) */
+#define B2_DSA				  0x00A00810 /* Destination Screen Address Register (W) */
+#define B2_SSA				  0x00A00814 /* Source Screen Address Register (W) */
+#define B2_WORG				  0x00A00818 /* Window Origin Register (W) */
+#define B2_FBS				  0x00A0081C /* Front Buffer Select Register (W) */
+#define B2_BPDU				  0x00A00820 /* Bitmap Pixel Data Register (Upper Half) (W) */
+#define B2_BPD				  0x00A00824 /* Bitmap Pixel Data Register (W) */
+#define B2_BPMU				  0x00A00828 /* Bitmap Pixel Mask Register (Upper Half) (W) */
+#define B2_BPM				  0x00A0082C /* Bitmap Pixel Mask Register (W) */
+#define B2_BPCU				  0x00A00830 /* Bitmap Pixel Clip Register (Upper Half) (W) */
+#define B2_BPC				  0x00A00834 /* Bitmap Pixel Clip Register (W) */
+#define B2_IFCU				  0x00A00838 /* Image Foreground Color Register (Uppef Half) (W) */
+#define B2_IFC				  0x00A0083C /* Image Foreground Color Register (W) */
+#define B2_IBCU				  0x00A00840 /* Image Background Color Register (Upper Half) (W) */
+#define B2_IBC				  0x00A00844 /* Image Background Color Register (W) */
+#define B2_IPMU				  0x00A00848 /* Image Plane Mask Register (Upper Half) (W) */
+#define B2_IPM				  0x00A0084C /* Image Plane Mask Register (W) */
+#define B2_MISC_CTL			  0x00A00850 /* FBC Miscellaneous Control Register (W) */
+#define B2_FLN				  0x00A00854 /* Fill Length (in X) (W) */
+#define B2_EN2D				  0x00A00858 /* Coordinate Change Register (W) */
+#define B2_RPH				  0x00A0085C /* Read Prefetch Hint Register (W) */
+#define B2_WCEU				  0x00A00868 /* Window Clip Enable Register (Upper Half) (W) */
+#define B2_WCE				  0x00A0086C /* Window Clip Enable Register (W) */
+#define B2_PCRU				  0x00A00870 /* Pattern Control Register (Upper Half) (W) */
+#define B2_PCR				  0x00A00874 /* Pattern Control Register (W) */
+#define B2_BLN				  0x00A00880 /* BLT Length (in X) (W) */
+#define B2_SWEN				  0x00A00884 /* FBC Write Enable Register (W) */
+#define B2_SREN				  0x00A00888 /* FBC Read Enable Register (W) */
+#define B2_BMAP_BABoth			  0x00A008A0 /* Writes of Shared BMAP_DBA (W) */
+#define B2_BMAP_DBA			  0x00A008A4 /* Writes of Shared BMAP_DBA (W) */
+#define B2_BMAP_SBA			  0x00A008A8 /* Writes of Shared BMAP_SBA (W) */
+
+/*  Video Display Processor Registers  */
+#define B2_CP				  0x00800000 /* Cursor Position Register (RW) */
+#define B2_CA				  0x00800004 /* Cursor Address Register (RW) */
+#define B2_CD				  0x00800008 /* Cursor Data Register (RW) */
+#define B2_CF				  0x0080000C /* Cursor Foreground Register (RW) */
+#define B2_CB				  0x00800010 /* Cursor Background Register (RW) */
+#define B2_PMASK			  0x00800018 /* LUT Plane Mask Register (RW) */
+#define B2_MCS				  0x0080001C /* Midlay Color Map Select Register (RW) */
+#define B2_LLCA				  0x00800020 /* LUT Load Control Address Register (RW) */
+#define B2_LUTD				  0x00800024 /* Look Up Table Register (RW) */
+#define B2_FATTR			  0x0080003C /* Force Attribute Bits Register (RW) */
+#define B2_MV				  0x00800040 /* Misc. Video Register (RW) */
+#define B2_CFG				  0x00800044 /* Configuration Register (RW) */
+#define B2_SCR				  0x00800048 /* Stereo Control Register (RW) */
+#define B2_MPC				  0x0080004C /* Monitor Power Control Register (RW) */
+#define B2_ETG				  0x00800058 /* Early Timing Generator Register (RW) */
+#define B2_VHAL				  0x0080005C /* Vertical / Horizontal Active Length Register (RW) */
+#define B2_HTG				  0x00800060 /* Horizontal Timing Generator Register (RW) */
+#define B2_STG				  0x00800064 /* Serration Timing Generator Register (RW) */
+#define B2_VTG				  0x00800068 /* Vertical Timing Generator Register (RW) */
+#define B2_HS				  0x0080006C /* Horizontal State Register (RW) */
+#define B2_VS				  0x00800070 /* Vertical State Register (RW) */
+#define B2_DTS				  0x00800074 /* Timing & State Register (R) */
+#define B2_SRBMAP0			  0x00800078 /* Stereo Right Front Block BMAP Register (RW) */
+#define B2_SRBMAP1			  0x0080007C /* Stereo Right Back Block BMAP Register (RW) */
+#define B2_VOP				  0x00800080 /* Video Out Position Register (RW) */
+#define B2_VOS				  0x00800084 /* Video Out Size Register (RW) */
+#define B2_VOC				  0x00800088 /* Video Out Control Register (RW) */
+#define B2_VOP1				  0x0080008C /* Video Out Position Register (RW) */
+#define B2_STSA				  0x00800090 /* Showtime CRC Register (RW) */
+#define B2_BLSA				  0x00800094 /* Blither CRC Register (RW) */
+#define B2_PLL_DOT_CTL			  0x008000A0 /* Dot Clock PLL Control Register (RW) */
+#define B2_PLL_DOT_CNT			  0x008000A4 /* Dot Clock PLL Counter Register (RW) */
+#define B2_PLL_CORE_CTL			  0x008000A8 /* Core Clock PLL Control Register (RW) */
+#define B2_PLL_CORE_CNT			  0x008000AC /* Core Clock PLL Counter Register (RW) */
+#define B2_PLL_RAM_CTL			  0x008000B0 /* RAM Clock PLL Control Register (RW) */
+#define B2_PLL_RAM_CNT			  0x008000B4 /* RAM Clock PLL Counter Register (RW) */
+#define B2_PLL_REF_CNT			  0x008000B8 /* PLL Reference Clock Counter Register (RW) */
+#define B2_BLSA_MASK			  0x008000C4 /* BL Signature Analysis Mask Register (RW) */
+#define B2_SA_MASK			  0x008000C8 /* Signature Analysis Mask Register (RW) */
+#define B2_SA_SIG			  0x008000CC /* Signature Analysis Register (RW) */
+#define B2_MON				  0x008000D0 /* Monitor Test Register (RW) */
+#define B2_DDC				  0x008000D4 /* Display Data Channel Register (RW) */
+#define B2_CFS0				  0x00800100 /* Colormap Function Select Register 0 (RW) */
+#define B2_CFS16			  0x00800140 /* Colormap Function Select Register 16 (RW) */
+#define B2_VBC_SIG_EN			  0x008001C0 /* Vid Bus Signature Enable Register ? (RW) */
+#define B2_VBC_SIG			  0x008001C4 /* Vid Bus Signature Register? (RW) */
+#define B2_DUM				  0x00800240 /* Display Unit Master Register (RW) */
+#define B2_ABMAP			  0x00800244 /* Attribute Block BMAP Register (RW) */
+#define B2_CKEY_HI			  0x00800248 /* Color Key High Register (RW) */
+#define B2_CKEY_LO			  0x0080024C /* Color Key Low Register (RW) */
+#define B2_CALPHA			  0x00800250 /* Constant Alpha Register (RW) */
+#define B2_CCBC				  0x00800254 /* Color Conversion Brightness & Contrast Register (RW) */
+#define B2_OMC				  0x00800260 /* Overlay Miscellaneous Control Register (RW) */
+#define B2_OTLS				  0x00800264 /* Overlay Transparency LUT Select Register (RW) */
+#define B2_OXYO				  0x00800268 /* Overlay Visible XY Offset Register (RW) */
+#define B2_OBS				  0x0080026C /* Overlay Buffer Select Register (RW) */
+#define B2_OBMAP0			  0x00800270 /* Overlay Primary Buffer Block BMAP Register (RW) */
+#define B2_OBMAP1			  0x00800274 /* Overlay Secondary Buffer Block BMAP Register (RW) */
+#define B2_OUL				  0x00800278 /* Overlay Upper Left Register (RW) */
+#define B2_OLR				  0x0080027C /* Overlay  Lower Right Register (RW) */
+#define B2_ODS				  0x00800280 /* Overlay  Data Size Register (RW) */
+#define B2_OSCALE			  0x00800284 /* Overlay Scale Register (RW) */
+#define B2_IMD				  0x00800288 /* Image Depth Register (RW) */
+#define B2_IMC0				  0x00800300 /* Image Miscellaneous Control 0 Register (RW) */
+#define B2_IMC1				  0x00800304 /* Image Miscellaneous Control 1 Register (RW) */
+#define B2_IMC2				  0x00800308 /* Image Miscellaneous Control 2 Register (RW) */
+#define B2_IMC3				  0x0080030C /* Image Miscellaneous Control 3 Register (RW) */
+#define B2_IMC4				  0x00800310 /* Image Miscellaneous Control 4 Register (RW) */
+#define B2_IMC5				  0x00800314 /* Image Miscellaneous Control 5 Register (RW) */
+#define B2_IMC6				  0x00800318 /* Image Miscellaneous Control 6 Register (RW) */
+#define B2_IMC7				  0x0080031C /* Image Miscellaneous Control 7 Register (RW) */
+#define B2_IBMAP0			  0x00800320 /* Image Primary BMAP Register (RW) */
+#define B2_IBMAP1			  0x00800324 /* Image Secondary BMAP Register (RW) */
+#define B2_WAIT_HSYNC			  0x00800330 /* Wait for Horizontal retrace sync Register (RW) */
+#define B2_IBS0				  0x00800340 /* Image Buffer Select 0 Register (RW) */
+#define B2_IBS1				  0x00800344 /* Image Buffer Select 1 Register (RW) */
+#define B2_IBS2				  0x00800348 /* Image Buffer Select 2 Register (RW) */
+#define B2_IBS3				  0x0080034C /* Image Buffer Select 3 Register (RW) */
+#define B2_IBS4				  0x00800350 /* Image Buffer Select 4 Register (RW) */
+#define B2_IBS5				  0x00800354 /* Image Buffer Select 5 Register (RW) */
+#define B2_IBS6				  0x00800358 /* Image Buffer Select 6 Register (RW) */
+#define B2_IBS7				  0x0080035C /* Image Buffer Select 7 Register (RW) */
+#define B2_ICLR0			  0x00800360 /* Image Clear 0 Register (RW) */
+#define B2_ICLR1			  0x00800364 /* Image Clear 1 Register (RW) */
+#define B2_ICLR2			  0x00800368 /* Image Clear 2 Register (RW) */
+#define B2_ICLR3			  0x0080036C /* Image Clear 3 Register (RW) */
+#define B2_ICLR4			  0x00800370 /* Image Clear 4 Register (RW) */
+#define B2_ICLR5			  0x00800374 /* Image Clear 5 Register (RW) */
+#define B2_ICLR6			  0x00800378 /* Image Clear 6 Register (RW) */
+#define B2_ICLR7			  0x0080037C /* Image Clear 7 Register (RW) */
+
+#define B2_FOE				  0x00A00404 /* Fragment Operation Enable Register (W) */
+#define B2_VTB				  0x00B08008 /* MFU Vector Tie Breaker Register (RW) */
+#define B2_TTB				  0x00B0800C /* MFU Trapezoid Tie Breaker Register (RW) */
+#define B2_TM_TSS			  0x008E5800 /* Texture Subsystem Setup (all registers) (RW) */
+
+/*  FBC Registers  */
+#define UB_IBO				  0x00521110 /* Image Bitmap Operation Register (R) */
+#define UB_CPE				  0x00521114 /* Clip Plane Enable Register (R) */
+#define UB_CZ				  0x00521118 /* Constant Z data Register  (R) */
+#define UB_CBR				  0x0052111C /* Constant Blend Register (R) */
+#define UB_ZBO				  0x00521120 /* Z Bitmap Operation Register (R) */
+#define UB_SBO				  0x00521124 /* Stencil Bitmap Operation Register (R) */
+#define UB_ATO				  0x00521128 /* Alpha Test Operation Register (R) */
+#define UB_DOXY				  0x0052112C /* Dither Offset  XY Register (R) */
+#define UB_FOG				  0x00521134 /* Fog Color Register (R) */
+#define UB_FZ				  0x00521138 /* Fast  Z Clear Register (R) */
+#define UB_BMAP_Z			  0x0052113C /* BMAP Z Register (R) */
+#define UB_TEC0				  0x00521140 /* Texture Environment Color  0 Register (R) */
+#define UB_TEC1				  0x00521144 /* Texture Environment Color 1 Register (R) */
+#define UB_TEX_2D			  0x00521154 /* Texture 2D Register (R) */
+#define UB_FOG_2D			  0x00521160 /* Fog 2D Register (R) */
+#define UB_SCK_UR			  0x00521170 /* Source Color Key Upper Range Register (R) */
+#define UB_SCK_LR			  0x00521174 /* Source Color Key Lower Range Register (R) */
+#define UB_CKC				  0x00521178 /* Color Key Configuration Register (R) */
+#define UB_VTR				  0x00521180 /* Visibility Test Statistics Results (R) */
+#define UB_VTE				  0x00521184 /* Visibility Test Enable (R) */
+#define UB_VPCNT			  0x0052118c /* Visibility Count Pass Register (R) */
+#define UB_VFCNT			  0x00521190 /* Visibility Count Fail Register (R) */
+#define UB_MBWB				  0x00521194 /* Multi-buffer Write Buffer B (R) */
+#define UB_MBWC				  0x00521198 /* Multi-buffer Write Buffer C (R) */
+#define UB_MBWD				  0x0052119c /* Multi-buffer Write Buffer D (R) */
+#define UB_FCDA				  0x005211a4 /* Fast Cleat Default Alpha Register (R) */
+#define UB_BTO				  0x005211a8 /* Pixel Batching Timeout Value (R) */
+#define UB_RC_CONFIG0			  0x005211b0 /* Ram controller timing configuration register 0 (R) */
+#define UB_RC_CONFIG1			  0x005211b4 /* Ram controller timing configuration register 1 (R) */
+#define UB_RC_CONFIG2			  0x005211b8 /* Ram controller timing configuration register 2 (R) */
+#define UB_FPR				  0x00522008 /* FBC Parameters Register (R) */
+
+/*  Shadowed FBC Registers(sent to all FBC blocks)  */
+#define B2_FBC_BABoth			  0x00920804 /* DBA & SBA (reads return DBA) (RW) */
+#define B2_FBC_DBA			  0x00920808 /* Destination Bitmap Access Register (RW) */
+#define B2_FBC_SBA			  0x0092080C /* Source Bitmap Access Register (RW) */
+#define B2_FBC_DSA			  0x00920810 /* Destination Screen Address Register (RW) */
+#define B2_FBC_SSA			  0x00920814 /* Source Screen Address Register (RW) */
+#define B2_FBC_WORG			  0x00920818 /* FBC Window Origin (W) */
+#define B2_FBC_FBS			  0x0092081C /* Front Buffer Select Register (RW) */
+#define B2_FBC_BPDU			  0x00920820 /* Bitmap Pixel Data Register (Upper Half) (RW) */
+#define B2_FBC_BPD			  0x00920824 /* Bitmap Pixel Data Register (RW) */
+#define B2_FBC_BPMU			  0x00920828 /* Bitmap Pixel Mask Register (Upper Half) (RW) */
+#define B2_FBC_BPM			  0x0092082C /* Bitmap Pixel Mask Register (RW) */
+#define B2_FBC_BPCU			  0x00920830 /* Bitmap Pixel Clip Register (Upper Half) (RW) */
+#define B2_FBC_BPC			  0x00920834 /* Bitmap Pixel Clip Register (RW) */
+#define B2_FBC_IFCU			  0x00920838 /* Image Foreground Color Register (Upper Half) (RW) */
+#define B2_FBC_IFC			  0x0092083C /* Image Foreground Color Register (RW) */
+#define B2_FBC_IBCU			  0x00920840 /* Image Background Color Register (Upper Half) (RW) */
+#define B2_FBC_IBC			  0x00920844 /* Image Background Color Register (RW) */
+#define B2_FBC_IPMU			  0x00920848 /* Image Plane Mask Register (Upper Half) (RW) */
+#define B2_FBC_IPM			  0x0092084C /* Image Plane Mask Register (RW) */
+#define B2_FBC_MISC_CTL			  0x00920850 /* Miscellaneous Control Register (RW) */
+#define B2_FBC_FLN			  0x00920854 /* Fill Length (in X) (RW) */
+#define B2_FBC_RPH			  0x0092085C /* Read Prefetch Hint Register (R) */
+#define B2_FBC_RBS			  0x00920860 /* Read Byte Swap Register (RW) */
+#define B2_FBC_WCEU			  0x00920868 /* Window Clip Enable Register (Upper Half) (RW) */
+#define B2_FBC_WCE			  0x0092086C /* Window Clip Enable Register (RW) */
+#define B2_FBC_PCRU			  0x00920870 /* Pattern Control Register (Upper Half) (RW) */
+#define B2_FBC_PCR			  0x00920874 /* Pattern Control Register (RW) */
+#define B2_FBC_BLN			  0x00920880 /* BLT Length (in X) (RW) */
+#define B2_FBC_WEN			  0x00920884 /* FBC Write Enable Register (RW) */
+#define B2_FBC_REN			  0x00920888 /* FBC Read Enable Register (RW) */
+#define B2_RTSTATUS			  0x00920890 /* RT Status Register (R) */
+#define B2_FBC_BMAP_BABoth		  0x009208A0 /* BMAP DBA and SBA (reads return BMAP_DBA) (RW) */
+#define B2_FBC_BMAP_DBA			  0x009208A4 /* BMAP Destination Bitmap Access register (RW) */
+#define B2_FBC_BMAP_SBA			  0x009208AC /* BMAP Source Bitmap Access register (RW) */
+#define B2_FBC_WUL0			  0x00920900 /* Window Clip Upper Left 0 (RW) */
+#define B2_FBC_WLR0			  0x00920904 /* Window Clip Lower Right 0 (RW) */
+
+#define B2_AMAP0			  0x00920A00 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP1			  0x00920A04 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP2			  0x00920A08 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP3			  0x00920A0C /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP4			  0x00920A10 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP5			  0x00920A14 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP6			  0x00920A18 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP7			  0x00920A1C /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP8			  0x00920A20 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP9			  0x00920A24 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP10			  0x00920A28 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP11			  0x00920A2C /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP12			  0x00920A30 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP13			  0x00920A34 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP14			  0x00920A38 /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP15			  0x00920A3C /* Direct Frame Buffer Address Mapping  (RW) */
+#define B2_AMAP_BA_U			  0x00920AF0 /* Direct Frame Buffer YUV420 U Address Mapping  (RW) */
+#define B2_AMAP_BA_V			  0x00920AF4 /* Direct Frame Buffer YUV420 V Address Mapping  (RW) */
+
+#define B2_BMAP_DFB0			  0x00920B00 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB1			  0x00920B04 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB2			  0x00920B08 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB3			  0x00920B0C /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB4			  0x00920B10 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB5			  0x00920B14 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB6			  0x00920B18 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB7			  0x00920B1C /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB8			  0x00920B20 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB9			  0x00920B24 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB10			  0x00920B28 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB11			  0x00920B2C /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB12			  0x00920B30 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB13			  0x00920B34 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB14			  0x00920B38 /* Direct Frame Buffer Access BMAP registers (RW) */
+#define B2_BMAP_DFB15			  0x00920B3C /* Direct Frame Buffer Access BMAP registers (RW) */
+
+/*  Misc FBC Non-Shadowed registers  */
+#define B2_FZ				  0x00921108 /* Fast Z Clear Register (RW) */
+#define B2_IBO				  0x00921110 /* Image Bitmap Operation Register (RW) */
+#define B2_CPE				  0x00921114 /* Clip Plane Enable Register (RW) */
+#define B2_CZ				  0x00921118 /* Constant Z data Register  (RW) */
+#define B2_CBR				  0x0092111C /* Constant Blend Register (RW) */
+#define B2_ZBO				  0x00921120 /* Z Bitmap Operation Register (RW) */
+#define B2_SBO				  0x00921124 /* Stencil Bitmap Operation Register (RW) */
+#define B2_ATO				  0x00921128 /* Alpha Test Operation Register (RW) */
+#define B2_DOXY				  0x0092112C /* Dither Offset XY Register (RW) */
+#define B2_FOGU				  0x00921130 /* Fog Color Register (Upper Half) (RW) */
+#define B2_FOG				  0x00921134 /* Fog Color Register (RW) */
+#define B2_BMAP_Z			  0x0092113C /* BMAP Z register (RW) */
+#define B2_TEC0				  0x00921140 /* Texture Environment Color  0 Register (RW) */
+#define B2_TEC1				  0x00921144 /* Texture Environment Color 1 Register (RW) */
+#define B2_OTR				  0x00921148 /* Overlay Transparency Register (RW) */
+#define B2_TEX_2DU			  0x00921150 /* Texture 2D Register (Upper Half) (RW) */
+#define B2_TEX_2D			  0x00921154 /* Texture 2D Register (RW) */
+#define B2_FOG_2D			  0x00921160 /* Fog 2D Register (RW) */
+#define B2_SCK_UR			  0x00921170 /* Source Color Key Upper Range Register (RW) */
+#define B2_SCK_LR			  0x00921174 /* Source Color Key Lower Range Register (RW) */
+#define B2_CKC				  0x00921178 /* Color Key Configuration Register (RW) */
+#define B2_VTR				  0x00921180 /* Visibility Test Statistics Results (RW) */
+#define B2_VTE				  0x00921184 /* Visibility Test Enable (RW) */
+#define B2_VTC				  0x00921188 /* Visibility Test Clear (W) */
+#define B2_VPCNT			  0x0092118c /* Visibility Count Pass Register (RW) */
+#define B2_VFCNT			  0x00921190 /* Visibility Count Fail Register (RW) */
+#define B2_MBWB				  0x00921194 /* Multi-buffer Write Buffer B (RW) */
+#define B2_MBWC				  0x00921198 /* Multi-buffer Write Buffer C (RW) */
+#define B2_MBWD				  0x0092119c /* Multi-buffer Write Buffer D (RW) */
+#define B2_FSR				  0x009211C4 /* Fast Surface Clear Pixel Read Register (RW) */
+#define B2_FSRMWA			  0x009211C8 /* Fast Surface Clear Register RMW buffer A (RW) */
+#define B2_FSRMWB			  0x009211CC /* Fast Surface Clear Register RMW buffer B (RW) */
+#define B2_FSRMWC			  0x009211D0 /* Fast Surface Clear Register RMW buffer C (RW) */
+#define B2_FSRMWD			  0x009211D4 /* Fast Surface Clear Register RMW buffer D (RW) */
+#define B2_FCDA				  0x009211D8 /* Fast Clear Default Alpha Register (RW) */
+#define B2_BTO				  0x009211DC /* Pixel Batching Timeout Value (RW) */
+#define B2_BIST				  0x009211e8 /* Built-in Self Test register (RW) */
+#define B2_RC_CONFIG0			  0x009211f0 /* Ram controller timing configuration register 0 (RW) */
+#define B2_RC_CONFIG1			  0x009211f4 /* Ram controller timing configuration register 1 (RW) */
+#define B2_RC_CONFIG2			  0x009211f8 /* Ram controller timing configuration register 2 (RW) */
+
+#define B2_FPR				  0x00922008 /* FBC Parameters Register (R) */
+#define B2_FBC_PERF			  0x0092200C /* FBC Performance Register (RW) */
+#define B2_FCR				  0x00922010 /* FBC CRC Read Register (R) */
+#define B2_FCI				  0x00922014 /* FBC CRC Initiate Register (W) */
+#define B2_FCM				  0x00922018 /* FBC CRC Mask Register (W) */
+#define B2_FBC_STATUS			  0x0092201C /* FBC Status Register (W) */
+
+/*  FBC Tile Builder Specific Registers  */
+#define B2_TB_BMAP_BABoth		  0x0092A000 /* Reads of TB's copy of Shared BMAP_DBA (R) */
+#define B2_TB_BMAP_DBA			  0x0092A004 /* Reads of TB's copy of Shared BMAP_DBA (R) */
+#define B2_TB_BMAP_SBA			  0x0092A008 /* Reads of TB's copy of Shared BMAP_SBA (R) */
+#define B2_FBC_TB_REN			  0x0092A00C /* FBC/TB read address for FBC_SREN (R) */
+#define B2_FBC_TB_DBA			  0x0092A010 /* FBC/TB read address for DBA (R) */
+#define B2_FBC_TB_SBA			  0x0092A014 /* FBC/TB read address for SBA (R) */
+#define B2_FBC_TB_WEN			  0x0092A018 /* FBC/TB read address for FBC_SWEN (R) */
+
+/* 2D Retargeted Registers  */
+#define B2_RTG_MEM_USE			  0x009C2000 /* Start Of Retargetter Memory (For Normal Use) (RW) */
+#define B2_RTG_MEM_LOAD			  0x009C3000 /* Start Of Retargetter Memory (For Loading Memory) (RW) */
+
+#define UB_UBABoth			  0x00600C04 /* UDBA & USBA (W) */
+#define UB_UDBA				  0x00600C08 /* Unbuffered Destination Bitmap Access Register (W) */
+#define UB_USBA				  0x00600C0C /* Unbuffered Source Bitmap Access Register (W) */
+#define UB_UDSA				  0x00600C10 /* Unbuffered Destination Screen Address Register (W) */
+#define UB_USSA				  0x00600C14 /* Unbuffered Source Screen Address Register (W) */
+#define UB_UBPDU			  0x00600C20 /* Unbuffered Bitmap Pixel Data Register (Upper Half) (W) */
+#define UB_UBPD				  0x00600C24 /* Unbuffered Bitmap Pixel Data Register (W) */
+#define UB_UBPMU			  0x00600C28 /* Unbuffered Bitmap Pixel Mask Register (Upper Half) (W) */
+#define UB_UBPM				  0x00600C2C /* Unbuffered Bitmap Pixel Mask Register (W) */
+#define UB_UBPCU			  0x00600C30 /* Unbuffered Bitmap Pixel Clip Register (Upper Half) (W) */
+#define UB_UBPC				  0x00600C34 /* Unbuffered Bitmap Pixel Clip Register (W) */
+#define UB_URPH				  0x00600C5C /* Unbuffered Read Prefetch Hint Register (W) */
+#define UB_UREN				  0x00600C8C /* Unbuffered Read Enable Register (W) */
+
+/* Host Interface Registers  */
+#define UP_CONTROL			  0x00249000 /* Control Register (RW) */
+#define UP_FC				  0x00249040 /* Fault Control Register (RW) */
+#define UP_TCP				  0x00249080 /* Time-out Circuit Parameter (RW) */
+#define UP_DC				  0x002490C0 /* Dribble Count Register (RW) */
+#define UP_STI_COUNT			  0x00249140 /* STI Count Register (RW) */
+#define UP_PSTI_SCRATCH1		  0x00249180 /* Privileged STI Scratch Register 1 (RW) */
+#define UP_PSTI_SCRATCH2		  0x002491A0 /* Privileged STI Scratch Register 2 (RW) */
+#define UP_PSTI_SCRATCH3		  0x002491C0 /* Privileged STI Scratch Register 3 (RW) */
+#define UP_PSTI_SCRATCH4		  0x002491E0 /* Privileged STI Scratch Register 4 (RW) */
+#define UP_INT_ADDR			  0x00249200 /* Interrupt Address Register (RW) */
+#define UP_INT_DATA			  0x00249240 /* Interrupt Data Register (RW) */
+#define UP_STI_ADDR			  0x00249280 /* STI Write Address Register (W) */
+#define UP_STI_DATA			  0x002492C0 /* STI Write Data Register (W) */
+#define UP_VBS_CTL			  0x00249300 /* VBS Control Register (-) */
+
+#define UP_CD_STATE1			  0x0024B000 /* CD Buffer State Register One (RW) */
+#define UP_CD_STATE2			  0x0024B004 /* CD Buffer State Register Two (RW) */
+#define UP_CD_DATA			  0x0024B008 /* CD Buffer Data Register (RW) */
+#define UP_CF_STATE			  0x0024B00C /* Command Fifo State Register (RW) */
+#define UP_CF_DATA			  0x0024B010 /* Command Fifo Data Register (RW) */
+#define UP_CD_HWC			  0x0024B014 /* CD Buffer High Water Count Register (R) */
+#define UP_CD_LWC			  0x0024B018 /* CD Buffer Low Water Count Register (R) */
+#define UP_CF_HWC			  0x0024B01C /* Command Fifo High Water Count Register (R) */
+#define UP_CF_LWC			  0x0024B020 /* Command Fifo Low Water Count Register (R) */
+#define UP_CD_DRC			  0x0024B024 /* CD Buffer Dribble Count Register (R) */
+#define UP_CF_DRC			  0x0024B028 /* Command FIFO Dribble Count Register (R) */
+
+/* Host Interface Registers  */
+#define BP_CONTROL			  0x002C9000 /* Control Register (RW) */
+#define BP_FC				  0x002C9040 /* Fault Control Register (RW) */
+#define BP_CD_HWC			  0x002CB014 /* CD Buffer High Water Count Register (RW) */
+#define BP_CD_LWC			  0x002CB018 /* CD Buffer Low Water Count Register (RW) */
+#define BP_CF_HWC			  0x002CB01C /* Command Fifo High Water Count Register (RW) */
+#define BP_CF_LWC			  0x002CB020 /* Command Fifo Low Water Count Register (RW) */
+#define BP_CD_DRC			  0x002CB024 /* CD Buffer Dribble Count Register (RW) */
+#define BP_CF_DRC			  0x002CB028 /* Command FIFO Dribble Count Register (RW) */
+#define BP_ICR				  0x002CB800 /* Integrator Counter Register (RW) */
+
+/* Host Interface Registers  */
+#define UB_CONTROL			  0x00641000 /* Control Register (RW) */
+#define UB_FC				  0x00641040 /* Fault Control Register (R) */
+#define UB_TCP				  0x00641080 /* Time-out Circuit Parameter Register (R) */
+#define UB_DC				  0x006410C0 /* Dribble Count Register (R) */
+#define UB_AGP_FFC			  0x00641100 /* AGP DMA Queue State (R) */
+#define UB_STI_COUNT			  0x00641140 /* STI Count Register (R) */
+#define UB_PSTI_SCRATCH1		  0x00641180 /* Privileged STI Scratch Register 1 (R) */
+#define UB_PSTI_SCRATCH2		  0x006411A0 /* Privileged STI Scratch Register 2 (R) */
+#define UB_PSTI_SCRATCH3		  0x006411C0 /* Privileged STI Scratch Register 3 (R) */
+#define UB_PSTI_SCRATCH4		  0x006411E0 /* Privileged STI Scratch Register 4 (R) */
+#define UB_INT_ADDR			  0x00641200 /* Interrupt Address Register (R) */
+#define UB_INT_DATA			  0x00641240 /* Interrupt Data Register (R) */
+#define UB_STATUS			  0x00641400 /* Status Register (R) */
+#define UB_FFC				  0x00641440 /* Fifo Free Count Register (R) */
+#define UB_UREAD_DATA			  0x006414C0 /* Unbuffered Read Data Register (R) */
+
+#define UB_UIRP				  0x00641540 /* Unbuffered Indirect Read Purge Register (W) */
+
+#define UB_CLIP_PLANE_STAMP		  0x00641580 /* STI Scratch 1/Clip Plane Stamp (RW) */
+#define UB_STI_SCRATCH1			  0x00641580 /* STI Scratch Register 1 (RW) */
+#define UB_STI_SCRATCH2			  0x006415A0 /* STI Scratch Register 2 (RW) */
+#define UB_STI_SCRATCH3			  0x006415C0 /* STI Scratch Register 3 (RW) */
+#define UB_STI_SCRATCH4			  0x006415E0 /* STI Scratch Register 4 (RW) */
+#define UB_SIG_LOWER_LSB		  0x00641700 /* Lower Write Data Signature LSB's (RW) */
+#define UB_SIG_LOWER_MSB		  0x00641740 /* Lower Write Data Signature MSB's (RW) */
+#define UB_SIG_UPPER_LSB		  0x00641780 /* Upper Write Data Signature LSB's (RW) */
+#define UB_SIG_UPPER_MSB		  0x006417C0 /* Upper Write Data Signature MSB's (RW) */
+#define UB_TRI_STATUS			  0x00641800 /* Triaqua-specific Status Register (R) */
+#define UB_INT_PENDING			  0x00641840 /* Interrupt Pending Register (Diagnostics) (R) */
+#define UB_DREAD_ADDR			  0x00641880 /* Direct Read Address Register (Diagnostics) (R) */
+#define UB_VREAD_ADDR			  0x006418C0 /* ROM Read Address Register (Diagnostics) (R) */
+#define UB_AGP_UDSA			  0x006499C0 /* TM AGP DMA UDSA (-) */
+#define UB_AGP_UDMA_UPPER		  0x00649A00 /* TM Reader Address (-) */
+#define UB_AGP_UDMA_LOWER		  0x00649A40 /* TM Reader Address (-) */
+#define UB_AGP_UDMA_OTC_STRIDE		  0x00649A80 /* AGP DMA Stride (-) */
+#define UB_AGP_UDMA_HIGH_WIDE		  0x00649AC0 /* TM AGP DMA Read Hint (-) */
+#define UB_AGP_DIAG0			  0x00649B00 /* TBD (-) */
+#define UB_AGP_DIAG1			  0x00649B40 /* TBD (-) */
+#define UB_AGP_DIAG2			  0x00649B80 /* TBD (-) */
+#define UB_AGP_DIAG3			  0x00649BC0 /* TBD (-) */
+#define UB_DEVID			  0x00641C00 /* PCI Device ID Register (R) */
+#define UB_COM_STAT			  0x00641C04 /* PCI Command And Status Register (R) */
+#define UB_REVID			  0x00641C08 /* PCI Revision ID Register (R) */
+#define UB_LT				  0x00641C0C /* PCI Latency Timer Register (R) */
+#define UB_MBA_LOWER			  0x00641C10 /* PCI Memory Base Address Register [31:0] (R) */
+#define UB_MBA_UPPER			  0x00641C14 /* PCI Memory Base Address Register [63:32] (R) */
+#define UB_FBMBA_LOWER			  0x00641C18 /* Direct FB Access (R) */
+#define UB_FBMBA_UPPER			  0x00641C1C /* Direct FB Access (R) */
+#define UB_SUBID			  0x00641C2C /* Subvendor ID (R) */
+#define UB_RBA				  0x00641C30 /* PCI Expansion ROM Base Address Register (R) */
+#define UB_AGP_CAPPTR			  0x00641C34 /* PCI New Capability (R) */
+#define UB_LAT_GNT			  0x00641C3C /* PCI Minimum Grant And Maximum Latency Register (R) */
+#define UB_AGP_CAPID			  0x00641C40 /* AGP Capabilities ID (R) */
+#define UB_AGP_STATUS			  0x00641C44 /* AGP Capabilities List (R) */
+#define UB_AGP_CMD			  0x00641C48 /* AGP Capabilities Enables (R) */
+#define UB_PWR_CAPID			  0x00641C4C /* Power Management (R) */
+#define UB__PWR_CMD			  0x00641C50 /* Power Management (R) */
+
+#define UB_IRC				  0x00643030 /* Buffered Indirect Read Control Register (R) */
+#define UB_UIRC				  0x00643034 /* Unbuffered Indirect Read Control Register (RW) */
+#define UB_CD_BUFFER_CTL		  0x00643038 /* CD Buffer Control Register (R) */
+#define UB_PDU_UBSCFB			  0x0064303C /* PDU Unbuffered Byte Swap Ctl Reg (frame buffer space) (RW) */
+#define UB_PQC				  0x00643040 /* Packet Queue Control Register (R) */
+#define UB_PQD				  0x00643100 /* Start Packet Queue Data Register (R) */
+
+#define B2_IRC				  0x00A43030 /* Buffered Indirect Read Control Register (RW) */
+
+#define B2_CD_BUFFER_CTL		  0x00A43038 /* CD Buffer Control Register (RW) */
+#define B2_PDU_BSCFB			  0x00A4303C /* PDU Buffered Byte Swap Control Register (frame buffer space) (RW) */
+#define B2_PQC				  0x00A43040 /* Packet Queue Control Register (RW) */
+#define B2_PQD				  0x00A43100 /* Start Packet Queue Data Register (RW) */
+
+/* Host Interface Address Space  */
+#define B3_CONTROL			  0x00E41000 /* Control Register (RW) */
+#define B3_FC				  0x00E41040 /* Fault Control Register (R) */
+#define B3_STATUS			  0x00E41400 /* Status Register (R) */
+#define B3_FFC				  0x00E41440 /* Fifo Free Count Register (R) */
+#define B3_READ_DATA			  0x00E41480 /* Buffered Read Data Register (R) */
+#define B3_IRP				  0x00E41500 /* Buffered Indirect Read Purge Register (W) */
+
+#define B3_BBC_CONFIG			  0x00EE231C /* Blitzen Bus Controller Config Register (RW) */
+#define B3_HUNGRY			  0x00EE2350 /* Hungry Bits From GA's Register (R) */
+#define B3_NUM_GA			  0x00EE233C /* Number Of Geometry Accelerators Register (RW) */
+#define B3_GA_CONFIG			  0x00CB0038 /* Geometry Accelerator Configuration Register (RW) */
+#define B3_GA_NOP_EOC			  0x00CA8000 /* Not Really Used This Way (RW) */
+#define B3_GA_IPLL			  0x00CB4030 /* Geometry Accelerator I/O PLL Control Register (RW) */
+
+/* Summit Binc Interface  */
+#define UB_BTDstObj_Xi			  0x00660000 /*Address For Direct Binc - dst / src obj inc X (RW) */
+#define UB_BTDstObj_Xd			  0x00664000 /*Address For Direct Binc - dst / src obj dec X (W) */
+#define B2_BTDstObj_Xi			  0x00A60000 /* Start For Direct Binc - dst / src obj inc X (RW) */
+#define B2_BTDstObj_Xd			  0x00A64000 /* Start For Direct Binc - dst / src obj dec X (W) */
+#define B2_BTDstObj_Yi			  0x00A68000 /* Start For Direct Binc - dst / src obj inc Y (W) */
+#define B2_BTDstObj_Yd			  0x00A6C000 /* Start For Direct Binc - dst / src obj dec Y (W) */
+#define B2_BTDstObj_Xi_Yi		  0x00A70000 /* Start For Direct Binc - dst / src obj inc X inc Y  (RW) */
+#define B2_BTDstObj_Xi_Yd		  0x00A74000 /* Start For Direct Binc - dst / src obj inc X, dec Y (W) */
+#define B2_BTDstObj_Xd_Yi		  0x00A78000 /*For Direct Binc - dst / src obj dec X, inc Y (W) */
+#define B2_BTDstObj_Xd_Yd		  0x00A7C000 /* Start For Direct Binc - dst / src obj dec X, dec Y (W) */
+
+#define UB_DMA_OFFSET			  0x006A007C /* Buffered DMA Offset Register (For Diag Only) (R) */
+#define UB_DMA_BSCBLK_RO		  0x006A0404 /* Buff. Data Blanket Byte Swap Ctl Read Reg (For Diag) (R) */
+#define UB_DMA_DIAG_AFLAG		  0x006A0418 /* DMA Controller Address Flags (Diagnostic) (R) */
+#define UB_DMA_DIAG_ADDR		  0x006A041C /* DMA Controller Address (Diagnostic) (R) */
+#define UB_DMA_BSCSAV			  0x006A0640 /* Buff. Data Blanket Byte Swap Ctl Save Reg (For Diag) (R) */
+
+#define UB_UDMA_OFFSET			  0x006A087C /* Unbuffered DMA Offset Register (RW) */
+#define UB_UDMA_DATA			  0x006A0880 /*Unbuffered DMA Data Register (W) */
+#define UB_DMA_UBSCFB			  0x006A0C08 /* Unbuffered DMA Byte Swap Ctl Reg (FBC space) (RW) */
+#define UB_UDMA_STATE			  0x006A0C10 /* Unbuffered DMA State Register (R) */
+#define UB_UDMA_DIAG_AFLAG		  0x006A0C18 /* Unbuffered DMA Controller Adr Flags (Diagnostic) (R) */
+#define UB_UDMA_DIAG_ADDR		  0x006A0C1C /* Unbuffered DMA Controller Adr (Diagnostic) (R) */
+#define UB_DMA_UBSCBLK			  0x006A0E00 /* Unbuffered Data Blanket Byte Swap Ctl Reg. (W) */
+#define UB_DMA_UBSCSAV			  0x006A0E40 /* Unbuffered Data Blanket Byte Swap Ctl Save Reg (RW) */
+
+#define B2_DMA_OFFSET			  0x00AA007C /* Buffered DMA Offset Register (RW) */
+#define B2_DMA_DATA			  0x00AA0080 /*Buffered DMA Data Register (W) */
+#define B2_DMA_BSCBLK_RO		  0x00AA0404 /* Address for read of B2_DMA_BSCBLK. (R) */
+#define B2_DMA_BSCFB			  0x00AA0408 /* Buffered DMA Byte Swap Ctl Reg (FBC space) (RW) */
+#define B2_DMA_DDBSC			  0x00AA040C /*  () */
+#define B2_DMA_STATE			  0x00AA0410 /* Buffered DMA State Register (R) */
+#define B2_DMA_DIAG_AFLAG		  0x00AA0418 /* Buffered DMA Controller Adr flags (Diagnostic) (R) */
+#define B2_DMA_DIAG_ADDR		  0x00AA041C /* Buffered DMA Controller Adr (Diagnostic) (R) */
+#define B2_DMA_BSCBLK			  0x00AA0600 /* Buffered Data Blanket Byte Swap Ctl Reg (W) */
+#define B2_DMA_BSCSAV			  0x00AA0640 /* Buffered Data Blanket Byte Swap Ctl Save Reg (RW) */
+
+#define B2_DWA				  0x00AC1000 /* Destination Window Address Register (RW) */
+#define B2_SWA				  0x00AC1004 /* Source Window Address Register (RW) */
+#define B2_DWAX				  0x00AC1010 /* Destination Window X Address Register (18 bits) (RW) */
+#define B2_DWAY				  0x00AC1014 /* Destination Window Y Address Register (18 bits) (RW) */
+#define B2_SWAX				  0x00AC1018 /* Source Window X Address Register (18 bits) (RW) */
+#define B2_SWAY				  0x00AC101C /* Source Window Y Address Register (18 bits) (RW) */
+#define B2_VBS				  0x00AC1020 /* Vertical Blank Sync Register (RW) */
+#define B2_TCR				  0x00AC1024 /* Throttle Control Register (RW) */
+#define B2_YBC				  0x00AC1028 /* YUV to RGB Brightness Control Register (RW) */
+#define B2_PSF				  0x00AC1030 /* Pixel Scale Factor Register (RW) */
+#define B2_PSS				  0x00AC1034 /* Pixel Scale Setup Register (RW) */
+#define B2_PS_RED			  0x00AC1038 /* Pixel Scale Accumulate Red Register (RW) */
+#define B2_PS_GRN			  0x00AC1040 /* Pixel Scale Accumulate Green Register (RW) */
+#define B2_PS_BLU			  0x00AC1044 /* Pixel Scale Accumulate Blue Register (RW) */
+#define B2_WCLIP1UL			  0x00AC1050 /* First Level Window Clip Upper Left Corner Reg (RW) */
+#define B2_WCLIP1LR			  0x00AC1054 /* First Level Window Clip Lower Right Corner Reg (RW) */
+#define B2_DSAX				  0x00AC2000 /* Destination Screen X Address Reg (19 bits) (RW) */
+#define B2_DSAY				  0x00AC2004 /* Destination Screen Y Address Regr (19 bits) (RW) */
+#define B2_SSAX				  0x00AC2008 /* Source Screen X Address Register (19 bits) (RW) */
+#define B2_SSAY				  0x00AC200C /* Source Screen Y Address Register (19 bits) (RW) */
+#define B2_BSE1				  0x00AC2010 /* Binc State Element 1 Register (R) */
+#define B2_BSE2				  0x00AC2014 /* Binc State Element 2 Register (R) */
+
+#define B2_MNOOP_R0			  0x00B00000 /* MFU Noop Opcode / Load Master Register 0 (RW) */
+#define B2_MNOOP_R1			  0x00B00004 /* MFU Noop Opcode / Load Master Register 1 (RW) */
+#define B2_MNOOP_R2			  0x00B00008 /* MFU Noop Opcode / Load Master Register 2 (RW) */
+#define B2_MNOOP_R3			  0x00B0000C /* MFU Noop Opcode / Load Master Register 3 (RW) */
+#define B2_MNOOP_R4			  0x00B00010 /* MFU Noop Opcode / Load Master Register 4 (RW) */
+#define B2_MNOOP_R5			  0x00B00014 /* MFU Noop Opcode / Load Master Register 5 (RW) */
+#define B2_MNOOP_R6			  0x00B00018 /* MFU Noop Opcode / Load Master Register 6 (RW) */
+#define B2_MNOOP_R7			  0x00B0001C /* MFU Noop Opcode / Load Master Register 7 (RW) */
+#define B2_MNOOP_R8			  0x00B00020 /* MFU Noop Opcode / Load Master Register 8 (RW) */
+#define B2_MNOOP_R9			  0x00B00024 /* MFU Noop Opcode / Load Master Register 9 (RW) */
+#define B2_MNOOP_R10			  0x00B00028 /* MFU Noop Opcode / Load Master Register 10 (RW) */
+#define B2_MNOOP_R11			  0x00B0002C /* MFU Noop Opcode / Load Master Register 11 (RW) */
+#define B2_MNOOP_R12			  0x00B00030 /* MFU Noop Opcode / Load Master Register 12 (RW) */
+#define B2_MNOOP_R13			  0x00B00034 /* MFU Noop Opcode / Load Master Register 13 (RW) */
+#define B2_MNOOP_TD			  0x00B00044 /* MFU Noop Opcode / Load Master TD Register (RW) */
+#define B2_MSLOAD_R0			  0x00B00100 /* Master To Slave Load Opcode / Load Master Register 0 (W) */
+#define B2_MSLOAD_R1			  0x00B00104 /* Master To Slave Load Opcode / Load Master Register 1 (W) */
+#define B2_MSLOAD_R2			  0x00B00108 /* Master To Slave Load Opcode / Load Master Register 2 (W) */
+#define B2_MSLOAD_R3			  0x00B0010C /* Master To Slave Load Opcode / Load Master Register 3 (W) */
+#define B2_MSLOAD_R4			  0x00B00110 /* Master To Slave Load Opcode / Load Master Register 4 (W) */
+#define B2_MSLOAD_R5			  0x00B00114 /* Master To Slave Load Opcode / Load Master Register 5 (W) */
+#define B2_MSLOAD_R6			  0x00B00118 /* Master To Slave Load Opcode / Load Master Register 6 (W) */
+#define B2_MSLOAD_R7			  0x00B0011C /* Master To Slave Load Opcode / Load Master Register 7 (W) */
+#define B2_MSLOAD_R8			  0x00B00120 /* Master To Slave Load Opcode / Load Master Register 8 (W) */
+#define B2_MSLOAD_R9			  0x00B00124 /* Master To Slave Load Opcode / Load Master Register 9 (W) */
+#define B2_MSLOAD_R10			  0x00B00128 /* Master To Slave Load Opcode / Load Master Register 10 (W) */
+#define B2_MSLOAD_R11			  0x00B0012C /* Master To Slave Load Opcode / Load Master Register 11 (W) */
+#define B2_MSLOAD_R12			  0x00B00130 /* Master To Slave Load Opcode / Load Master Register 12 (W) */
+#define B2_MSLOAD_R13			  0x00B00134 /* Master To Slave Load Opcode / Load Master Register 13 (W) */
+#define B2_MSLOAD_TD			  0x00B00144 /* Master To Slave Load Opcode / Load Master TD Register (W) */
+#define B2_TEXT16_R0			  0x00B00400 /* 16 Bit Text Fill Opcode / Load Master Register 0 (W) */
+#define B2_TEXT16_R1			  0x00B00404 /* 16 Bit Text Fill Opcode / Load Master Register 1 (W) */
+#define B2_TEXT16_R2			  0x00B00408 /* 16 Bit Text Fill Opcode / Load Master Register 2 (W) */
+#define B2_TEXT16_R3			  0x00B0040C /* 16 Bit Text Fill Opcode / Load Master Register 3 (W) */
+#define B2_TEXT16_TD			  0x00B00444 /* 16 Bit Text Fill Opcode / Load Master TD Register (W) */
+#define B2_TEXT8_R0			  0x00B00480 /* 8 Bit Text Fill Opcode / Load Master Register 0 (W) */
+#define B2_TEXT8_R1			  0x00B00484 /* 8 Bit Text Fill Opcode / Load Master Register 1 (W) */
+#define B2_TEXT8_R2			  0x00B00488 /* 8 Bit Text Fill Opcode / Load Master Register 2 (W) */
+#define B2_TEXT8_R3			  0x00B0048C /* 8 Bit Text Fill Opcode / Load Master Register 3 (W) */
+#define B2_TEXT8_TD			  0x00B004C4 /* 8 Bit Text Fill Opcode / Load Master TD Register (W) */
+#define B2_TEXT16SETUP_R0		  0x00B00500 /* 16 Bit Text Fill Setup Opcode / Load Master Register 0 (W) */
+#define B2_TEXT16SETUP_R1		  0x00B00504 /* 16 Bit Text Fill Setup Opcode / Load Master Register 1 (W) */
+#define B2_TEXT16SETUP_R2		  0x00B00508 /* 16 Bit Text Fill Setup Opcode / Load Master Register 2 (W) */
+#define B2_TEXT16SETUP_R3		  0x00B0050C /* 16 Bit Text Fill Setup Opcode / Load Master Register 3 (W) */
+#define B2_TEXT16SETUP_TD		  0x00B00544 /* 16 Bit Text Fill Setup Opcode / Load Master TD Register (W) */
+#define B2_TEXT8SETUP_R0		  0x00B00580 /* 8 Bit Text Fill Setup Opcode / Load Master Register 0 (W) */
+#define B2_TEXT8SETUP_R1		  0x00B00584 /* 8 Bit Text Fill Setup Opcode / Load Master Register 1 (W) */
+#define B2_TEXT8SETUP_R2		  0x00B00588 /* 8 Bit Text Fill Setup Opcode / Load Master Register 2 (W) */
+#define B2_TEXT8SETUP_R3		  0x00B0058C /* 8 Bit Text Fill Setup Opcode / Load Master Register 3 (W) */
+#define B2_TEXT8SETUP_TD		  0x00B005C4 /* 8 Bit Text Fill Setup Opcode / Load Master TD Register (W) */
+#define B2_SOLIDFILL_R0			  0x00B00800 /* Solid Fill Opcode / Load Master Register 0 (W) */
+#define B2_SOLIDFILL_R1			  0x00B00804 /* Solid Fill Opcode / Load Master Register 1 (W) */
+#define B2_SOLIDFILL_R2			  0x00B00808 /* Solid Fill Opcode / Load Master Register 2 (W) */
+#define B2_SOLIDFILL_R3			  0x00B0080C /* Solid Fill Opcode / Load Master Register 3 (W) */
+#define B2_SOLIDFILLT_R0		  0x00B00880 /* Solid Fill Throttled Opcode / Load Master Register 0 (W) */
+#define B2_SOLIDFILLT_R1		  0x00B00884 /* Solid Fill Throttled Opcode / Load Master Register 1 (W) */
+#define B2_SOLIDFILLT_R2		  0x00B00888 /* Solid Fill Throttled Opcode / Load Master Register 2 (W) */
+#define B2_SOLIDFILLT_R3		  0x00B0088C /* Solid Fill Throttled Opcode / Load Master Register 3 (W) */
+#define B2_TDFILL_R0			  0x00B00900 /* TD Fill Opcode / Load Master Register 0 (W) */
+#define B2_TDFILL_R1			  0x00B00904 /* TD Fill Opcode / Load Master Register 1 (W) */
+#define B2_TDFILL_R2			  0x00B00908 /* TD Fill Opcode / Load Master Register 2 (W) */
+#define B2_TDFILL_R3			  0x00B0090C /* TD Fill Opcode / Load Master Register 3 (W) */
+#define B2_TDFILL_TD			  0x00B00944 /* TD Fill Opcode / Load Master TD Register (W) */
+#define B2_TDFILLT_R0			  0x00B00980 /* TD Fill Throttled Opcode / Load Master Register 0 (W) */
+#define B2_TDFILLT_R1			  0x00B00984 /* TD Fill Throttled Opcode / Load Master Register 1 (W) */
+#define B2_TDFILLT_R2			  0x00B00988 /* TD Fill Throttled Opcode / Load Master Register 2 (W) */
+#define B2_TDFILLT_R3			  0x00B0098C /* TD Fill Throttled Opcode / Load Master Register 3 (W) */
+#define B2_TDFILLT_TD			  0x00B009C4 /* TD Fill Throttled Opcode / Load Master TD Register (W) */
+#define B2_BLT_R0			  0x00B00C00 /* Blt Opcode / Load Master Register 0 (W) */
+#define B2_BLT_R1			  0x00B00C04 /* Blt Opcode / Load Master Register 1 (W) */
+#define B2_BLT_R2			  0x00B00C08 /* Blt Opcode / Load Master Register 2 (W) */
+#define B2_BLT_R3			  0x00B00C0C /* Blt Opcode / Load Master Register 3 (W) */
+#define B2_BLT_R4			  0x00B00C10 /* Blt Opcode / Load Master Register 4 (W) */
+#define B2_BLT_R5			  0x00B00C14 /* Blt Opcode / Load Master Register 5 (W) */
+#define B2_EXBLT_R0			  0x00B00C80 /* Expanding Blt Opcode / Load Master Register 0 (W) */
+#define B2_EXBLT_R1			  0x00B00C84 /* Expanding Blt Opcode / Load Master Register 1 (W) */
+#define B2_EXBLT_R2			  0x00B00C88 /* Expanding Blt Opcode / Load Master Register 2 (W) */
+#define B2_EXBLT_R3			  0x00B00C8C /* Expanding Blt Opcode / Load Master Register 3 (W) */
+#define B2_EXBLT_R4			  0x00B00C90 /* Expanding Blt Opcode / Load Master Register 4 (W) */
+#define B2_EXBLT_R5			  0x00B00C94 /* Expanding Blt Opcode / Load Master Register 5 (W) */
+#define B2_EXBLT_R11			  0x00B00CAC /* Expanding Blt Opcode / Load Master Register 11 (W) */
+
+#define B2_SR0				  0x00B04000 /* MFU Slave Register 0 (RW) */
+#define B2_SR1				  0x00B04004 /* MFU Slave Register 1 (RW) */
+#define B2_SR2				  0x00B04008 /* MFU Slave Register 2 (RW) */
+#define B2_SR3				  0x00B0400C /* MFU Slave Register 3 (RW) */
+#define B2_SR4				  0x00B04010 /* MFU Slave Register 4 (RW) */
+#define B2_SR5				  0x00B04014 /* MFU Slave Register 5 (RW) */
+#define B2_SR6				  0x00B04018 /* MFU Slave Register 6 (RW) */
+#define B2_SR7				  0x00B0401C /* MFU Slave Register 7 (RW) */
+#define B2_SR8				  0x00B04020 /* MFU Slave Register 8 (RW) */
+#define B2_SR9				  0x00B04024 /* MFU Slave Register 9 (RW) */
+#define B2_SR10				  0x00B04028 /* MFU Slave Register 10 (RW) */
+#define B2_SR11				  0x00B0402C /* MFU Slave Register 11 (RW) */
+#define B2_SR12				  0x00B04030 /* MFU Slave Register 12 (RW) */
+#define B2_SR13				  0x00B04034 /* MFU Slave Register 13 (RW) */
+#define B2_SR14				  0x00B04038 /* MFU Slave Register 14 (RW) */
+#define B2_SR15				  0x00B0403C /* MFU Slave Register 15 (RW) */
+#define B2_STD				  0x00B04044 /* MFU Slave Transfer Data Register (RW) */
+#define B2_SOV				  0x00B08000 /* MFU Scoreboard Override Register (RW) */
+#define B2_SB				  0x00B08004 /* MFU Scoreboard Register (R) */
+#define B2_MFU_DIAG			  0x00B08040 /* MFU Diagnostic Register (R) */
+#define B2_MFU_BSCTD			  0x00B08044 /* MFU Byte Swap Control Register (TD operations) (RW) */
+#define B2_MFU_BSCCTL			  0x00B08048 /* MFU Byte Swap Control Register (register pair opcodes) (RW) */
+#define B2_MNOOP			  0x00B0C000 /* MFU Noop Opcode / Don't Load Any Master Registers (W) */
+#define B2_NOSB				  0x00B0C080 /* MFU Noop Opcode (No Scoreboard) / Don't Load Any Master Registers (W) */
+#define B2_MSLOAD			  0x00B0C100 /* Master To Slave Load Opcode / Don't Load Any Master Registers (W) */
+#define B2_TEXT16			  0x00B0C400 /* 16 Bit Text Fill Opcode / Don't Load Any Master Registers (W) */
+#define B2_TEXT8			  0x00B0C480 /* 8 Bit Text Fill Opcode / Don't Load Any Master Registers (W) */
+#define B2_TEXT16SETUP			  0x00B0C500 /* 16 Bit Text Fill Setup Opcode / Don't Load Any Master Registers (W) */
+#define B2_TEXT8SETUP			  0x00B0C580 /* 8 Bit Text Fill Setup Opcode / Don't Load Any Master Registers (W) */
+#define B2_SOLIDFILL			  0x00B0C800 /* Solid Fill Opcode / Don't Load Any Master Registers (W) */
+#define B2_SOLIDFILLT			  0x00B0C880 /* Solid Fill Throttled Opcode / Don't Load Any Master Registers (W) */
+#define B2_TDFILL			  0x00B0C900 /* TD Fill Opcode / Don't Load Any Master Registers (W) */
+#define B2_TDFILLT			  0x00B0C980 /* TD Fill Throttled Opcode / Don't Load Any Master Registers (W) */
+#define B2_BLT				  0x00B0CC00 /* Blt Opcode / Don't Load Any Master Registers (W) */
+#define B2_EXBLT			  0x00B0CC80 /* Expanding Blt Opcode / Don't Load Any Master Registers (W) */
+#define B2_SS0				  0x00B10000 /* MFU Setup Slave Register 0 (RW) */
+#define B2_SS1				  0x00B10004 /* MFU Setup Slave Register 1 (RW) */
+#define B2_SS2				  0x00B10008 /* MFU Setup Slave Register 2 (RW) */
+#define B2_SS3				  0x00B1000C /* MFU Setup Slave Register 3 (RW) */
+#define B2_SS4				  0x00B10010 /* MFU Setup Slave Register 4 (RW) */
+#define B2_SS5				  0x00B10014 /* MFU Setup Slave Register 5 (RW) */
+#define B2_SS6				  0x00B10018 /* MFU Setup Slave Register 6 (RW) */
+#define B2_SSTD				  0x00B10044 /* MFU Setup Slave Transfer Data Register (RW) */
+
+/* Remapped MFU Registers  */
+#define B2_MNOOP_R0R1_REMAP		  0x00B20000 /* Start Of MFU Noop Opcode / Load Master Register 0 and 1 (W) */
+#define B2_NOSB_R0R1_REMAP		  0x00B20080 /* Start Of MFU Noop Opcode (No Scoreboard) / Load Master Register 0 and 1 (W) */
+#define B2_MSLOAD_R0R1_REMAP		  0x00B20100 /* Master To Slave Load Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT16_R0R1_REMAP		  0x00B20400 /* 16 Bit Text Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT8_R0R1_REMAP		  0x00B20480 /* 8 Bit Text Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT16SETUP_R0R1_REMAP	  0x00B20500 /* 16 Bit Text Fill Setup Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT8SETUP_R0R1_REMAP	  0x00B20580 /* 8 Bit Text Fill Setup Opcode / Load Master Register 0 and 1 (W) */
+#define B2_SOLIDFILL_R0R1_REMAP		  0x00B20800 /* Solid Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_SOLIDFILLT_R0R1_REMAP	  0x00B20880 /* Solid Fill Throttled Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TDFILL_R0R1_REMAP		  0x00B20900 /* TD Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TDFILLT_R0R1_REMAP		  0x00B20980 /* TD Fill Throttled Opcode / Load Master Register 0 and 1 (W) */
+#define B2_BLT_R0R1_REMAP		  0x00B20C00 /* Blt Opcode / Load Master Register 0 and 1 (W) */
+#define B2_EXBLT_R0R1_REMAP		  0x00B20C80 /* Expanding Blt Opcode / Load Master Register 0 and 1 (W) */
+#define B2_MNOOP_R2R3_REMAP		  0x00B24000 /* Start Of MFU Noop Opcode / Load Master Register 2 and 3 (W) */
+#define B2_NOSB_R2R3_REMAP		  0x00B24080 /* Start Of MFU Noop Opcode (No Scoreboard) / Load Master Register 2 and 3 (W) */
+#define B2_MSLOAD_R2R3_REMAP		  0x00B24100 /* Master To Slave Load Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT16_R2R3_REMAP		  0x00B24400 /* 16 Bit Text Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT8_R2R3_REMAP		  0x00B24480 /* 8 Bit Text Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT16SETUP_R2R3_REMAP	  0x00B24500 /* 16 Bit Text Fill Setup Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT8SETUP_R2R3_REMAP	  0x00B24580 /* 8 Bit Text Fill Setup Opcode / Load Master Register 2 and 3 (W) */
+#define B2_SOLIDFILL_R2R3_REMAP		  0x00B24800 /* Solid Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_SOLIDFILLT_R2R3_REMAP	  0x00B24880 /* Solid Fill Throttled Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TDFILL_R2R3_REMAP		  0x00B24900 /* TD Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TDFILLT_R2R3_REMAP		  0x00B24980 /* TD Fill Throttled Opcode / Load Master Register 2 and 3 (W) */
+#define B2_BLT_R2R3_REMAP		  0x00B24C00 /* Blt Opcode / Load Master Register 2 and 3 (W) */
+#define B2_EXBLT_R2R3_REMAP		  0x00B24C80 /* Expanding Blt Opcode / Load Master Register 2 and 3 (W) */
+#define B2_MNOOP_TD_REMAP		  0x00B28000 /* Start Of MFU Noop Opcode / Load Master Register TD (W) */
+#define B2_NOSB_TD_REMAP		  0x00B28080 /* Start Of MFU Noop Opcode (No Scoreboard) / Load Master Register TD (W) */
+#define B2_MSLOAD_TD_REMAP		  0x00B28100 /* Master To Slave Load Opcode / Load Master Register TD (W) */
+#define B2_TEXT16_TD_REMAP		  0x00B28400 /* 16 Bit Text Fill Opcode / Load Master Register TD (W) */
+#define B2_TEXT8_TD_REMAP		  0x00B28480 /* 8 Bit Text Fill Opcode / Load Master Register TD (W) */
+#define B2_TEXT16SETUP_TD_REMAP		  0x00B28500 /* 16 Bit Text Fill Setup Opcode / Load Master Register TD (W) */
+#define B2_TEXT8SETUP_TD_REMAP		  0x00B28580 /* 8 Bit Text Fill Setup Opcode / Load Master Register TD (W) */
+#define B2_SOLIDFILL_TD_REMAP		  0x00B28800 /* Solid Fill Opcode / Load Master Register TD (W) */
+#define B2_SOLIDFILLT_TD_REMAP		  0x00B28880 /* Solid Fill Throttled Opcode / Load Master Register TD (W) */
+#define B2_TDFILL_TD_REMAP		  0x00B28900 /* TD Fill Opcode / Load Master Register TD (W) */
+#define B2_TDFILLT_TD_REMAP		  0x00B28980 /* TD Fill Throttled Opcode / Load Master Register TD (W) */
+#define B2_BLT_TD_REMAP			  0x00B28C00 /* Blt Opcode / Load Master Register TD (W) */
+#define B2_EXBLT_TD_REMAP		  0x00B28C80 /* Expanding Blt Opcode / Load Master Register TD (W) */
+#define B2_MNOOP_ALT			  0x00B2C000 /* Start Of MFU Noop Opcode / Load Master Register Alternating Between MNOOP_R0R1 and MNOOP_R2R3 (W) */
+#define B2_NOSB_ALT			  0x00B2C080 /* Start Of MFU Noop Opcode (No Scoreboard) (W) */
+#define B2_MSLOAD_ALT			  0x00B2C100 /* Master To Slave Load Opcode (W) */
+#define B2_TEXT16_ALT			  0x00B2C400 /* 16 Bit Text Fill Opcode / Load Master Register Alternating Between MNOOP_R0R1 and TEXT16_R2R3 (W) */
+#define B2_TEXT8_ALT			  0x00B2C480 /* 8 Bit Text Fill Opcode / Load Master Register Alternating Between MNOOP_R0R1 and TEXT8_R2R3 (W) */
+#define B2_TEXT16SETUP_ALT		  0x00B2C500 /* 16 Bit Text Fill Setup Opcode (W) */
+#define B2_TEXT8SETUP_ALT		  0x00B2C580 /* 8 Bit Text Fill Setup Opcode (W) */
+#define B2_SOLIDFILL_ALT		  0x00B2C800 /* Solid Fill Opcode / Load Master Register Alternating Between MNOOP_R0R1 and SOLIDFILL_R2R3 (W) */
+#define B2_SOLIDFILLT_ALT		  0x00B2C880 /* Solid Fill Throttled Opcode / Load Master Register Alternating Between MNOOP_R0R1/SOLIDFILLT_R2R3 (W) */
+#define B2_TDFILL_ALT			  0x00B2C900 /* TD Fill Opcode / Load Master Register Alternating Between MNOOP_R0R1 and TDFILL_R2R3 (W) */
+#define B2_TDFILLT_ALT			  0x00B2C980 /* TD Fill Throttled Opcode / Load Master Register Alternating Between MNOOP_R0R1 and TDFILLT_R2R3 (W) */
+#define B2_MNOOP_R0R1			  0x00B3C000 /* MFU Noop Opcode / Load Master Register 0 and 1 (W) */
+#define B2_MNOOP_R2R3			  0x00B3C008 /* MFU Noop Opcode / Load Master Register 2 and 3 (W) */
+#define B2_MNOOP_R4R5			  0x00B3C010 /* MFU Noop Opcode / Load Master Register 4 and 5 (W) */
+#define B2_MNOOP_R6R7			  0x00B3C018 /* MFU Noop Opcode / Load Master Register 6 and 7 (W) */
+#define B2_MNOOP_R8R9			  0x00B3C020 /* MFU Noop Opcode / Load Master Register 8 and 9 (W) */
+#define B2_MNOOP_R10R11			  0x00B3C028 /* MFU Noop Opcode / Load Master Register 10 and 11 (W) */
+#define B2_MNOOP_R12R13			  0x00B3C030 /* MFU Noop Opcode / Load Master Register 12 and 13 (W) */
+#define B2_TEXT16_R0R1			  0x00B3C400 /* 16 Bit Text Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT16_R2R3			  0x00B3C408 /* 16 Bit Text Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT8_R0R1			  0x00B3C480 /* 8 Bit Text Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT8_R2R3			  0x00B3C488 /* 8 Bit Text Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT16SETUP_R0R1		  0x00B3C500 /* 16 Bit Text Fill Setup Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT16SETUP_R2R3		  0x00B3C508 /* 16 Bit Text Fill Setup Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TEXT8SETUP_R0R1		  0x00B3C580 /* 8 Bit Text Fill Setup Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TEXT8SETUP_R2R3		  0x00B3C588 /* 8 Bit Text Fill Setup Opcode / Load Master Register 2 and 3 (W) */
+#define B2_SOLIDFILL_R0R1		  0x00B3C800 /* Solid Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_SOLIDFILL_R2R3		  0x00B3C808 /* Solid Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_SOLIDFILLT_R0R1		  0x00B3C880 /* Solid Fill Throttled Opcode / Load Master Register 0 and 1 (W) */
+#define B2_SOLIDFILLT_R2R3		  0x00B3C888 /* Solid Fill Throttled Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TDFILL_R0R1			  0x00B3C900 /* TD Fill Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TDFILL_R2R3			  0x00B3C908 /* TD Fill Opcode / Load Master Register 2 and 3 (W) */
+#define B2_TDFILLT_R0R1			  0x00B3C980 /* TD Fill Throttled Opcode / Load Master Register 0 and 1 (W) */
+#define B2_TDFILLT_R2R3			  0x00B3C988 /* TD Fill Throttled Opcode / Load Master Register 2 and 3 (W) */
+#define B2_BLT_R0R1			  0x00B3CC00 /* Blt Opcode / Load Master Register 0 and 1 (W) */
+#define B2_BLT_R2R3			  0x00B3CC08 /* Blt Opcode / Load Master Register 2 and 3 (W) */
+#define B2_BLT_R4R5			  0x00B3CC10 /* Blt Opcode / Load Master Register 4 and 5 (W) */
+#define B2_EXBLT_R0R1			  0x00B3CC80 /* Expanding Blt Opcode / Load Master Register 0 and 1 (W) */
+#define B2_EXBLT_R2R3			  0x00B3CC88 /* Expanding Blt Opcode / Load Master Register 2 and 3 (W) */
+#define B2_EXBLT_R4R5			  0x00B3CC90 /* Expanding Blt Opcode / Load Master Register 4 and 5 (W) */
+#define B2_EXBLT_R10R11			  0x00B3CCA8 /* Expanding Blt Opcode / Load Master Register 10 and 11 (W) */
+
+
+#define DSM_NO_BYTE_SWAP			0xe4e4e4e4
+#define DSM_RGBA_TO_ARGB_BYTE_SWAP		0x39393939
+#define DSM_ARGB_TO_RGBA_BYTE_SWAP		0x93939393
+#define DSM_PDU_BYTE_SWAP_DEFAULT		0x1b1b1b1b
+#define DSM_DMA_BYTE_SWAP_DEFAULT		0x1b1b1b1b
+#define DSM_MFU_BYTE_SWAP_DEFAULT		0x1b1b1b1b
+#define DSM_HOST_IS_LITTLE_ENDIAN		0x01010101
+#define DSM_HOST_IS_BIG_ENDIAN			0x00000000
+
+#define B2_DBA_BUF_A		(0 << 12)
+#define B2_DBA_BUF_AB		(1 << 12)
+#define B2_DBA_BUF_ABC		(2 << 12)
+#define B2_DBA_BUF_ABCD		(3 << 12)
+
+#define B2_DBA_DIRECT		(0 << 6)
+#define B2_DBA_IND_BG		(1 << 6)
+#define B2_DBA_IND_FG		(2 << 6)
+#define B2_DBA_IND_BG_FG	(3 << 6)
+#define B2_DBA_OTC(x)		((x) << 24)
+#define B2_DBA_P		(1 << 9)
+#define B2_DBA_S		(1 << 10)
+#define B2_DBA_D		(1 << 11)
+#define B2_DBA_BIN8I		(0 << 16)	/* 8 bit indexed */  /* page 335 */
+#define B2_DBA_BIN8F		(7 << 16)	/* ARGB888 truecolor */
+#define B2_DBA_OTC04		(2 << 24)	/* 4 bytes per word access */
+#define B2_DBA_OTC01		(0 << 24)	/* one ARGB888 per word access */
+
+#define B2_EN2D_BYTE_MODE	0x30 | 0x80	/* mode and disable pixel interpolation */
+#define B2_EN2D_WORD_MODE	0x50 | 0x80
+
+#define UB_CP_CURSOR_ENABLE	       0x80000000
+
+
+static char *mode_option; /* empty means take video mode from ROM */
+
+/* const struct in ROM */
+struct visfx_default {
+	u8 __pad0[0x48];
+	u32 pll_core_0;
+	u32 pll_core_1;
+	u8 __pad1[0x08];
+	u32 pll_ram_0;
+	u32 pll_ram_1;
+	u8 __pad2[0x18];
+	u32 pll_cb4038_0;
+	u32 pll_cb4038_1;
+	u8 __pad3[0x08];
+	u32 pll_ga_ipll_0;
+	u32 pll_ga_ipll_1;
+	u8 __pad4[0x08];
+};
+
+struct visfx_par {
+	void __iomem *reg_base;
+	unsigned long reg_size;
+	u32 abmap, ibmap0, bmap_z, ibmap1, obmap0;
+	u32 dba, bmap_dba;
+	u32 pseudo_palette[16];
+	struct visfx_default *defaults;
+	struct device *dev;
+
+	struct fb_info *info;
+};
+
+static void visfx_setup(struct fb_info *info);
+
+static u32 visfx_readl(struct fb_info *info, int reg)
+{
+	struct visfx_par *par = info->par;
+
+	return le32_to_cpu(readl(par->reg_base + reg));
+}
+
+static void visfx_writel(struct fb_info *info, int reg, u32 val)
+{
+	struct visfx_par *par = info->par;
+
+	return writel(cpu_to_le32(val), par->reg_base + reg);
+}
+
+static void visfx_write_vram(struct fb_info *info, int reg, u32 val)
+{
+	struct visfx_par *par = info->par;
+
+	return writel(val, par->reg_base + reg);
+}
+
+static int visfx_wait_write_pipe_empty(struct fb_info *info)
+{
+	u32 status;
+	int i;
+
+	for(i = 0; i < 1000000; i++) {
+		status = visfx_readl(info, UB_STATUS);
+		// this fails on FX-10
+		if (WARN_ON_ONCE(status & UB_STATUS_FAULT))
+			return -EIO;
+
+		if (!(status & UB_STATUS_WPNE))
+			return 0;
+		udelay(1);
+	}
+	WARN_ON_ONCE(1);
+	return -ETIMEDOUT;
+}
+
+static void visfx_set_vram_addr(struct fb_info *info, int x, int y)
+{
+	visfx_writel(info, B2_DWA, (y << 16) | x);
+}
+
+static u32 visfx_cmap_entry(struct fb_info *info, int color)
+{
+	struct fb_cmap *cmap;
+
+	if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR)
+		return color;
+
+	cmap = &info->cmap;
+	return (((cmap->blue[color] & 0xff) << 0) |
+		((cmap->green[color] & 0xff) << 8) |
+		(cmap->red[color] & 0xff) << 16);
+}
+
+static void visfx_set_bmove_color(struct fb_info *info, int fg, int bg)
+{
+	visfx_writel(info, B2_IBC, visfx_cmap_entry(info, bg));
+	visfx_writel(info, B2_IFC, visfx_cmap_entry(info, fg));
+}
+
+static void visfx_wclip(struct fb_info *info, int x1, int y1, int x2, int y2)
+{
+	visfx_writel(info, B2_WCLIP1UL, (x1 << 16) | y1);
+	visfx_writel(info, B2_WCLIP1LR, (x2 << 16) | y2);
+}
+
+#define LINESIZE(x) (((x-1)/8)+1)
+static void visfx_copyline(struct fb_info *info, const char *data, int x,
+			   int width, int height, int len)
+{
+	u32 tmp;
+	int y;
+
+	for (y = 0; y < height; y++) {
+		memcpy(&tmp, &data[y * LINESIZE(width) + x], len);
+		visfx_write_vram(info, B2_BTDstObj_Yi, tmp);
+	}
+}
+
+static void visfx_imageblit_mono(struct fb_info *info, const char *data, int dx, int dy,
+				 int width, int height, int fg_color, int bg_color)
+{
+	int _width, x;
+
+	visfx_writel(info, B2_DBA, B2_DBA_OTC(5) | B2_DBA_S | B2_DBA_IND_BG_FG);
+	if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) {
+		visfx_writel(info, B2_IPM, 0xff);
+		visfx_writel(info, B2_BPM, 0xff);
+	} else {
+		visfx_writel(info, B2_BPM, 0xffffffff);
+	}
+	visfx_set_bmove_color(info, fg_color, bg_color);
+
+	for (x = 0, _width = width; _width > 0; _width -= 32, x += 4) {
+		visfx_set_vram_addr(info, dx + x * 8, dy);
+		if (_width >= 32)
+			visfx_copyline(info, data, x, width, height, 4);
+		else {
+			visfx_writel(info, B2_BPM, GENMASK(31, 31 - _width));
+			visfx_copyline(info, data, x, width, height, LINESIZE(_width));
+		}
+	}
+	visfx_writel(info, B2_IPM, 0xffffffff);
+}
+
+static void visfx_imageblit(struct fb_info *info, const struct fb_image *image)
+{
+	struct visfx_par *par = info->par;
+	int x, y;
+
+	visfx_wait_write_pipe_empty(info);
+
+	switch (image->depth) {
+	case 1:
+		/* visfx_imageblit_mono doesn't work yet for 8bpp */
+		if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR)
+			return cfb_imageblit(info, image);
+
+		visfx_imageblit_mono(info, image->data, image->dx, image->dy,
+				     image->width, image->height,
+				     image->fg_color, image->bg_color);
+		break;
+	case 8:
+		visfx_writel(info, B2_DBA, B2_DBA_OTC01 | B2_DBA_DIRECT);
+		visfx_writel(info, B2_BPM, 0xffffffff);
+
+		for (y = 0; y < image->height; y++) {
+			visfx_set_vram_addr(info, image->dx, image->dy + y);
+			for (x = 0; x < image->width; x++) {
+				u32 c = ((unsigned char *)image->data)[y * image->width + x];
+				if (info->fix.visual != FB_VISUAL_PSEUDOCOLOR) {
+					c = ((u32*)info->pseudo_palette)[c];
+					c = le32_to_cpu(c);
+				}
+				visfx_write_vram(info, B2_BTDstObj_Xi, c);
+			}
+		}
+		break;
+
+	default:
+		return cfb_imageblit(info, image);
+	}
+
+	visfx_writel(info, B2_DBA, par->dba);
+}
+
+static void visfx_fillrect(struct fb_info *info, const struct fb_fillrect *fr)
+{
+	struct visfx_par *par = info->par;
+
+	visfx_writel(info, B2_DBA, B2_DBA_OTC(5) | B2_DBA_S | B2_DBA_IND_BG_FG);
+	visfx_set_bmove_color(info, fr->color, 0);
+	visfx_writel(info, B2_MNOOP_R0R1, (fr->dx << 16) | fr->dy);
+	visfx_writel(info, B2_SOLIDFILL_R2R3, (fr->width << 16) | fr->height);
+
+	visfx_writel(info, B2_DBA, par->dba);
+}
+
+static void visfx_copyarea(struct fb_info *info, const struct fb_copyarea *area)
+{
+	visfx_writel(info, B2_MNOOP_R4R5, (area->sx << 16) | area->sy);
+	visfx_writel(info, B2_MNOOP_R2R3, (area->width << 16) | area->height);
+	visfx_writel(info, B2_BLT_R0R1, (area->dx << 16) | area->dy);
+}
+
+static int visfx_setcolreg(unsigned regno, unsigned red, unsigned green,
+			     unsigned blue, unsigned transp,
+			     struct fb_info *info)
+{
+	u32 r, g, b;
+
+	if (info->var.grayscale) {
+		/* grayscale = 0.30*R + 0.59*G + 0.11*B */
+		red = green = blue = (red * 77 + green * 151 + blue * 28) >> 8;
+	}
+
+	switch (info->fix.visual) {
+	case FB_VISUAL_PSEUDOCOLOR:
+		if (regno >= 256)
+			return -EINVAL;
+		r = (red >> 8) << 16;
+		g = (green >> 8) << 8;
+		b = (blue >> 8);
+		set_clut:
+		visfx_writel(info, B2_LLCA, regno);
+		visfx_writel(info, B2_LUTD, r | g | b);
+		break;
+	case FB_VISUAL_TRUECOLOR:
+	case FB_VISUAL_DIRECTCOLOR:
+		r = (red >> (16 - info->var.red.length))
+			<< info->var.red.offset;
+		b = (blue >> (16 - info->var.blue.length))
+			<< info->var.blue.offset;
+		g = (green >> (16 - info->var.green.length))
+			<< info->var.green.offset;
+		if (info->fix.visual == FB_VISUAL_DIRECTCOLOR)
+			goto set_clut;
+		break;
+	default:
+		return -EINVAL;
+	}
+
+	if (regno < 16)
+		((u32 *) info->pseudo_palette)[regno] = r | g | b;
+
+	return 0;
+}
+
+static int visfx_blank(int blank_mode, struct fb_info *info)
+{
+	u32 mpc;
+
+	switch (blank_mode) {
+	case FB_BLANK_POWERDOWN:
+		mpc = 3;
+		break;
+	case FB_BLANK_NORMAL:
+		mpc = 0;
+		break;
+	case FB_BLANK_UNBLANK:
+		mpc = 3 << 2;
+		break;
+	case FB_BLANK_VSYNC_SUSPEND:
+		mpc = 1 << 1;
+		break;
+	case FB_BLANK_HSYNC_SUSPEND:
+		mpc = 1 << 0;
+		break;
+	default:
+		return 1;
+	}
+	visfx_writel(info, B2_MPC, mpc);
+
+	return 0;
+}
+
+int visfx_sync(struct fb_info *info)
+{
+	visfx_wait_write_pipe_empty(info);
+	return 0;
+}
+
+static void visfx_get_video_mode(struct fb_info *info)
+{
+	struct fb_var_screeninfo *var = &info->var;
+	unsigned long n, d;
+	u32 tmp;
+
+	tmp = visfx_readl(info, B2_VHAL);
+	var->xres = (tmp & 0xffff) + 1;
+	var->yres = (tmp >> 16) + 1;
+
+	tmp = visfx_readl(info, B2_PLL_DOT_CTL);
+	n = (tmp & 0xff) + 1;
+	d = ((tmp >> 8) & 0xff) + 1;
+	var->pixclock = (VISFX_SYNC_PLL_BASE / d) * n;
+
+	tmp = visfx_readl(info, B2_HTG);
+	var->left_margin = ((tmp >> 20) & 0x1ff) + 1;
+	var->hsync_len = (((tmp >> 12) & 0xff) + 1) * 4;
+	var->right_margin = (tmp & 0x1ff) + 1;
+
+	tmp = visfx_readl(info, B2_VTG);
+	var->upper_margin = ((tmp >> 16) & 0xff) + 1;
+	var->vsync_len = ((tmp >> 8) & 0xff) + 1;
+	var->lower_margin = (tmp & 0xff) + 1;
+
+	tmp = visfx_readl(info, B2_CFG);
+	if (tmp & VISFX_HSYNC_POSITIVE)
+		var->sync |= FB_SYNC_HOR_HIGH_ACT;
+	if (tmp & VISFX_VSYNC_POSITIVE)
+		var->sync |= FB_SYNC_VERT_HIGH_ACT;
+}
+
+static int visfx_wait_pll(struct fb_info *info)
+{
+	struct visfx_par *par = info->par;
+	u32 status, pll_stat;
+	int i = 0;
+
+	visfx_writel(info, B2_PLL_REF_CNT, BIT(31) | 202500);
+
+	for (i = 0; i < 100000; i++) {
+		status = visfx_readl(info, UB_STATUS);
+		pll_stat = visfx_readl(info, B2_PLL_REF_CNT) & 0xffffff;
+		if (pll_stat == 0 && !(pll_stat & (UB_STATUS_FAULT | UB_STATUS_WPNE)))
+			break;
+		udelay(1);
+	}
+
+	if (status & (UB_STATUS_FAULT | UB_STATUS_WPNE)) {
+		dev_err(par->dev, "WPNE error %x\n", status);
+		return -EIO;
+	}
+
+	if (i == 100000) {
+		dev_err(par->dev, "timeout (status %x)\n",
+		       visfx_readl(info, B2_PLL_REF_CNT));
+		return -ETIMEDOUT;
+	}
+	return 0;
+}
+
+static int visfx_init_pll(struct fb_info *info, u32 reg, u32 value1, u32 value2)
+{
+	int ret;
+
+	visfx_writel(info, reg, value1);
+	ret = visfx_wait_pll(info);
+	if (ret)
+		return ret;
+
+	visfx_writel(info, reg, value2);
+	ret = visfx_wait_pll(info);
+	if (ret)
+		return ret;
+
+	visfx_writel(info, reg, value2 | 0x10000);
+	return visfx_wait_pll(info);
+}
+
+static int visfx_set_pll(struct fb_info *info, u32 reg, unsigned long clock)
+{
+	unsigned long n, d, tmp;
+
+	rational_best_approximation(clock, VISFX_SYNC_PLL_BASE, 0x3f, 0x3f, &n, &d);
+	tmp = 0x520000 | ((((d * 4) - 1) << 8) | ((n * 4) - 1));
+	return visfx_init_pll(info, reg, tmp, tmp);
+}
+
+static int visfx_set_par(struct fb_info *info)
+{
+	u32 xres, yres, hbp, hsw, hfp, vbp, vsw, vfp, tmp;
+	struct fb_var_screeninfo *var = &info->var;
+	int ret;
+
+	xres = var->xres;
+	yres = var->yres;
+	hsw = var->hsync_len / 4 - 1;
+	hfp = (var->right_margin - 1) & 0x1ff;
+	hbp = var->left_margin - 1;
+	vsw = var->vsync_len - 1;
+	vfp = var->lower_margin - 1;
+	vbp = var->upper_margin - 1;
+
+	ret = visfx_set_pll(info, B2_PLL_DOT_CTL, var->pixclock);
+	if (ret) {
+		pr_warn("visfx_set_par: failed to set PLL\n");
+		return ret;
+	}
+
+	visfx_writel(info, B2_HTG, (hbp << 20) | (hsw << 12) | (0xc << 8) | hfp);
+	visfx_writel(info, B2_VTG, (vbp << 0) | (vsw << 8) | (vfp << 16));
+	visfx_writel(info, B2_VHAL,((yres - 1) << 16) | (xres - 1));
+	visfx_writel(info, B2_ETG, 0x12260);
+	visfx_writel(info, B2_SCR, 0);
+	visfx_wclip(info, 0, 0, xres, yres);
+
+	tmp = VISFX_DFP_ENABLE;
+	if (var->sync & FB_SYNC_HOR_HIGH_ACT)
+		tmp |= VISFX_HSYNC_POSITIVE;
+	if (var->sync & FB_SYNC_VERT_HIGH_ACT)
+		tmp |= VISFX_VSYNC_POSITIVE;
+	visfx_writel(info, B2_CFG, tmp);
+	visfx_writel(info, B2_MPC, 0xc);
+
+	visfx_setup(info);
+
+	return visfx_wait_write_pipe_empty(info);
+}
+
+static int visfx_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
+{
+	struct fb_var_screeninfo *v = &info->var;
+
+	if (var->pixclock > VISFX_SYNC_PLL_BASE ||
+		var->left_margin > 512 ||
+		var->right_margin > 512 ||
+		var->hsync_len > 512 ||
+		var->lower_margin > 256 ||
+		var->upper_margin > 256 ||
+		var->vsync_len > 256 ||
+		var->xres > 2048 ||
+		var->yres > 2048)
+		return -EINVAL;
+
+	if (var->bits_per_pixel == 24)
+		var->bits_per_pixel = 32;
+	if (var->bits_per_pixel != 8 && var->bits_per_pixel != 32)
+		return -EINVAL;
+
+	if (var->xres & 0x7)
+		return -EINVAL;
+	if (var->xres < MIN_XRES)
+		var->xres = MIN_XRES;
+	if (var->yres < MIN_YRES)
+		var->yres = MIN_YRES;
+	var->xres_virtual = var->xres;
+	var->yres_virtual = var->yres;
+
+	/*
+	 * Copy the RGB parameters for this display
+	 * from the machine specific parameters.
+	 */
+	var->red    = v->red;
+	var->green  = v->green;
+	var->blue   = v->blue;
+	var->transp = v->transp;
+
+	var->nonstd = 0;
+	var->height = -1;
+	var->width = -1;
+	var->vmode = FB_VMODE_NONINTERLACED;
+	var->accel_flags = info->flags;
+
+	return 0;
+}
+
+static void visfx_update_cursor_image_line(struct fb_info *info,
+					   struct fb_cursor *cursor, int y)
+{
+	unsigned int x, bytecnt;
+	u32 data[2] = { 0 };
+	u8 d, m;
+
+	bytecnt = ((cursor->image.width - 1) / 8) + 1;
+
+	for (x = 0; x < bytecnt && x < 8; x++) {
+		m = cursor->mask[y * bytecnt + x];
+		d = cursor->image.data[y * bytecnt + x];
+
+		if (cursor->rop == ROP_XOR)
+			((u8 *)data)[x] = d ^ m;
+		else
+			((u8 *)data)[x] = d & m;
+	}
+
+	if (cursor->image.width < 32)
+		data[0] &= GENMASK(31, 31 - cursor->image.width + 1);
+	visfx_writel(info, UB_CD, data[0]);
+	if (cursor->image.width < 64)
+		data[0] &= GENMASK(31, 63 - cursor->image.width + 1);
+	visfx_writel(info, UB_CD, data[1]);
+}
+
+static void visfx_update_cursor_image(struct fb_info *info,
+				      struct fb_cursor *cursor)
+{
+	int y, height = cursor->image.height;
+
+	if (height > 128)
+		height = 128;
+
+	visfx_writel(info, UB_CA, 0);
+	for (y = 0; y < height; y++)
+		visfx_update_cursor_image_line(info, cursor, y);
+
+	for (; y < 256; y++)
+		visfx_writel(info, UB_CD, 0);
+}
+
+static int visfx_cursor(struct fb_info *info, struct fb_cursor *cursor)
+{
+	u32 cp, color;
+
+	cp = (cursor->image.dx << 16) | (cursor->image.dy & 0xffff);
+	visfx_writel(info, UB_CP, cp);
+
+	if (cursor->set & (FB_CUR_SETIMAGE|FB_CUR_SETSHAPE))
+		visfx_update_cursor_image(info, cursor);
+
+	if (cursor->set & FB_CUR_SETCMAP) {
+		color = cursor->image.fg_color;
+		if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR)
+			color = ((u32 *) info->pseudo_palette)[color & 0x0f];
+		else
+			color = visfx_cmap_entry(info, color);
+		visfx_writel(info, UB_CB, color);
+		visfx_writel(info, UB_CF, 0);
+	}
+
+	if (cursor->enable) {
+		cp |= UB_CP_CURSOR_ENABLE;
+		visfx_writel(info, UB_CP, cp);
+	}
+	return 0;
+}
+
+static const struct fb_ops visfx_ops = {
+	.owner		= THIS_MODULE,
+	.fb_check_var	= visfx_check_var,
+	.fb_set_par	= visfx_set_par,
+	.fb_setcolreg	= visfx_setcolreg,
+	.fb_blank	= visfx_blank,
+	.fb_fillrect	= visfx_fillrect,
+	.fb_copyarea	= visfx_copyarea,
+	.fb_imageblit	= visfx_imageblit,
+	.fb_cursor	= visfx_cursor,
+	.fb_sync	= visfx_sync,
+};
+
+static void visfx_bus_error_timer_enable(struct fb_info *info, bool enable)
+{
+	u32 tmp = visfx_readl(info, UP_CONTROL);
+
+	if (enable)
+		tmp |= 0x1000;
+	else
+		tmp &= ~0x1000;
+	visfx_writel(info, UP_CONTROL, tmp);
+}
+
+static int visfx_soft_reset(struct fb_info *info)
+{
+	int i = 0;
+	u32 old;
+
+	old = visfx_readl(info, UP_CONTROL);
+	visfx_writel(info, UP_CONTROL, UP_CONTROL_SOFT_RST);
+	while (visfx_readl(info, UP_CONTROL) & UP_CONTROL_SOFT_RST) {
+		if (i++ > 10000)
+			return -ETIMEDOUT;
+		udelay(10);
+	}
+	visfx_writel(info, UP_TCP, 0x00030000);
+	visfx_writel(info, UP_CONTROL, old & ~UP_CONTROL_TO);
+	visfx_writel(info, B2_WORG, 0);
+	if (visfx_readl(info, UB_STATUS) & UB_STATUS_FAULT)
+		return -EIO;
+	return 0;
+}
+
+static int visfx_reset(struct fb_info *info)
+{
+	struct visfx_par *par = info->par;
+	int ret;
+	u32 tmp;
+
+	ret = visfx_soft_reset(info);
+	if (ret)
+		return ret;
+
+	ret = visfx_wait_write_pipe_empty(info);
+	if (ret)
+		return ret;
+
+	visfx_writel(info, B2_SWEN, 0xffffffff);
+	visfx_writel(info, B2_SREN, 0xffffffff);
+
+	ret = visfx_wait_write_pipe_empty(info);
+	if (ret)
+		return ret;
+
+	visfx_writel(info, B2_MV, 0x2001db0);
+	visfx_writel(info, UB_UIRC, 0x04040404);
+	visfx_writel(info, B2_IRC, 0x04040404);
+	visfx_writel(info, B2_DMA_BSCSAV, 0);
+	visfx_writel(info, UB_DMA_UBSCSAV, 0);
+	visfx_writel(info, B2_DMA_BSCBLK, 0);
+	visfx_writel(info, UB_DMA_UBSCBLK, 0);
+	visfx_writel(info, UP_TCP, 0x30000);
+	visfx_writel(info, UP_DC, 0x30301);
+	visfx_writel(info, BP_CF_DRC, 0x300);
+	visfx_writel(info, BP_CF_HWC, 0x104);
+	visfx_writel(info, BP_CF_LWC, 0x3e8);
+	visfx_writel(info, BP_CD_HWC, 0x4);
+	visfx_writel(info, B2_CD_BUFFER_CTL, 0x4040404);
+	visfx_writel(info, B2_PDU_BSCFB, 0x1b);
+	visfx_writel(info, UB_PDU_UBSCFB, 0x1b);
+	visfx_writel(info, B2_DMA_BSCFB, 0x1b);
+	visfx_writel(info, UB_DMA_UBSCFB, 0x1b);
+	visfx_writel(info, B2_FBC_RBS, 0xe4);
+	visfx_writel(info, B2_SOV, 0);
+	visfx_writel(info, B2_MFU_BSCCTL, 0x1b);
+	visfx_writel(info, B2_MFU_BSCTD, 0x1b);
+	visfx_writel(info, BP_ICR, 0);
+	visfx_writel(info, B2_SWEN, 0xffffffff);
+	visfx_writel(info, B2_SREN, 0x1000001);
+	visfx_writel(info, B2_FPR, 0);
+
+	visfx_writel(info, B3_BBC_CONFIG, 0);
+	tmp = visfx_readl(info, B3_HUNGRY);
+
+	switch(tmp) {
+	case 0x2a:
+		visfx_writel(info, B3_NUM_GA, 0x00000003);
+		visfx_writel(info, B3_GA_CONFIG, 0x00000002);
+		break;
+	case 0xaaa:
+		visfx_writel(info, B3_NUM_GA, 0x00000006);
+		visfx_writel(info, B3_GA_CONFIG, 0x00000005);
+		break;
+	default:
+		dev_err(par->dev, "unknown value %x\n", tmp);
+		break;
+	}
+	visfx_writel(info, B3_BBC_CONFIG, 4);
+	return 0;
+}
+
+int visfx_set_default_mode(struct fb_info *info)
+{
+	u32 tmp;
+	int ret;
+
+	ret = visfx_init_pll(info, B2_PLL_DOT_CTL,
+			     visfx_readl(info, 0x50028),
+			     visfx_readl(info, 0x5002c));
+	if (ret)
+		return ret;
+
+	visfx_writel(info, B2_HTG, visfx_readl(info, 0x50038));
+	visfx_writel(info, B2_VTG, visfx_readl(info, 0x5003c));
+	visfx_writel(info, B2_CFG, visfx_readl(info, 0x50040));
+
+	tmp = (visfx_readl(info, 0x50024) & 0xffff0000) |
+		(visfx_readl(info, 0x50020) & 0xffff);
+
+	visfx_writel(info, B2_VHAL, tmp - 0x10001);
+
+	visfx_writel(info, B2_ETG, visfx_readl(info, 0x50044));
+	visfx_writel(info, B2_SCR, visfx_readl(info, 0x5004c));
+	visfx_writel(info, B2_IMD, 2);
+	return 0;
+}
+
+static void visfx_buffer_setup(struct fb_info *info, int num,
+			       u32 imc, u32 ibs, u32 iclr)
+{
+	visfx_writel(info, B2_ICLR0 + (num << 2), iclr);
+	visfx_writel(info, B2_IMC0 + (num << 2), imc);
+	visfx_writel(info, B2_IBS0 + (num << 2), ibs);
+}
+
+static void visfx_setup_and_wait(struct fb_info *info, u32 reg, u32 val)
+{
+	visfx_writel(info, UP_CF_STATE, (1 << 25));
+	visfx_writel(info, B2_VBS, 1);
+	visfx_writel(info, reg, val);
+	visfx_writel(info, UP_CF_STATE, 0);
+	visfx_wait_write_pipe_empty(info);
+}
+
+static void visfx_clear_buffer(struct fb_info *info, u32 dba, u32 bmap_dba, u32 mbwb, u32 ifc)
+{
+	struct fb_var_screeninfo *var = &info->var;
+
+	visfx_writel(info, B2_DBA, dba);
+	visfx_writel(info, B2_BMAP_DBA, bmap_dba);
+	visfx_writel(info, B2_IBO, 0);
+	visfx_writel(info, B2_IPM, 0xffffffff);
+	visfx_writel(info, B2_IFC, ifc);
+	visfx_writel(info, B2_FOE, 1);
+	visfx_writel(info, B2_SOV, 0);
+	visfx_writel(info, B2_WCE, 0);
+	visfx_writel(info, B2_CPE, 0);
+	visfx_writel(info, B2_MBWB, mbwb);
+	visfx_writel(info, B2_MNOOP_R0R1, 0);
+	visfx_writel(info, B2_SOLIDFILL_R2R3_REMAP, var->xres<<16 | var->yres);
+}
+
+static void visfx_setup(struct fb_info *info)
+{
+	struct visfx_par *par = info->par;
+	struct fb_var_screeninfo *var = &info->var;
+	int i;
+
+	visfx_wait_write_pipe_empty(info);
+
+#ifdef __BIG_ENDIAN
+	if (var->bits_per_pixel == 32) {
+		visfx_writel(info, B2_DMA_BSCFB, DSM_NO_BYTE_SWAP);
+		visfx_writel(info, B2_PDU_BSCFB, DSM_NO_BYTE_SWAP);
+	} else {
+		u32 val = DSM_NO_BYTE_SWAP;
+		visfx_writel(info, B2_DMA_BSCFB, val);
+		visfx_writel(info, B2_PDU_BSCFB, val);
+		visfx_writel(info, B2_FBC_RBS, DSM_NO_BYTE_SWAP);
+	}
+	visfx_writel(info, B2_MFU_BSCTD, DSM_NO_BYTE_SWAP);
+	visfx_writel(info, B2_MFU_BSCCTL, DSM_PDU_BYTE_SWAP_DEFAULT);
+#else
+	visfx_writel(info, B2_DMA_BSCFB, DSM_PDU_BYTE_SWAP_DEFAULT);
+	visfx_writel(info, B2_PDU_BSCFB, DSM_PDU_BYTE_SWAP_DEFAULT);
+	visfx_writel(info, B2_MFU_BSCTD, DSM_PDU_BYTE_SWAP_DEFAULT);
+	visfx_writel(info, B2_MFU_BSCCTL, DSM_PDU_BYTE_SWAP_DEFAULT);
+#endif
+
+	visfx_writel(info, B2_DMA_BSCBLK, 0);
+	visfx_writel(info, B2_VTB, 0x35);
+	visfx_writel(info, B2_TTB, 0x99);
+	visfx_writel(info, B2_EN2D, 0);
+	visfx_writel(info, B2_FOE, 1);
+	visfx_writel(info, B2_IBO, 0);
+	visfx_writel(info, B2_SB, 0);
+	visfx_writel(info, B2_WCE, 0);
+	visfx_writel(info, B2_CPE, 0);
+	visfx_writel(info, B2_ZBO, 0x00080000);
+	visfx_writel(info, B2_RTG_MEM_LOAD, 0xc9200);
+	visfx_writel(info, B2_TM_TSS, 0);
+	visfx_writel(info, B2_FCDA, 0);
+	visfx_writel(info, B2_BMAP_Z, 0);
+	visfx_writel(info, B2_FSRMWB, 0);
+	visfx_readl(info, UB_CONTROL);
+	visfx_wait_write_pipe_empty(info);
+
+	visfx_writel(info, UP_CF_STATE, 0x02000000);
+	visfx_writel(info, B2_VBS, 1);
+
+	par->abmap  = var->xres / 4;	/* x-resolution encoded in lower bits */
+	par->ibmap0 = 0x02681002;
+	par->bmap_z = 0x13090006;
+	par->obmap0 = 0x23a80000 | var->xres / 2;
+	par->ibmap1 = 0x27e00002;
+
+	visfx_setup_and_wait(info, B2_ABMAP, par->abmap);
+	visfx_setup_and_wait(info, B2_IBMAP0, par->ibmap0);
+	visfx_setup_and_wait(info, B2_BMAP_Z, par->bmap_z);
+	visfx_setup_and_wait(info, B2_OBMAP0, par->obmap0);
+	visfx_setup_and_wait(info, UP_CF_STATE, 0);
+	visfx_setup_and_wait(info, B2_IBMAP1, par->ibmap1);
+	visfx_setup_and_wait(info, B2_DUM, 0x81030002);
+	visfx_setup_and_wait(info, B2_OXYO, 0);
+
+	visfx_writel(info, B2_PMASK, 0xff);
+	visfx_writel(info, B2_MPC, 0x0c);
+
+	for (i = 0; i < 7; i++)
+		visfx_buffer_setup(info, i, 0, 0, 0);
+
+	visfx_buffer_setup(info, 0, (var->bits_per_pixel == 32) ? 0x09000004 : 0x2000000, 0, 0);
+	visfx_buffer_setup(info, 1, (var->bits_per_pixel == 32) ? 0x09000004 : 0x2000000, 1, 0);
+	visfx_setup_and_wait(info, B2_OMC, 0x2000000);
+	visfx_writel(info, B2_OTLS, 2);
+	visfx_writel(info, B2_OBS, 0);
+
+	visfx_wclip(info, 0, 0, var->xres, var->yres);
+	visfx_clear_buffer(info, 0x05000880, par->ibmap0, 0x03f00000, 0);
+	visfx_clear_buffer(info, 0x05000880, par->obmap0, 0x00fc0000, (var->bits_per_pixel == 32) ? 0xffffffff : 0);
+	visfx_clear_buffer(info, 0x05000880, par->abmap,  0x00900000, 0);
+
+	visfx_writel(info, B2_FATTR, 0);
+	visfx_writel(info, B2_OTLS, (var->bits_per_pixel == 8) ? 0 : 0x10002);
+	visfx_writel(info, B2_CKEY_HI, 0xffffff);
+	visfx_writel(info, B2_CKEY_LO, 0xffffff);
+
+	for (i = 0; i < 256; i++) {
+		visfx_writel(info, B2_LLCA, 0x40003000 | i);
+		visfx_writel(info, B2_LUTD, 0x010101 * i);
+	}
+
+	// visfx_clear_buffer(info, 0x00000a00, par->ibmap0, 0x03f00000, 0);
+	visfx_buffer_setup(info, 2, 0x08000084, 0, 0);
+
+	visfx_wait_write_pipe_empty(info);
+	visfx_writel(info, B2_BMAP_DBA, par->ibmap0);
+
+	info->fix.accel = FB_ACCEL_NONE;
+	info->fix.type = FB_TYPE_PACKED_PIXELS;
+	info->fix.line_length = 2048 * var->bits_per_pixel / 8;
+
+	switch (var->bits_per_pixel) {
+	default:
+		info->fix.visual = FB_VISUAL_TRUECOLOR;
+		var->red.length = 8;
+		var->red.offset = 8;
+		var->green.length = 8;
+		var->green.offset = 16;
+		var->blue.length = 8;
+		var->blue.offset = 24;
+		var->transp.length = 8;
+		var->transp.offset = 0;
+		break;
+	case 8:
+		info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
+		var->red.length = 8;
+		var->red.offset = 0;
+		var->green.length = 8;
+		var->green.offset = 0;
+		var->blue.length = 8;
+		var->blue.offset = 0;
+		var->transp.length = 0;
+		var->transp.offset = 0;
+	}
+
+	var->xres_virtual = var->xres;
+	var->yres_virtual = var->yres;
+	visfx_wclip(info, 0, 0, var->xres, var->yres);
+
+	/* set DBA */
+	if (info->var.bits_per_pixel == 32) {
+		visfx_writel(info, B2_EN2D, B2_EN2D_WORD_MODE);
+		par->dba = B2_DBA_BIN8F | B2_DBA_OTC01 | B2_DBA_DIRECT | B2_DBA_D;
+		par->bmap_dba = par->ibmap0;
+		visfx_writel(info, B2_BPM, 0xffffffff);
+		visfx_writel(info, B2_OTR, 1<<16 | 1<<8 | 0);
+		visfx_writel(info, B2_FATTR, 0);
+	} else { /* 8-bit indexed: */
+		visfx_writel(info, B2_EN2D, B2_EN2D_BYTE_MODE);
+		par->dba = B2_DBA_BIN8I | B2_DBA_OTC04 | B2_DBA_DIRECT | B2_DBA_D;
+		par->bmap_dba = par->obmap0;
+		visfx_writel(info, B2_BPM, 0xff << 24);
+		visfx_writel(info, B2_OTR, 2);
+		visfx_writel(info, B2_CFS16, 0x40);
+		visfx_writel(info, B2_FATTR, 1<<7 | 1<<4); /* CFS16 & force Overlay */
+	}
+
+	visfx_writel(info, B2_BMAP_BABoth, par->bmap_dba);
+	visfx_writel(info, B2_BABoth, par->dba);
+	visfx_writel(info, B2_IPM, 0xffffffff);
+}
+
+static int __init visfx_initialize(struct fb_info *info)
+{
+	struct visfx_par *par = info->par;
+	int i, ret;
+
+	pr_info("visfx: PLL: %08x:%08x, RAM: %08x:%08x, CB: %08x:%08x, GA: %08x:%08x\n",
+		par->defaults->pll_core_0, par->defaults->pll_core_1,
+		par->defaults->pll_ram_0, par->defaults->pll_ram_1,
+		par->defaults->pll_cb4038_0, par->defaults->pll_cb4038_1,
+		par->defaults->pll_ga_ipll_0, par->defaults->pll_ga_ipll_1);
+
+	visfx_bus_error_timer_enable(info, false);
+	ret = visfx_reset(info);
+	if (ret)
+		return ret;
+	visfx_bus_error_timer_enable(info, true);
+
+	ret = visfx_init_pll(info, B2_PLL_CORE_CTL,
+			     par->defaults->pll_core_0,
+			     par->defaults->pll_core_1);
+	if (ret)
+		return ret;
+
+	ret = visfx_init_pll(info, B2_PLL_RAM_CTL,
+			     par->defaults->pll_ram_0,
+			     par->defaults->pll_ram_1);
+	if (ret)
+		return ret;
+
+	visfx_writel(info, B2_RC_CONFIG1, 0);
+	visfx_writel(info, B2_RC_CONFIG0, 0x04444649);
+	visfx_writel(info, B2_RC_CONFIG2, 0x0119F051);
+	visfx_writel(info, B2_RC_CONFIG1, 0xE3901212);
+
+	ret = visfx_init_pll(info, 0xcb4038,
+			     par->defaults->pll_cb4038_0,
+			     par->defaults->pll_cb4038_1);
+	if (ret)
+		return ret;
+
+	for(i = 0; i < 6; i++)
+		visfx_writel(info, B3_GA_NOP_EOC, 0);
+
+	ret = visfx_init_pll(info, B3_GA_IPLL,
+			     par->defaults->pll_ga_ipll_0,
+			     par->defaults->pll_ga_ipll_1);
+	if (ret)
+		return ret;
+
+	for(i = 0; i < 6; i++)
+		visfx_writel(info, B3_GA_NOP_EOC, 0);
+
+	visfx_writel(info, B2_FOE, 0);
+	visfx_writel(info, B2_IBO, 0);
+	visfx_writel(info, B2_FCDA, 0);
+	visfx_writel(info, B2_CPE, 0);
+	visfx_writel(info, B2_IPM, 0xffffffff);
+
+	visfx_wclip(info, 0, 0, 2048, 2048);
+	visfx_writel(info, B2_EN2D, B2_EN2D_BYTE_MODE);
+	visfx_writel(info, B2_BABoth, 0x2000000);
+	visfx_writel(info, B2_BMAP_BABoth, 0x200);
+	visfx_writel(info, 0x1000000, 0);
+	visfx_writel(info, B2_BMAP_BABoth, 0x80000200);
+	visfx_writel(info, 0x1000000, 0);
+	visfx_writel(info, B2_BMAP_BABoth, 0x40000200);
+	visfx_writel(info, 0x1000000, 0);
+	visfx_writel(info, B2_BMAP_BABoth, 0x200);
+	visfx_writel(info, B2_MV, 0);
+
+	// setup video regs
+	ret = visfx_set_default_mode(info);
+	if (ret)
+		return ret;
+
+	visfx_writel(info, B2_MFU_BSCTD, 0x1b);
+	visfx_writel(info, B2_MFU_BSCCTL, 0x1b);
+	visfx_writel(info, B2_FBC_RBS, 0xe4);
+	visfx_writel(info, B2_FOE, 0);
+
+	visfx_writel(info, B2_EN2D, B2_EN2D_BYTE_MODE);
+
+	return 0;
+}
+
+static int __init visfx_get_rom_defaults(struct fb_info *info)
+{
+	struct visfx_par *par = info->par;
+	u32 offset, id;
+
+	if (visfx_readl(info, 0) != 0x55aa0000)
+		return -EINVAL;
+
+	offset = le32_to_cpu(visfx_readl(info, 0x08)) + 0x08;
+	if (offset > par->reg_size)
+		return -EINVAL;
+
+	id = visfx_readl(info, offset);
+
+	if (id != VISFX_CARDTYPE_FX5) {
+		dev_err(par->dev, "Unsupported card: ID %08x\n", id);
+		return -EINVAL;
+	}
+
+	offset = le32_to_cpu(visfx_readl(info, 0x08)) + 0x28;
+	if (offset > par->reg_size)
+		return -EINVAL;
+
+	offset = visfx_readl(info, offset);
+	if (offset > par->reg_size)
+		return -EINVAL;
+
+	par->defaults = par->reg_base + offset;
+	return 0;
+}
+
+static void __init visfx_setup_info(struct pci_dev *pdev, struct fb_info *info)
+{
+	struct visfx_par *par = info->par;
+
+	info->fbops = &visfx_ops;
+	info->flags = FBINFO_HWACCEL_FILLRECT | FBINFO_HWACCEL_IMAGEBLIT |
+			FBINFO_HWACCEL_COPYAREA | FBINFO_READS_FAST;
+	info->pseudo_palette = par->pseudo_palette;
+	info->screen_base = par->reg_base + VISFX_FB_OFFSET;
+
+	strscpy(info->fix.id, "Visualize-FX", sizeof(info->fix.id));
+	info->fix.mmio_start = pci_resource_start(pdev, 0);
+	info->fix.smem_start = pci_resource_start(pdev, 0) + VISFX_FB_OFFSET;
+	info->fix.smem_len = VISFX_FB_LENGTH;
+	info->fix.type = FB_TYPE_PACKED_PIXELS;
+	if (DEFAULT_BPP == 32)
+		info->fix.visual = FB_VISUAL_TRUECOLOR;
+	else
+		info->fix.visual = FB_VISUAL_PSEUDOCOLOR;
+	info->fix.line_length = 2048 * DEFAULT_BPP / 8;
+	info->fix.accel = FB_ACCEL_NONE;
+}
+
+static int __init visfx_init_device(struct pci_dev *pdev, struct sti_struct *sti)
+{
+	struct visfx_par *par;
+	struct fb_info *info;
+	char mode[64];
+	int ret;
+
+	info = framebuffer_alloc(sizeof(struct visfx_par), &pdev->dev);
+	if (!info)
+		return -ENOMEM;
+
+	pci_set_drvdata(pdev, info);
+	par = info->par;
+	par->info = info;
+	par->reg_size = pci_resource_len(pdev, 0);
+	par->dev = &pdev->dev;
+
+	if (sti) {
+		sti->info = info;
+		par->reg_base = pci_iomap(pdev, 0, VISFX_FB_OFFSET + VISFX_FB_LENGTH);
+	} else
+		par->reg_base = pcim_iomap_table(pdev)[0];
+
+	ret = visfx_get_rom_defaults(info);
+	if (ret)
+		goto err_out_free;
+
+	visfx_setup_info(pdev, info);
+	if (sti)
+		strscpy(info->fix.id, sti->sti_data->inq_outptr.dev_name,
+			sizeof(info->fix.id));
+
+	ret = visfx_initialize(info);
+	if (ret)
+		goto err_out_free;
+
+	info->var.bits_per_pixel = DEFAULT_BPP;
+	ret = fb_alloc_cmap(&info->cmap, 256, 0);
+	if (ret)
+		goto err_out_free;
+
+	visfx_get_video_mode(info);
+
+	if (!mode_option) {
+		scnprintf(mode, sizeof(mode), "%dx%d@60",
+			info->var.xres, info->var.yres);
+		mode_option = mode;
+	}
+
+	fb_find_mode(&info->var, info, mode_option, NULL, 0, NULL, DEFAULT_BPP);
+	visfx_check_var(&info->var, info);
+	visfx_set_par(info);
+
+	ret = register_framebuffer(info);
+	if (ret)
+		goto err_out_dealloc_cmap;
+
+	fb_info(info, "visfxfb %dx%d-%d frame buffer device, %s, mmio: 0x%04lx\n",
+		info->var.xres,
+		info->var.yres,
+		info->var.bits_per_pixel,
+		info->fix.id,
+		info->fix.mmio_start);
+
+	return 0;
+
+err_out_dealloc_cmap:
+	fb_dealloc_cmap(&info->cmap);
+err_out_free:
+	framebuffer_release(info);
+	return ret;
+}
+
+static int visfx_probe_pci(struct pci_dev *pdev,
+	       const struct pci_device_id *ent)
+{
+	int ret;
+
+	ret = pcim_enable_device(pdev);
+	if (ret) {
+		dev_err(&pdev->dev, "Cannot enable PCI device: %d\n", ret);
+		return ret;
+	}
+
+	ret = pcim_iomap_regions(pdev, BIT(0), KBUILD_MODNAME);
+	if (ret) {
+		dev_err(&pdev->dev, "Cannot map PCI resources: %d\n", ret);
+		return ret;
+	}
+
+	return visfx_init_device(pdev, NULL);
+}
+
+static void visfx_probe_sti(struct sti_struct *sti, int enable)
+{
+	if (!sti || !sti->pd)
+		return;
+
+	if (sti->graphics_id[0] != VISFX_CARDTYPE_FX5)
+		return;
+
+	if (enable)
+		visfx_init_device(sti->pd, sti);
+	else {
+		struct fb_info *info;
+		struct visfx_par *par;
+
+		info = pci_get_drvdata(sti->pd);
+		par = info->par;
+		unregister_framebuffer(info);
+		fb_dealloc_cmap(&info->cmap);
+		framebuffer_release(info);
+		pci_iounmap(sti->pd, par->reg_base);
+	}
+}
+
+static int __init visfx_options(char *options)
+{
+	if (!options || !*options)
+		return 0;
+
+	mode_option = options;
+
+	return 0;
+}
+
+static void __exit visfx_remove(struct pci_dev *pdev)
+{
+	struct fb_info *info = pci_get_drvdata(pdev);
+
+	unregister_framebuffer(info);
+	fb_dealloc_cmap(&info->cmap);
+	framebuffer_release(info);
+}
+
+static const struct pci_device_id visfx_pci_tbl[] = {
+	{ PCI_DEVICE(PCI_VENDOR_ID_HP, PCI_DEVICE_ID_HP_VISUALIZE_FX4) },
+	{ 0 },
+};
+MODULE_DEVICE_TABLE(pci, visfx_pci_tbl);
+
+static struct pci_driver visfx_driver = {
+	.name	   = KBUILD_MODNAME,
+	.id_table  = visfx_pci_tbl,
+	.probe	   = visfx_probe_pci,
+	.remove    = visfx_remove,
+};
+
+static int __init visfx_init(void)
+{
+	char *option = NULL;
+	int i;
+
+	if (fb_get_options(KBUILD_MODNAME, &option))
+		return -ENODEV;
+
+	visfx_options(option);
+
+	if (IS_ENABLED(CONFIG_STI_CONSOLE) || IS_ENABLED(CONFIG_FB_STI))
+		for (i = 1; i <= MAX_STI_ROMS; i++)
+			visfx_probe_sti(sti_get_rom(i), 1);
+
+	return pci_register_driver(&visfx_driver);
+}
+
+static void __exit visfx_exit(void)
+{
+	int i;
+
+	if (IS_ENABLED(CONFIG_STI_CONSOLE) || IS_ENABLED(CONFIG_FB_STI))
+		for (i = 1; i <= MAX_STI_ROMS; i++)
+			visfx_probe_sti(sti_get_rom(i), 0);
+
+	pci_unregister_driver(&visfx_driver);
+}
+
+module_init(visfx_init);
+module_exit(visfx_exit);
+
+module_param(mode_option, charp, 0);
+MODULE_PARM_DESC(mode_option, "Initial video mode or empty for ROM defaults");
+
+MODULE_AUTHOR("Sven Schnelle <svens@stackframe.org>");
+MODULE_AUTHOR("Helge Deller <deller@gmx.de>");
+MODULE_DESCRIPTION("Framebuffer driver for HP Visualize FX cards");
+MODULE_LICENSE("GPL");

             reply	other threads:[~2023-04-23 22:01 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-23 22:00 Helge Deller [this message]
2023-04-25 10:58 ` [PATCH v3] fbdev: visfxfb: HP Visualize-FX framebufffer driver kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=ZEWqkJekzyIlhBlW@p100 \
    --to=deller@gmx.de \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-parisc@vger.kernel.org \
    --cc=svens@stackframe.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.