[Intel-gfx] [RFC] lib: Import intel_sideband.c from the kernel

Damien Lespiau damien.lespiau at intel.com
Wed Jun 5 12:59:38 CEST 2013


XXX: more detailed commit message
---
 lib/Makefile.am                                    |   9 +-
 lib/intel_dpio.c                                   |  94 ---------
 lib/intel_gpu_tools.h                              |  15 ++
 lib/intel_iosf.c                                   |  85 --------
 lib/intel_reg.h                                    | 221 +++++++++++++++++++--
 lib/intel_sideband.c                               | 191 ++++++++++++++++++
 tools/intel_dpio_read.c => lib/intel_sideband.h    |  64 ++----
 .../kernel-shim/drm-shim.h                         |  62 +++---
 .../kernel-shim/i915_drv.h                         |  53 ++---
 .../kernel-shim/intel_drv.h                        |  69 +++----
 .../intel_dpio_read.c => lib/kernel-shim/kernel.h  |  76 +++----
 scripts/sync-from-kernel                           |  30 +++
 tools/intel_dpio_read.c                            |   4 +-
 tools/intel_dpio_write.c                           |   4 +-
 tools/intel_nc_read.c                              |   6 +-
 tools/intel_nc_write.c                             |  10 +-
 tools/intel_punit_read.c                           |   6 +-
 tools/intel_punit_write.c                          |  10 +-
 18 files changed, 592 insertions(+), 417 deletions(-)
 delete mode 100644 lib/intel_dpio.c
 delete mode 100644 lib/intel_iosf.c
 create mode 100644 lib/intel_sideband.c
 copy tools/intel_dpio_read.c => lib/intel_sideband.h (52%)
 copy tools/intel_dpio_write.c => lib/kernel-shim/drm-shim.h (55%)
 copy tools/intel_dpio_write.c => lib/kernel-shim/i915_drv.h (55%)
 copy tools/intel_dpio_write.c => lib/kernel-shim/intel_drv.h (55%)
 copy tools/intel_dpio_read.c => lib/kernel-shim/kernel.h (52%)
 create mode 100755 scripts/sync-from-kernel

diff --git a/lib/Makefile.am b/lib/Makefile.am
index 387141b..2cafe22 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -1,10 +1,14 @@
 
 noinst_LTLIBRARIES = libintel_tools.la
 
-AM_CPPFLAGS = -I$(top_srcdir)
+AM_CPPFLAGS = -I$(top_srcdir) -I$(srcdir)/kernel-shim
 AM_CFLAGS = $(DRM_CFLAGS) $(CWARNFLAGS)
 
 libintel_tools_la_SOURCES = 	\
+	kernel-shim/kernel.h	\
+	kernel-shim/i915_drv.h	\
+	kernel-shim/intel_drv.h	\
+	kernel-shim/drm-shim.h	\
 	debug.h			\
 	drmtest.c		\
 	drmtest.h		\
@@ -29,8 +33,7 @@ libintel_tools_la_SOURCES = 	\
 	rendercopy_gen7.c	\
 	rendercopy.h		\
 	intel_reg_map.c		\
-	intel_dpio.c		\
-	intel_iosf.c		\
+	intel_sideband.c	\
 	$(NULL)
 
 LDADD = $(CAIRO_LIBS)
diff --git a/lib/intel_dpio.c b/lib/intel_dpio.c
deleted file mode 100644
index acfd201..0000000
--- a/lib/intel_dpio.c
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright © 2008 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *    Vijay Purushothaman <vijay.a.purushothaman at intel.com>
- *
- */
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <err.h>
-#include "intel_gpu_tools.h"
-
-static uint32_t intel_display_reg_read(uint32_t reg)
-{
-	struct pci_device *dev = intel_get_pci_device();
-
-	if (IS_VALLEYVIEW(dev->device_id))
-		reg += VLV_DISPLAY_BASE;
-	return (*(volatile uint32_t*)((volatile char*)mmio + reg));
-}
-
-static void intel_display_reg_write(uint32_t reg, uint32_t val)
-{
-	volatile uint32_t *ptr;
-	struct pci_device *dev = intel_get_pci_device();
-
-	if (IS_VALLEYVIEW(dev->device_id))
-		reg += VLV_DISPLAY_BASE;
-	ptr = (volatile uint32_t*)((volatile char*)mmio + reg);
-	*ptr = val;
-}
-
-/*
- * In SoCs like Valleyview some of the PLL & Lane control registers
- * can be accessed only through IO side band fabric called DPIO
- */
-uint32_t
-intel_dpio_reg_read(uint32_t reg)
-{
-	/* Check whether the side band fabric is ready to accept commands */
-	do {
-		usleep(1);
-	} while (intel_display_reg_read(DPIO_PKT) & DPIO_BUSY);
-
-	intel_display_reg_write(DPIO_REG, reg);
-	intel_display_reg_write(DPIO_PKT, DPIO_RID |
-						DPIO_OP_READ | DPIO_PORTID | DPIO_BYTE);
-	do {
-		usleep(1);
-	} while (intel_display_reg_read(DPIO_PKT) & DPIO_BUSY);
-
-	return intel_display_reg_read(DPIO_DATA);
-}
-
-/*
- * In SoCs like Valleyview some of the PLL & Lane control registers
- * can be accessed only through IO side band fabric called DPIO
- */
-void
-intel_dpio_reg_write(uint32_t reg, uint32_t val)
-{
-	/* Check whether the side band fabric is ready to accept commands */
-	do {
-		usleep(1);
-	} while (intel_display_reg_read(DPIO_PKT) & DPIO_BUSY);
-
-	intel_display_reg_write(DPIO_DATA, val);
-	intel_display_reg_write(DPIO_REG, reg);
-	intel_display_reg_write(DPIO_PKT, DPIO_RID |
-						DPIO_OP_WRITE | DPIO_PORTID | DPIO_BYTE);
-	do {
-		usleep(1);
-	} while (intel_display_reg_read(DPIO_PKT) & DPIO_BUSY);
-}
diff --git a/lib/intel_gpu_tools.h b/lib/intel_gpu_tools.h
index faa948c..bd54171 100644
--- a/lib/intel_gpu_tools.h
+++ b/lib/intel_gpu_tools.h
@@ -112,4 +112,19 @@ void intel_check_pch(void);
 #define HAS_CPT (pch == PCH_CPT)
 #define HAS_LPT (pch == PCH_LPT)
 
+/*
+ * Kernel Shim
+ */
+
+/* Don't really care about locking atm */
+struct mutex
+{
+	int dummy;
+};
+
+struct drm_i915_private
+{
+	struct mutex dpio_lock;
+};
+
 #endif /* INTEL_GPU_TOOLS_H */
