Lines Matching +full:0 +full:- +full:dev

7  * later. See the COPYING file in the top-level directory.
13 #include "pnv-xscom.h"
15 #define PPC_BIT(bit) (0x8000000000000000ULL >> (bit))
16 #define PPC_BIT32(bit) (0x80000000 >> (bit))
17 #define PPC_BIT8(bit) (0x80 >> (bit))
18 #define PPC_BITMASK(bs, be) ((PPC_BIT(bs) - PPC_BIT(be)) | PPC_BIT(bs))
19 #define PPC_BITMASK32(bs, be) ((PPC_BIT32(bs) - PPC_BIT32(be)) | \
22 #define MASK_TO_LSH(m) (__builtin_ffsll(m) - 1)
27 #define PNV10_XSCOM_I2CM_BASE 0xa0000
28 #define PNV10_XSCOM_I2CM_SIZE 0x1000
47 return pnv_xscom_addr(ctlr->chip, PNV10_XSCOM_I2CM_BASE + in pnv_i2c_xscom_addr()
48 (PNV10_XSCOM_I2CM_SIZE * ctlr->engine) + reg); in pnv_i2c_xscom_addr()
53 return qtest_readq(ctlr->qts, pnv_i2c_xscom_addr(ctlr, reg)); in pnv_i2c_xscom_read()
58 qtest_writeq(ctlr->qts, pnv_i2c_xscom_addr(ctlr, reg), val); in pnv_i2c_xscom_write()
62 static void pnv_i2c_send(PnvI2cDev *dev, const uint8_t *buf, uint16_t len) in pnv_i2c_send() argument
68 reg64 = SETFIELD(I2C_MODE_BIT_RATE_DIV, 0ull, 0x2be); in pnv_i2c_send()
69 reg64 = SETFIELD(I2C_MODE_PORT_NUM, reg64, dev->port); in pnv_i2c_send()
70 pnv_i2c_xscom_write(dev->ctlr, I2C_MODE_REG, reg64); in pnv_i2c_send()
73 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_EXTD_STAT_REG); in pnv_i2c_send()
74 g_assert_cmphex(reg64 & I2C_EXTD_STAT_I2C_BUSY, ==, 0); in pnv_i2c_send()
75 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_STAT_REG); in pnv_i2c_send()
81 reg64 = SETFIELD(I2C_CMD_DEV_ADDR, reg64, dev->addr); in pnv_i2c_send()
83 pnv_i2c_xscom_write(dev->ctlr, I2C_CMD_REG, reg64); in pnv_i2c_send()
86 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_STAT_REG); in pnv_i2c_send()
87 g_assert_cmphex(reg64 & I2C_STAT_ANY_ERR, ==, 0); in pnv_i2c_send()
90 for (byte_num = 0; byte_num < len; byte_num++) { in pnv_i2c_send()
91 reg64 = SETFIELD(I2C_FIFO, 0ull, buf[byte_num]); in pnv_i2c_send()
92 pnv_i2c_xscom_write(dev->ctlr, I2C_FIFO_REG, reg64); in pnv_i2c_send()
96 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_EXTD_STAT_REG); in pnv_i2c_send()
97 g_assert_cmphex(reg64 & I2C_EXTD_STAT_I2C_BUSY, ==, 0); in pnv_i2c_send()
98 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_STAT_REG); in pnv_i2c_send()
104 static void pnv_i2c_recv(PnvI2cDev *dev, uint8_t *buf, uint16_t len) in pnv_i2c_recv() argument
110 reg64 = SETFIELD(I2C_MODE_BIT_RATE_DIV, 0ull, 0x2be); in pnv_i2c_recv()
111 reg64 = SETFIELD(I2C_MODE_PORT_NUM, reg64, dev->port); in pnv_i2c_recv()
112 pnv_i2c_xscom_write(dev->ctlr, I2C_MODE_REG, reg64); in pnv_i2c_recv()
115 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_EXTD_STAT_REG); in pnv_i2c_recv()
116 g_assert_cmphex(reg64 & I2C_EXTD_STAT_I2C_BUSY, ==, 0); in pnv_i2c_recv()
117 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_STAT_REG); in pnv_i2c_recv()
124 reg64 = SETFIELD(I2C_CMD_DEV_ADDR, reg64, dev->addr); in pnv_i2c_recv()
126 pnv_i2c_xscom_write(dev->ctlr, I2C_CMD_REG, reg64); in pnv_i2c_recv()
129 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_STAT_REG); in pnv_i2c_recv()
130 g_assert_cmphex(reg64 & I2C_STAT_ANY_ERR, ==, 0); in pnv_i2c_recv()
133 for (byte_num = 0; byte_num < len; byte_num++) { in pnv_i2c_recv()
134 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_FIFO_REG); in pnv_i2c_recv()
139 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_EXTD_STAT_REG); in pnv_i2c_recv()
140 g_assert_cmphex(reg64 & I2C_EXTD_STAT_I2C_BUSY, ==, 0); in pnv_i2c_recv()
141 reg64 = pnv_i2c_xscom_read(dev->ctlr, I2C_STAT_REG); in pnv_i2c_recv()
146 static void pnv_i2c_pca9554_default_cfg(PnvI2cDev *dev) in pnv_i2c_pca9554_default_cfg() argument
151 buf[0] = PCA9554_POLARITY; in pnv_i2c_pca9554_default_cfg()
152 buf[1] = 0; in pnv_i2c_pca9554_default_cfg()
153 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9554_default_cfg()
156 buf[0] = PCA9554_CONFIG; in pnv_i2c_pca9554_default_cfg()
157 buf[1] = 0xff; in pnv_i2c_pca9554_default_cfg()
158 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9554_default_cfg()
161 buf[0] = PCA9554_OUTPUT; in pnv_i2c_pca9554_default_cfg()
162 buf[1] = 0xff; in pnv_i2c_pca9554_default_cfg()
163 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9554_default_cfg()
166 static void pnv_i2c_pca9554_set_pin(PnvI2cDev *dev, int pin, bool high) in pnv_i2c_pca9554_set_pin() argument
170 uint8_t mask = 0x1 << pin; in pnv_i2c_pca9554_set_pin()
171 uint8_t new_value = ((high) ? 1 : 0) << pin; in pnv_i2c_pca9554_set_pin()
174 send_buf[0] = PCA9554_OUTPUT; in pnv_i2c_pca9554_set_pin()
175 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9554_set_pin()
176 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9554_set_pin()
179 send_buf[1] = (recv_buf[0] & ~mask) | new_value; in pnv_i2c_pca9554_set_pin()
180 pnv_i2c_send(dev, send_buf, 2); in pnv_i2c_pca9554_set_pin()
183 send_buf[0] = PCA9554_CONFIG; in pnv_i2c_pca9554_set_pin()
184 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9554_set_pin()
185 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9554_set_pin()
186 send_buf[1] = recv_buf[0] & ~mask; in pnv_i2c_pca9554_set_pin()
187 pnv_i2c_send(dev, send_buf, 2); in pnv_i2c_pca9554_set_pin()
190 static uint8_t pnv_i2c_pca9554_read_pins(PnvI2cDev *dev) in pnv_i2c_pca9554_read_pins() argument
194 send_buf[0] = PCA9554_INPUT; in pnv_i2c_pca9554_read_pins()
195 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9554_read_pins()
196 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9554_read_pins()
197 return recv_buf[0]; in pnv_i2c_pca9554_read_pins()
200 static void pnv_i2c_pca9554_flip_polarity(PnvI2cDev *dev) in pnv_i2c_pca9554_flip_polarity() argument
205 send_buf[0] = PCA9554_POLARITY; in pnv_i2c_pca9554_flip_polarity()
206 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9554_flip_polarity()
207 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9554_flip_polarity()
208 send_buf[1] = recv_buf[0] ^ 0xff; in pnv_i2c_pca9554_flip_polarity()
209 pnv_i2c_send(dev, send_buf, 2); in pnv_i2c_pca9554_flip_polarity()
212 static void pnv_i2c_pca9554_default_inputs(PnvI2cDev *dev) in pnv_i2c_pca9554_default_inputs() argument
214 uint8_t pin_values = pnv_i2c_pca9554_read_pins(dev); in pnv_i2c_pca9554_default_inputs()
215 g_assert_cmphex(pin_values, ==, 0xff); in pnv_i2c_pca9554_default_inputs()
219 static void pnv_i2c_pca554_set_pins(PnvI2cDev *dev) in pnv_i2c_pca554_set_pins() argument
222 pnv_i2c_pca9554_set_pin(dev, 0, 0); in pnv_i2c_pca554_set_pins()
223 pin_values = pnv_i2c_pca9554_read_pins(dev); in pnv_i2c_pca554_set_pins()
224 g_assert_cmphex(pin_values, ==, 0xfe); in pnv_i2c_pca554_set_pins()
225 pnv_i2c_pca9554_flip_polarity(dev); in pnv_i2c_pca554_set_pins()
226 pin_values = pnv_i2c_pca9554_read_pins(dev); in pnv_i2c_pca554_set_pins()
227 g_assert_cmphex(pin_values, ==, 0x01); in pnv_i2c_pca554_set_pins()
228 pnv_i2c_pca9554_set_pin(dev, 2, 0); in pnv_i2c_pca554_set_pins()
229 pin_values = pnv_i2c_pca9554_read_pins(dev); in pnv_i2c_pca554_set_pins()
230 g_assert_cmphex(pin_values, ==, 0x05); in pnv_i2c_pca554_set_pins()
231 pnv_i2c_pca9554_flip_polarity(dev); in pnv_i2c_pca554_set_pins()
232 pin_values = pnv_i2c_pca9554_read_pins(dev); in pnv_i2c_pca554_set_pins()
233 g_assert_cmphex(pin_values, ==, 0xfa); in pnv_i2c_pca554_set_pins()
234 pnv_i2c_pca9554_default_cfg(dev); in pnv_i2c_pca554_set_pins()
235 pin_values = pnv_i2c_pca9554_read_pins(dev); in pnv_i2c_pca554_set_pins()
236 g_assert_cmphex(pin_values, ==, 0xff); in pnv_i2c_pca554_set_pins()
239 static void pnv_i2c_pca9552_default_cfg(PnvI2cDev *dev) in pnv_i2c_pca9552_default_cfg() argument
243 buf[0] = PCA9552_PSC0; in pnv_i2c_pca9552_default_cfg()
244 buf[1] = 0xff; in pnv_i2c_pca9552_default_cfg()
245 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
246 buf[0] = PCA9552_PWM0; in pnv_i2c_pca9552_default_cfg()
247 buf[1] = 0x80; in pnv_i2c_pca9552_default_cfg()
248 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
249 buf[0] = PCA9552_PSC1; in pnv_i2c_pca9552_default_cfg()
250 buf[1] = 0xff; in pnv_i2c_pca9552_default_cfg()
251 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
252 buf[0] = PCA9552_PWM1; in pnv_i2c_pca9552_default_cfg()
253 buf[1] = 0x80; in pnv_i2c_pca9552_default_cfg()
254 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
257 buf[0] = PCA9552_LS0; in pnv_i2c_pca9552_default_cfg()
258 buf[1] = 0x55; in pnv_i2c_pca9552_default_cfg()
259 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
260 buf[0] = PCA9552_LS1; in pnv_i2c_pca9552_default_cfg()
261 buf[1] = 0x55; in pnv_i2c_pca9552_default_cfg()
262 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
263 buf[0] = PCA9552_LS2; in pnv_i2c_pca9552_default_cfg()
264 buf[1] = 0x55; in pnv_i2c_pca9552_default_cfg()
265 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
266 buf[0] = PCA9552_LS3; in pnv_i2c_pca9552_default_cfg()
267 buf[1] = 0x55; in pnv_i2c_pca9552_default_cfg()
268 pnv_i2c_send(dev, buf, 2); in pnv_i2c_pca9552_default_cfg()
271 static void pnv_i2c_pca9552_set_pin(PnvI2cDev *dev, int pin, bool high) in pnv_i2c_pca9552_set_pin() argument
277 uint8_t mask = ~(0x3 << shift); in pnv_i2c_pca9552_set_pin()
278 uint8_t new_value = ((high) ? 1 : 0) << shift; in pnv_i2c_pca9552_set_pin()
281 send_buf[0] = reg; in pnv_i2c_pca9552_set_pin()
282 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9552_set_pin()
283 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9552_set_pin()
286 send_buf[1] = (recv_buf[0] & mask) | new_value; in pnv_i2c_pca9552_set_pin()
287 pnv_i2c_send(dev, send_buf, 2); in pnv_i2c_pca9552_set_pin()
290 static uint16_t pnv_i2c_pca9552_read_pins(PnvI2cDev *dev) in pnv_i2c_pca9552_read_pins() argument
295 send_buf[0] = PCA9552_INPUT0; in pnv_i2c_pca9552_read_pins()
296 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9552_read_pins()
297 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9552_read_pins()
298 inputs = recv_buf[0]; in pnv_i2c_pca9552_read_pins()
299 send_buf[0] = PCA9552_INPUT1; in pnv_i2c_pca9552_read_pins()
300 pnv_i2c_send(dev, send_buf, 1); in pnv_i2c_pca9552_read_pins()
301 pnv_i2c_recv(dev, recv_buf, 1); in pnv_i2c_pca9552_read_pins()
302 inputs |= recv_buf[0] << 8; in pnv_i2c_pca9552_read_pins()
306 static void pnv_i2c_pca9552_default_inputs(PnvI2cDev *dev) in pnv_i2c_pca9552_default_inputs() argument
308 uint16_t pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca9552_default_inputs()
309 g_assert_cmphex(pin_values, ==, 0xffff); in pnv_i2c_pca9552_default_inputs()
313 * Set pins 0-4 one at a time and verify that pins 5-9 are
316 static void pnv_i2c_pca552_set_pins(PnvI2cDev *dev) in pnv_i2c_pca552_set_pins() argument
320 /* set pin 0 low */ in pnv_i2c_pca552_set_pins()
321 pnv_i2c_pca9552_set_pin(dev, 0, 0); in pnv_i2c_pca552_set_pins()
322 pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca552_set_pins()
324 /* pins 0 and 5 should be low */ in pnv_i2c_pca552_set_pins()
325 g_assert_cmphex(pin_values, ==, 0xffde); in pnv_i2c_pca552_set_pins()
328 pnv_i2c_pca9552_set_pin(dev, 1, 0); in pnv_i2c_pca552_set_pins()
329 pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca552_set_pins()
331 /* pins 0, 1, 5 and 6 should be low */ in pnv_i2c_pca552_set_pins()
332 g_assert_cmphex(pin_values, ==, 0xff9c); in pnv_i2c_pca552_set_pins()
335 pnv_i2c_pca9552_set_pin(dev, 2, 0); in pnv_i2c_pca552_set_pins()
336 pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca552_set_pins()
338 /* pins 0, 1, 2, 5, 6 and 7 should be low */ in pnv_i2c_pca552_set_pins()
339 g_assert_cmphex(pin_values, ==, 0xff18); in pnv_i2c_pca552_set_pins()
342 pnv_i2c_pca9552_set_pin(dev, 3, 0); in pnv_i2c_pca552_set_pins()
343 pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca552_set_pins()
345 /* pins 0, 1, 2, 3, 5, 6, 7 and 8 should be low */ in pnv_i2c_pca552_set_pins()
346 g_assert_cmphex(pin_values, ==, 0xfe10); in pnv_i2c_pca552_set_pins()
349 pnv_i2c_pca9552_set_pin(dev, 4, 0); in pnv_i2c_pca552_set_pins()
350 pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca552_set_pins()
352 /* pins 0, 1, 2, 3, 5, 6, 7, 8 and 9 should be low */ in pnv_i2c_pca552_set_pins()
353 g_assert_cmphex(pin_values, ==, 0xfc00); in pnv_i2c_pca552_set_pins()
356 pnv_i2c_pca9552_default_cfg(dev); in pnv_i2c_pca552_set_pins()
357 pin_values = pnv_i2c_pca9552_read_pins(dev); in pnv_i2c_pca552_set_pins()
360 g_assert_cmphex(pin_values, ==, 0xffff); in pnv_i2c_pca552_set_pins()
365 pnv_i2c_xscom_write(ctlr, I2C_RESET_I2C_REG, 0); in reset_engine()
371 for (engine = 0; engine < chip->num_i2c; engine++) { in check_i2cm_por_regs()
379 g_assert_cmphex(value & I2C_EXTD_STAT_I2C_VERSION, ==, 0x1700000000); in check_i2cm_por_regs()
392 for (engine = 0; engine < chip->num_i2c; engine++) { in reset_all()
398 pnv_i2c_xscom_write(&ctlr, I2C_MODE_REG, 0x02be040000000000); in reset_all()
411 if (chip->chip_type == PNV_CHIP_POWER9) { in test_host_i2c()
413 } else if (chip->chip_type == PNV_CHIP_POWER10) { in test_host_i2c()
414 machine = "powernv10-rainier"; in test_host_i2c()
417 qts = qtest_initf("-M %s -smp %d,cores=1,threads=%d -nographic " in test_host_i2c()
418 "-nodefaults -serial mon:stdio -S " in test_host_i2c()
419 "-d guest_errors", in test_host_i2c()
432 if (chip->chip_type != PNV_CHIP_POWER10) { in test_host_i2c()
443 pca9552.addr = 0x63; in test_host_i2c()
457 pca9554.addr = 0x25; in test_host_i2c()
475 for (i = 0; i < ARRAY_SIZE(pnv_chips); i++) { in add_test()
476 char *tname = g_strdup_printf("pnv-xscom/%s/%s", name, in add_test()
487 add_test("host-i2c", test_host_i2c); in main()