Loading...
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright © 2022 Intel Corporation
4 */
5
6#include "i915_drv.h"
7#include "i915_reg.h"
8
9#include "intel_de.h"
10#include "intel_display.h"
11#include "intel_dkl_phy.h"
12#include "intel_dkl_phy_regs.h"
13
14static void
15dkl_phy_set_hip_idx(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
16{
17 enum tc_port tc_port = DKL_REG_TC_PORT(reg);
18
19 drm_WARN_ON(&i915->drm, tc_port < TC_PORT_1 || tc_port >= I915_MAX_TC_PORTS);
20
21 intel_de_write(i915,
22 HIP_INDEX_REG(tc_port),
23 HIP_INDEX_VAL(tc_port, reg.bank_idx));
24}
25
26/**
27 * intel_dkl_phy_read - read a Dekel PHY register
28 * @i915: i915 device instance
29 * @reg: Dekel PHY register
30 *
31 * Read the @reg Dekel PHY register.
32 *
33 * Returns the read value.
34 */
35u32
36intel_dkl_phy_read(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
37{
38 u32 val;
39
40 spin_lock(&i915->display.dkl.phy_lock);
41
42 dkl_phy_set_hip_idx(i915, reg);
43 val = intel_de_read(i915, DKL_REG_MMIO(reg));
44
45 spin_unlock(&i915->display.dkl.phy_lock);
46
47 return val;
48}
49
50/**
51 * intel_dkl_phy_write - write a Dekel PHY register
52 * @i915: i915 device instance
53 * @reg: Dekel PHY register
54 * @val: value to write
55 *
56 * Write @val to the @reg Dekel PHY register.
57 */
58void
59intel_dkl_phy_write(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg, u32 val)
60{
61 spin_lock(&i915->display.dkl.phy_lock);
62
63 dkl_phy_set_hip_idx(i915, reg);
64 intel_de_write(i915, DKL_REG_MMIO(reg), val);
65
66 spin_unlock(&i915->display.dkl.phy_lock);
67}
68
69/**
70 * intel_dkl_phy_rmw - read-modify-write a Dekel PHY register
71 * @i915: i915 device instance
72 * @reg: Dekel PHY register
73 * @clear: mask to clear
74 * @set: mask to set
75 *
76 * Read the @reg Dekel PHY register, clearing then setting the @clear/@set bits in it, and writing
77 * this value back to the register if the value differs from the read one.
78 */
79void
80intel_dkl_phy_rmw(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg, u32 clear, u32 set)
81{
82 spin_lock(&i915->display.dkl.phy_lock);
83
84 dkl_phy_set_hip_idx(i915, reg);
85 intel_de_rmw(i915, DKL_REG_MMIO(reg), clear, set);
86
87 spin_unlock(&i915->display.dkl.phy_lock);
88}
89
90/**
91 * intel_dkl_phy_posting_read - do a posting read from a Dekel PHY register
92 * @i915: i915 device instance
93 * @reg: Dekel PHY register
94 *
95 * Read the @reg Dekel PHY register without returning the read value.
96 */
97void
98intel_dkl_phy_posting_read(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
99{
100 spin_lock(&i915->display.dkl.phy_lock);
101
102 dkl_phy_set_hip_idx(i915, reg);
103 intel_de_posting_read(i915, DKL_REG_MMIO(reg));
104
105 spin_unlock(&i915->display.dkl.phy_lock);
106}
1// SPDX-License-Identifier: MIT
2/*
3 * Copyright © 2022 Intel Corporation
4 */
5
6#include "i915_drv.h"
7#include "i915_reg.h"
8
9#include "intel_de.h"
10#include "intel_display.h"
11#include "intel_dkl_phy.h"
12#include "intel_dkl_phy_regs.h"
13
14/**
15 * intel_dkl_phy_init - initialize Dekel PHY
16 * @i915: i915 device instance
17 */
18void intel_dkl_phy_init(struct drm_i915_private *i915)
19{
20 spin_lock_init(&i915->display.dkl.phy_lock);
21}
22
23static void
24dkl_phy_set_hip_idx(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
25{
26 enum tc_port tc_port = DKL_REG_TC_PORT(reg);
27
28 drm_WARN_ON(&i915->drm, tc_port < TC_PORT_1 || tc_port >= I915_MAX_TC_PORTS);
29
30 intel_de_write(i915,
31 HIP_INDEX_REG(tc_port),
32 HIP_INDEX_VAL(tc_port, reg.bank_idx));
33}
34
35/**
36 * intel_dkl_phy_read - read a Dekel PHY register
37 * @i915: i915 device instance
38 * @reg: Dekel PHY register
39 *
40 * Read the @reg Dekel PHY register.
41 *
42 * Returns the read value.
43 */
44u32
45intel_dkl_phy_read(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
46{
47 u32 val;
48
49 spin_lock(&i915->display.dkl.phy_lock);
50
51 dkl_phy_set_hip_idx(i915, reg);
52 val = intel_de_read(i915, DKL_REG_MMIO(reg));
53
54 spin_unlock(&i915->display.dkl.phy_lock);
55
56 return val;
57}
58
59/**
60 * intel_dkl_phy_write - write a Dekel PHY register
61 * @i915: i915 device instance
62 * @reg: Dekel PHY register
63 * @val: value to write
64 *
65 * Write @val to the @reg Dekel PHY register.
66 */
67void
68intel_dkl_phy_write(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg, u32 val)
69{
70 spin_lock(&i915->display.dkl.phy_lock);
71
72 dkl_phy_set_hip_idx(i915, reg);
73 intel_de_write(i915, DKL_REG_MMIO(reg), val);
74
75 spin_unlock(&i915->display.dkl.phy_lock);
76}
77
78/**
79 * intel_dkl_phy_rmw - read-modify-write a Dekel PHY register
80 * @i915: i915 device instance
81 * @reg: Dekel PHY register
82 * @clear: mask to clear
83 * @set: mask to set
84 *
85 * Read the @reg Dekel PHY register, clearing then setting the @clear/@set bits in it, and writing
86 * this value back to the register if the value differs from the read one.
87 */
88void
89intel_dkl_phy_rmw(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg, u32 clear, u32 set)
90{
91 spin_lock(&i915->display.dkl.phy_lock);
92
93 dkl_phy_set_hip_idx(i915, reg);
94 intel_de_rmw(i915, DKL_REG_MMIO(reg), clear, set);
95
96 spin_unlock(&i915->display.dkl.phy_lock);
97}
98
99/**
100 * intel_dkl_phy_posting_read - do a posting read from a Dekel PHY register
101 * @i915: i915 device instance
102 * @reg: Dekel PHY register
103 *
104 * Read the @reg Dekel PHY register without returning the read value.
105 */
106void
107intel_dkl_phy_posting_read(struct drm_i915_private *i915, struct intel_dkl_phy_reg reg)
108{
109 spin_lock(&i915->display.dkl.phy_lock);
110
111 dkl_phy_set_hip_idx(i915, reg);
112 intel_de_posting_read(i915, DKL_REG_MMIO(reg));
113
114 spin_unlock(&i915->display.dkl.phy_lock);
115}