diff --git a/lib/intel_iosf.c b/lib/intel_iosf.c
deleted file mode 100644
index 0ab14df..0000000
--- a/lib/intel_iosf.c
+++ /dev/null
@@ -1,85 +0,0 @@
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <err.h>
-#include <errno.h>
-#include "intel_gpu_tools.h"
-
-#define TIMEOUT_US 500000
-
-static int vlv_punit_rw(uint32_t port, uint8_t opcode, uint8_t addr,
-			uint32_t *val)
-{
-	volatile uint32_t *ptr;
-	int timeout = 0;
-	uint32_t cmd, devfn, be, bar;
-
-	bar = 0;
-	be = 0xf;
-	devfn = 16;
-
-	cmd = (devfn << IOSF_DEVFN_SHIFT) | (opcode << IOSF_OPCODE_SHIFT) |
-		(port << IOSF_PORT_SHIFT) | (be << IOSF_BYTE_ENABLES_SHIFT) |
-		(bar << IOSF_BAR_SHIFT);
-
-	ptr = (volatile uint32_t*)((volatile char*)mmio +
-				   VLV_IOSF_DOORBELL_REQ);
-
-	if (*ptr & IOSF_SB_BUSY) {
-		fprintf(stderr, "warning: pcode (%s) mailbox access failed\n",
-			opcode == PUNIT_OPCODE_REG_READ ?
-			"read" : "write");
-		return -EAGAIN;
-	}
-
-	ptr = (volatile uint32_t*)((volatile char*)mmio + VLV_IOSF_ADDR);
-	*ptr = addr;
-	if (opcode == PUNIT_OPCODE_REG_WRITE) {
-		ptr = (volatile uint32_t*)((volatile char*)mmio +
-					   VLV_IOSF_DATA);
-		*ptr = *val;
-	}
-	ptr = (volatile uint32_t*)((volatile char*)mmio +
-				   VLV_IOSF_DOORBELL_REQ);
-	*ptr = cmd;
-	do {
-		usleep(1);
-		timeout++;
-	} while ((*ptr & IOSF_SB_BUSY) && timeout < TIMEOUT_US);
-
-	if (timeout >= TIMEOUT_US) {
-		fprintf(stderr, "timeout waiting for pcode %s (%d) to finish\n",
-			opcode == PUNIT_OPCODE_REG_READ ? "read" : "write",
-			addr);
-		return -ETIMEDOUT;
-	}
-
-	if (opcode == PUNIT_OPCODE_REG_READ) {
-		ptr = (volatile uint32_t*)((volatile char*)mmio +
-					   VLV_IOSF_DATA);
-		*val = *ptr;
-	}
-	*ptr = 0;
-
-	return 0;
-}
-
-int intel_punit_read(uint8_t addr, uint32_t *val)
-{
-	return vlv_punit_rw(IOSF_PORT_PUNIT, PUNIT_OPCODE_REG_READ, addr, val);
-}
-
-int intel_punit_write(uint8_t addr, uint32_t val)
-{
-	return vlv_punit_rw(IOSF_PORT_PUNIT, PUNIT_OPCODE_REG_WRITE, addr, &val);
-}
-
-int intel_nc_read(uint8_t addr, uint32_t *val)
-{
-	return vlv_punit_rw(IOSF_PORT_NC, PUNIT_OPCODE_REG_READ, addr, val);
-}
-
-int intel_nc_write(uint8_t addr, uint32_t val)
-{
-	return vlv_punit_rw(IOSF_PORT_NC, PUNIT_OPCODE_REG_WRITE, addr, &val);
-}
diff --git a/lib/intel_reg.h b/lib/intel_reg.h
index 065881b..173919c 100644
--- a/lib/intel_reg.h
+++ b/lib/intel_reg.h
@@ -3549,20 +3549,12 @@ typedef enum {
 
 /* Valleyview related items */
 
-/* Valleyview DPIO registers */
 #define VLV_DISPLAY_BASE	0x180000
-#define DPIO_PKT			0x2100
-#define  DPIO_RID			(0 << 24)
-#define  DPIO_OP_WRITE		(1 << 16)
-#define  DPIO_OP_READ		(0 << 16)
-#define  DPIO_PORTID		(0x12 << 8)
-#define  DPIO_BYTE			(0xf << 4)
-#define  DPIO_BUSY			(1 << 0)
-#define DPIO_DATA			0x2104
-#define DPIO_REG			0x2108
-
-/* VLV IOSF access */
-#define VLV_IOSF_DOORBELL_REQ			0x182100
+
+/*
+ * IOSF sideband
+ */
+#define VLV_IOSF_DOORBELL_REQ			(VLV_DISPLAY_BASE + 0x2100)
 #define   IOSF_DEVFN_SHIFT			24
 #define   IOSF_OPCODE_SHIFT			16
 #define   IOSF_PORT_SHIFT			8
@@ -3571,10 +3563,209 @@ typedef enum {
 #define   IOSF_SB_BUSY				(1<<0)
 #define   IOSF_PORT_PUNIT			0x4
 #define   IOSF_PORT_NC				0x11
-#define VLV_IOSF_DATA				0x182104
-#define VLV_IOSF_ADDR				0x182108
+#define   IOSF_PORT_DPIO			0x12
+#define VLV_IOSF_DATA				(VLV_DISPLAY_BASE + 0x2104)
+#define VLV_IOSF_ADDR				(VLV_DISPLAY_BASE + 0x2108)
 
 #define PUNIT_OPCODE_REG_READ			6
 #define PUNIT_OPCODE_REG_WRITE			7
 
+#define PUNIT_REG_GPU_LFM			0xd3
+#define PUNIT_REG_GPU_FREQ_REQ			0xd4
+#define PUNIT_REG_GPU_FREQ_STS			0xd8
+#define PUNIT_REG_MEDIA_TURBO_FREQ_REQ		0xdc
+
+#define PUNIT_FUSE_BUS2				0xf6 /* bits 47:40 */
+#define PUNIT_FUSE_BUS1				0xf5 /* bits 55:48 */
+
+#define IOSF_NC_FB_GFX_FREQ_FUSE		0x1c
+#define   FB_GFX_MAX_FREQ_FUSE_SHIFT		3
+#define   FB_GFX_MAX_FREQ_FUSE_MASK		0x000007f8
+#define   FB_GFX_FGUARANTEED_FREQ_FUSE_SHIFT	11
+#define   FB_GFX_FGUARANTEED_FREQ_FUSE_MASK	0x0007f800
+#define IOSF_NC_FB_GFX_FMAX_FUSE_HI		0x34
+#define   FB_FMAX_VMIN_FREQ_HI_MASK		0x00000007
+#define IOSF_NC_FB_GFX_FMAX_FUSE_LO		0x30
+#define   FB_FMAX_VMIN_FREQ_LO_SHIFT		27
+#define   FB_FMAX_VMIN_FREQ_LO_MASK		0xf8000000
+
+/*
+ * DPIO - a special bus for various display related registers to hide behind
+ *
+ * DPIO is VLV only.
+ *
+ * Note: digital port B is DDI0, digital port C is DDI1
+ */
+#define DPIO_DEVFN			0
+#define DPIO_OPCODE_REG_WRITE		1
+#define DPIO_OPCODE_REG_READ		0
+
+#define DPIO_CTL			(VLV_DISPLAY_BASE + 0x2110)
+#define  DPIO_MODSEL1			(1<<3) /* if ref clk b == 27 */
+#define  DPIO_MODSEL0			(1<<2) /* if ref clk a == 27 */
+#define  DPIO_SFR_BYPASS		(1<<1)
+#define  DPIO_RESET			(1<<0)
+
+#define _DPIO_TX3_SWING_CTL4_A		0x690
+#define _DPIO_TX3_SWING_CTL4_B		0x2a90
+#define DPIO_TX3_SWING_CTL4(pipe) _PIPE(pipe, _DPIO_TX_SWING_CTL4_A, \
+					_DPIO_TX3_SWING_CTL4_B)
+
+/*
+ * Per pipe/PLL DPIO regs
+ */
+#define _DPIO_DIV_A			0x800c
+#define   DPIO_POST_DIV_SHIFT		(28) /* 3 bits */
+#define   DPIO_POST_DIV_DAC		0
+#define   DPIO_POST_DIV_HDMIDP		1 /* DAC 225-400M rate */
+#define   DPIO_POST_DIV_LVDS1		2
+#define   DPIO_POST_DIV_LVDS2		3
+#define   DPIO_K_SHIFT			(24) /* 4 bits */
+#define   DPIO_P1_SHIFT			(21) /* 3 bits */
+#define   DPIO_P2_SHIFT			(16) /* 5 bits */
+#define   DPIO_N_SHIFT			(12) /* 4 bits */
+#define   DPIO_ENABLE_CALIBRATION	(1<<11)
+#define   DPIO_M1DIV_SHIFT		(8) /* 3 bits */
+#define   DPIO_M2DIV_MASK		0xff
+#define _DPIO_DIV_B			0x802c
+#define DPIO_DIV(pipe) _PIPE(pipe, _DPIO_DIV_A, _DPIO_DIV_B)
+
+#define _DPIO_REFSFR_A			0x8014
+#define   DPIO_REFSEL_OVERRIDE		27
+#define   DPIO_PLL_MODESEL_SHIFT	24 /* 3 bits */
+#define   DPIO_BIAS_CURRENT_CTL_SHIFT	21 /* 3 bits, always 0x7 */
+#define   DPIO_PLL_REFCLK_SEL_SHIFT	16 /* 2 bits */
+#define   DPIO_PLL_REFCLK_SEL_MASK	3
+#define   DPIO_DRIVER_CTL_SHIFT		12 /* always set to 0x8 */
+#define   DPIO_CLK_BIAS_CTL_SHIFT	8 /* always set to 0x5 */
+#define _DPIO_REFSFR_B			0x8034
+#define DPIO_REFSFR(pipe) _PIPE(pipe, _DPIO_REFSFR_A, _DPIO_REFSFR_B)
+
+#define _DPIO_CORE_CLK_A		0x801c
+#define _DPIO_CORE_CLK_B		0x803c
+#define DPIO_CORE_CLK(pipe) _PIPE(pipe, _DPIO_CORE_CLK_A, _DPIO_CORE_CLK_B)
+
+#define _DPIO_IREF_CTL_A		0x8040
+#define _DPIO_IREF_CTL_B		0x8060
+#define DPIO_IREF_CTL(pipe) _PIPE(pipe, _DPIO_IREF_CTL_A, _DPIO_IREF_CTL_B)
+
+#define DPIO_IREF_BCAST			0xc044
+#define _DPIO_IREF_A			0x8044
+#define _DPIO_IREF_B			0x8064
+#define DPIO_IREF(pipe) _PIPE(pipe, _DPIO_IREF_A, _DPIO_IREF_B)
+
+#define _DPIO_PLL_CML_A			0x804c
+#define _DPIO_PLL_CML_B			0x806c
+#define DPIO_PLL_CML(pipe) _PIPE(pipe, _DPIO_PLL_CML_A, _DPIO_PLL_CML_B)
+
+#define _DPIO_LFP_COEFF_A		0x8048
+#define _DPIO_LFP_COEFF_B		0x8068
+#define DPIO_LFP_COEFF(pipe) _PIPE(pipe, _DPIO_LFP_COEFF_A, _DPIO_LFP_COEFF_B)
+
+#define DPIO_CALIBRATION		0x80ac
+
+#define DPIO_FASTCLK_DISABLE		0x8100
+
+/*
+ * Per DDI channel DPIO regs
+ */
+
+#define _DPIO_PCS_TX_0			0x8200
+#define _DPIO_PCS_TX_1			0x8400
+#define   DPIO_PCS_TX_LANE2_RESET	(1<<16)
+#define   DPIO_PCS_TX_LANE1_RESET	(1<<7)
+#define DPIO_PCS_TX(port) _PORT(port, _DPIO_PCS_TX_0, _DPIO_PCS_TX_1)
+
+#define _DPIO_PCS_CLK_0			0x8204
+#define _DPIO_PCS_CLK_1			0x8404
+#define   DPIO_PCS_CLK_CRI_RXEB_EIOS_EN	(1<<22)
+#define   DPIO_PCS_CLK_CRI_RXDIGFILTSG_EN (1<<21)
+#define   DPIO_PCS_CLK_DATAWIDTH_SHIFT	(6)
+#define   DPIO_PCS_CLK_SOFT_RESET	(1<<5)
+#define DPIO_PCS_CLK(port) _PORT(port, _DPIO_PCS_CLK_0, _DPIO_PCS_CLK_1)
+
+#define _DPIO_PCS_CTL_OVR1_A		0x8224
+#define _DPIO_PCS_CTL_OVR1_B		0x8424
+#define DPIO_PCS_CTL_OVER1(port) _PORT(port, _DPIO_PCS_CTL_OVR1_A, \
+				       _DPIO_PCS_CTL_OVR1_B)
+
+#define _DPIO_PCS_STAGGER0_A		0x822c
+#define _DPIO_PCS_STAGGER0_B		0x842c
+#define DPIO_PCS_STAGGER0(port) _PORT(port, _DPIO_PCS_STAGGER0_A, \
+				      _DPIO_PCS_STAGGER0_B)
+
+#define _DPIO_PCS_STAGGER1_A		0x8230
+#define _DPIO_PCS_STAGGER1_B		0x8430
+#define DPIO_PCS_STAGGER1(port) _PORT(port, _DPIO_PCS_STAGGER1_A, \
+				      _DPIO_PCS_STAGGER1_B)
+
+#define _DPIO_PCS_CLOCKBUF0_A		0x8238
+#define _DPIO_PCS_CLOCKBUF0_B		0x8438
+#define DPIO_PCS_CLOCKBUF0(port) _PORT(port, _DPIO_PCS_CLOCKBUF0_A, \
+				       _DPIO_PCS_CLOCKBUF0_B)
+
+#define _DPIO_PCS_CLOCKBUF8_A		0x825c
+#define _DPIO_PCS_CLOCKBUF8_B		0x845c
+#define DPIO_PCS_CLOCKBUF8(port) _PORT(port, _DPIO_PCS_CLOCKBUF8_A, \
+				       _DPIO_PCS_CLOCKBUF8_B)
+
+#define _DPIO_TX_SWING_CTL2_A		0x8288
+#define _DPIO_TX_SWING_CTL2_B		0x8488
+#define DPIO_TX_SWING_CTL2(port) _PORT(port, _DPIO_TX_SWING_CTL2_A, \
+				       _DPIO_TX_SWING_CTL2_B)
+
+#define _DPIO_TX_SWING_CTL3_A		0x828c
+#define _DPIO_TX_SWING_CTL3_B		0x848c
+#define DPIO_TX_SWING_CTL3(port) _PORT(port, _DPIO_TX_SWING_CTL3_A, \
+				       _DPIO_TX_SWING_CTL3_B)
+
+#define _DPIO_TX_SWING_CTL4_A		0x8290
+#define _DPIO_TX_SWING_CTL4_B		0x8490
+#define DPIO_TX_SWING_CTL4(port) _PORT(port, _DPIO_TX_SWING_CTL4_A, \
+				       _DPIO_TX_SWING_CTL4_B)
+
+#define _DPIO_TX_OCALINIT_0		0x8294
+#define _DPIO_TX_OCALINIT_1		0x8494
+#define   DPIO_TX_OCALINIT_EN		(1<<31)
+#define DPIO_TX_OCALINIT(port) _PORT(port, _DPIO_TX_OCALINIT_0, \
+				     _DPIO_TX_OCALINIT_1)
+
+#define _DPIO_TX_CTL_0			0x82ac
+#define _DPIO_TX_CTL_1			0x84ac
+#define DPIO_TX_CTL(port) _PORT(port, _DPIO_TX_CTL_0, _DPIO_TX_CTL_1)
+
+#define _DPIO_TX_LANE_0			0x82b8
+#define _DPIO_TX_LANE_1			0x84b8
+#define DPIO_TX_LANE(port) _PORT(port, _DPIO_TX_LANE_0, _DPIO_TX_LANE_1)
+
+#define _DPIO_DATA_CHANNEL1		0x8220
+#define _DPIO_DATA_CHANNEL2		0x8420
+#define DPIO_DATA_CHANNEL(port) _PORT(port, _DPIO_DATA_CHANNEL1, _DPIO_DATA_CHANNEL2)
+
+#define _DPIO_PORT0_PCS0		0x0220
+#define _DPIO_PORT0_PCS1		0x0420
+#define _DPIO_PORT1_PCS2		0x2620
+#define _DPIO_PORT1_PCS3		0x2820
+#define DPIO_DATA_LANE_A(port) _PORT(port, _DPIO_PORT0_PCS0, _DPIO_PORT1_PCS2)
+#define DPIO_DATA_LANE_B(port) _PORT(port, _DPIO_PORT0_PCS1, _DPIO_PORT1_PCS3)
+#define DPIO_DATA_CHANNEL1              0x8220
+#define DPIO_DATA_CHANNEL2              0x8420
+
+/* Sideband Interface (SBI) is programmed indirectly, via
+ * SBI_ADDR, which contains the register offset; and SBI_DATA,
+ * which contains the payload */
+#define SBI_ADDR			0xC6000
+#define SBI_DATA			0xC6004
+#define SBI_CTL_STAT			0xC6008
+#define  SBI_CTL_DEST_ICLK		(0x0<<16)
+#define  SBI_CTL_DEST_MPHY		(0x1<<16)
+#define  SBI_CTL_OP_IORD		(0x2<<8)
+#define  SBI_CTL_OP_IOWR		(0x3<<8)
+#define  SBI_CTL_OP_CRRD		(0x6<<8)
+#define  SBI_CTL_OP_CRWR		(0x7<<8)
+#define  SBI_RESPONSE_FAIL		(0x1<<1)
+#define  SBI_RESPONSE_SUCCESS		(0x0<<1)
+#define  SBI_BUSY			(0x1<<0)
+#define  SBI_READY			(0x0<<0)
+
 #endif /* _I810_REG_H */
