Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/i915: add generic read/write functions for VLV IOSF SB

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>

+83 -5
+73
drivers/gpu/drm/i915/vlv_iosf_sb.c
··· 123 123 return err; 124 124 } 125 125 126 + static u32 unit_to_devfn(enum vlv_iosf_sb_unit unit) 127 + { 128 + if (unit == VLV_IOSF_SB_DPIO || unit == VLV_IOSF_SB_DPIO_2 || 129 + unit == VLV_IOSF_SB_FLISDSI) 130 + return DPIO_DEVFN; 131 + else 132 + return PCI_DEVFN(0, 0); 133 + } 134 + 135 + static u32 unit_to_port(enum vlv_iosf_sb_unit unit) 136 + { 137 + switch (unit) { 138 + case VLV_IOSF_SB_BUNIT: 139 + return IOSF_PORT_BUNIT; 140 + case VLV_IOSF_SB_CCK: 141 + return IOSF_PORT_CCK; 142 + case VLV_IOSF_SB_CCU: 143 + return IOSF_PORT_CCU; 144 + case VLV_IOSF_SB_DPIO: 145 + return IOSF_PORT_DPIO; 146 + case VLV_IOSF_SB_DPIO_2: 147 + return IOSF_PORT_DPIO_2; 148 + case VLV_IOSF_SB_FLISDSI: 149 + return IOSF_PORT_FLISDSI; 150 + case VLV_IOSF_SB_GPIO: 151 + return 0; /* FIXME: unused */ 152 + case VLV_IOSF_SB_NC: 153 + return IOSF_PORT_NC; 154 + case VLV_IOSF_SB_PUNIT: 155 + return IOSF_PORT_PUNIT; 156 + default: 157 + return 0; 158 + } 159 + } 160 + 161 + static u32 unit_to_opcode(enum vlv_iosf_sb_unit unit, bool write) 162 + { 163 + if (unit == VLV_IOSF_SB_DPIO || unit == VLV_IOSF_SB_DPIO_2) 164 + return write ? SB_MWR_NP : SB_MRD_NP; 165 + else 166 + return write ? SB_CRWRDA_NP : SB_CRRDDA_NP; 167 + } 168 + 169 + u32 vlv_iosf_sb_read(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr) 170 + { 171 + u32 devfn, port, opcode, val = 0; 172 + 173 + devfn = unit_to_devfn(unit); 174 + port = unit_to_port(unit); 175 + opcode = unit_to_opcode(unit, false); 176 + 177 + if (drm_WARN_ONCE(&i915->drm, !port, "invalid unit %d\n", unit)) 178 + return 0; 179 + 180 + vlv_sideband_rw(i915, devfn, port, opcode, addr, &val); 181 + 182 + return val; 183 + } 184 + 185 + int vlv_iosf_sb_write(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr, u32 val) 186 + { 187 + u32 devfn, port, opcode; 188 + 189 + devfn = unit_to_devfn(unit); 190 + port = unit_to_port(unit); 191 + opcode = unit_to_opcode(unit, true); 192 + 193 + if (drm_WARN_ONCE(&i915->drm, !port, "invalid unit %d\n", unit)) 194 + return -EINVAL; 195 + 196 + return vlv_sideband_rw(i915, devfn, port, opcode, addr, &val); 197 + } 198 + 126 199 u32 vlv_punit_read(struct drm_i915_private *i915, u32 addr) 127 200 { 128 201 u32 val = 0;
+5 -1
drivers/gpu/drm/i915/vlv_iosf_sb.h
··· 14 14 enum dpio_phy; 15 15 struct drm_i915_private; 16 16 17 - enum { 17 + enum vlv_iosf_sb_unit { 18 18 VLV_IOSF_SB_BUNIT, 19 19 VLV_IOSF_SB_CCK, 20 20 VLV_IOSF_SB_CCU, 21 21 VLV_IOSF_SB_DPIO, 22 + VLV_IOSF_SB_DPIO_2, 22 23 VLV_IOSF_SB_FLISDSI, 23 24 VLV_IOSF_SB_GPIO, 24 25 VLV_IOSF_SB_NC, ··· 31 30 32 31 void vlv_iosf_sb_get(struct drm_i915_private *i915, unsigned long ports); 33 32 void vlv_iosf_sb_put(struct drm_i915_private *i915, unsigned long ports); 33 + 34 + u32 vlv_iosf_sb_read(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr); 35 + int vlv_iosf_sb_write(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr, u32 val); 34 36 35 37 static inline void vlv_bunit_get(struct drm_i915_private *i915) 36 38 {
+5 -4
drivers/gpu/drm/xe/compat-i915-headers/vlv_iosf_sb.h
··· 13 13 enum pipe; 14 14 struct drm_i915_private; 15 15 16 - enum { 16 + enum vlv_iosf_sb_unit { 17 17 VLV_IOSF_SB_BUNIT, 18 18 VLV_IOSF_SB_CCK, 19 19 VLV_IOSF_SB_CCU, 20 20 VLV_IOSF_SB_DPIO, 21 + VLV_IOSF_SB_DPIO_2, 21 22 VLV_IOSF_SB_FLISDSI, 22 23 VLV_IOSF_SB_GPIO, 23 24 VLV_IOSF_SB_NC, ··· 28 27 static inline void vlv_iosf_sb_get(struct drm_i915_private *i915, unsigned long ports) 29 28 { 30 29 } 31 - static inline u32 vlv_iosf_sb_read(struct drm_i915_private *i915, u8 port, u32 reg) 30 + static inline u32 vlv_iosf_sb_read(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr) 32 31 { 33 32 return 0; 34 33 } 35 - static inline void vlv_iosf_sb_write(struct drm_i915_private *i915, 36 - u8 port, u32 reg, u32 val) 34 + static inline int vlv_iosf_sb_write(struct drm_i915_private *i915, enum vlv_iosf_sb_unit unit, u32 addr, u32 val) 37 35 { 36 + return 0; 38 37 } 39 38 static inline void vlv_iosf_sb_put(struct drm_i915_private *i915, unsigned long ports) 40 39 {