| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. |
|---|
| 2 | | - * |
|---|
| 3 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 4 | | - * it under the terms of the GNU General Public License version 2 and |
|---|
| 5 | | - * only version 2 as published by the Free Software Foundation. |
|---|
| 6 | | - * |
|---|
| 7 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 8 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 9 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 10 | | - * GNU General Public License for more details. |
|---|
| 11 | 3 | */ |
|---|
| 12 | 4 | |
|---|
| 13 | 5 | #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__ |
|---|
| .. | .. |
|---|
| 63 | 55 | int dpu_core_irq_idx_lookup(struct dpu_kms *dpu_kms, |
|---|
| 64 | 56 | enum dpu_intr_type intr_type, u32 instance_idx) |
|---|
| 65 | 57 | { |
|---|
| 66 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
|---|
| 67 | | - !dpu_kms->hw_intr->ops.irq_idx_lookup) |
|---|
| 58 | + if (!dpu_kms->hw_intr || !dpu_kms->hw_intr->ops.irq_idx_lookup) |
|---|
| 68 | 59 | return -EINVAL; |
|---|
| 69 | 60 | |
|---|
| 70 | 61 | return dpu_kms->hw_intr->ops.irq_idx_lookup(intr_type, |
|---|
| .. | .. |
|---|
| 81 | 72 | unsigned long irq_flags; |
|---|
| 82 | 73 | int ret = 0, enable_count; |
|---|
| 83 | 74 | |
|---|
| 84 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
|---|
| 75 | + if (!dpu_kms->hw_intr || |
|---|
| 85 | 76 | !dpu_kms->irq_obj.enable_counts || |
|---|
| 86 | 77 | !dpu_kms->irq_obj.irq_counts) { |
|---|
| 87 | 78 | DPU_ERROR("invalid params\n"); |
|---|
| .. | .. |
|---|
| 122 | 113 | { |
|---|
| 123 | 114 | int i, ret = 0, counts; |
|---|
| 124 | 115 | |
|---|
| 125 | | - if (!dpu_kms || !irq_idxs || !irq_count) { |
|---|
| 116 | + if (!irq_idxs || !irq_count) { |
|---|
| 126 | 117 | DPU_ERROR("invalid params\n"); |
|---|
| 127 | 118 | return -EINVAL; |
|---|
| 128 | 119 | } |
|---|
| .. | .. |
|---|
| 146 | 137 | { |
|---|
| 147 | 138 | int ret = 0, enable_count; |
|---|
| 148 | 139 | |
|---|
| 149 | | - if (!dpu_kms || !dpu_kms->hw_intr || !dpu_kms->irq_obj.enable_counts) { |
|---|
| 140 | + if (!dpu_kms->hw_intr || !dpu_kms->irq_obj.enable_counts) { |
|---|
| 150 | 141 | DPU_ERROR("invalid params\n"); |
|---|
| 151 | 142 | return -EINVAL; |
|---|
| 152 | 143 | } |
|---|
| .. | .. |
|---|
| 177 | 168 | { |
|---|
| 178 | 169 | int i, ret = 0, counts; |
|---|
| 179 | 170 | |
|---|
| 180 | | - if (!dpu_kms || !irq_idxs || !irq_count) { |
|---|
| 171 | + if (!irq_idxs || !irq_count) { |
|---|
| 181 | 172 | DPU_ERROR("invalid params\n"); |
|---|
| 182 | 173 | return -EINVAL; |
|---|
| 183 | 174 | } |
|---|
| .. | .. |
|---|
| 194 | 185 | |
|---|
| 195 | 186 | u32 dpu_core_irq_read(struct dpu_kms *dpu_kms, int irq_idx, bool clear) |
|---|
| 196 | 187 | { |
|---|
| 197 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
|---|
| 188 | + if (!dpu_kms->hw_intr || |
|---|
| 198 | 189 | !dpu_kms->hw_intr->ops.get_interrupt_status) |
|---|
| 199 | 190 | return 0; |
|---|
| 200 | 191 | |
|---|
| .. | .. |
|---|
| 213 | 204 | { |
|---|
| 214 | 205 | unsigned long irq_flags; |
|---|
| 215 | 206 | |
|---|
| 216 | | - if (!dpu_kms || !dpu_kms->irq_obj.irq_cb_tbl) { |
|---|
| 207 | + if (!dpu_kms->irq_obj.irq_cb_tbl) { |
|---|
| 217 | 208 | DPU_ERROR("invalid params\n"); |
|---|
| 218 | 209 | return -EINVAL; |
|---|
| 219 | 210 | } |
|---|
| .. | .. |
|---|
| 248 | 239 | { |
|---|
| 249 | 240 | unsigned long irq_flags; |
|---|
| 250 | 241 | |
|---|
| 251 | | - if (!dpu_kms || !dpu_kms->irq_obj.irq_cb_tbl) { |
|---|
| 242 | + if (!dpu_kms->irq_obj.irq_cb_tbl) { |
|---|
| 252 | 243 | DPU_ERROR("invalid params\n"); |
|---|
| 253 | 244 | return -EINVAL; |
|---|
| 254 | 245 | } |
|---|
| .. | .. |
|---|
| 282 | 273 | |
|---|
| 283 | 274 | static void dpu_clear_all_irqs(struct dpu_kms *dpu_kms) |
|---|
| 284 | 275 | { |
|---|
| 285 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
|---|
| 286 | | - !dpu_kms->hw_intr->ops.clear_all_irqs) |
|---|
| 276 | + if (!dpu_kms->hw_intr || !dpu_kms->hw_intr->ops.clear_all_irqs) |
|---|
| 287 | 277 | return; |
|---|
| 288 | 278 | |
|---|
| 289 | 279 | dpu_kms->hw_intr->ops.clear_all_irqs(dpu_kms->hw_intr); |
|---|
| .. | .. |
|---|
| 291 | 281 | |
|---|
| 292 | 282 | static void dpu_disable_all_irqs(struct dpu_kms *dpu_kms) |
|---|
| 293 | 283 | { |
|---|
| 294 | | - if (!dpu_kms || !dpu_kms->hw_intr || |
|---|
| 295 | | - !dpu_kms->hw_intr->ops.disable_all_irqs) |
|---|
| 284 | + if (!dpu_kms->hw_intr || !dpu_kms->hw_intr->ops.disable_all_irqs) |
|---|
| 296 | 285 | return; |
|---|
| 297 | 286 | |
|---|
| 298 | 287 | dpu_kms->hw_intr->ops.disable_all_irqs(dpu_kms->hw_intr); |
|---|
| 299 | 288 | } |
|---|
| 300 | 289 | |
|---|
| 301 | 290 | #ifdef CONFIG_DEBUG_FS |
|---|
| 302 | | -#define DEFINE_DPU_DEBUGFS_SEQ_FOPS(__prefix) \ |
|---|
| 303 | | -static int __prefix ## _open(struct inode *inode, struct file *file) \ |
|---|
| 304 | | -{ \ |
|---|
| 305 | | - return single_open(file, __prefix ## _show, inode->i_private); \ |
|---|
| 306 | | -} \ |
|---|
| 307 | | -static const struct file_operations __prefix ## _fops = { \ |
|---|
| 308 | | - .owner = THIS_MODULE, \ |
|---|
| 309 | | - .open = __prefix ## _open, \ |
|---|
| 310 | | - .release = single_release, \ |
|---|
| 311 | | - .read = seq_read, \ |
|---|
| 312 | | - .llseek = seq_lseek, \ |
|---|
| 313 | | -} |
|---|
| 314 | | - |
|---|
| 315 | 291 | static int dpu_debugfs_core_irq_show(struct seq_file *s, void *v) |
|---|
| 316 | 292 | { |
|---|
| 317 | 293 | struct dpu_irq *irq_obj = s->private; |
|---|
| .. | .. |
|---|
| 319 | 295 | unsigned long irq_flags; |
|---|
| 320 | 296 | int i, irq_count, enable_count, cb_count; |
|---|
| 321 | 297 | |
|---|
| 322 | | - if (!irq_obj || !irq_obj->enable_counts || !irq_obj->irq_cb_tbl) { |
|---|
| 323 | | - DPU_ERROR("invalid parameters\n"); |
|---|
| 298 | + if (WARN_ON(!irq_obj->enable_counts || !irq_obj->irq_cb_tbl)) |
|---|
| 324 | 299 | return 0; |
|---|
| 325 | | - } |
|---|
| 326 | 300 | |
|---|
| 327 | 301 | for (i = 0; i < irq_obj->total_irqs; i++) { |
|---|
| 328 | 302 | spin_lock_irqsave(&irq_obj->cb_lock, irq_flags); |
|---|
| .. | .. |
|---|
| 341 | 315 | return 0; |
|---|
| 342 | 316 | } |
|---|
| 343 | 317 | |
|---|
| 344 | | -DEFINE_DPU_DEBUGFS_SEQ_FOPS(dpu_debugfs_core_irq); |
|---|
| 318 | +DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_core_irq); |
|---|
| 345 | 319 | |
|---|
| 346 | | -int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, |
|---|
| 320 | +void dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, |
|---|
| 347 | 321 | struct dentry *parent) |
|---|
| 348 | 322 | { |
|---|
| 349 | | - dpu_kms->irq_obj.debugfs_file = debugfs_create_file("core_irq", 0600, |
|---|
| 350 | | - parent, &dpu_kms->irq_obj, |
|---|
| 351 | | - &dpu_debugfs_core_irq_fops); |
|---|
| 352 | | - |
|---|
| 353 | | - return 0; |
|---|
| 354 | | -} |
|---|
| 355 | | - |
|---|
| 356 | | -void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms) |
|---|
| 357 | | -{ |
|---|
| 358 | | - debugfs_remove(dpu_kms->irq_obj.debugfs_file); |
|---|
| 359 | | - dpu_kms->irq_obj.debugfs_file = NULL; |
|---|
| 360 | | -} |
|---|
| 361 | | - |
|---|
| 362 | | -#else |
|---|
| 363 | | -int dpu_debugfs_core_irq_init(struct dpu_kms *dpu_kms, |
|---|
| 364 | | - struct dentry *parent) |
|---|
| 365 | | -{ |
|---|
| 366 | | - return 0; |
|---|
| 367 | | -} |
|---|
| 368 | | - |
|---|
| 369 | | -void dpu_debugfs_core_irq_destroy(struct dpu_kms *dpu_kms) |
|---|
| 370 | | -{ |
|---|
| 323 | + debugfs_create_file("core_irq", 0600, parent, &dpu_kms->irq_obj, |
|---|
| 324 | + &dpu_debugfs_core_irq_fops); |
|---|
| 371 | 325 | } |
|---|
| 372 | 326 | #endif |
|---|
| 373 | 327 | |
|---|
| 374 | 328 | void dpu_core_irq_preinstall(struct dpu_kms *dpu_kms) |
|---|
| 375 | 329 | { |
|---|
| 376 | | - struct msm_drm_private *priv; |
|---|
| 377 | 330 | int i; |
|---|
| 378 | | - |
|---|
| 379 | | - if (!dpu_kms) { |
|---|
| 380 | | - DPU_ERROR("invalid dpu_kms\n"); |
|---|
| 381 | | - return; |
|---|
| 382 | | - } else if (!dpu_kms->dev) { |
|---|
| 383 | | - DPU_ERROR("invalid drm device\n"); |
|---|
| 384 | | - return; |
|---|
| 385 | | - } else if (!dpu_kms->dev->dev_private) { |
|---|
| 386 | | - DPU_ERROR("invalid device private\n"); |
|---|
| 387 | | - return; |
|---|
| 388 | | - } |
|---|
| 389 | | - priv = dpu_kms->dev->dev_private; |
|---|
| 390 | 331 | |
|---|
| 391 | 332 | pm_runtime_get_sync(&dpu_kms->pdev->dev); |
|---|
| 392 | 333 | dpu_clear_all_irqs(dpu_kms); |
|---|
| .. | .. |
|---|
| 410 | 351 | } |
|---|
| 411 | 352 | } |
|---|
| 412 | 353 | |
|---|
| 413 | | -int dpu_core_irq_postinstall(struct dpu_kms *dpu_kms) |
|---|
| 414 | | -{ |
|---|
| 415 | | - return 0; |
|---|
| 416 | | -} |
|---|
| 417 | | - |
|---|
| 418 | 354 | void dpu_core_irq_uninstall(struct dpu_kms *dpu_kms) |
|---|
| 419 | 355 | { |
|---|
| 420 | | - struct msm_drm_private *priv; |
|---|
| 421 | 356 | int i; |
|---|
| 422 | | - |
|---|
| 423 | | - if (!dpu_kms) { |
|---|
| 424 | | - DPU_ERROR("invalid dpu_kms\n"); |
|---|
| 425 | | - return; |
|---|
| 426 | | - } else if (!dpu_kms->dev) { |
|---|
| 427 | | - DPU_ERROR("invalid drm device\n"); |
|---|
| 428 | | - return; |
|---|
| 429 | | - } else if (!dpu_kms->dev->dev_private) { |
|---|
| 430 | | - DPU_ERROR("invalid device private\n"); |
|---|
| 431 | | - return; |
|---|
| 432 | | - } |
|---|
| 433 | | - priv = dpu_kms->dev->dev_private; |
|---|
| 434 | 357 | |
|---|
| 435 | 358 | pm_runtime_get_sync(&dpu_kms->pdev->dev); |
|---|
| 436 | 359 | for (i = 0; i < dpu_kms->irq_obj.total_irqs; i++) |
|---|