/** * Initialize BAM device security execution environment */ int bam_security_init(void *base, u32 ee, u32 vmid, u32 pipe_mask) { u32 version; u32 num_pipes; u32 mask; u32 pipe; /* * Discover the hardware version number and the number of pipes * supported by this BAM */ version = bam_read_reg_field(base, REVISION, BAM_REVISION); num_pipes = bam_read_reg_field(base, NUM_PIPES, BAM_NUM_PIPES); if (version < 3 || version > 0x1F) { SPS_ERR("sps:bam 0x%x(va) security is not supported for this" "BAM version 0x%x.\n", (u32) base, version); return -ENODEV; } if (num_pipes > BAM_MAX_PIPES) return -ENODEV; for (pipe = 0, mask = 1; pipe < num_pipes; pipe++, mask <<= 1) if ((mask & pipe_mask) != 0) bam_pipe_set_ee(base, pipe, ee, vmid); /* If MSbit is set, assign top-level interrupt to this EE */ mask = 1UL << 31; if ((mask & pipe_mask) != 0) bam_set_ee(base, ee, vmid, BAM_NONSECURE_RESET_ENABLE); return 0; }
int bam_security_init(void *base, u32 ee, u32 vmid, u32 pipe_mask) { u32 version; u32 num_pipes; u32 mask; u32 pipe; SPS_DBG2("sps:%s:bam=0x%x(va).", __func__, (u32) base); version = bam_read_reg_field(base, REVISION, BAM_REVISION); num_pipes = bam_read_reg_field(base, NUM_PIPES, BAM_NUM_PIPES); if (version < 3 || version > 0x1F) { SPS_ERR("sps:bam 0x%x(va) security is not supported for this" "BAM version 0x%x.\n", (u32) base, version); return -ENODEV; } if (num_pipes > BAM_MAX_PIPES) { SPS_ERR("sps:bam 0x%x(va) the number of pipes is more than " "the maximum number allowed.", (u32) base); return -ENODEV; } for (pipe = 0, mask = 1; pipe < num_pipes; pipe++, mask <<= 1) if ((mask & pipe_mask) != 0) bam_pipe_set_ee(base, pipe, ee, vmid); mask = 1UL << 31; if ((mask & pipe_mask) != 0) bam_set_ee(base, ee, vmid, BAM_NONSECURE_RESET_ENABLE); return 0; }