/** * intel_lpe_audio_irq_handler() - forwards the LPE audio irq * @dev_priv: the i915 drm device private data * * the LPE Audio irq is forwarded to the irq handler registered by LPE audio * driver. */ void intel_lpe_audio_irq_handler(struct drm_i915_private *dev_priv) { int ret; if (!HAS_LPE_AUDIO(dev_priv)) return; ret = generic_handle_irq(dev_priv->lpe_audio.irq); if (ret) DRM_ERROR_RATELIMITED("error handling LPE audio irq: %d\n", ret); }
static void mdp4_irq_error_handler(struct mdp_irq *irq, uint32_t irqstatus) { struct mdp4_kms *mdp4_kms = container_of(irq, struct mdp4_kms, error_handler); static DEFINE_RATELIMIT_STATE(rs, 5*HZ, 1); extern bool dumpstate; DRM_ERROR_RATELIMITED("errors: %08x\n", irqstatus); if (dumpstate && __ratelimit(&rs)) { struct drm_printer p = drm_info_printer(mdp4_kms->dev->dev); drm_state_dump(mdp4_kms->dev, &p); } }
static void omap_crtc_error_irq(struct omap_drm_irq *irq, uint32_t irqstatus) { struct omap_crtc *omap_crtc = container_of(irq, struct omap_crtc, error_irq); if (omap_crtc->ignore_digit_sync_lost) { irqstatus &= ~DISPC_IRQ_SYNC_LOST_DIGIT; if (!irqstatus) return; } DRM_ERROR_RATELIMITED("%s: errors: %08x\n", omap_crtc->name, irqstatus); }
static bool guc_check_log_buf_overflow(struct intel_guc_log *log, enum guc_log_buffer_type type, unsigned int full_cnt) { unsigned int prev_full_cnt = log->stats[type].sampled_overflow; bool overflow = false; if (full_cnt != prev_full_cnt) { overflow = true; log->stats[type].overflow = full_cnt; log->stats[type].sampled_overflow += full_cnt - prev_full_cnt; if (full_cnt < prev_full_cnt) { /* buffer_full_cnt is a 4 bit counter */ log->stats[type].sampled_overflow += 16; } DRM_ERROR_RATELIMITED("GuC log buffer overflow\n"); } return overflow; }
static void guc_read_update_log_buffer(struct intel_guc_log *log) { unsigned int buffer_size, read_offset, write_offset, bytes_to_copy, full_cnt; struct guc_log_buffer_state *log_buf_state, *log_buf_snapshot_state; struct guc_log_buffer_state log_buf_state_local; enum guc_log_buffer_type type; void *src_data, *dst_data; bool new_overflow; mutex_lock(&log->relay.lock); if (WARN_ON(!intel_guc_log_relay_enabled(log))) goto out_unlock; /* Get the pointer to shared GuC log buffer */ log_buf_state = src_data = log->relay.buf_addr; /* Get the pointer to local buffer to store the logs */ log_buf_snapshot_state = dst_data = guc_get_write_buffer(log); if (unlikely(!log_buf_snapshot_state)) { /* * Used rate limited to avoid deluge of messages, logs might be * getting consumed by User at a slow rate. */ DRM_ERROR_RATELIMITED("no sub-buffer to capture logs\n"); log->relay.full_count++; goto out_unlock; } /* Actual logs are present from the 2nd page */ src_data += PAGE_SIZE; dst_data += PAGE_SIZE; for (type = GUC_ISR_LOG_BUFFER; type < GUC_MAX_LOG_BUFFER; type++) { /* * Make a copy of the state structure, inside GuC log buffer * (which is uncached mapped), on the stack to avoid reading * from it multiple times. */ memcpy(&log_buf_state_local, log_buf_state, sizeof(struct guc_log_buffer_state)); buffer_size = guc_get_log_buffer_size(type); read_offset = log_buf_state_local.read_ptr; write_offset = log_buf_state_local.sampled_write_ptr; full_cnt = log_buf_state_local.buffer_full_cnt; /* Bookkeeping stuff */ log->stats[type].flush += log_buf_state_local.flush_to_file; new_overflow = guc_check_log_buf_overflow(log, type, full_cnt); /* Update the state of shared log buffer */ log_buf_state->read_ptr = write_offset; log_buf_state->flush_to_file = 0; log_buf_state++; /* First copy the state structure in snapshot buffer */ memcpy(log_buf_snapshot_state, &log_buf_state_local, sizeof(struct guc_log_buffer_state)); /* * The write pointer could have been updated by GuC firmware, * after sending the flush interrupt to Host, for consistency * set write pointer value to same value of sampled_write_ptr * in the snapshot buffer. */ log_buf_snapshot_state->write_ptr = write_offset; log_buf_snapshot_state++; /* Now copy the actual logs. */ if (unlikely(new_overflow)) { /* copy the whole buffer in case of overflow */ read_offset = 0; write_offset = buffer_size; } else if (unlikely((read_offset > buffer_size) || (write_offset > buffer_size))) { DRM_ERROR("invalid log buffer state\n"); /* copy whole buffer as offsets are unreliable */ read_offset = 0; write_offset = buffer_size; } /* Just copy the newly written data */ if (read_offset > write_offset) { i915_memcpy_from_wc(dst_data, src_data, write_offset); bytes_to_copy = buffer_size - read_offset; } else { bytes_to_copy = write_offset - read_offset; } i915_memcpy_from_wc(dst_data + read_offset, src_data + read_offset, bytes_to_copy); src_data += buffer_size; dst_data += buffer_size; } guc_move_to_next_buf(log); out_unlock: mutex_unlock(&log->relay.lock); }
static void mdp4_irq_error_handler(struct mdp_irq *irq, uint32_t irqstatus) { DRM_ERROR_RATELIMITED("errors: %08x\n", irqstatus); }