1*d83cc019SAndroid Build Coastguard Worker #include <unistd.h>
2*d83cc019SAndroid Build Coastguard Worker #include <stdlib.h>
3*d83cc019SAndroid Build Coastguard Worker #include <stdio.h>
4*d83cc019SAndroid Build Coastguard Worker #include <err.h>
5*d83cc019SAndroid Build Coastguard Worker #include <errno.h>
6*d83cc019SAndroid Build Coastguard Worker
7*d83cc019SAndroid Build Coastguard Worker #include "intel_io.h"
8*d83cc019SAndroid Build Coastguard Worker #include "intel_reg.h"
9*d83cc019SAndroid Build Coastguard Worker #include "igt_core.h"
10*d83cc019SAndroid Build Coastguard Worker
11*d83cc019SAndroid Build Coastguard Worker #define TIMEOUT_US 500000
12*d83cc019SAndroid Build Coastguard Worker
13*d83cc019SAndroid Build Coastguard Worker /* Standard MMIO read, non-posted */
14*d83cc019SAndroid Build Coastguard Worker #define SB_MRD_NP 0x00
15*d83cc019SAndroid Build Coastguard Worker /* Standard MMIO write, non-posted */
16*d83cc019SAndroid Build Coastguard Worker #define SB_MWR_NP 0x01
17*d83cc019SAndroid Build Coastguard Worker /* Private register read, double-word addressing, non-posted */
18*d83cc019SAndroid Build Coastguard Worker #define SB_CRRDDA_NP 0x06
19*d83cc019SAndroid Build Coastguard Worker /* Private register write, double-word addressing, non-posted */
20*d83cc019SAndroid Build Coastguard Worker #define SB_CRWRDA_NP 0x07
21*d83cc019SAndroid Build Coastguard Worker
vlv_sideband_rw(uint32_t port,uint8_t opcode,uint32_t addr,uint32_t * val)22*d83cc019SAndroid Build Coastguard Worker static int vlv_sideband_rw(uint32_t port, uint8_t opcode, uint32_t addr,
23*d83cc019SAndroid Build Coastguard Worker uint32_t *val)
24*d83cc019SAndroid Build Coastguard Worker {
25*d83cc019SAndroid Build Coastguard Worker int timeout = 0;
26*d83cc019SAndroid Build Coastguard Worker uint32_t cmd, devfn, be, bar;
27*d83cc019SAndroid Build Coastguard Worker int is_read = (opcode == SB_CRRDDA_NP || opcode == SB_MRD_NP);
28*d83cc019SAndroid Build Coastguard Worker
29*d83cc019SAndroid Build Coastguard Worker bar = 0;
30*d83cc019SAndroid Build Coastguard Worker be = 0xf;
31*d83cc019SAndroid Build Coastguard Worker devfn = 0;
32*d83cc019SAndroid Build Coastguard Worker
33*d83cc019SAndroid Build Coastguard Worker cmd = (devfn << IOSF_DEVFN_SHIFT) | (opcode << IOSF_OPCODE_SHIFT) |
34*d83cc019SAndroid Build Coastguard Worker (port << IOSF_PORT_SHIFT) | (be << IOSF_BYTE_ENABLES_SHIFT) |
35*d83cc019SAndroid Build Coastguard Worker (bar << IOSF_BAR_SHIFT);
36*d83cc019SAndroid Build Coastguard Worker
37*d83cc019SAndroid Build Coastguard Worker if (intel_register_read(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY) {
38*d83cc019SAndroid Build Coastguard Worker igt_warn("warning: pcode (%s) mailbox access failed\n", is_read ? "read" : "write");
39*d83cc019SAndroid Build Coastguard Worker return -EAGAIN;
40*d83cc019SAndroid Build Coastguard Worker }
41*d83cc019SAndroid Build Coastguard Worker
42*d83cc019SAndroid Build Coastguard Worker intel_register_write(VLV_IOSF_ADDR, addr);
43*d83cc019SAndroid Build Coastguard Worker if (!is_read)
44*d83cc019SAndroid Build Coastguard Worker intel_register_write(VLV_IOSF_DATA, *val);
45*d83cc019SAndroid Build Coastguard Worker
46*d83cc019SAndroid Build Coastguard Worker intel_register_write(VLV_IOSF_DOORBELL_REQ, cmd);
47*d83cc019SAndroid Build Coastguard Worker
48*d83cc019SAndroid Build Coastguard Worker do {
49*d83cc019SAndroid Build Coastguard Worker usleep(1);
50*d83cc019SAndroid Build Coastguard Worker timeout++;
51*d83cc019SAndroid Build Coastguard Worker } while (intel_register_read(VLV_IOSF_DOORBELL_REQ) & IOSF_SB_BUSY &&
52*d83cc019SAndroid Build Coastguard Worker timeout < TIMEOUT_US);
53*d83cc019SAndroid Build Coastguard Worker
54*d83cc019SAndroid Build Coastguard Worker if (timeout >= TIMEOUT_US) {
55*d83cc019SAndroid Build Coastguard Worker igt_warn("timeout waiting for pcode %s (%d) to finish\n", is_read ? "read" : "write", addr);
56*d83cc019SAndroid Build Coastguard Worker return -ETIMEDOUT;
57*d83cc019SAndroid Build Coastguard Worker }
58*d83cc019SAndroid Build Coastguard Worker
59*d83cc019SAndroid Build Coastguard Worker if (is_read)
60*d83cc019SAndroid Build Coastguard Worker *val = intel_register_read(VLV_IOSF_DATA);
61*d83cc019SAndroid Build Coastguard Worker intel_register_write(VLV_IOSF_DATA, 0);
62*d83cc019SAndroid Build Coastguard Worker
63*d83cc019SAndroid Build Coastguard Worker return 0;
64*d83cc019SAndroid Build Coastguard Worker }
65*d83cc019SAndroid Build Coastguard Worker
66*d83cc019SAndroid Build Coastguard Worker /**
67*d83cc019SAndroid Build Coastguard Worker * intel_punit_read:
68*d83cc019SAndroid Build Coastguard Worker * @addr: register offset
69*d83cc019SAndroid Build Coastguard Worker * @val: pointer to store the read result
70*d83cc019SAndroid Build Coastguard Worker *
71*d83cc019SAndroid Build Coastguard Worker * 32-bit read of the register at @offset through the P-Unit sideband port.
72*d83cc019SAndroid Build Coastguard Worker *
73*d83cc019SAndroid Build Coastguard Worker * Returns:
74*d83cc019SAndroid Build Coastguard Worker * 0 when the register access succeeded, negative errno code on failure.
75*d83cc019SAndroid Build Coastguard Worker */
intel_punit_read(uint32_t addr,uint32_t * val)76*d83cc019SAndroid Build Coastguard Worker int intel_punit_read(uint32_t addr, uint32_t *val)
77*d83cc019SAndroid Build Coastguard Worker {
78*d83cc019SAndroid Build Coastguard Worker return vlv_sideband_rw(IOSF_PORT_PUNIT, SB_CRRDDA_NP, addr, val);
79*d83cc019SAndroid Build Coastguard Worker }
80*d83cc019SAndroid Build Coastguard Worker
81*d83cc019SAndroid Build Coastguard Worker /**
82*d83cc019SAndroid Build Coastguard Worker * intel_punit_write:
83*d83cc019SAndroid Build Coastguard Worker * @addr: register offset
84*d83cc019SAndroid Build Coastguard Worker * @val: value to write
85*d83cc019SAndroid Build Coastguard Worker *
86*d83cc019SAndroid Build Coastguard Worker * 32-bit write of the register at @offset through the P-Unit sideband port.
87*d83cc019SAndroid Build Coastguard Worker *
88*d83cc019SAndroid Build Coastguard Worker * Returns:
89*d83cc019SAndroid Build Coastguard Worker * 0 when the register access succeeded, negative errno code on failure.
90*d83cc019SAndroid Build Coastguard Worker */
intel_punit_write(uint32_t addr,uint32_t val)91*d83cc019SAndroid Build Coastguard Worker int intel_punit_write(uint32_t addr, uint32_t val)
92*d83cc019SAndroid Build Coastguard Worker {
93*d83cc019SAndroid Build Coastguard Worker return vlv_sideband_rw(IOSF_PORT_PUNIT, SB_CRWRDA_NP, addr, &val);
94*d83cc019SAndroid Build Coastguard Worker }
95*d83cc019SAndroid Build Coastguard Worker
96*d83cc019SAndroid Build Coastguard Worker /**
97*d83cc019SAndroid Build Coastguard Worker * intel_nc_read:
98*d83cc019SAndroid Build Coastguard Worker * @addr: register offset
99*d83cc019SAndroid Build Coastguard Worker * @val: pointer to starge for the read result
100*d83cc019SAndroid Build Coastguard Worker *
101*d83cc019SAndroid Build Coastguard Worker * 32-bit read of the register at @offset through the NC sideband port.
102*d83cc019SAndroid Build Coastguard Worker *
103*d83cc019SAndroid Build Coastguard Worker * Returns:
104*d83cc019SAndroid Build Coastguard Worker * 0 when the register access succeeded, negative errno code on failure.
105*d83cc019SAndroid Build Coastguard Worker */
intel_nc_read(uint32_t addr,uint32_t * val)106*d83cc019SAndroid Build Coastguard Worker int intel_nc_read(uint32_t addr, uint32_t *val)
107*d83cc019SAndroid Build Coastguard Worker {
108*d83cc019SAndroid Build Coastguard Worker return vlv_sideband_rw(IOSF_PORT_NC, SB_CRRDDA_NP, addr, val);
109*d83cc019SAndroid Build Coastguard Worker }
110*d83cc019SAndroid Build Coastguard Worker
111*d83cc019SAndroid Build Coastguard Worker /**
112*d83cc019SAndroid Build Coastguard Worker * intel_nc_write:
113*d83cc019SAndroid Build Coastguard Worker * @addr: register offset
114*d83cc019SAndroid Build Coastguard Worker * @val: value to write
115*d83cc019SAndroid Build Coastguard Worker *
116*d83cc019SAndroid Build Coastguard Worker * 32-bit write of the register at @offset through the NC sideband port.
117*d83cc019SAndroid Build Coastguard Worker *
118*d83cc019SAndroid Build Coastguard Worker * Returns:
119*d83cc019SAndroid Build Coastguard Worker * 0 when the register access succeeded, negative errno code on failure.
120*d83cc019SAndroid Build Coastguard Worker */
intel_nc_write(uint32_t addr,uint32_t val)121*d83cc019SAndroid Build Coastguard Worker int intel_nc_write(uint32_t addr, uint32_t val)
122*d83cc019SAndroid Build Coastguard Worker {
123*d83cc019SAndroid Build Coastguard Worker return vlv_sideband_rw(IOSF_PORT_NC, SB_CRWRDA_NP, addr, &val);
124*d83cc019SAndroid Build Coastguard Worker }
125*d83cc019SAndroid Build Coastguard Worker
126*d83cc019SAndroid Build Coastguard Worker /**
127*d83cc019SAndroid Build Coastguard Worker * intel_dpio_reg_read:
128*d83cc019SAndroid Build Coastguard Worker * @reg: register offset
129*d83cc019SAndroid Build Coastguard Worker * @phy: DPIO PHY to use
130*d83cc019SAndroid Build Coastguard Worker *
131*d83cc019SAndroid Build Coastguard Worker * 32-bit read of the register at @offset through the DPIO sideband port.
132*d83cc019SAndroid Build Coastguard Worker *
133*d83cc019SAndroid Build Coastguard Worker * Returns:
134*d83cc019SAndroid Build Coastguard Worker * The value read from the register.
135*d83cc019SAndroid Build Coastguard Worker */
intel_dpio_reg_read(uint32_t reg,int phy)136*d83cc019SAndroid Build Coastguard Worker uint32_t intel_dpio_reg_read(uint32_t reg, int phy)
137*d83cc019SAndroid Build Coastguard Worker {
138*d83cc019SAndroid Build Coastguard Worker uint32_t val;
139*d83cc019SAndroid Build Coastguard Worker
140*d83cc019SAndroid Build Coastguard Worker if (phy == 0)
141*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(IOSF_PORT_DPIO, SB_MRD_NP, reg, &val);
142*d83cc019SAndroid Build Coastguard Worker else
143*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(IOSF_PORT_DPIO_2, SB_MRD_NP, reg, &val);
144*d83cc019SAndroid Build Coastguard Worker return val;
145*d83cc019SAndroid Build Coastguard Worker }
146*d83cc019SAndroid Build Coastguard Worker
147*d83cc019SAndroid Build Coastguard Worker /**
148*d83cc019SAndroid Build Coastguard Worker * intel_dpio_reg_write:
149*d83cc019SAndroid Build Coastguard Worker * @reg: register offset
150*d83cc019SAndroid Build Coastguard Worker * @val: value to write
151*d83cc019SAndroid Build Coastguard Worker * @phy: dpio PHY to use
152*d83cc019SAndroid Build Coastguard Worker *
153*d83cc019SAndroid Build Coastguard Worker * 32-bit write of the register at @offset through the DPIO sideband port.
154*d83cc019SAndroid Build Coastguard Worker */
intel_dpio_reg_write(uint32_t reg,uint32_t val,int phy)155*d83cc019SAndroid Build Coastguard Worker void intel_dpio_reg_write(uint32_t reg, uint32_t val, int phy)
156*d83cc019SAndroid Build Coastguard Worker {
157*d83cc019SAndroid Build Coastguard Worker if (phy == 0)
158*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(IOSF_PORT_DPIO, SB_MWR_NP, reg, &val);
159*d83cc019SAndroid Build Coastguard Worker else
160*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(IOSF_PORT_DPIO_2, SB_MWR_NP, reg, &val);
161*d83cc019SAndroid Build Coastguard Worker }
162*d83cc019SAndroid Build Coastguard Worker
intel_flisdsi_reg_read(uint32_t reg)163*d83cc019SAndroid Build Coastguard Worker uint32_t intel_flisdsi_reg_read(uint32_t reg)
164*d83cc019SAndroid Build Coastguard Worker {
165*d83cc019SAndroid Build Coastguard Worker uint32_t val = 0;
166*d83cc019SAndroid Build Coastguard Worker
167*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(IOSF_PORT_FLISDSI, SB_CRRDDA_NP, reg, &val);
168*d83cc019SAndroid Build Coastguard Worker
169*d83cc019SAndroid Build Coastguard Worker return val;
170*d83cc019SAndroid Build Coastguard Worker }
171*d83cc019SAndroid Build Coastguard Worker
intel_flisdsi_reg_write(uint32_t reg,uint32_t val)172*d83cc019SAndroid Build Coastguard Worker void intel_flisdsi_reg_write(uint32_t reg, uint32_t val)
173*d83cc019SAndroid Build Coastguard Worker {
174*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(IOSF_PORT_FLISDSI, SB_CRWRDA_NP, reg, &val);
175*d83cc019SAndroid Build Coastguard Worker }
176*d83cc019SAndroid Build Coastguard Worker
intel_iosf_sb_read(uint32_t port,uint32_t reg)177*d83cc019SAndroid Build Coastguard Worker uint32_t intel_iosf_sb_read(uint32_t port, uint32_t reg)
178*d83cc019SAndroid Build Coastguard Worker {
179*d83cc019SAndroid Build Coastguard Worker uint32_t val;
180*d83cc019SAndroid Build Coastguard Worker
181*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(port, SB_CRRDDA_NP, reg, &val);
182*d83cc019SAndroid Build Coastguard Worker
183*d83cc019SAndroid Build Coastguard Worker return val;
184*d83cc019SAndroid Build Coastguard Worker }
185*d83cc019SAndroid Build Coastguard Worker
intel_iosf_sb_write(uint32_t port,uint32_t reg,uint32_t val)186*d83cc019SAndroid Build Coastguard Worker void intel_iosf_sb_write(uint32_t port, uint32_t reg, uint32_t val)
187*d83cc019SAndroid Build Coastguard Worker {
188*d83cc019SAndroid Build Coastguard Worker vlv_sideband_rw(port, SB_CRWRDA_NP, reg, &val);
189*d83cc019SAndroid Build Coastguard Worker }
190