diff --git a/lib/intel_sideband.c b/lib/intel_sideband.c
new file mode 100644
index 0000000..0271944
--- /dev/null
+++ b/lib/intel_sideband.c
@@ -0,0 +1,191 @@
+/*
+ * This file is generated from scripts/sync-from-kernel, do not hand-edit.
+ * This file is is from kernel v3.9-rc1-15371-g393f670
+ */
+/*
+ * Copyright © 2013 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ *
+ */
+
+#include "i915_drv.h"
+#include "intel_drv.h"
+
+/* IOSF sideband */
+static int vlv_sideband_rw(struct drm_i915_private *dev_priv, u32 devfn,
+			   u32 port, u32 opcode, u32 addr, u32 *val)
+{
+	u32 cmd, be = 0xf, bar = 0;
+	bool is_read = (opcode == PUNIT_OPCODE_REG_READ ||
+			opcode == DPIO_OPCODE_REG_READ);
+
+	cmd = (devfn << IOSF_DEVFN_SHIFT) | (opcode << IOSF_OPCODE_SHIFT) |
+		(port << IOSF_PORT_SHIFT) | (be << IOSF_BYTE_ENABLES_SHIFT) |
+		(bar << IOSF_BAR_SHIFT);
+
+	WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
+
+	if (wait_for((I915_READ(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY) == 0, 5)) {
+		DRM_DEBUG_DRIVER("IOSF sideband idle wait (%s) timed out\n",
+				 is_read ? "read" : "write");
+		return -EAGAIN;
+	}
+
+	I915_WRITE(VLV_IOSF_ADDR, addr);
+	if (!is_read)
+		I915_WRITE(VLV_IOSF_DATA, *val);
+	I915_WRITE(VLV_IOSF_DOORBELL_REQ, cmd);
+
+	if (wait_for((I915_READ(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY) == 0, 5)) {
+		DRM_DEBUG_DRIVER("IOSF sideband finish wait (%s) timed out\n",
+				 is_read ? "read" : "write");
+		return -ETIMEDOUT;
+	}
+
+	if (is_read)
+		*val = I915_READ(VLV_IOSF_DATA);
+	I915_WRITE(VLV_IOSF_DATA, 0);
+
+	return 0;
+}
+
+u32 vlv_punit_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_PUNIT,
+			PUNIT_OPCODE_REG_READ, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+
+void vlv_punit_write(struct drm_i915_private *dev_priv, u8 addr, u32 val)
+{
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_PUNIT,
+			PUNIT_OPCODE_REG_WRITE, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+}
+
+u32 vlv_nc_read(struct drm_i915_private *dev_priv, u8 addr)
+{
+	u32 val = 0;
+
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_NC,
+			PUNIT_OPCODE_REG_READ, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+
+	return val;
+}
+
+void vlv_nc_write(struct drm_i915_private *dev_priv, u8 addr, u32 val)
+{
+	WARN_ON(!mutex_is_locked(&dev_priv->rps.hw_lock));
+
+	mutex_lock(&dev_priv->dpio_lock);
+	vlv_sideband_rw(dev_priv, PCI_DEVFN(2, 0), IOSF_PORT_NC,
+			PUNIT_OPCODE_REG_WRITE, addr, &val);
+	mutex_unlock(&dev_priv->dpio_lock);
+}
+
+u32 vlv_dpio_read(struct drm_i915_private *dev_priv, int reg)
+{
+	u32 val = 0;
+
+	vlv_sideband_rw(dev_priv, DPIO_DEVFN, IOSF_PORT_DPIO,
+			DPIO_OPCODE_REG_READ, reg, &val);
+
+	return val;
+}
+
+void vlv_dpio_write(struct drm_i915_private *dev_priv, int reg, u32 val)
+{
+	vlv_sideband_rw(dev_priv, DPIO_DEVFN, IOSF_PORT_DPIO,
+			DPIO_OPCODE_REG_WRITE, reg, &val);
+}
+
+/* SBI access */
+u32 intel_sbi_read(struct drm_i915_private *dev_priv, u16 reg,
+		   enum intel_sbi_destination destination)
+{
+	u32 value = 0;
+	WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
+
+	if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_BUSY) == 0,
+				100)) {
+		DRM_ERROR("timeout waiting for SBI to become ready\n");
+		return 0;
+	}
+
+	I915_WRITE(SBI_ADDR, (reg << 16));
+
+	if (destination == SBI_ICLK)
+		value = SBI_CTL_DEST_ICLK | SBI_CTL_OP_CRRD;
+	else
+		value = SBI_CTL_DEST_MPHY | SBI_CTL_OP_IORD;
+	I915_WRITE(SBI_CTL_STAT, value | SBI_BUSY);
+
+	if (wait_for((I915_READ(SBI_CTL_STAT) & (SBI_BUSY | SBI_RESPONSE_FAIL)) == 0,
+				100)) {
+		DRM_ERROR("timeout waiting for SBI to complete read transaction\n");
+		return 0;
+	}
+
+	return I915_READ(SBI_DATA);
+}
+
+void intel_sbi_write(struct drm_i915_private *dev_priv, u16 reg, u32 value,
+		     enum intel_sbi_destination destination)
+{
+	u32 tmp;
+
+	WARN_ON(!mutex_is_locked(&dev_priv->dpio_lock));
+
+	if (wait_for((I915_READ(SBI_CTL_STAT) & SBI_BUSY) == 0,
+				100)) {
+		DRM_ERROR("timeout waiting for SBI to become ready\n");
+		return;
+	}
+
+	I915_WRITE(SBI_ADDR, (reg << 16));
+	I915_WRITE(SBI_DATA, value);
+
+	if (destination == SBI_ICLK)
+		tmp = SBI_CTL_DEST_ICLK | SBI_CTL_OP_CRWR;
+	else
+		tmp = SBI_CTL_DEST_MPHY | SBI_CTL_OP_IOWR;
+	I915_WRITE(SBI_CTL_STAT, SBI_BUSY | tmp);
+
+	if (wait_for((I915_READ(SBI_CTL_STAT) & (SBI_BUSY | SBI_RESPONSE_FAIL)) == 0,
+				100)) {
+		DRM_ERROR("timeout waiting for SBI to complete write transaction\n");
+		return;
+	}
+}
diff --git a/tools/intel_dpio_read.c b/lib/intel_sideband.h
similarity index 52%
copy from tools/intel_dpio_read.c
copy to lib/intel_sideband.h
index c0c904a..45892f5 100644
--- a/tools/intel_dpio_read.c
+++ b/lib/intel_sideband.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -17,52 +17,30 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *		Vijay Purushothaman <vijay.a.purushothaman at intel.com>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
  *
  */
 
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <err.h>
-#include <string.h>
-#include "intel_gpu_tools.h"
-
-static void usage(char *cmdname)
-{
-	printf("Warning : This program will work only on Valleyview\n");
-	printf("Usage: %s [addr]\n", cmdname);
-	printf("\t addr : in 0xXXXX format\n");
-}
-
-int main(int argc, char** argv)
-{
-	int ret = 0;
-	uint32_t reg, val;
-	char *cmdname = strdup(argv[0]);
-	struct pci_device *dev = intel_get_pci_device();
-
-	if (argc != 2 || !IS_VALLEYVIEW(dev->device_id)) {
-		usage(cmdname);
-		ret = 1;
-		goto out;
-	}
-
-	sscanf(argv[1], "0x%x", &reg);
-
-	intel_register_access_init(dev, 0);
+#ifndef _INTEL_SIDEBAND_H_
+#define _INTEL_SIDEBAND_H_
 
-	val = intel_dpio_reg_read(reg);
+#include <stdint.h>
 
-	printf("Read DPIO register: 0x%x - Value : 0x%x\n", reg, val);
+enum intel_sbi_destination {
+	SBI_ICLK,
+	SBI_MPHY,
+};
 
-	intel_register_access_fini();
+uint32_t vlv_punit_read(struct drm_i915_private *dev_priv, uint8_t addr);
+void vlv_punit_write(struct drm_i915_private *dev_priv, uint8_t addr, uint32_t val);
+uint32_t vlv_nc_read(struct drm_i915_private *dev_priv, uint8_t addr);
+void vlv_nc_write(struct drm_i915_private *dev_priv, uint8_t addr, uint32_t val);
+uint32_t vlv_dpio_read(struct drm_i915_private *dev_priv, int reg);
+void vlv_dpio_write(struct drm_i915_private *dev_priv, int reg, uint32_t val);
+uint32_t intel_sbi_read(struct drm_i915_private *dev_priv, uint16_t reg,
+                   enum intel_sbi_destination destination);
+void intel_sbi_write(struct drm_i915_private *dev_priv, uint16_t reg, uint32_t value,
+                     enum intel_sbi_destination destination);
 
-out:
-	free(cmdname);
-	return ret;
-}
+#endif /* _INTEL_SIDEBAND_H_ */
diff --git a/tools/intel_dpio_write.c b/lib/kernel-shim/drm-shim.h
similarity index 55%
copy from tools/intel_dpio_write.c
copy to lib/kernel-shim/drm-shim.h
index f842999..a88cf16 100644
--- a/tools/intel_dpio_write.c
+++ b/lib/kernel-shim/drm-shim.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -17,51 +17,39 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *		Vijay Purushothaman <vijay.a.purushothaman at intel.com>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
  *
  */
 
