From ccb6da75673eb994c9f4a22c3a1895f4138127c9 Mon Sep 17 00:00:00 2001 From: Mihir Ganu Date: Fri, 5 Mar 2021 17:51:10 -0800 Subject: [PATCH] video: driver: Add support for non-secure pix context bank - Add support for a new non-secure pix context bank. - Remove usage of deprecated 'buffer-types' in context banks. Change-Id: I3a21eb8ce1d9aff277568d54aadb54193ad0ce75 Signed-off-by: Mihir Ganu --- driver/vidc/inc/msm_vidc_driver.h | 8 ++- driver/vidc/inc/msm_vidc_dt.h | 1 - driver/vidc/inc/msm_vidc_internal.h | 1 + driver/vidc/src/msm_vidc_driver.c | 103 +++++++++++++++++----------- driver/vidc/src/msm_vidc_dt.c | 16 ++--- driver/vidc/src/msm_vidc_memory.c | 1 + 6 files changed, 75 insertions(+), 55 deletions(-) diff --git a/driver/vidc/inc/msm_vidc_driver.h b/driver/vidc/inc/msm_vidc_driver.h index 1dd76652ec..dfef8e16e5 100644 --- a/driver/vidc/inc/msm_vidc_driver.h +++ b/driver/vidc/inc/msm_vidc_driver.h @@ -180,11 +180,17 @@ static inline bool is_active_session(u64 prev, u64 curr) MSM_VIDC_SESSION_INACTIVE_THRESHOLD_MS); } -static inline bool is_session_error(struct msm_vidc_inst* inst) +static inline bool is_session_error(struct msm_vidc_inst *inst) { return inst->state == MSM_VIDC_ERROR; } +static inline bool is_secure_region(enum msm_vidc_buffer_region region) +{ + return !(region == MSM_VIDC_NON_SECURE || + region == MSM_VIDC_NON_SECURE_PIXEL); +} + const char *cap_name(enum msm_vidc_inst_capability_type cap); void print_vidc_buffer(u32 tag, const char *tag_str, const char *str, struct msm_vidc_inst *inst, struct msm_vidc_buffer *vbuf); diff --git a/driver/vidc/inc/msm_vidc_dt.h b/driver/vidc/inc/msm_vidc_dt.h index d3baaee007..04b58a8451 100644 --- a/driver/vidc/inc/msm_vidc_dt.h +++ b/driver/vidc/inc/msm_vidc_dt.h @@ -104,7 +104,6 @@ struct addr_set { struct context_bank_info { struct list_head list; const char *name; - u32 buffer_type; bool is_secure; struct addr_range addr_range; struct device *dev; diff --git a/driver/vidc/inc/msm_vidc_internal.h b/driver/vidc/inc/msm_vidc_internal.h index aafcd7c803..638458b7dc 100644 --- a/driver/vidc/inc/msm_vidc_internal.h +++ b/driver/vidc/inc/msm_vidc_internal.h @@ -168,6 +168,7 @@ enum msm_vidc_buffer_attributes { enum msm_vidc_buffer_region { MSM_VIDC_REGION_NONE = 0, MSM_VIDC_NON_SECURE, + MSM_VIDC_NON_SECURE_PIXEL, MSM_VIDC_SECURE_PIXEL, MSM_VIDC_SECURE_NONPIXEL, MSM_VIDC_SECURE_BITSTREAM, diff --git a/driver/vidc/src/msm_vidc_driver.c b/driver/vidc/src/msm_vidc_driver.c index a2edba81d0..c1cea19e86 100644 --- a/driver/vidc/src/msm_vidc_driver.c +++ b/driver/vidc/src/msm_vidc_driver.c @@ -784,48 +784,69 @@ u32 msm_vidc_get_buffer_region(struct msm_vidc_inst *inst, { u32 region = MSM_VIDC_NON_SECURE; - if (!is_secure_session(inst) && - buffer_type != MSM_VIDC_BUF_ARP) { - return region; + if (!is_secure_session(inst)) { + switch (buffer_type) { + case MSM_VIDC_BUF_ARP: + region = MSM_VIDC_SECURE_NONPIXEL; + break; + case MSM_VIDC_BUF_INPUT: + if (is_encode_session(inst)) + region = MSM_VIDC_NON_SECURE_PIXEL; + else + region = MSM_VIDC_NON_SECURE; + break; + case MSM_VIDC_BUF_OUTPUT: + if (is_decode_session(inst)) + region = MSM_VIDC_NON_SECURE_PIXEL; + else + region = MSM_VIDC_NON_SECURE; + break; + case MSM_VIDC_BUF_DPB: + region = MSM_VIDC_NON_SECURE_PIXEL; + break; + default: + region = MSM_VIDC_NON_SECURE; + break; + } + } else { + switch (buffer_type) { + case MSM_VIDC_BUF_INPUT: + if (is_encode_session(inst)) + region = MSM_VIDC_SECURE_PIXEL; + else + region = MSM_VIDC_SECURE_BITSTREAM; + break; + case MSM_VIDC_BUF_OUTPUT: + if (is_encode_session(inst)) + region = MSM_VIDC_SECURE_BITSTREAM; + else + region = MSM_VIDC_SECURE_PIXEL; + break; + case MSM_VIDC_BUF_INPUT_META: + case MSM_VIDC_BUF_OUTPUT_META: + region = MSM_VIDC_NON_SECURE; + break; + case MSM_VIDC_BUF_BIN: + region = MSM_VIDC_SECURE_BITSTREAM; + break; + case MSM_VIDC_BUF_COMV: + case MSM_VIDC_BUF_NON_COMV: + case MSM_VIDC_BUF_LINE: + region = MSM_VIDC_SECURE_NONPIXEL; + break; + case MSM_VIDC_BUF_DPB: + region = MSM_VIDC_SECURE_PIXEL; + break; + case MSM_VIDC_BUF_PERSIST: + case MSM_VIDC_BUF_ARP: + region = MSM_VIDC_SECURE_NONPIXEL; + break; + default: + i_vpr_e(inst, "%s: invalid driver buffer type %d\n", + func, buffer_type); + } } - switch (buffer_type) { - case MSM_VIDC_BUF_INPUT: - if (is_encode_session(inst)) - region = MSM_VIDC_SECURE_PIXEL; - else - region = MSM_VIDC_SECURE_BITSTREAM; - break; - case MSM_VIDC_BUF_OUTPUT: - if (is_encode_session(inst)) - region = MSM_VIDC_SECURE_BITSTREAM; - else - region = MSM_VIDC_SECURE_PIXEL; - break; - case MSM_VIDC_BUF_INPUT_META: - case MSM_VIDC_BUF_OUTPUT_META: - region = MSM_VIDC_NON_SECURE; - break; - case MSM_VIDC_BUF_BIN: - region = MSM_VIDC_SECURE_BITSTREAM; - break; - case MSM_VIDC_BUF_COMV: - case MSM_VIDC_BUF_NON_COMV: - case MSM_VIDC_BUF_LINE: - region = MSM_VIDC_SECURE_NONPIXEL; - break; - case MSM_VIDC_BUF_DPB: - region = MSM_VIDC_SECURE_PIXEL; - break; - case MSM_VIDC_BUF_PERSIST: - // TODO: Need to revisit for ARP - case MSM_VIDC_BUF_ARP: - region = MSM_VIDC_SECURE_NONPIXEL; - break; - default: - i_vpr_e(inst, "%s: invalid driver buffer type %d\n", - func, buffer_type); - } return region; } @@ -2283,7 +2304,7 @@ int msm_vidc_create_internal_buffer(struct msm_vidc_inst *inst, alloc->region = msm_vidc_get_buffer_region(inst, buffer_type, __func__); alloc->size = buffer->buffer_size; - alloc->secure = (alloc->region > MSM_VIDC_NON_SECURE) ? 1 : 0; + alloc->secure = is_secure_region(alloc->region); rc = msm_vidc_memory_alloc(inst->core, alloc); if (rc) return -ENOMEM; diff --git a/driver/vidc/src/msm_vidc_dt.c b/driver/vidc/src/msm_vidc_dt.c index f0616155c3..a2d9c1ea38 100644 --- a/driver/vidc/src/msm_vidc_dt.c +++ b/driver/vidc/src/msm_vidc_dt.c @@ -819,10 +819,9 @@ static int msm_vidc_setup_context_bank(struct msm_vidc_core *core, d_vpr_h("Attached %s and created mapping\n", dev_name(dev)); d_vpr_h( - "Context bank: %s, buffer_type: %#x, is_secure: %d, address range start: %#x, size: %#x, dev: %pK, domain: %pK", - cb->name, cb->buffer_type, cb->is_secure, cb->addr_range.start, + "Context bank: %s, is_secure: %d, address range start: %#x, size: %#x, dev: %pK, domain: %pK", + cb->name, cb->is_secure, cb->addr_range.start, cb->addr_range.size, cb->dev, cb->domain); - remove_cb: return rc; } @@ -868,16 +867,9 @@ static int msm_vidc_populate_context_bank(struct device *dev, d_vpr_h("context bank %s: secure = %d\n", cb->name, cb->is_secure); - /* setup buffer type for each sub device*/ - rc = of_property_read_u32(np, "buffer-types", &cb->buffer_type); - if (rc) { - d_vpr_e("failed to load buffer_type info %d\n", rc); - rc = -ENOENT; - goto err_setup_cb; - } - d_vpr_h("context bank %s address start %x size %x buffer_type %x\n", + d_vpr_h("context bank %s address start %x size %x\n", cb->name, cb->addr_range.start, - cb->addr_range.size, cb->buffer_type); + cb->addr_range.size); rc = msm_vidc_setup_context_bank(core, cb, dev); if (rc) { diff --git a/driver/vidc/src/msm_vidc_memory.c b/driver/vidc/src/msm_vidc_memory.c index 7cbed6f03f..ff362febb5 100644 --- a/driver/vidc/src/msm_vidc_memory.c +++ b/driver/vidc/src/msm_vidc_memory.c @@ -27,6 +27,7 @@ struct context_bank_info *get_context_bank(struct msm_vidc_core *core, static const struct msm_vidc_buf_region_name buf_region_name[] = { {MSM_VIDC_REGION_NONE, "none" }, {MSM_VIDC_NON_SECURE, "venus_ns" }, + {MSM_VIDC_NON_SECURE_PIXEL, "venus_ns_pixel" }, {MSM_VIDC_SECURE_PIXEL, "venus_sec_pixel" }, {MSM_VIDC_SECURE_NONPIXEL, "venus_sec_non_pixel" }, {MSM_VIDC_SECURE_BITSTREAM, "venus_sec_bitstream" },