int mfc_cmd_sys_init(struct mfc_dev *dev) { struct mfc_cmd_args h2r_args; unsigned int fw_version, fw_memsize; memset(&h2r_args, 0, sizeof(struct mfc_cmd_args)); h2r_args.arg[0] = MFC_FW_SYSTEM_SIZE; if (write_h2r_cmd(SYS_INIT, &h2r_args) == false) return MFC_CMD_FAIL; if (mfc_wait_sys(dev, SYS_INIT_RET, msecs_to_jiffies(H2R_INT_TIMEOUT)) == false) { mfc_err("failed to init system\n"); return MFC_FW_INIT_FAIL; } fw_version = read_reg(MFC_FW_VERSION); fw_memsize = r2h_args.arg[0]; mfc_info("MFC F/W version: %02x-%02x-%02x, %dkB\n", (fw_version >> 16) & 0xff, (fw_version >> 8) & 0xff, (fw_version) & 0xff, (fw_memsize) >> 10); return MFC_OK; }
int s5p_mfc_cmd_fw_start(struct mfc_dev *dev) { /* release RISC reset */ write_reg(0x3FF, S5P_FIMV_SW_RESET); if (mfc_wait_sys(dev, FW_STATUS_RET, msecs_to_jiffies(H2R_INT_TIMEOUT)) == false) { mfc_err("failed to check F/W\n"); return MFC_FW_LOAD_FAIL; } return MFC_OK; }
int mfc_cmd_sys_sleep(struct mfc_dev *dev) { struct mfc_cmd_args h2r_args; memset(&h2r_args, 0, sizeof(struct mfc_cmd_args)); if (write_h2r_cmd(SLEEP, &h2r_args) == false) return MFC_CMD_FAIL; if (mfc_wait_sys(dev, SLEEP_RET, msecs_to_jiffies(H2R_INT_TIMEOUT)) == false) { mfc_err("failed to sleep\n"); return MFC_SLEEP_FAIL; } return MFC_OK; }
int mfc_cmd_inst_open(struct mfc_inst_ctx *ctx) { struct mfc_cmd_args h2r_args; unsigned int crc = 0; unsigned int pixelcache = 0; struct mfc_dec_ctx *dec_ctx; struct mfc_enc_ctx *enc_ctx; if (ctx->type == DECODER) { dec_ctx = (struct mfc_dec_ctx *)ctx->c_priv; crc = dec_ctx->crc & 0x1; pixelcache = dec_ctx->pixelcache & 0x3; } else { enc_ctx = (struct mfc_enc_ctx *)ctx->c_priv; pixelcache = enc_ctx->pixelcache & 0x3; } memset(&h2r_args, 0, sizeof(struct mfc_cmd_args)); h2r_args.arg[0] = ctx->codecid; h2r_args.arg[1] = crc << 31 | pixelcache; h2r_args.arg[2] = ctx->ctxbufofs; h2r_args.arg[3] = ctx->ctxbufsize; if (write_h2r_cmd(OPEN_CH, &h2r_args) == false) return MFC_CMD_FAIL; if (mfc_wait_sys(ctx->dev, OPEN_CH_RET, msecs_to_jiffies(H2R_INT_TIMEOUT)) == false) { mfc_err("failed to open instance\n"); return MFC_OPEN_FAIL; } ctx->cmd_id = r2h_args.arg[0]; mfc_dbg("inst id: %d, cmd id: %d, codec id: %d", ctx->id, ctx->cmd_id, ctx->codecid); #ifdef MFC_PERF framecnt = 0; #endif return ctx->cmd_id; }
int mfc_cmd_seq_start(struct mfc_inst_ctx *ctx) { /* all codec command pass the shared mem addrees */ write_reg(ctx->shmofs, MFC_SI_CH1_HOST_WR_ADR); write_reg((SEQ_HEADER << 16 & 0x70000) | ctx->cmd_id, MFC_SI_CH1_INST_ID); /* FIXME: close_instance ? */ /* FIXME: mfc_wait_codec */ if (mfc_wait_sys(ctx->dev, SEQ_DONE_RET, msecs_to_jiffies(CODEC_INT_TIMEOUT)) == false) { mfc_err("failed to init seq start\n"); return MFC_DEC_INIT_FAIL; } return MFC_OK; }
int mfc_cmd_inst_close(struct mfc_inst_ctx *ctx) { struct mfc_cmd_args h2r_args; memset(&h2r_args, 0, sizeof(struct mfc_cmd_args)); h2r_args.arg[0] = ctx->cmd_id; if (write_h2r_cmd(CLOSE_CH, &h2r_args) == false) return MFC_CMD_FAIL; if (mfc_wait_sys(ctx->dev, CLOSE_CH_RET, msecs_to_jiffies(H2R_INT_TIMEOUT)) == false) { mfc_err("failed to close instance\n"); return MFC_CLOSE_FAIL; } return MFC_OK; }
int mfc_cmd_frame_start(struct mfc_inst_ctx *ctx) { struct mfc_dec_ctx *dec_ctx; /* all codec command pass the shared mem addrees */ write_reg(ctx->shmofs, MFC_SI_CH1_HOST_WR_ADR); if (ctx->type == DECODER) { dec_ctx = (struct mfc_dec_ctx *)ctx->c_priv; mfc_dbg("dec_ctx->lastframe: %d", dec_ctx->lastframe); if (dec_ctx->lastframe) { write_reg((LAST_SEQ << 16 & 0x70000) | ctx->cmd_id, MFC_SI_CH1_INST_ID); dec_ctx->lastframe = 0; } else if (ctx->resolution_status == RES_SET_CHANGE) { mfc_dbg("FRAME_START_REALLOC\n"); write_reg((FRAME_START_REALLOC << 16 & 0x70000) | ctx->cmd_id, MFC_SI_CH1_INST_ID); ctx->resolution_status = RES_WAIT_FRAME_DONE; } else { write_reg((FRAME_START << 16 & 0x70000) | ctx->cmd_id, MFC_SI_CH1_INST_ID); } } else { /* == ENCODER */ write_reg((FRAME_START << 16 & 0x70000) | ctx->cmd_id, MFC_SI_CH1_INST_ID); } #ifdef MFC_PERF do_gettimeofday(&tv1); #endif /* FIXME: close_instance ? */ /* FIXME: mfc_wait_codec */ if (mfc_wait_sys(ctx->dev, FRAME_DONE_RET, msecs_to_jiffies(CODEC_INT_TIMEOUT)) == false) { mfc_err("failed to frame start\n"); return MFC_DEC_EXE_TIME_OUT; } return MFC_OK; }
int mfc_cmd_sys_wakeup(struct mfc_dev *dev) { struct mfc_cmd_args h2r_args; memset(&h2r_args, 0, sizeof(struct mfc_cmd_args)); if (write_h2r_cmd(WAKEUP, &h2r_args) == false) return MFC_CMD_FAIL; /* release RISC reset */ write_reg(0x3FF, MFC_SW_RESET); if (mfc_wait_sys(dev, WAKEUP_RET, //msecs_to_jiffies(H2R_INT_TIMEOUT)) == false) { msecs_to_jiffies(20000)) == false) { mfc_err("failed to wakeup\n"); return MFC_WAKEUP_FAIL; } return MFC_OK; }
int mfc_cmd_init_buffers(struct mfc_inst_ctx *ctx) { /* all codec command pass the shared mem addrees */ write_reg(ctx->shmofs, MFC_SI_CH1_HOST_WR_ADR); write_reg((INIT_BUFFERS << 16 & 0x70000) | ctx->cmd_id, MFC_SI_CH1_INST_ID); /* FIXME: close_instance ? */ /* FIXME: mfc_wait_codec */ if (mfc_wait_sys(ctx->dev, INIT_BUFFERS_RET, msecs_to_jiffies(CODEC_INT_TIMEOUT)) == false) { mfc_err("failed to init buffers\n"); return MFC_DEC_INIT_FAIL; } #ifdef MFC_PERF framecnt = 1; #endif return MFC_OK; }