/**
 * Get BAM IRQ source and clear global IRQ status
 */
u32 bam_check_irq_source(void *base, u32 ee, u32 mask,
				enum sps_callback_case *cb_case)
{
	u32 source = bam_read_reg(base, IRQ_SRCS_EE(ee));
	u32 clr = source & (1UL << 31);

	if (clr) {
		u32 status = 0;
		status = bam_read_reg(base, IRQ_STTS);

		if (status & IRQ_STTS_BAM_ERROR_IRQ) {
			SPS_ERR("sps:bam 0x%x(va);bam irq status="
				"0x%x.\nsps: BAM_ERROR_IRQ\n",
				(u32) base, status);
			bam_output_register_content(base);
			*cb_case = SPS_CALLBACK_BAM_ERROR_IRQ;
		} else if (status & IRQ_STTS_BAM_HRESP_ERR_IRQ) {
			SPS_ERR("sps:bam 0x%x(va);bam irq status="
				"0x%x.\nsps: BAM_HRESP_ERR_IRQ\n",
				(u32) base, status);
			bam_output_register_content(base);
			*cb_case = SPS_CALLBACK_BAM_HRESP_ERR_IRQ;
		} else
			SPS_INFO("sps:bam 0x%x(va);bam irq status="
				"0x%x.", (u32) base, status);

		bam_write_reg(base, IRQ_CLR, status);
	}

	source &= (mask|(1UL << 31));
	return source;
}
示例#2
0
文件: bam.c 项目: NooNameR/k3_bravo
/**
 * Get BAM IRQ source and clear global IRQ status
 */
u32 bam_check_irq_source(void *base, u32 ee, u32 mask)
{
	u32 source = bam_read_reg(base, IRQ_SRCS_EE(ee));
	u32 clr = source & (1UL << 31);

	if (clr) {
		u32 status = 0;
		status = bam_read_reg(base, IRQ_STTS);
		bam_write_reg(base, IRQ_CLR, status);
		if (printk_ratelimit()) {
			if (status & IRQ_STTS_BAM_ERROR_IRQ)
				SPS_ERR("sps:bam 0x%x(va);bam irq status="
					"0x%x.\nsps: BAM_ERROR_IRQ\n",
					(u32) base, status);
			else
				SPS_INFO("sps:bam 0x%x(va);bam irq status="
					"0x%x.", (u32) base, status);
		}
	}

	source &= mask;
	return source;
}