Lines Matching refs:ctx
56 struct atom_context *ctx; member
66 static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params);
67 int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params);
102 static uint32_t atom_iio_execute(struct atom_context *ctx, int base, in atom_iio_execute() argument
105 struct radeon_device *rdev = ctx->card->dev->dev_private; in atom_iio_execute()
114 temp = ctx->card->ioreg_read(ctx->card, CU16(base + 1)); in atom_iio_execute()
119 (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); in atom_iio_execute()
120 ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); in atom_iio_execute()
160 ((ctx-> in atom_iio_execute()
177 static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr, in atom_get_src_int() argument
181 struct atom_context *gctx = ctx->ctx; in atom_get_src_int()
225 val = get_unaligned_le32((u32 *)&ctx->ps[idx]); in atom_get_src_int()
263 val = ctx->ws[idx]; in atom_get_src_int()
365 static void atom_skip_src_int(atom_exec_context *ctx, uint8_t attr, int *ptr) in atom_skip_src_int() argument
401 static uint32_t atom_get_src(atom_exec_context *ctx, uint8_t attr, int *ptr) in atom_get_src() argument
403 return atom_get_src_int(ctx, attr, ptr, NULL, 1); in atom_get_src()
406 static uint32_t atom_get_src_direct(atom_exec_context *ctx, uint8_t align, int *ptr) in atom_get_src_direct() argument
432 static uint32_t atom_get_dst(atom_exec_context *ctx, int arg, uint8_t attr, in atom_get_dst() argument
435 return atom_get_src_int(ctx, in atom_get_dst()
441 static void atom_skip_dst(atom_exec_context *ctx, int arg, uint8_t attr, int *ptr) in atom_skip_dst() argument
443 atom_skip_src_int(ctx, in atom_skip_dst()
448 static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr, in atom_put_dst() argument
454 struct atom_context *gctx = ctx->ctx; in atom_put_dst()
501 ctx->ps[idx] = cpu_to_le32(val); in atom_put_dst()
533 ctx->ws[idx] = val; in atom_put_dst()
587 static void atom_op_add(atom_exec_context *ctx, int *ptr, int arg) in atom_op_add() argument
593 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_add()
595 src = atom_get_src(ctx, attr, ptr); in atom_op_add()
598 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_add()
601 static void atom_op_and(atom_exec_context *ctx, int *ptr, int arg) in atom_op_and() argument
607 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_and()
609 src = atom_get_src(ctx, attr, ptr); in atom_op_and()
612 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_and()
615 static void atom_op_beep(atom_exec_context *ctx, int *ptr, int arg) in atom_op_beep() argument
620 static void atom_op_calltable(atom_exec_context *ctx, int *ptr, int arg) in atom_op_calltable() argument
629 if (U16(ctx->ctx->cmd_table + 4 + 2 * idx)) in atom_op_calltable()
630 r = atom_execute_table_locked(ctx->ctx, idx, ctx->ps + ctx->ps_shift); in atom_op_calltable()
632 ctx->abort = true; in atom_op_calltable()
636 static void atom_op_clear(atom_exec_context *ctx, int *ptr, int arg) in atom_op_clear() argument
643 atom_get_dst(ctx, arg, attr, ptr, &saved, 0); in atom_op_clear()
645 atom_put_dst(ctx, arg, attr, &dptr, 0, saved); in atom_op_clear()
648 static void atom_op_compare(atom_exec_context *ctx, int *ptr, int arg) in atom_op_compare() argument
653 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_compare()
655 src = atom_get_src(ctx, attr, ptr); in atom_op_compare()
656 ctx->ctx->cs_equal = (dst == src); in atom_op_compare()
657 ctx->ctx->cs_above = (dst > src); in atom_op_compare()
658 SDEBUG(" result: %s %s\n", ctx->ctx->cs_equal ? "EQ" : "NE", in atom_op_compare()
659 ctx->ctx->cs_above ? "GT" : "LE"); in atom_op_compare()
662 static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg) in atom_op_delay() argument
674 static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg) in atom_op_div() argument
679 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_div()
681 src = atom_get_src(ctx, attr, ptr); in atom_op_div()
683 ctx->ctx->divmul[0] = dst / src; in atom_op_div()
684 ctx->ctx->divmul[1] = dst % src; in atom_op_div()
686 ctx->ctx->divmul[0] = 0; in atom_op_div()
687 ctx->ctx->divmul[1] = 0; in atom_op_div()
691 static void atom_op_eot(atom_exec_context *ctx, int *ptr, int arg) in atom_op_eot() argument
696 static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg) in atom_op_jump() argument
704 execute = ctx->ctx->cs_above; in atom_op_jump()
707 execute = ctx->ctx->cs_above || ctx->ctx->cs_equal; in atom_op_jump()
713 execute = !(ctx->ctx->cs_above || ctx->ctx->cs_equal); in atom_op_jump()
716 execute = !ctx->ctx->cs_above; in atom_op_jump()
719 execute = ctx->ctx->cs_equal; in atom_op_jump()
722 execute = !ctx->ctx->cs_equal; in atom_op_jump()
729 if (ctx->last_jump == (ctx->start + target)) { in atom_op_jump()
731 if (time_after(cjiffies, ctx->last_jump_jiffies)) { in atom_op_jump()
732 cjiffies -= ctx->last_jump_jiffies; in atom_op_jump()
735 ctx->abort = true; in atom_op_jump()
739 ctx->last_jump_jiffies = jiffies; in atom_op_jump()
742 ctx->last_jump = ctx->start + target; in atom_op_jump()
743 ctx->last_jump_jiffies = jiffies; in atom_op_jump()
745 *ptr = ctx->start + target; in atom_op_jump()
749 static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg) in atom_op_mask() argument
755 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_mask()
756 mask = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr); in atom_op_mask()
759 src = atom_get_src(ctx, attr, ptr); in atom_op_mask()
763 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_mask()
766 static void atom_op_move(atom_exec_context *ctx, int *ptr, int arg) in atom_op_move() argument
772 atom_get_dst(ctx, arg, attr, ptr, &saved, 0); in atom_op_move()
774 atom_skip_dst(ctx, arg, attr, ptr); in atom_op_move()
778 src = atom_get_src(ctx, attr, ptr); in atom_op_move()
780 atom_put_dst(ctx, arg, attr, &dptr, src, saved); in atom_op_move()
783 static void atom_op_mul(atom_exec_context *ctx, int *ptr, int arg) in atom_op_mul() argument
788 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_mul()
790 src = atom_get_src(ctx, attr, ptr); in atom_op_mul()
791 ctx->ctx->divmul[0] = dst * src; in atom_op_mul()
794 static void atom_op_nop(atom_exec_context *ctx, int *ptr, int arg) in atom_op_nop() argument
799 static void atom_op_or(atom_exec_context *ctx, int *ptr, int arg) in atom_op_or() argument
805 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_or()
807 src = atom_get_src(ctx, attr, ptr); in atom_op_or()
810 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_or()
813 static void atom_op_postcard(atom_exec_context *ctx, int *ptr, int arg) in atom_op_postcard() argument
819 static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg) in atom_op_repeat() argument
824 static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg) in atom_op_restorereg() argument
829 static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg) in atom_op_savereg() argument
834 static void atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setdatablock() argument
840 ctx->ctx->data_block = 0; in atom_op_setdatablock()
842 ctx->ctx->data_block = ctx->start; in atom_op_setdatablock()
844 ctx->ctx->data_block = U16(ctx->ctx->data_table + 4 + 2 * idx); in atom_op_setdatablock()
845 SDEBUG(" base: 0x%04X\n", ctx->ctx->data_block); in atom_op_setdatablock()
848 static void atom_op_setfbbase(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setfbbase() argument
852 ctx->ctx->fb_base = atom_get_src(ctx, attr, ptr); in atom_op_setfbbase()
855 static void atom_op_setport(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setport() argument
866 ctx->ctx->io_mode = ATOM_IO_MM; in atom_op_setport()
868 ctx->ctx->io_mode = ATOM_IO_IIO | port; in atom_op_setport()
872 ctx->ctx->io_mode = ATOM_IO_PCI; in atom_op_setport()
876 ctx->ctx->io_mode = ATOM_IO_SYSIO; in atom_op_setport()
882 static void atom_op_setregblock(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setregblock() argument
884 ctx->ctx->reg_block = U16(*ptr); in atom_op_setregblock()
886 SDEBUG(" base: 0x%04X\n", ctx->ctx->reg_block); in atom_op_setregblock()
889 static void atom_op_shift_left(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shift_left() argument
897 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shift_left()
898 shift = atom_get_src_direct(ctx, ATOM_SRC_BYTE0, ptr); in atom_op_shift_left()
902 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shift_left()
905 static void atom_op_shift_right(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shift_right() argument
913 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shift_right()
914 shift = atom_get_src_direct(ctx, ATOM_SRC_BYTE0, ptr); in atom_op_shift_right()
918 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shift_right()
921 static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shl() argument
928 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shl()
931 shift = atom_get_src(ctx, attr, ptr); in atom_op_shl()
937 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shl()
940 static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shr() argument
947 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shr()
950 shift = atom_get_src(ctx, attr, ptr); in atom_op_shr()
956 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shr()
959 static void atom_op_sub(atom_exec_context *ctx, int *ptr, int arg) in atom_op_sub() argument
965 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_sub()
967 src = atom_get_src(ctx, attr, ptr); in atom_op_sub()
970 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_sub()
973 static void atom_op_switch(atom_exec_context *ctx, int *ptr, int arg) in atom_op_switch() argument
978 src = atom_get_src(ctx, attr, ptr); in atom_op_switch()
984 atom_get_src(ctx, (attr & 0x38) | ATOM_ARG_IMM, in atom_op_switch()
989 *ptr = ctx->start + target; in atom_op_switch()
1000 static void atom_op_test(atom_exec_context *ctx, int *ptr, int arg) in atom_op_test() argument
1005 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_test()
1007 src = atom_get_src(ctx, attr, ptr); in atom_op_test()
1008 ctx->ctx->cs_equal = ((dst & src) == 0); in atom_op_test()
1009 SDEBUG(" result: %s\n", ctx->ctx->cs_equal ? "EQ" : "NE"); in atom_op_test()
1012 static void atom_op_xor(atom_exec_context *ctx, int *ptr, int arg) in atom_op_xor() argument
1018 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_xor()
1020 src = atom_get_src(ctx, attr, ptr); in atom_op_xor()
1023 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_xor()
1026 static void atom_op_debug(atom_exec_context *ctx, int *ptr, int arg) in atom_op_debug() argument
1159 static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params) in atom_execute_table_locked() argument
1161 int base = CU16(ctx->cmd_table + 4 + 2 * index); in atom_execute_table_locked()
1177 ectx.ctx = ctx; in atom_execute_table_locked()
1220 int atom_execute_table_scratch_unlocked(struct atom_context *ctx, int index, uint32_t * params) in atom_execute_table_scratch_unlocked() argument
1224 mutex_lock(&ctx->mutex); in atom_execute_table_scratch_unlocked()
1226 ctx->data_block = 0; in atom_execute_table_scratch_unlocked()
1228 ctx->reg_block = 0; in atom_execute_table_scratch_unlocked()
1230 ctx->fb_base = 0; in atom_execute_table_scratch_unlocked()
1232 ctx->io_mode = ATOM_IO_MM; in atom_execute_table_scratch_unlocked()
1234 ctx->divmul[0] = 0; in atom_execute_table_scratch_unlocked()
1235 ctx->divmul[1] = 0; in atom_execute_table_scratch_unlocked()
1236 r = atom_execute_table_locked(ctx, index, params); in atom_execute_table_scratch_unlocked()
1237 mutex_unlock(&ctx->mutex); in atom_execute_table_scratch_unlocked()
1241 int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) in atom_execute_table() argument
1244 mutex_lock(&ctx->scratch_mutex); in atom_execute_table()
1245 r = atom_execute_table_scratch_unlocked(ctx, index, params); in atom_execute_table()
1246 mutex_unlock(&ctx->scratch_mutex); in atom_execute_table()
1252 static void atom_index_iio(struct atom_context *ctx, int base) in atom_index_iio() argument
1254 ctx->iio = kzalloc(2 * 256, GFP_KERNEL); in atom_index_iio()
1255 if (!ctx->iio) in atom_index_iio()
1258 ctx->iio[CU8(base + 1)] = base + 2; in atom_index_iio()
1269 struct atom_context *ctx = in atom_parse() local
1275 if (!ctx) in atom_parse()
1278 ctx->card = card; in atom_parse()
1279 ctx->bios = bios; in atom_parse()
1283 kfree(ctx); in atom_parse()
1290 kfree(ctx); in atom_parse()
1299 kfree(ctx); in atom_parse()
1303 ctx->cmd_table = CU16(base + ATOM_ROM_CMD_PTR); in atom_parse()
1304 ctx->data_table = CU16(base + ATOM_ROM_DATA_PTR); in atom_parse()
1305 atom_index_iio(ctx, CU16(ctx->data_table + ATOM_DATA_IIO_PTR) + 4); in atom_parse()
1306 if (!ctx->iio) { in atom_parse()
1307 atom_destroy(ctx); in atom_parse()
1324 return ctx; in atom_parse()
1327 int atom_asic_init(struct atom_context *ctx) in atom_asic_init() argument
1329 struct radeon_device *rdev = ctx->card->dev->dev_private; in atom_asic_init()
1330 int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR); in atom_asic_init()
1341 if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT)) in atom_asic_init()
1343 ret = atom_execute_table(ctx, ATOM_CMD_INIT, ps); in atom_asic_init()
1350 if (CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_SPDFANCNTL)) in atom_asic_init()
1351 atom_execute_table(ctx, ATOM_CMD_SPDFANCNTL, ps); in atom_asic_init()
1356 void atom_destroy(struct atom_context *ctx) in atom_destroy() argument
1358 kfree(ctx->iio); in atom_destroy()
1359 kfree(ctx); in atom_destroy()
1362 bool atom_parse_data_header(struct atom_context *ctx, int index, in atom_parse_data_header() argument
1367 int idx = CU16(ctx->data_table + offset); in atom_parse_data_header()
1368 u16 *mdt = (u16 *)(ctx->bios + ctx->data_table + 4); in atom_parse_data_header()
1383 bool atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * frev, in atom_parse_cmd_header() argument
1387 int idx = CU16(ctx->cmd_table + offset); in atom_parse_cmd_header()
1388 u16 *mct = (u16 *)(ctx->bios + ctx->cmd_table + 4); in atom_parse_cmd_header()
1400 int atom_allocate_fb_scratch(struct atom_context *ctx) in atom_allocate_fb_scratch() argument
1407 if (atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) { in atom_allocate_fb_scratch()
1408 firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset); in atom_allocate_fb_scratch()
1416 ctx->scratch_size_bytes = 0; in atom_allocate_fb_scratch()
1420 ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL); in atom_allocate_fb_scratch()
1421 if (!ctx->scratch) in atom_allocate_fb_scratch()
1423 ctx->scratch_size_bytes = usage_bytes; in atom_allocate_fb_scratch()