-#include <unistd.h>
-#include <stdlib.h>
+#ifndef _DRM_SHIM_H_
+#define _DRM_SHIM_H_
+
 #include <stdio.h>
-#include <err.h>
-#include <string.h>
-#include "intel_gpu_tools.h"
 
-static void usage(char *cmdname)
-{
-	printf("Warning : This program will work only on Valleyview\n");
-	printf("Usage: %s [addr] [val]\n", cmdname);
-	printf("\t addr : in 0xXXXX format\n");
-}
+#define xstringify(s) #s
+#define stringify(s) xstringify(s)
 
-int main(int argc, char** argv)
-{
-	int ret = 0;
-	uint32_t reg, val;
-	char *cmdname = strdup(argv[0]);
-	struct pci_device *dev = intel_get_pci_device();
+#define STRLOC __FILE__ ":" stringify(__LINE__)
 
-	if (argc != 3 || !IS_VALLEYVIEW(dev->device_id)) {
-		usage(cmdname);
-		ret = 1;
-		goto out;
-	}
+#define DRM_ERROR(fmt, args...) ({			\
+	fprintf(stderr, "%s" fmt, STRLOC ": ", ##args);	\
+})
 
-	sscanf(argv[1], "0x%x", &reg);
-	sscanf(argv[2], "0x%x", &val);
+#define DRM_INFO(fmt, args...) ({			\
+	fprintf(stdout, "%s" fmt, STRLOC ": ", ##args);	\
+})
 
