[PATCH 2/6] drm/i915: add generic read/write functions for VLV IOSF SB

Jani Nikula jani.nikula at intel.com
Fri Apr 25 13:19:20 UTC 2025


The read/write functions will be helpful for rewriting the unit specific
functions.

Signed-off-by: Jani Nikula <jani.nikula at intel.com>
---
 drivers/gpu/drm/i915/vlv_iosf_sb.c            | 73 +++++++++++++++++++
 drivers/gpu/drm/i915/vlv_iosf_sb.h            |  6 +-
 .../drm/xe/compat-i915-headers/vlv_iosf_sb.h  |  9 ++-
 3 files changed, 83 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/vlv_iosf_sb.c b/drivers/gpu/drm/i915/vlv_iosf_sb.c
index 91703c6c478c..33c282adfff6 100644
--- a/drivers/gpu/drm/i915/vlv_iosf_sb.c
+++ b/drivers/gpu/drm/i915/vlv_iosf_sb.c
@@ -123,6 +123,79 @@ static int vlv_sideband_rw(struct drm_i915_private *i915,
 	return err;
 }
 
+static u32 unit_to_devfn(enum vlv_iosf_sb_unit unit)
+{
+	if (unit == VLV_IOSF_SB_DPIO || unit == VLV_IOSF_SB_DPIO_2 ||
+	    unit == VLV_IOSF_SB_FLISDSI)
+		return DPIO_DEVFN;
+	else
+		return PCI_DEVFN(0, 0);
+}
+
+static u32 unit_to_port(enum vlv_iosf_sb_unit unit)
+{
+	switch (unit) {
+	case VLV_IOSF_SB_BUNIT:
+		return IOSF_PORT_BUNIT;
+	case VLV_IOSF_SB_CCK:
+		return IOSF_PORT_CCK;
+	case VLV_IOSF_SB_CCU:
+		return IOSF_PORT_CCU;
+	case VLV_IOSF_SB_DPIO:
+		return IOSF_PORT_DPIO;
+	case VLV_IOSF_SB_DPIO_2:
+		return IOSF_PORT_DPIO_2;
+	case VLV_IOSF_SB_FLISDSI:
+		return IOSF_PORT_FLISDSI;
+	case VLV_IOSF_SB_GPIO:
+		return 0; /* FIXME: unused */
+	case VLV_IOSF_SB_NC:
+		return IOSF_PORT_NC;
+	case VLV_IOSF_SB_PUNIT:
+		return IOSF_PORT_PUNIT;
+	default:
+		return 0;
+	}
+}
+
+static u32 unit_to_opcode(enum vlv_iosf_sb_unit unit, bool write)
+{
+	if (unit == VLV_IOSF_SB_DPIO || unit == VLV_IOSF_SB_DPIO_2)
+		return write ? SB_MWR_NP : SB_MRD_NP;
+	else
+		return write ? SB_CRWRDA_NP : SB_CRRDDA_NP;
+}
+
+u32 vlv_iosf_sb_read(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr)
+{
+	u32 devfn, port, opcode, val = 0;
+
+	devfn = unit_to_devfn(unit);
+	port = unit_to_port(unit);
+	opcode = unit_to_opcode(unit, false);
+
+	if (drm_WARN_ONCE(&i915->drm, !port, "invalid unit %d\n", unit))
+	    return 0;
+
+	vlv_sideband_rw(i915, devfn, port, opcode, addr, &val);
+
+	return val;
+}
+
+int vlv_iosf_sb_write(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr, u32 val)
+{
+	u32 devfn, port, opcode;
+
+	devfn = unit_to_devfn(unit);
+	port = unit_to_port(unit);
+	opcode = unit_to_opcode(unit, true);
+
+	if (drm_WARN_ONCE(&i915->drm, !port, "invalid unit %d\n", unit))
+	    return -EINVAL;
+
+	return vlv_sideband_rw(i915, devfn, port, opcode, addr, &val);
+}
+
 u32 vlv_punit_read(struct drm_i915_private *i915, u32 addr)
 {
 	u32 val = 0;
diff --git a/drivers/gpu/drm/i915/vlv_iosf_sb.h b/drivers/gpu/drm/i915/vlv_iosf_sb.h
index 380b96089cda..26af3aa973f8 100644
--- a/drivers/gpu/drm/i915/vlv_iosf_sb.h
+++ b/drivers/gpu/drm/i915/vlv_iosf_sb.h
@@ -14,11 +14,12 @@
 enum dpio_phy;
 struct drm_i915_private;
 
-enum {
+enum vlv_iosf_sb_unit {
 	VLV_IOSF_SB_BUNIT,
 	VLV_IOSF_SB_CCK,
 	VLV_IOSF_SB_CCU,
 	VLV_IOSF_SB_DPIO,
+	VLV_IOSF_SB_DPIO_2,
 	VLV_IOSF_SB_FLISDSI,
 	VLV_IOSF_SB_GPIO,
 	VLV_IOSF_SB_NC,
@@ -31,6 +32,9 @@ void vlv_iosf_sb_fini(struct drm_i915_private *i915);
 void vlv_iosf_sb_get(struct drm_i915_private *i915, unsigned long ports);
 void vlv_iosf_sb_put(struct drm_i915_private *i915, unsigned long ports);
 
+u32 vlv_iosf_sb_read(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr);
+int vlv_iosf_sb_write(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr, u32 val);
+
 static inline void vlv_bunit_get(struct drm_i915_private *i915)
 {
 	vlv_iosf_sb_get(i915, BIT(VLV_IOSF_SB_BUNIT));
diff --git a/drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h b/drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h
index b42a518a79e0..57f7dde90ced 100644
--- a/drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h
+++ b/drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h
@@ -13,11 +13,12 @@
 enum pipe;
 struct drm_i915_private;
 
-enum {
+enum vlv_iosf_sb_unit {
 	VLV_IOSF_SB_BUNIT,
 	VLV_IOSF_SB_CCK,
 	VLV_IOSF_SB_CCU,
 	VLV_IOSF_SB_DPIO,
+	VLV_IOSF_SB_DPIO_2,
 	VLV_IOSF_SB_FLISDSI,
 	VLV_IOSF_SB_GPIO,
 	VLV_IOSF_SB_NC,
@@ -27,13 +28,13 @@ enum {
 static inline void vlv_iosf_sb_get(struct drm_i915_private *i915, unsigned long ports)
 {
 }
-static inline u32 vlv_iosf_sb_read(struct drm_i915_private *i915, u8 port, u32 reg)
+static inline u32 vlv_iosf_sb_read(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr)
 {
 	return 0;
 }
-static inline void vlv_iosf_sb_write(struct drm_i915_private *i915,
-				     u8 port, u32 reg, u32 val)
+static inline int vlv_iosf_sb_write(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr, u32 val)
 {
+	return 0;
 }
 static inline void vlv_iosf_sb_put(struct drm_i915_private *i915, unsigned long ports)
 {
-- 
2.39.5



More information about the Intel-xe mailing list