FILE
core.c
File preview with syntax highlighting.
linux-6.19.14/drivers/i3c/master/mipi-i3c-hci/core.c
1// SPDX-License-Identifier: BSD-3-Clause 2/* 3 * Copyright (c) 2020, MIPI Alliance, Inc. 4 * 5 * Author: Nicolas Pitre <npitre@baylibre.com> 6 * 7 * Core driver code with main interface to the I3C subsystem. 8 */ 9 10#include <linux/bitfield.h> 11#include <linux/device.h> 12#include <linux/errno.h> 13#include <linux/i3c/master.h> 14#include <linux/interrupt.h> 15#include <linux/iopoll.h> 16#include <linux/module.h> 17#include <linux/platform_device.h> 18 19#include "hci.h" 20#include "ext_caps.h" 21#include "cmd.h" 22#include "dat.h" 23 24 25/* 26 * Host Controller Capabilities and Operation Registers 27 */ 28 29#define HCI_VERSION 0x00 /* HCI Version (in BCD) */ 30 31#define HC_CONTROL 0x04 32#define HC_CONTROL_BUS_ENABLE BIT(31) 33#define HC_CONTROL_RESUME BIT(30) 34#define HC_CONTROL_ABORT BIT(29) 35#define HC_CONTROL_HALT_ON_CMD_TIMEOUT BIT(12) 36#define HC_CONTROL_HOT_JOIN_CTRL BIT(8) /* Hot-Join ACK/NACK Control */ 37#define HC_CONTROL_I2C_TARGET_PRESENT BIT(7) 38#define HC_CONTROL_PIO_MODE BIT(6) /* DMA/PIO Mode Selector */ 39#define HC_CONTROL_DATA_BIG_ENDIAN BIT(4) 40#define HC_CONTROL_IBA_INCLUDE BIT(0) /* Include I3C Broadcast Address */ 41 42#define MASTER_DEVICE_ADDR 0x08 /* Master Device Address */ 43#define MASTER_DYNAMIC_ADDR_VALID BIT(31) /* Dynamic Address is Valid */ 44#define MASTER_DYNAMIC_ADDR(v) FIELD_PREP(GENMASK(22, 16), v) 45 46#define HC_CAPABILITIES 0x0c 47#define HC_CAP_SG_DC_EN BIT(30) 48#define HC_CAP_SG_IBI_EN BIT(29) 49#define HC_CAP_SG_CR_EN BIT(28) 50#define HC_CAP_MAX_DATA_LENGTH GENMASK(24, 22) 51#define HC_CAP_CMD_SIZE GENMASK(21, 20) 52#define HC_CAP_DIRECT_COMMANDS_EN BIT(18) 53#define HC_CAP_MULTI_LANE_EN BIT(15) 54#define HC_CAP_CMD_CCC_DEFBYTE BIT(10) 55#define HC_CAP_HDR_BT_EN BIT(8) 56#define HC_CAP_HDR_TS_EN BIT(7) 57#define HC_CAP_HDR_DDR_EN BIT(6) 58#define HC_CAP_NON_CURRENT_MASTER_CAP BIT(5) /* master handoff capable */ 59#define HC_CAP_DATA_BYTE_CFG_EN BIT(4) /* endian selection possible */ 60#define HC_CAP_AUTO_COMMAND BIT(3) 61#define HC_CAP_COMBO_COMMAND BIT(2) 62 63#define RESET_CONTROL 0x10 64#define BUS_RESET BIT(31) 65#define BUS_RESET_TYPE GENMASK(30, 29) 66#define IBI_QUEUE_RST BIT(5) 67#define RX_FIFO_RST BIT(4) 68#define TX_FIFO_RST BIT(3) 69#define RESP_QUEUE_RST BIT(2) 70#define CMD_QUEUE_RST BIT(1) 71#define SOFT_RST BIT(0) /* Core Reset */ 72 73#define PRESENT_STATE 0x14 74#define STATE_CURRENT_MASTER BIT(2) 75 76#define INTR_STATUS 0x20 77#define INTR_STATUS_ENABLE 0x24 78#define INTR_SIGNAL_ENABLE 0x28 79#define INTR_FORCE 0x2c 80#define INTR_HC_CMD_SEQ_UFLOW_STAT BIT(12) /* Cmd Sequence Underflow */ 81#define INTR_HC_SEQ_CANCEL BIT(11) /* HC Cancelled Transaction Sequence */ 82#define INTR_HC_INTERNAL_ERR BIT(10) /* HC Internal Error */ 83 84#define DAT_SECTION 0x30 /* Device Address Table */ 85#define DAT_ENTRY_SIZE GENMASK(31, 28) 86#define DAT_TABLE_SIZE GENMASK(18, 12) 87#define DAT_TABLE_OFFSET GENMASK(11, 0) 88 89#define DCT_SECTION 0x34 /* Device Characteristics Table */ 90#define DCT_ENTRY_SIZE GENMASK(31, 28) 91#define DCT_TABLE_INDEX GENMASK(23, 19) 92#define DCT_TABLE_SIZE GENMASK(18, 12) 93#define DCT_TABLE_OFFSET GENMASK(11, 0) 94 95#define RING_HEADERS_SECTION 0x38 96#define RING_HEADERS_OFFSET GENMASK(15, 0) 97 98#define PIO_SECTION 0x3c 99#define PIO_REGS_OFFSET GENMASK(15, 0) /* PIO Offset */ 100 101#define EXT_CAPS_SECTION 0x40 102#define EXT_CAPS_OFFSET GENMASK(15, 0) 103 104#define IBI_NOTIFY_CTRL 0x58 /* IBI Notify Control */ 105#define IBI_NOTIFY_SIR_REJECTED BIT(3) /* Rejected Target Interrupt Request */ 106#define IBI_NOTIFY_MR_REJECTED BIT(1) /* Rejected Master Request Control */ 107#define IBI_NOTIFY_HJ_REJECTED BIT(0) /* Rejected Hot-Join Control */ 108 109#define DEV_CTX_BASE_LO 0x60 110#define DEV_CTX_BASE_HI 0x64 111 112 113static inline struct i3c_hci *to_i3c_hci(struct i3c_master_controller *m) 114{ 115 return container_of(m, struct i3c_hci, master); 116} 117 118static int i3c_hci_bus_init(struct i3c_master_controller *m) 119{ 120 struct i3c_hci *hci = to_i3c_hci(m); 121 struct i3c_device_info info; 122 int ret; 123 124 if (hci->cmd == &mipi_i3c_hci_cmd_v1) { 125 ret = mipi_i3c_hci_dat_v1.init(hci); 126 if (ret) 127 return ret; 128 } 129 130 ret = i3c_master_get_free_addr(m, 0); 131 if (ret < 0) 132 return ret; 133 reg_write(MASTER_DEVICE_ADDR, 134 MASTER_DYNAMIC_ADDR(ret) | MASTER_DYNAMIC_ADDR_VALID); 135 memset(&info, 0, sizeof(info)); 136 info.dyn_addr = ret; 137 ret = i3c_master_set_info(m, &info); 138 if (ret) 139 return ret; 140 141 ret = hci->io->init(hci); 142 if (ret) 143 return ret; 144 145 /* Set RESP_BUF_THLD to 0(n) to get 1(n+1) response */ 146 if (hci->quirks & HCI_QUIRK_RESP_BUF_THLD) 147 amd_set_resp_buf_thld(hci); 148 149 reg_set(HC_CONTROL, HC_CONTROL_BUS_ENABLE); 150 dev_dbg(&hci->master.dev, "HC_CONTROL = %#x", reg_read(HC_CONTROL)); 151 152 return 0; 153} 154 155static void i3c_hci_bus_cleanup(struct i3c_master_controller *m) 156{ 157 struct i3c_hci *hci = to_i3c_hci(m); 158 struct platform_device *pdev = to_platform_device(m->dev.parent); 159 160 reg_clear(HC_CONTROL, HC_CONTROL_BUS_ENABLE); 161 synchronize_irq(platform_get_irq(pdev, 0)); 162 hci->io->cleanup(hci); 163 if (hci->cmd == &mipi_i3c_hci_cmd_v1) 164 mipi_i3c_hci_dat_v1.cleanup(hci); 165} 166 167void mipi_i3c_hci_resume(struct i3c_hci *hci) 168{ 169 reg_set(HC_CONTROL, HC_CONTROL_RESUME); 170} 171 172/* located here rather than pio.c because needed bits are in core reg space */ 173void mipi_i3c_hci_pio_reset(struct i3c_hci *hci) 174{ 175 reg_write(RESET_CONTROL, RX_FIFO_RST | TX_FIFO_RST | RESP_QUEUE_RST); 176} 177 178/* located here rather than dct.c because needed bits are in core reg space */ 179void mipi_i3c_hci_dct_index_reset(struct i3c_hci *hci) 180{ 181 reg_write(DCT_SECTION, FIELD_PREP(DCT_TABLE_INDEX, 0)); 182} 183 184static int i3c_hci_send_ccc_cmd(struct i3c_master_controller *m, 185 struct i3c_ccc_cmd *ccc) 186{ 187 struct i3c_hci *hci = to_i3c_hci(m); 188 struct hci_xfer *xfer; 189 bool raw = !!(hci->quirks & HCI_QUIRK_RAW_CCC); 190 bool prefixed = raw && !!(ccc->id & I3C_CCC_DIRECT); 191 unsigned int nxfers = ccc->ndests + prefixed; 192 DECLARE_COMPLETION_ONSTACK(done); 193 int i, last, ret = 0; 194 195 dev_dbg(&hci->master.dev, "cmd=%#x rnw=%d ndests=%d data[0].len=%d", 196 ccc->id, ccc->rnw, ccc->ndests, ccc->dests[0].payload.len); 197 198 xfer = hci_alloc_xfer(nxfers); 199 if (!xfer) 200 return -ENOMEM; 201 202 if (prefixed) { 203 xfer->data = NULL; 204 xfer->data_len = 0; 205 xfer->rnw = false; 206 hci->cmd->prep_ccc(hci, xfer, I3C_BROADCAST_ADDR, 207 ccc->id, true); 208 xfer++; 209 } 210 211 for (i = 0; i < nxfers - prefixed; i++) { 212 xfer[i].data = ccc->dests[i].payload.data; 213 xfer[i].data_len = ccc->dests[i].payload.len; 214 xfer[i].rnw = ccc->rnw; 215 ret = hci->cmd->prep_ccc(hci, &xfer[i], ccc->dests[i].addr, 216 ccc->id, raw); 217 if (ret) 218 goto out; 219 xfer[i].cmd_desc[0] |= CMD_0_ROC; 220 } 221 last = i - 1; 222 xfer[last].cmd_desc[0] |= CMD_0_TOC; 223 xfer[last].completion = &done; 224 225 if (prefixed) 226 xfer--; 227 228 ret = hci->io->queue_xfer(hci, xfer, nxfers); 229 if (ret) 230 goto out; 231 if (!wait_for_completion_timeout(&done, HZ) && 232 hci->io->dequeue_xfer(hci, xfer, nxfers)) { 233 ret = -ETIMEDOUT; 234 goto out; 235 } 236 for (i = prefixed; i < nxfers; i++) { 237 if (ccc->rnw) 238 ccc->dests[i - prefixed].payload.len = 239 RESP_DATA_LENGTH(xfer[i].response); 240 switch (RESP_STATUS(xfer[i].response)) { 241 case RESP_SUCCESS: 242 continue; 243 case RESP_ERR_ADDR_HEADER: 244 case RESP_ERR_NACK: 245 ccc->err = I3C_ERROR_M2; 246 fallthrough; 247 default: 248 ret = -EIO; 249 goto out; 250 } 251 } 252 253 if (ccc->rnw) 254 dev_dbg(&hci->master.dev, "got: %*ph", 255 ccc->dests[0].payload.len, ccc->dests[0].payload.data); 256 257out: 258 hci_free_xfer(xfer, nxfers); 259 return ret; 260} 261 262static int i3c_hci_daa(struct i3c_master_controller *m) 263{ 264 struct i3c_hci *hci = to_i3c_hci(m); 265 266 return hci->cmd->perform_daa(hci); 267} 268 269static int i3c_hci_i3c_xfers(struct i3c_dev_desc *dev, 270 struct i3c_xfer *i3c_xfers, int nxfers, 271 enum i3c_xfer_mode mode) 272{ 273 struct i3c_master_controller *m = i3c_dev_get_master(dev); 274 struct i3c_hci *hci = to_i3c_hci(m); 275 struct hci_xfer *xfer; 276 DECLARE_COMPLETION_ONSTACK(done); 277 unsigned int size_limit; 278 int i, last, ret = 0; 279 280 dev_dbg(&hci->master.dev, "nxfers = %d", nxfers); 281 282 xfer = hci_alloc_xfer(nxfers); 283 if (!xfer) 284 return -ENOMEM; 285 286 size_limit = 1U << (16 + FIELD_GET(HC_CAP_MAX_DATA_LENGTH, hci->caps)); 287 288 for (i = 0; i < nxfers; i++) { 289 xfer[i].data_len = i3c_xfers[i].len; 290 ret = -EFBIG; 291 if (xfer[i].data_len >= size_limit) 292 goto out; 293 xfer[i].rnw = i3c_xfers[i].rnw; 294 if (i3c_xfers[i].rnw) { 295 xfer[i].data = i3c_xfers[i].data.in; 296 } else { 297 /* silence the const qualifier warning with a cast */ 298 xfer[i].data = (void *) i3c_xfers[i].data.out; 299 } 300 hci->cmd->prep_i3c_xfer(hci, dev, &xfer[i]); 301 xfer[i].cmd_desc[0] |= CMD_0_ROC; 302 } 303 last = i - 1; 304 xfer[last].cmd_desc[0] |= CMD_0_TOC; 305 xfer[last].completion = &done; 306 307 ret = hci->io->queue_xfer(hci, xfer, nxfers); 308 if (ret) 309 goto out; 310 if (!wait_for_completion_timeout(&done, HZ) && 311 hci->io->dequeue_xfer(hci, xfer, nxfers)) { 312 ret = -ETIMEDOUT; 313 goto out; 314 } 315 for (i = 0; i < nxfers; i++) { 316 if (i3c_xfers[i].rnw) 317 i3c_xfers[i].len = RESP_DATA_LENGTH(xfer[i].response); 318 if (RESP_STATUS(xfer[i].response) != RESP_SUCCESS) { 319 ret = -EIO; 320 goto out; 321 } 322 } 323 324out: 325 hci_free_xfer(xfer, nxfers); 326 return ret; 327} 328 329static int i3c_hci_i2c_xfers(struct i2c_dev_desc *dev, 330 struct i2c_msg *i2c_xfers, int nxfers) 331{ 332 struct i3c_master_controller *m = i2c_dev_get_master(dev); 333 struct i3c_hci *hci = to_i3c_hci(m); 334 struct hci_xfer *xfer; 335 DECLARE_COMPLETION_ONSTACK(done); 336 int i, last, ret = 0; 337 338 dev_dbg(&hci->master.dev, "nxfers = %d", nxfers); 339 340 xfer = hci_alloc_xfer(nxfers); 341 if (!xfer) 342 return -ENOMEM; 343 344 for (i = 0; i < nxfers; i++) { 345 xfer[i].data = i2c_xfers[i].buf; 346 xfer[i].data_len = i2c_xfers[i].len; 347 xfer[i].rnw = i2c_xfers[i].flags & I2C_M_RD; 348 hci->cmd->prep_i2c_xfer(hci, dev, &xfer[i]); 349 xfer[i].cmd_desc[0] |= CMD_0_ROC; 350 } 351 last = i - 1; 352 xfer[last].cmd_desc[0] |= CMD_0_TOC; 353 xfer[last].completion = &done; 354 355 ret = hci->io->queue_xfer(hci, xfer, nxfers); 356 if (ret) 357 goto out; 358 if (!wait_for_completion_timeout(&done, m->i2c.timeout) && 359 hci->io->dequeue_xfer(hci, xfer, nxfers)) { 360 ret = -ETIMEDOUT; 361 goto out; 362 } 363 for (i = 0; i < nxfers; i++) { 364 if (RESP_STATUS(xfer[i].response) != RESP_SUCCESS) { 365 ret = -EIO; 366 goto out; 367 } 368 } 369 370out: 371 hci_free_xfer(xfer, nxfers); 372 return ret; 373} 374 375static int i3c_hci_attach_i3c_dev(struct i3c_dev_desc *dev) 376{ 377 struct i3c_master_controller *m = i3c_dev_get_master(dev); 378 struct i3c_hci *hci = to_i3c_hci(m); 379 struct i3c_hci_dev_data *dev_data; 380 int ret; 381 382 dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL); 383 if (!dev_data) 384 return -ENOMEM; 385 if (hci->cmd == &mipi_i3c_hci_cmd_v1) { 386 ret = mipi_i3c_hci_dat_v1.alloc_entry(hci); 387 if (ret < 0) { 388 kfree(dev_data); 389 return ret; 390 } 391 mipi_i3c_hci_dat_v1.set_dynamic_addr(hci, ret, 392 dev->info.dyn_addr ?: dev->info.static_addr); 393 dev_data->dat_idx = ret; 394 } 395 i3c_dev_set_master_data(dev, dev_data); 396 return 0; 397} 398 399static int i3c_hci_reattach_i3c_dev(struct i3c_dev_desc *dev, u8 old_dyn_addr) 400{ 401 struct i3c_master_controller *m = i3c_dev_get_master(dev); 402 struct i3c_hci *hci = to_i3c_hci(m); 403 struct i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); 404 405 if (hci->cmd == &mipi_i3c_hci_cmd_v1) 406 mipi_i3c_hci_dat_v1.set_dynamic_addr(hci, dev_data->dat_idx, 407 dev->info.dyn_addr); 408 return 0; 409} 410 411static void i3c_hci_detach_i3c_dev(struct i3c_dev_desc *dev) 412{ 413 struct i3c_master_controller *m = i3c_dev_get_master(dev); 414 struct i3c_hci *hci = to_i3c_hci(m); 415 struct i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); 416 417 i3c_dev_set_master_data(dev, NULL); 418 if (hci->cmd == &mipi_i3c_hci_cmd_v1) 419 mipi_i3c_hci_dat_v1.free_entry(hci, dev_data->dat_idx); 420 kfree(dev_data); 421} 422 423static int i3c_hci_attach_i2c_dev(struct i2c_dev_desc *dev) 424{ 425 struct i3c_master_controller *m = i2c_dev_get_master(dev); 426 struct i3c_hci *hci = to_i3c_hci(m); 427 struct i3c_hci_dev_data *dev_data; 428 int ret; 429 430 if (hci->cmd != &mipi_i3c_hci_cmd_v1) 431 return 0; 432 dev_data = kzalloc(sizeof(*dev_data), GFP_KERNEL); 433 if (!dev_data) 434 return -ENOMEM; 435 ret = mipi_i3c_hci_dat_v1.alloc_entry(hci); 436 if (ret < 0) { 437 kfree(dev_data); 438 return ret; 439 } 440 mipi_i3c_hci_dat_v1.set_static_addr(hci, ret, dev->addr); 441 mipi_i3c_hci_dat_v1.set_flags(hci, ret, DAT_0_I2C_DEVICE, 0); 442 dev_data->dat_idx = ret; 443 i2c_dev_set_master_data(dev, dev_data); 444 return 0; 445} 446 447static void i3c_hci_detach_i2c_dev(struct i2c_dev_desc *dev) 448{ 449 struct i3c_master_controller *m = i2c_dev_get_master(dev); 450 struct i3c_hci *hci = to_i3c_hci(m); 451 struct i3c_hci_dev_data *dev_data = i2c_dev_get_master_data(dev); 452 453 if (dev_data) { 454 i2c_dev_set_master_data(dev, NULL); 455 if (hci->cmd == &mipi_i3c_hci_cmd_v1) 456 mipi_i3c_hci_dat_v1.free_entry(hci, dev_data->dat_idx); 457 kfree(dev_data); 458 } 459} 460 461static int i3c_hci_request_ibi(struct i3c_dev_desc *dev, 462 const struct i3c_ibi_setup *req) 463{ 464 struct i3c_master_controller *m = i3c_dev_get_master(dev); 465 struct i3c_hci *hci = to_i3c_hci(m); 466 struct i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); 467 unsigned int dat_idx = dev_data->dat_idx; 468 469 if (req->max_payload_len != 0) 470 mipi_i3c_hci_dat_v1.set_flags(hci, dat_idx, DAT_0_IBI_PAYLOAD, 0); 471 else 472 mipi_i3c_hci_dat_v1.clear_flags(hci, dat_idx, DAT_0_IBI_PAYLOAD, 0); 473 return hci->io->request_ibi(hci, dev, req); 474} 475 476static void i3c_hci_free_ibi(struct i3c_dev_desc *dev) 477{ 478 struct i3c_master_controller *m = i3c_dev_get_master(dev); 479 struct i3c_hci *hci = to_i3c_hci(m); 480 481 hci->io->free_ibi(hci, dev); 482} 483 484static int i3c_hci_enable_ibi(struct i3c_dev_desc *dev) 485{ 486 struct i3c_master_controller *m = i3c_dev_get_master(dev); 487 struct i3c_hci *hci = to_i3c_hci(m); 488 struct i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); 489 490 mipi_i3c_hci_dat_v1.clear_flags(hci, dev_data->dat_idx, DAT_0_SIR_REJECT, 0); 491 return i3c_master_enec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); 492} 493 494static int i3c_hci_disable_ibi(struct i3c_dev_desc *dev) 495{ 496 struct i3c_master_controller *m = i3c_dev_get_master(dev); 497 struct i3c_hci *hci = to_i3c_hci(m); 498 struct i3c_hci_dev_data *dev_data = i3c_dev_get_master_data(dev); 499 500 mipi_i3c_hci_dat_v1.set_flags(hci, dev_data->dat_idx, DAT_0_SIR_REJECT, 0); 501 return i3c_master_disec_locked(m, dev->info.dyn_addr, I3C_CCC_EVENT_SIR); 502} 503 504static void i3c_hci_recycle_ibi_slot(struct i3c_dev_desc *dev, 505 struct i3c_ibi_slot *slot) 506{ 507 struct i3c_master_controller *m = i3c_dev_get_master(dev); 508 struct i3c_hci *hci = to_i3c_hci(m); 509 510 hci->io->recycle_ibi_slot(hci, dev, slot); 511} 512 513static const struct i3c_master_controller_ops i3c_hci_ops = { 514 .bus_init = i3c_hci_bus_init, 515 .bus_cleanup = i3c_hci_bus_cleanup, 516 .do_daa = i3c_hci_daa, 517 .send_ccc_cmd = i3c_hci_send_ccc_cmd, 518 .i3c_xfers = i3c_hci_i3c_xfers, 519 .i2c_xfers = i3c_hci_i2c_xfers, 520 .attach_i3c_dev = i3c_hci_attach_i3c_dev, 521 .reattach_i3c_dev = i3c_hci_reattach_i3c_dev, 522 .detach_i3c_dev = i3c_hci_detach_i3c_dev, 523 .attach_i2c_dev = i3c_hci_attach_i2c_dev, 524 .detach_i2c_dev = i3c_hci_detach_i2c_dev, 525 .request_ibi = i3c_hci_request_ibi, 526 .free_ibi = i3c_hci_free_ibi, 527 .enable_ibi = i3c_hci_enable_ibi, 528 .disable_ibi = i3c_hci_disable_ibi, 529 .recycle_ibi_slot = i3c_hci_recycle_ibi_slot, 530}; 531 532static irqreturn_t i3c_hci_irq_handler(int irq, void *dev_id) 533{ 534 struct i3c_hci *hci = dev_id; 535 irqreturn_t result = IRQ_NONE; 536 u32 val; 537 538 val = reg_read(INTR_STATUS); 539 reg_write(INTR_STATUS, val); 540 dev_dbg(&hci->master.dev, "INTR_STATUS %#x", val); 541 542 if (val) 543 result = IRQ_HANDLED; 544 545 if (val & INTR_HC_SEQ_CANCEL) { 546 dev_dbg(&hci->master.dev, 547 "Host Controller Cancelled Transaction Sequence\n"); 548 val &= ~INTR_HC_SEQ_CANCEL; 549 } 550 if (val & INTR_HC_INTERNAL_ERR) { 551 dev_err(&hci->master.dev, "Host Controller Internal Error\n"); 552 val &= ~INTR_HC_INTERNAL_ERR; 553 } 554 555 if (val) 556 dev_warn_once(&hci->master.dev, 557 "unexpected INTR_STATUS %#x\n", val); 558 559 if (hci->io->irq_handler(hci)) 560 result = IRQ_HANDLED; 561 562 return result; 563} 564 565static int i3c_hci_init(struct i3c_hci *hci) 566{ 567 bool size_in_dwords, mode_selector; 568 u32 regval, offset; 569 int ret; 570 571 /* Validate HCI hardware version */ 572 regval = reg_read(HCI_VERSION); 573 hci->version_major = (regval >> 8) & 0xf; 574 hci->version_minor = (regval >> 4) & 0xf; 575 hci->revision = regval & 0xf; 576 dev_notice(&hci->master.dev, "MIPI I3C HCI v%u.%u r%02u\n", 577 hci->version_major, hci->version_minor, hci->revision); 578 /* known versions */ 579 switch (regval & ~0xf) { 580 case 0x100: /* version 1.0 */ 581 case 0x110: /* version 1.1 */ 582 case 0x200: /* version 2.0 */ 583 break; 584 default: 585 dev_err(&hci->master.dev, "unsupported HCI version\n"); 586 return -EPROTONOSUPPORT; 587 } 588 589 hci->caps = reg_read(HC_CAPABILITIES); 590 dev_dbg(&hci->master.dev, "caps = %#x", hci->caps); 591 592 size_in_dwords = hci->version_major < 1 || 593 (hci->version_major == 1 && hci->version_minor < 1); 594 595 regval = reg_read(DAT_SECTION); 596 offset = FIELD_GET(DAT_TABLE_OFFSET, regval); 597 hci->DAT_regs = offset ? hci->base_regs + offset : NULL; 598 hci->DAT_entries = FIELD_GET(DAT_TABLE_SIZE, regval); 599 hci->DAT_entry_size = FIELD_GET(DAT_ENTRY_SIZE, regval) ? 0 : 8; 600 if (size_in_dwords) 601 hci->DAT_entries = 4 * hci->DAT_entries / hci->DAT_entry_size; 602 dev_info(&hci->master.dev, "DAT: %u %u-bytes entries at offset %#x\n", 603 hci->DAT_entries, hci->DAT_entry_size, offset); 604 605 regval = reg_read(DCT_SECTION); 606 offset = FIELD_GET(DCT_TABLE_OFFSET, regval); 607 hci->DCT_regs = offset ? hci->base_regs + offset : NULL; 608 hci->DCT_entries = FIELD_GET(DCT_TABLE_SIZE, regval); 609 hci->DCT_entry_size = FIELD_GET(DCT_ENTRY_SIZE, regval) ? 0 : 16; 610 if (size_in_dwords) 611 hci->DCT_entries = 4 * hci->DCT_entries / hci->DCT_entry_size; 612 dev_info(&hci->master.dev, "DCT: %u %u-bytes entries at offset %#x\n", 613 hci->DCT_entries, hci->DCT_entry_size, offset); 614 615 regval = reg_read(RING_HEADERS_SECTION); 616 offset = FIELD_GET(RING_HEADERS_OFFSET, regval); 617 hci->RHS_regs = offset ? hci->base_regs + offset : NULL; 618 dev_info(&hci->master.dev, "Ring Headers at offset %#x\n", offset); 619 620 regval = reg_read(PIO_SECTION); 621 offset = FIELD_GET(PIO_REGS_OFFSET, regval); 622 hci->PIO_regs = offset ? hci->base_regs + offset : NULL; 623 dev_info(&hci->master.dev, "PIO section at offset %#x\n", offset); 624 625 regval = reg_read(EXT_CAPS_SECTION); 626 offset = FIELD_GET(EXT_CAPS_OFFSET, regval); 627 hci->EXTCAPS_regs = offset ? hci->base_regs + offset : NULL; 628 dev_info(&hci->master.dev, "Extended Caps at offset %#x\n", offset); 629 630 ret = i3c_hci_parse_ext_caps(hci); 631 if (ret) 632 return ret; 633 634 spin_lock_init(&hci->lock); 635 mutex_init(&hci->control_mutex); 636 637 /* 638 * Now let's reset the hardware. 639 * SOFT_RST must be clear before we write to it. 640 * Then we must wait until it clears again. 641 */ 642 ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval, 643 !(regval & SOFT_RST), 1, 10000); 644 if (ret) 645 return -ENXIO; 646 reg_write(RESET_CONTROL, SOFT_RST); 647 ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval, 648 !(regval & SOFT_RST), 1, 10000); 649 if (ret) 650 return -ENXIO; 651 652 /* Disable all interrupts */ 653 reg_write(INTR_SIGNAL_ENABLE, 0x0); 654 /* 655 * Only allow bit 31:10 signal updates because 656 * Bit 0:9 are reserved in IP version >= 0.8 657 * Bit 0:5 are defined in IP version < 0.8 but not handled by PIO code 658 */ 659 reg_write(INTR_STATUS_ENABLE, GENMASK(31, 10)); 660 661 /* Make sure our data ordering fits the host's */ 662 regval = reg_read(HC_CONTROL); 663 if (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)) { 664 if (!(regval & HC_CONTROL_DATA_BIG_ENDIAN)) { 665 regval |= HC_CONTROL_DATA_BIG_ENDIAN; 666 reg_write(HC_CONTROL, regval); 667 regval = reg_read(HC_CONTROL); 668 if (!(regval & HC_CONTROL_DATA_BIG_ENDIAN)) { 669 dev_err(&hci->master.dev, "cannot set BE mode\n"); 670 return -EOPNOTSUPP; 671 } 672 } 673 } else { 674 if (regval & HC_CONTROL_DATA_BIG_ENDIAN) { 675 regval &= ~HC_CONTROL_DATA_BIG_ENDIAN; 676 reg_write(HC_CONTROL, regval); 677 regval = reg_read(HC_CONTROL); 678 if (regval & HC_CONTROL_DATA_BIG_ENDIAN) { 679 dev_err(&hci->master.dev, "cannot clear BE mode\n"); 680 return -EOPNOTSUPP; 681 } 682 } 683 } 684 685 /* Select our command descriptor model */ 686 switch (FIELD_GET(HC_CAP_CMD_SIZE, hci->caps)) { 687 case 0: 688 hci->cmd = &mipi_i3c_hci_cmd_v1; 689 break; 690 case 1: 691 hci->cmd = &mipi_i3c_hci_cmd_v2; 692 break; 693 default: 694 dev_err(&hci->master.dev, "wrong CMD_SIZE capability value\n"); 695 return -EINVAL; 696 } 697 698 mode_selector = hci->version_major > 1 || 699 (hci->version_major == 1 && hci->version_minor > 0); 700 701 /* Quirk for HCI_QUIRK_PIO_MODE on AMD platforms */ 702 if (hci->quirks & HCI_QUIRK_PIO_MODE) 703 hci->RHS_regs = NULL; 704 705 /* Try activating DMA operations first */ 706 if (hci->RHS_regs) { 707 reg_clear(HC_CONTROL, HC_CONTROL_PIO_MODE); 708 if (mode_selector && (reg_read(HC_CONTROL) & HC_CONTROL_PIO_MODE)) { 709 dev_err(&hci->master.dev, "PIO mode is stuck\n"); 710 ret = -EIO; 711 } else { 712 hci->io = &mipi_i3c_hci_dma; 713 dev_info(&hci->master.dev, "Using DMA\n"); 714 } 715 } 716 717 /* If no DMA, try PIO */ 718 if (!hci->io && hci->PIO_regs) { 719 reg_set(HC_CONTROL, HC_CONTROL_PIO_MODE); 720 if (mode_selector && !(reg_read(HC_CONTROL) & HC_CONTROL_PIO_MODE)) { 721 dev_err(&hci->master.dev, "DMA mode is stuck\n"); 722 ret = -EIO; 723 } else { 724 hci->io = &mipi_i3c_hci_pio; 725 dev_info(&hci->master.dev, "Using PIO\n"); 726 } 727 } 728 729 if (!hci->io) { 730 dev_err(&hci->master.dev, "neither DMA nor PIO can be used\n"); 731 if (!ret) 732 ret = -EINVAL; 733 return ret; 734 } 735 736 /* Configure OD and PP timings for AMD platforms */ 737 if (hci->quirks & HCI_QUIRK_OD_PP_TIMING) 738 amd_set_od_pp_timing(hci); 739 740 return 0; 741} 742 743static int i3c_hci_probe(struct platform_device *pdev) 744{ 745 struct i3c_hci *hci; 746 int irq, ret; 747 748 hci = devm_kzalloc(&pdev->dev, sizeof(*hci), GFP_KERNEL); 749 if (!hci) 750 return -ENOMEM; 751 hci->base_regs = devm_platform_ioremap_resource(pdev, 0); 752 if (IS_ERR(hci->base_regs)) 753 return PTR_ERR(hci->base_regs); 754 755 platform_set_drvdata(pdev, hci); 756 /* temporary for dev_printk's, to be replaced in i3c_master_register */ 757 hci->master.dev.init_name = dev_name(&pdev->dev); 758 759 hci->quirks = (unsigned long)device_get_match_data(&pdev->dev); 760 761 ret = i3c_hci_init(hci); 762 if (ret) 763 return ret; 764 765 irq = platform_get_irq(pdev, 0); 766 ret = devm_request_irq(&pdev->dev, irq, i3c_hci_irq_handler, 767 0, NULL, hci); 768 if (ret) 769 return ret; 770 771 ret = i3c_master_register(&hci->master, &pdev->dev, 772 &i3c_hci_ops, false); 773 if (ret) 774 return ret; 775 776 return 0; 777} 778 779static void i3c_hci_remove(struct platform_device *pdev) 780{ 781 struct i3c_hci *hci = platform_get_drvdata(pdev); 782 783 i3c_master_unregister(&hci->master); 784} 785 786static const __maybe_unused struct of_device_id i3c_hci_of_match[] = { 787 { .compatible = "mipi-i3c-hci", }, 788 {}, 789}; 790MODULE_DEVICE_TABLE(of, i3c_hci_of_match); 791 792static const struct acpi_device_id i3c_hci_acpi_match[] = { 793 { "AMDI5017", HCI_QUIRK_PIO_MODE | HCI_QUIRK_OD_PP_TIMING | HCI_QUIRK_RESP_BUF_THLD }, 794 {} 795}; 796MODULE_DEVICE_TABLE(acpi, i3c_hci_acpi_match); 797 798static struct platform_driver i3c_hci_driver = { 799 .probe = i3c_hci_probe, 800 .remove = i3c_hci_remove, 801 .driver = { 802 .name = "mipi-i3c-hci", 803 .of_match_table = of_match_ptr(i3c_hci_of_match), 804 .acpi_match_table = i3c_hci_acpi_match, 805 }, 806}; 807module_platform_driver(i3c_hci_driver); 808MODULE_ALIAS("platform:mipi-i3c-hci"); 809 810MODULE_AUTHOR("Nicolas Pitre <npitre@baylibre.com>"); 811MODULE_DESCRIPTION("MIPI I3C HCI driver"); 812MODULE_LICENSE("Dual BSD/GPL");
~/
Read-only file preview.