-	intel_register_access_init(dev, 0);
+#define DRM_DEBUG(fmt, args...) ({			\
+	fprintf(stderr, "%s" fmt, STRLOC ": ", ##args);	\
+})
 
-	intel_dpio_reg_write(reg, val);
+#define DRM_DEBUG_DRIVER(fmt, args...) ({		\
+	fprintf(stderr, "%s" fmt, STRLOC ": ", ##args);	\
+})
 
-	intel_register_access_fini();
+#define DRM_DEBUG_KMS(fmt, args...) ({			\
+	fprintf(stderr, "%s" fmt, STRLOC ": ", ##args);	\
+})
 
-out:
-	free(cmdname);
-	return ret;
-}
+#endif /* _DRM_SHIM_H_ */
diff --git a/tools/intel_dpio_write.c b/lib/kernel-shim/i915_drv.h
similarity index 55%
copy from tools/intel_dpio_write.c
copy to lib/kernel-shim/i915_drv.h
index f842999..16d9d90 100644
--- a/tools/intel_dpio_write.c
+++ b/lib/kernel-shim/i915_drv.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -17,51 +17,22 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *		Vijay Purushothaman <vijay.a.purushothaman at intel.com>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
  *
  */
 
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <err.h>
-#include <string.h>
-#include "intel_gpu_tools.h"
-
-static void usage(char *cmdname)
-{
-	printf("Warning : This program will work only on Valleyview\n");
-	printf("Usage: %s [addr] [val]\n", cmdname);
-	printf("\t addr : in 0xXXXX format\n");
-}
+#ifndef _I915_DRV_H_
+#define _I915_DRV_H_
 
