drivers/memory/tegra/tegra264.c

Source file repositories/reference/linux-study-clean/drivers/memory/tegra/tegra264.c

File Facts

System
Linux kernel
Corpus path
drivers/memory/tegra/tegra264.c
Extension
.c
Size
31573 bytes
Lines
1213
Domain
Driver Families
Bucket
drivers/memory
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

switch (BIT(bit)) {
		case MC_INT_DECERR_EMEM:
		case MC_INT_SECURITY_VIOLATION:
			status_reg = mc->soc->regs->err_status;
			addr_reg = mc->soc->regs->err_add;
			addr_hi_reg = mc->soc->regs->err_add_hi;
			err_type_mask = mc->soc->mc_err_status_type_mask;
			break;

		case MC_INT_DECERR_VPR:
			status_reg = mc->soc->regs->err_vpr_status;
			addr_reg = mc->soc->regs->err_vpr_add;
			addr_hi_shift = MC_ERR_STATUS_ADR_HI_SHIFT;
			addr_hi_mask = mc->soc->mc_addr_hi_mask;
			break;

		case MC_INT_SECERR_SEC:
			status_reg = mc->soc->regs->err_sec_status;
			addr_reg = mc->soc->regs->err_sec_add;
			addr_hi_shift = MC_ERR_STATUS_ADR_HI_SHIFT;
			addr_hi_mask = mc->soc->mc_addr_hi_mask;
			break;

		case MC_INT_DECERR_MTS:
			status_reg = mc->soc->regs->err_mts_status;
			addr_reg = mc->soc->regs->err_mts_add;
			addr_hi_shift = MC_ERR_STATUS_ADR_HI_SHIFT;
			addr_hi_mask = mc->soc->mc_addr_hi_mask;
			break;

		case MC_INT_DECERR_GENERALIZED_CARVEOUT:
			status_reg = mc->soc->regs->err_gen_co_status;
			status1_reg = MC_ERR_GENERALIZED_CARVEOUT_STATUS_1_0;
			addr_reg = mc->soc->regs->err_gen_co_add;
			addr_hi_shift = MC_ERR_STATUS_GSC_ADR_HI_SHIFT;
			addr_hi_mask = MC_ERR_STATUS_GSC_ADR_HI_MASK;
			break;

		case MC_INT_DECERR_ROUTE_SANITY:
		case MC_INT_DECERR_ROUTE_SANITY_GIC_MSI:
			status_reg = mc->soc->regs->err_route_status;
			addr_reg = mc->soc->regs->err_route_add;
			addr_hi_shift = MC_ERR_STATUS_RT_ADR_HI_SHIFT;
			addr_hi_mask = mc->soc->mc_addr_hi_mask;
			mc_sec_bit = MC_ERR_ROUTE_SANITY_SEC;
			mc_rw_bit = MC_ERR_ROUTE_SANITY_RW;
			err_type_mask = MC_ERR_STATUS_RT_TYPE_MASK;
			break;

		default:
			dev_err_ratelimited(mc->dev, "Incorrect MC interrupt mask\n");
			return;
		}

		value = mc_ch_readl(mc, channel, status_reg);
		if (addr_hi_reg) {
			addr = mc_ch_readl(mc, channel, addr_hi_reg);
		} else {
			if (!status1_reg) {
				addr = ((value >> addr_hi_shift) & addr_hi_mask);
			} else {
				status1 = mc_ch_readl(mc, channel, status1_reg);
				addr = ((status1 >> addr_hi_shift) & addr_hi_mask);
			}
		}

		addr <<= 32;
		addr |= mc_ch_readl(mc, channel, addr_reg);

		client_id = value & mc->soc->client_id_mask;
		for (i = 0; i < mc->soc->num_clients; i++) {
			if (mc->soc->clients[i].id == client_id) {
				client = mc->soc->clients[i].name;
				break;
			}
		}

		if (err_type_mask == MC_ERR_STATUS_RT_TYPE_MASK) {
			type = (value & err_type_mask) >>
				MC_ERR_STATUS_RT_TYPE_SHIFT;
			desc = tegra264_rt_error_names[type];
		} else if (err_type_mask) {
			type = (value & err_type_mask) >>
					MC_ERR_STATUS_TYPE_SHIFT;
			desc = tegra264_mc_error_names[type];
		}

		dev_err_ratelimited(mc->dev, "%s: %s %s @%pa: %s (%s)\n",
				    client, value & mc_sec_bit ? "secure" : "non-secure",
				    value & mc_rw_bit ? "write" : "read", &addr,

Annotation

Implementation Notes