1 // SPDX-License-Identifier: GPL-2.0-only OR MIT 2 /* Copyright (c) 2023 Imagination Technologies Ltd. */ 3 4 #include "pvr_device.h" 5 #include "pvr_fw.h" 6 #include "pvr_fw_startstop.h" 7 #include "pvr_power.h" 8 #include "pvr_queue.h" 9 #include "pvr_rogue_fwif.h" 10 11 #include <drm/drm_drv.h> 12 #include <drm/drm_managed.h> 13 #include <linux/cleanup.h> 14 #include <linux/clk.h> 15 #include <linux/interrupt.h> 16 #include <linux/mutex.h> 17 #include <linux/of.h> 18 #include <linux/platform_device.h> 19 #include <linux/pm_domain.h> 20 #include <linux/pm_runtime.h> 21 #include <linux/reset.h> 22 #include <linux/timer.h> 23 #include <linux/types.h> 24 #include <linux/workqueue.h> 25 26 #define POWER_SYNC_TIMEOUT_US (1000000) /* 1s */ 27 28 #define WATCHDOG_TIME_MS (500) 29 30 /** 31 * pvr_device_lost() - Mark GPU device as lost 32 * @pvr_dev: Target PowerVR device. 33 * 34 * This will cause the DRM device to be unplugged. 35 */ 36 void 37 pvr_device_lost(struct pvr_device *pvr_dev) 38 { 39 if (!pvr_dev->lost) { 40 pvr_dev->lost = true; 41 drm_dev_unplug(from_pvr_device(pvr_dev)); 42 } 43 } 44 45 static int 46 pvr_power_send_command(struct pvr_device *pvr_dev, struct rogue_fwif_kccb_cmd *pow_cmd) 47 { 48 struct pvr_fw_device *fw_dev = &pvr_dev->fw_dev; 49 u32 slot_nr; 50 u32 value; 51 int err; 52 53 WRITE_ONCE(*fw_dev->power_sync, 0); 54 55 err = pvr_kccb_send_cmd_powered(pvr_dev, pow_cmd, &slot_nr); 56 if (err) 57 return err; 58 59 /* Wait for FW to acknowledge. */ 60 return readl_poll_timeout(pvr_dev->fw_dev.power_sync, value, value != 0, 100, 61 POWER_SYNC_TIMEOUT_US); 62 } 63 64 static int 65 pvr_power_request_idle(struct pvr_device *pvr_dev) 66 { 67 struct rogue_fwif_kccb_cmd pow_cmd; 68 69 /* Send FORCED_IDLE request to FW. */ 70 pow_cmd.cmd_type = ROGUE_FWIF_KCCB_CMD_POW; 71 pow_cmd.cmd_data.pow_data.pow_type = ROGUE_FWIF_POW_FORCED_IDLE_REQ; 72 pow_cmd.cmd_data.pow_data.power_req_data.pow_request_type = ROGUE_FWIF_POWER_FORCE_IDLE; 73 74 return pvr_power_send_command(pvr_dev, &pow_cmd); 75 } 76 77 static int 78 pvr_power_request_pwr_off(struct pvr_device *pvr_dev) 79 { 80 struct rogue_fwif_kccb_cmd pow_cmd; 81 82 /* Send POW_OFF request to firmware. */ 83 pow_cmd.cmd_type = ROGUE_FWIF_KCCB_CMD_POW; 84 pow_cmd.cmd_data.pow_data.pow_type = ROGUE_FWIF_POW_OFF_REQ; 85 pow_cmd.cmd_data.pow_data.power_req_data.forced = true; 86 87 return pvr_power_send_command(pvr_dev, &pow_cmd); 88 } 89 90 static int 91 pvr_power_fw_disable(struct pvr_device *pvr_dev, bool hard_reset) 92 { 93 if (!hard_reset) { 94 int err; 95 96 cancel_delayed_work_sync(&pvr_dev->watchdog.work); 97 98 err = pvr_power_request_idle(pvr_dev); 99 if (err) 100 return err; 101 102 err = pvr_power_request_pwr_off(pvr_dev); 103 if (err) 104 return err; 105 } 106 107 return pvr_fw_stop(pvr_dev); 108 } 109 110 static int 111 pvr_power_fw_enable(struct pvr_device *pvr_dev) 112 { 113 int err; 114 115 err = pvr_fw_start(pvr_dev); 116 if (err) 117 return err; 118 119 err = pvr_wait_for_fw_boot(pvr_dev); 120 if (err) { 121 drm_err(from_pvr_device(pvr_dev), "Firmware failed to boot\n"); 122 pvr_fw_stop(pvr_dev); 123 return err; 124 } 125 126 queue_delayed_work(pvr_dev->sched_wq, &pvr_dev->watchdog.work, 127 msecs_to_jiffies(WATCHDOG_TIME_MS)); 128 129 return 0; 130 } 131 132 bool 133 pvr_power_is_idle(struct pvr_device *pvr_dev) 134 { 135 /* 136 * FW power state can be out of date if a KCCB command has been submitted but the FW hasn't 137 * started processing it yet. So also check the KCCB status. 138 */ 139 enum rogue_fwif_pow_state pow_state = READ_ONCE(pvr_dev->fw_dev.fwif_sysdata->pow_state); 140 bool kccb_idle = pvr_kccb_is_idle(pvr_dev); 141 142 return (pow_state == ROGUE_FWIF_POW_IDLE) && kccb_idle; 143 } 144 145 static bool 146 pvr_watchdog_kccb_stalled(struct pvr_device *pvr_dev) 147 { 148 /* Check KCCB commands are progressing. */ 149 u32 kccb_cmds_executed = pvr_dev->fw_dev.fwif_osdata->kccb_cmds_executed; 150 bool kccb_is_idle = pvr_kccb_is_idle(pvr_dev); 151 152 if (pvr_dev->watchdog.old_kccb_cmds_executed == kccb_cmds_executed && !kccb_is_idle) { 153 pvr_dev->watchdog.kccb_stall_count++; 154 155 /* 156 * If we have commands pending with no progress for 2 consecutive polls then 157 * consider KCCB command processing stalled. 158 */ 159 if (pvr_dev->watchdog.kccb_stall_count == 2) { 160 pvr_dev->watchdog.kccb_stall_count = 0; 161 return true; 162 } 163 } else if (pvr_dev->watchdog.old_kccb_cmds_executed == kccb_cmds_executed) { 164 bool has_active_contexts; 165 166 mutex_lock(&pvr_dev->queues.lock); 167 has_active_contexts = list_empty(&pvr_dev->queues.active); 168 mutex_unlock(&pvr_dev->queues.lock); 169 170 if (has_active_contexts) { 171 /* Send a HEALTH_CHECK command so we can verify FW is still alive. */ 172 struct rogue_fwif_kccb_cmd health_check_cmd; 173 174 health_check_cmd.cmd_type = ROGUE_FWIF_KCCB_CMD_HEALTH_CHECK; 175 176 pvr_kccb_send_cmd_powered(pvr_dev, &health_check_cmd, NULL); 177 } 178 } else { 179 pvr_dev->watchdog.old_kccb_cmds_executed = kccb_cmds_executed; 180 pvr_dev->watchdog.kccb_stall_count = 0; 181 } 182 183 return false; 184 } 185 186 static void 187 pvr_watchdog_worker(struct work_struct *work) 188 { 189 struct pvr_device *pvr_dev = container_of(work, struct pvr_device, 190 watchdog.work.work); 191 bool stalled; 192 193 if (pvr_dev->lost) 194 return; 195 196 if (pm_runtime_get_if_in_use(from_pvr_device(pvr_dev)->dev) <= 0) 197 goto out_requeue; 198 199 if (!pvr_dev->fw_dev.booted) 200 goto out_pm_runtime_put; 201 202 stalled = pvr_watchdog_kccb_stalled(pvr_dev); 203 204 if (stalled) { 205 drm_err(from_pvr_device(pvr_dev), "FW stalled, trying hard reset"); 206 207 pvr_power_reset(pvr_dev, true); 208 /* Device may be lost at this point. */ 209 } 210 211 out_pm_runtime_put: 212 pm_runtime_put(from_pvr_device(pvr_dev)->dev); 213 214 out_requeue: 215 if (!pvr_dev->lost) { 216 queue_delayed_work(pvr_dev->sched_wq, &pvr_dev->watchdog.work, 217 msecs_to_jiffies(WATCHDOG_TIME_MS)); 218 } 219 } 220 221 /** 222 * pvr_watchdog_init() - Initialise watchdog for device 223 * @pvr_dev: Target PowerVR device. 224 * 225 * Returns: 226 * * 0 on success, or 227 * * -%ENOMEM on out of memory. 228 */ 229 int 230 pvr_watchdog_init(struct pvr_device *pvr_dev) 231 { 232 INIT_DELAYED_WORK(&pvr_dev->watchdog.work, pvr_watchdog_worker); 233 234 return 0; 235 } 236 237 int 238 pvr_power_device_suspend(struct device *dev) 239 { 240 struct platform_device *plat_dev = to_platform_device(dev); 241 struct drm_device *drm_dev = platform_get_drvdata(plat_dev); 242 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); 243 int err = 0; 244 int idx; 245 246 if (!drm_dev_enter(drm_dev, &idx)) 247 return -EIO; 248 249 if (pvr_dev->fw_dev.booted) { 250 err = pvr_power_fw_disable(pvr_dev, false); 251 if (err) 252 goto err_drm_dev_exit; 253 } 254 255 clk_disable_unprepare(pvr_dev->mem_clk); 256 clk_disable_unprepare(pvr_dev->sys_clk); 257 clk_disable_unprepare(pvr_dev->core_clk); 258 259 err = reset_control_assert(pvr_dev->reset); 260 261 err_drm_dev_exit: 262 drm_dev_exit(idx); 263 264 return err; 265 } 266 267 int 268 pvr_power_device_resume(struct device *dev) 269 { 270 struct platform_device *plat_dev = to_platform_device(dev); 271 struct drm_device *drm_dev = platform_get_drvdata(plat_dev); 272 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); 273 int idx; 274 int err; 275 276 if (!drm_dev_enter(drm_dev, &idx)) 277 return -EIO; 278 279 err = clk_prepare_enable(pvr_dev->core_clk); 280 if (err) 281 goto err_drm_dev_exit; 282 283 err = clk_prepare_enable(pvr_dev->sys_clk); 284 if (err) 285 goto err_core_clk_disable; 286 287 err = clk_prepare_enable(pvr_dev->mem_clk); 288 if (err) 289 goto err_sys_clk_disable; 290 291 /* 292 * According to the hardware manual, a delay of at least 32 clock 293 * cycles is required between de-asserting the clkgen reset and 294 * de-asserting the GPU reset. Assuming a worst-case scenario with 295 * a very high GPU clock frequency, a delay of 1 microsecond is 296 * sufficient to ensure this requirement is met across all 297 * feasible GPU clock speeds. 298 */ 299 udelay(1); 300 301 err = reset_control_deassert(pvr_dev->reset); 302 if (err) 303 goto err_mem_clk_disable; 304 305 if (pvr_dev->fw_dev.booted) { 306 err = pvr_power_fw_enable(pvr_dev); 307 if (err) 308 goto err_reset_assert; 309 } 310 311 drm_dev_exit(idx); 312 313 return 0; 314 315 err_reset_assert: 316 reset_control_assert(pvr_dev->reset); 317 318 err_mem_clk_disable: 319 clk_disable_unprepare(pvr_dev->mem_clk); 320 321 err_sys_clk_disable: 322 clk_disable_unprepare(pvr_dev->sys_clk); 323 324 err_core_clk_disable: 325 clk_disable_unprepare(pvr_dev->core_clk); 326 327 err_drm_dev_exit: 328 drm_dev_exit(idx); 329 330 return err; 331 } 332 333 int 334 pvr_power_device_idle(struct device *dev) 335 { 336 struct platform_device *plat_dev = to_platform_device(dev); 337 struct drm_device *drm_dev = platform_get_drvdata(plat_dev); 338 struct pvr_device *pvr_dev = to_pvr_device(drm_dev); 339 340 return pvr_power_is_idle(pvr_dev) ? 0 : -EBUSY; 341 } 342 343 static int 344 pvr_power_clear_error(struct pvr_device *pvr_dev) 345 { 346 struct device *dev = from_pvr_device(pvr_dev)->dev; 347 int err; 348 349 /* Ensure the device state is known and nothing is happening past this point */ 350 pm_runtime_disable(dev); 351 352 /* Attempt to clear the runtime PM error by setting the current state again */ 353 if (pm_runtime_status_suspended(dev)) 354 err = pm_runtime_set_suspended(dev); 355 else 356 err = pm_runtime_set_active(dev); 357 358 if (err) { 359 drm_err(from_pvr_device(pvr_dev), 360 "%s: Failed to clear runtime PM error (new error %d)\n", 361 __func__, err); 362 } 363 364 pm_runtime_enable(dev); 365 366 return err; 367 } 368 369 /** 370 * pvr_power_get_clear() - Acquire a power reference, correcting any errors 371 * @pvr_dev: Device pointer 372 * 373 * Attempt to acquire a power reference on the device. If the runtime PM 374 * is in error state, attempt to clear the error and retry. 375 * 376 * Returns: 377 * * 0 on success, or 378 * * Any error code returned by pvr_power_get() or the runtime PM API. 379 */ 380 static int 381 pvr_power_get_clear(struct pvr_device *pvr_dev) 382 { 383 int err; 384 385 err = pvr_power_get(pvr_dev); 386 if (err == 0) 387 return err; 388 389 drm_warn(from_pvr_device(pvr_dev), 390 "%s: pvr_power_get returned error %d, attempting recovery\n", 391 __func__, err); 392 393 err = pvr_power_clear_error(pvr_dev); 394 if (err) 395 return err; 396 397 return pvr_power_get(pvr_dev); 398 } 399 400 /** 401 * pvr_power_reset() - Reset the GPU 402 * @pvr_dev: Device pointer 403 * @hard_reset: %true for hard reset, %false for soft reset 404 * 405 * If @hard_reset is %false and the FW processor fails to respond during the reset process, this 406 * function will attempt a hard reset. 407 * 408 * If a hard reset fails then the GPU device is reported as lost. 409 * 410 * Returns: 411 * * 0 on success, or 412 * * Any error code returned by pvr_power_get, pvr_power_fw_disable or pvr_power_fw_enable(). 413 */ 414 int 415 pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset) 416 { 417 bool queues_disabled = false; 418 int err; 419 420 /* 421 * Take a power reference during the reset. This should prevent any interference with the 422 * power state during reset. 423 */ 424 WARN_ON(pvr_power_get_clear(pvr_dev)); 425 426 down_write(&pvr_dev->reset_sem); 427 428 if (pvr_dev->lost) { 429 err = -EIO; 430 goto err_up_write; 431 } 432 433 /* Disable IRQs for the duration of the reset. */ 434 disable_irq(pvr_dev->irq); 435 436 do { 437 if (hard_reset) { 438 pvr_queue_device_pre_reset(pvr_dev); 439 queues_disabled = true; 440 } 441 442 err = pvr_power_fw_disable(pvr_dev, hard_reset); 443 if (!err) { 444 if (hard_reset) { 445 pvr_dev->fw_dev.booted = false; 446 WARN_ON(pvr_power_device_suspend(from_pvr_device(pvr_dev)->dev)); 447 448 err = pvr_fw_hard_reset(pvr_dev); 449 if (err) 450 goto err_device_lost; 451 452 err = pvr_power_device_resume(from_pvr_device(pvr_dev)->dev); 453 pvr_dev->fw_dev.booted = true; 454 if (err) 455 goto err_device_lost; 456 } else { 457 /* Clear the FW faulted flags. */ 458 pvr_dev->fw_dev.fwif_sysdata->hwr_state_flags &= 459 ~(ROGUE_FWIF_HWR_FW_FAULT | 460 ROGUE_FWIF_HWR_RESTART_REQUESTED); 461 } 462 463 pvr_fw_irq_clear(pvr_dev); 464 465 err = pvr_power_fw_enable(pvr_dev); 466 } 467 468 if (err && hard_reset) 469 goto err_device_lost; 470 471 if (err && !hard_reset) { 472 drm_err(from_pvr_device(pvr_dev), "FW stalled, trying hard reset"); 473 hard_reset = true; 474 } 475 } while (err); 476 477 if (queues_disabled) 478 pvr_queue_device_post_reset(pvr_dev); 479 480 enable_irq(pvr_dev->irq); 481 482 up_write(&pvr_dev->reset_sem); 483 484 pvr_power_put(pvr_dev); 485 486 return 0; 487 488 err_device_lost: 489 drm_err(from_pvr_device(pvr_dev), "GPU device lost"); 490 pvr_device_lost(pvr_dev); 491 492 /* Leave IRQs disabled if the device is lost. */ 493 494 if (queues_disabled) 495 pvr_queue_device_post_reset(pvr_dev); 496 497 err_up_write: 498 up_write(&pvr_dev->reset_sem); 499 500 pvr_power_put(pvr_dev); 501 502 return err; 503 } 504 505 /** 506 * pvr_watchdog_fini() - Shutdown watchdog for device 507 * @pvr_dev: Target PowerVR device. 508 */ 509 void 510 pvr_watchdog_fini(struct pvr_device *pvr_dev) 511 { 512 cancel_delayed_work_sync(&pvr_dev->watchdog.work); 513 } 514 515 int pvr_power_domains_init(struct pvr_device *pvr_dev) 516 { 517 struct device *dev = from_pvr_device(pvr_dev)->dev; 518 519 struct device_link **domain_links __free(kfree) = NULL; 520 struct device **domain_devs __free(kfree) = NULL; 521 int domain_count; 522 int link_count; 523 524 char dev_name[2] = "a"; 525 int err; 526 int i; 527 528 domain_count = of_count_phandle_with_args(dev->of_node, "power-domains", 529 "#power-domain-cells"); 530 if (domain_count < 0) 531 return domain_count; 532 533 if (domain_count <= 1) 534 return 0; 535 536 link_count = domain_count + (domain_count - 1); 537 538 domain_devs = kcalloc(domain_count, sizeof(*domain_devs), GFP_KERNEL); 539 if (!domain_devs) 540 return -ENOMEM; 541 542 domain_links = kcalloc(link_count, sizeof(*domain_links), GFP_KERNEL); 543 if (!domain_links) 544 return -ENOMEM; 545 546 for (i = 0; i < domain_count; i++) { 547 struct device *domain_dev; 548 549 dev_name[0] = 'a' + i; 550 domain_dev = dev_pm_domain_attach_by_name(dev, dev_name); 551 if (IS_ERR_OR_NULL(domain_dev)) { 552 err = domain_dev ? PTR_ERR(domain_dev) : -ENODEV; 553 goto err_detach; 554 } 555 556 domain_devs[i] = domain_dev; 557 } 558 559 for (i = 0; i < domain_count; i++) { 560 struct device_link *link; 561 562 link = device_link_add(dev, domain_devs[i], DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME); 563 if (!link) { 564 err = -ENODEV; 565 goto err_unlink; 566 } 567 568 domain_links[i] = link; 569 } 570 571 for (i = domain_count; i < link_count; i++) { 572 struct device_link *link; 573 574 link = device_link_add(domain_devs[i - domain_count + 1], 575 domain_devs[i - domain_count], 576 DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME); 577 if (!link) { 578 err = -ENODEV; 579 goto err_unlink; 580 } 581 582 domain_links[i] = link; 583 } 584 585 pvr_dev->power = (struct pvr_device_power){ 586 .domain_devs = no_free_ptr(domain_devs), 587 .domain_links = no_free_ptr(domain_links), 588 .domain_count = domain_count, 589 }; 590 591 return 0; 592 593 err_unlink: 594 while (--i >= 0) 595 device_link_del(domain_links[i]); 596 597 i = domain_count; 598 599 err_detach: 600 while (--i >= 0) 601 dev_pm_domain_detach(domain_devs[i], true); 602 603 return err; 604 } 605 606 void pvr_power_domains_fini(struct pvr_device *pvr_dev) 607 { 608 const int domain_count = pvr_dev->power.domain_count; 609 610 int i = domain_count + (domain_count - 1); 611 612 while (--i >= 0) 613 device_link_del(pvr_dev->power.domain_links[i]); 614 615 i = domain_count; 616 617 while (--i >= 0) 618 dev_pm_domain_detach(pvr_dev->power.domain_devs[i], true); 619 620 kfree(pvr_dev->power.domain_links); 621 kfree(pvr_dev->power.domain_devs); 622 623 pvr_dev->power = (struct pvr_device_power){ 0 }; 624 } 625