-int main(int argc, char** argv)
-{
-	int ret = 0;
-	uint32_t reg, val;
-	char *cmdname = strdup(argv[0]);
-	struct pci_device *dev = intel_get_pci_device();
+#include "kernel.h"
+#include "drm-shim.h"
 
-	if (argc != 3 || !IS_VALLEYVIEW(dev->device_id)) {
-		usage(cmdname);
-		ret = 1;
-		goto out;
-	}
-
-	sscanf(argv[1], "0x%x", &reg);
-	sscanf(argv[2], "0x%x", &val);
-
-	intel_register_access_init(dev, 0);
+#include "intel_gpu_tools.h"
 
-	intel_dpio_reg_write(reg, val);
+#define I915_READ(reg)		intel_register_read((reg))
+#define I915_WRITE(reg, val)	intel_register_write((reg), (val))
 
-	intel_register_access_fini();
+#include "intel_sideband.h"
 
-out:
-	free(cmdname);
-	return ret;
-}
+#endif /* _I915_DRV_H_ */
diff --git a/tools/intel_dpio_write.c b/lib/kernel-shim/intel_drv.h
similarity index 55%
copy from tools/intel_dpio_write.c
copy to lib/kernel-shim/intel_drv.h
index f842999..582643b 100644
--- a/tools/intel_dpio_write.c
+++ b/lib/kernel-shim/intel_drv.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -17,51 +17,32 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *		Vijay Purushothaman <vijay.a.purushothaman at intel.com>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
  *
  */
 
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <err.h>
-#include <string.h>
-#include "intel_gpu_tools.h"
-
-static void usage(char *cmdname)
-{
-	printf("Warning : This program will work only on Valleyview\n");
-	printf("Usage: %s [addr] [val]\n", cmdname);
-	printf("\t addr : in 0xXXXX format\n");
-}
-
-int main(int argc, char** argv)
-{
-	int ret = 0;
-	uint32_t reg, val;
-	char *cmdname = strdup(argv[0]);
-	struct pci_device *dev = intel_get_pci_device();
-
-	if (argc != 3 || !IS_VALLEYVIEW(dev->device_id)) {
-		usage(cmdname);
-		ret = 1;
-		goto out;
-	}
+#ifndef _INTEL_DRV_H_
+#define _INTEL_DRV_H_
 
-	sscanf(argv[1], "0x%x", &reg);
-	sscanf(argv[2], "0x%x", &val);
-
-	intel_register_access_init(dev, 0);
-
-	intel_dpio_reg_write(reg, val);
-
-	intel_register_access_fini();
+#include <unistd.h>
 
-out:
-	free(cmdname);
-	return ret;
-}
+#include "kernel.h"
+
+/* rather crude, but hopefully good enough */
+#define wait_for(COND, MS) ({				\
+	unsigned int elapsed_ms = 0;			\
+	int ret__  = 0;					\
+	while (!(COND)) {				\
+		if (elapsed_ms > (MS)) {		\
+			ret__ = -ETIMEDOUT;		\
+			break;				\
+		}					\
+							\
+		usleep(1000);				\
+		elapsed_ms++;				\
+	}						\
+	ret__;						\
+})
+
+#endif /* _INTEL_DRV_H_ */
diff --git a/tools/intel_dpio_read.c b/lib/kernel-shim/kernel.h
similarity index 52%
copy from tools/intel_dpio_read.c
copy to lib/kernel-shim/kernel.h
index c0c904a..e621408 100644
--- a/tools/intel_dpio_read.c
+++ b/lib/kernel-shim/kernel.h
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2012 Intel Corporation
+ * Copyright © 2013 Intel Corporation
  *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
