]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/i915: add generic read/write functions for VLV IOSF SB
authorJani Nikula <jani.nikula@intel.com>
Mon, 12 May 2025 14:56:53 +0000 (17:56 +0300)
committerJani Nikula <jani.nikula@intel.com>
Tue, 13 May 2025 07:26:45 +0000 (10:26 +0300)
The read/write functions will be helpful for rewriting the unit specific
functions.

v2: Fix checkpatch complaint on indent

Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://lore.kernel.org/r/babe42609c7a2056aff301320efbda534d20ad82.1747061743.git.jani.nikula@intel.com
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
drivers/gpu/drm/i915/vlv_iosf_sb.c
drivers/gpu/drm/i915/vlv_iosf_sb.h
drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h

index 91703c6c478c5050762cf340a86719ea265470f4..aaed876a1f2e7008342b027ee817961bec92e0fa 100644 (file)
@@ -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;
index 380b96089cda878edb18cb13d13e7f73e3bfc4aa..26af3aa973f8ba1ed8619302482f4e4301cae8b6 100644 (file)
 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));
index b42a518a79e0a0f72d2614d327e29f27628f0273..57f7dde90ced81ab74cb0f3b806411be47979d59 100644 (file)
 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)
 {