@@ -17,52 +17,54 @@
  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Authors:
- *		Vijay Purushothaman <vijay.a.purushothaman at intel.com>
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
  *
  */
 
-#include <unistd.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <err.h>
-#include <string.h>
+#ifndef _KERNEL_H_
+#define _KERNEL_H_
+
+#include <stdint.h>
+#include <stdbool.h>
+#include <errno.h>
+
 #include "intel_gpu_tools.h"
 
-static void usage(char *cmdname)
+typedef uint64_t           u64;
+typedef int64_t            s64;
+typedef unsigned int       u32;
+typedef signed int         s32;
+typedef unsigned short     u16;
+typedef signed short       s16;
+typedef unsigned char      u8;
+typedef signed char        s8;
+
+static inline int mutex_is_locked(struct mutex *lock)
 {
-	printf("Warning : This program will work only on Valleyview\n");
-	printf("Usage: %s [addr]\n", cmdname);
-	printf("\t addr : in 0xXXXX format\n");
+	return 1;
 }
 
-int main(int argc, char** argv)
+static inline void mutex_lock(struct mutex *lock)
 {
-	int ret = 0;
-	uint32_t reg, val;
-	char *cmdname = strdup(argv[0]);
-	struct pci_device *dev = intel_get_pci_device();
-
-	if (argc != 2 || !IS_VALLEYVIEW(dev->device_id)) {
-		usage(cmdname);
-		ret = 1;
-		goto out;
-	}
-
-	sscanf(argv[1], "0x%x", &reg);
-
-	intel_register_access_init(dev, 0);
+}
 
-	val = intel_dpio_reg_read(reg);
+static inline void mutex_unlock(struct mutex *lock)
+{
+}
 
-	printf("Read DPIO register: 0x%x - Value : 0x%x\n", reg, val);
+#define WARN_ON(cond)
 
-	intel_register_access_fini();
+/*
+ * The PCI interface treats multi-function devices as independent
+ * devices.  The slot/function address of each device is encoded
+ * in a single byte as follows:
+ *
+ *      7:3 = slot
+ *      2:0 = function
+ */
+#define PCI_DEVFN(slot, func)   ((((slot) & 0x1f) << 3) | ((func) & 0x07))
+#define PCI_SLOT(devfn)         (((devfn) >> 3) & 0x1f)
+#define PCI_FUNC(devfn)         ((devfn) & 0x07)
 
-out:
-	free(cmdname);
-	return ret;
-}
+#endif /* _KERNEL_TYPES_H_ */
diff --git a/scripts/sync-from-kernel b/scripts/sync-from-kernel
new file mode 100755
index 0000000..6940815
--- /dev/null
+++ b/scripts/sync-from-kernel
@@ -0,0 +1,30 @@
+#!/bin/bash
+
+kernel_path=$1
+[ -z "$kernel_path" ] && kernel_path=.
+
+[ -f $kernel_path/Kconfig ] || {
+	echo "$kernel_path is not a path to a kernel"
+	exit 1
+}
+
+kernel_description=$(cd $kernel_path; git describe)
+echo Using $kernel_description
+
+read -r -d '' header <<EOF
+/*
+ * This file is generated from scripts/sync-from-kernel, do not hand-edit.
+ * This file is is from kernel $kernel_description
+ */
+EOF
+
+function import {
+	src=$1
+	dst=$2
+
+	echo "Importing `basename $src`"
+	echo "$header" > $dst
+	cat $kernel_path/$src >> $dst
+}
+
+import "$kernel_path/drivers/gpu/drm/i915/intel_sideband.c" lib/intel_sideband.c
diff --git a/tools/intel_dpio_read.c b/tools/intel_dpio_read.c
index c0c904a..52c6080 100644
--- a/tools/intel_dpio_read.c
+++ b/tools/intel_dpio_read.c
@@ -31,6 +31,7 @@
 #include <err.h>
 #include <string.h>
 #include "intel_gpu_tools.h"
+#include "intel_sideband.h"
 
 static void usage(char *cmdname)
 {
@@ -45,6 +46,7 @@ int main(int argc, char** argv)
 	uint32_t reg, val;
 	char *cmdname = strdup(argv[0]);
 	struct pci_device *dev = intel_get_pci_device();
+	struct drm_i915_private dev_priv;
 
 	if (argc != 2 || !IS_VALLEYVIEW(dev->device_id)) {
 		usage(cmdname);
@@ -56,7 +58,7 @@ int main(int argc, char** argv)
 
 	intel_register_access_init(dev, 0);
 
-	val = intel_dpio_reg_read(reg);
+	val = vlv_dpio_read(&dev_priv, reg);
 
 	printf("Read DPIO register: 0x%x - Value : 0x%x\n", reg, val);
 
diff --git a/tools/intel_dpio_write.c b/tools/intel_dpio_write.c
index f842999..0d519c8 100644
--- a/tools/intel_dpio_write.c
+++ b/tools/intel_dpio_write.c
@@ -31,6 +31,7 @@
 #include <err.h>
 #include <string.h>
 #include "intel_gpu_tools.h"
+#include "intel_sideband.h"
 
 static void usage(char *cmdname)
 {
@@ -45,6 +46,7 @@ int main(int argc, char** argv)
 	uint32_t reg, val;
 	char *cmdname = strdup(argv[0]);
 	struct pci_device *dev = intel_get_pci_device();
+	struct drm_i915_private dev_priv;
 
 	if (argc != 3 || !IS_VALLEYVIEW(dev->device_id)) {
 		usage(cmdname);
@@ -57,7 +59,7 @@ int main(int argc, char** argv)
 
 	intel_register_access_init(dev, 0);
 
-	intel_dpio_reg_write(reg, val);
+	vlv_dpio_write(&dev_priv, reg, val);
 
 	intel_register_access_fini();
 
diff --git a/tools/intel_nc_read.c b/tools/intel_nc_read.c
index a2c2e9f..3386305 100644
--- a/tools/intel_nc_read.c
+++ b/tools/intel_nc_read.c
@@ -31,6 +31,7 @@
 #include <err.h>
 #include <string.h>
 #include "intel_gpu_tools.h"
+#include "intel_sideband.h"
 
 static void usage(char *cmdname)
 {
@@ -45,6 +46,7 @@ int main(int argc, char** argv)
 	uint32_t reg, val;
 	char *cmdname = strdup(argv[0]);
 	struct pci_device *dev = intel_get_pci_device();
+	struct drm_i915_private dev_priv;
 
 	if (argc != 2 || !IS_VALLEYVIEW(dev->device_id)) {
 		usage(cmdname);
@@ -56,9 +58,7 @@ int main(int argc, char** argv)
 
 	intel_register_access_init(dev, 0);
 
-	ret = intel_nc_read(reg, &val);
-	if (ret)
-		fprintf(stderr, "iosf read failed: %d\n", ret);
+	val = vlv_nc_read(&dev_priv, reg);
 
 	printf("Read IOSF register: 0x%x - Value : 0x%x\n", reg, val);
 
diff --git a/tools/intel_nc_write.c b/tools/intel_nc_write.c
index 58be79a..047269a 100644
--- a/tools/intel_nc_write.c
+++ b/tools/intel_nc_write.c
@@ -31,6 +31,7 @@
 #include <err.h>
 #include <string.h>
 #include "intel_gpu_tools.h"
+#include "intel_sideband.h"
 
 static void usage(char *cmdname)
 {
@@ -45,6 +46,7 @@ int main(int argc, char** argv)
 	uint32_t reg, val, tmp;
 	char *cmdname = strdup(argv[0]);
 	struct pci_device *dev = intel_get_pci_device();
+	struct drm_i915_private dev_priv;
 
 	if (argc != 3 || !IS_VALLEYVIEW(dev->device_id)) {
 		usage(cmdname);
@@ -57,14 +59,12 @@ int main(int argc, char** argv)
 
 	intel_register_access_init(dev, 0);
 
-	intel_nc_read(reg, &tmp);
+	tmp = vlv_nc_read(&dev_priv, reg);
 	printf("Value before: 0x%X\n", tmp);
 
-	ret = intel_nc_write(reg, val);
-	if (ret)
-		fprintf(stderr, "Nc write failed: %d\n", ret);
+	vlv_nc_write(&dev_priv, reg, val);
 
-	intel_nc_read(reg, &tmp);
+	tmp = vlv_nc_read(&dev_priv, reg);
 	printf("Value after: 0x%X\n", tmp);
 
 	intel_register_access_fini();
diff --git a/tools/intel_punit_read.c b/tools/intel_punit_read.c
index 3fa2ca8..4661825 100644
--- a/tools/intel_punit_read.c
+++ b/tools/intel_punit_read.c
@@ -31,6 +31,7 @@
 #include <err.h>
 #include <string.h>
 #include "intel_gpu_tools.h"
+#include "intel_sideband.h"
 
 static void usage(char *cmdname)
 {
@@ -45,6 +46,7 @@ int main(int argc, char** argv)
 	uint32_t reg, val;
 	char *cmdname = strdup(argv[0]);
 	struct pci_device *dev = intel_get_pci_device();
+	struct drm_i915_private dev_priv;
 
 	if (argc != 2 || !IS_VALLEYVIEW(dev->device_id)) {
 		usage(cmdname);
@@ -56,9 +58,7 @@ int main(int argc, char** argv)
 
 	intel_register_access_init(dev, 0);
 
-	ret = intel_punit_read(reg, &val);
-	if (ret)
-		fprintf(stderr, "iosf read failed: %d\n", ret);
+	val = vlv_punit_read(&dev_priv, reg);
 
 	printf("Read IOSF register: 0x%x - Value : 0x%x\n", reg, val);
 
diff --git a/tools/intel_punit_write.c b/tools/intel_punit_write.c
index eb036ba..30d4522 100644
--- a/tools/intel_punit_write.c
+++ b/tools/intel_punit_write.c
@@ -31,6 +31,7 @@
 #include <err.h>
 #include <string.h>
 #include "intel_gpu_tools.h"
+#include "intel_sideband.h"
 
 static void usage(char *cmdname)
 {
@@ -45,6 +46,7 @@ int main(int argc, char** argv)
 	uint32_t reg, val, tmp;
 	char *cmdname = strdup(argv[0]);
 	struct pci_device *dev = intel_get_pci_device();
+	struct drm_i915_private dev_priv;
 
 	if (argc != 3 || !IS_VALLEYVIEW(dev->device_id)) {
 		usage(cmdname);
@@ -57,14 +59,12 @@ int main(int argc, char** argv)
 
 	intel_register_access_init(dev, 0);
 
-	intel_punit_read(reg, &tmp);
+	tmp = vlv_punit_read(&dev_priv, reg);
 	printf("Value before: 0x%X\n", tmp);
 
-	ret = intel_punit_write(reg, val);
-	if (ret)
-		fprintf(stderr, "Punit write failed: %d\n", ret);
+	vlv_punit_write(&dev_priv, reg, val);
 
-	intel_punit_read(reg, &tmp);
+	tmp = vlv_punit_read(&dev_priv, reg);
 	printf("Value after: 0x%X\n", tmp);
 
 	intel_register_access_fini();
-- 
1.8.1.4




More information about the Intel-gfx mailing list