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);
103 static uint32_t atom_iio_execute(struct atom_context *ctx, int base, in atom_iio_execute() argument
106 struct radeon_device *rdev = ctx->card->dev->dev_private; in atom_iio_execute()
115 temp = ctx->card->ioreg_read(ctx->card, CU16(base + 1)); in atom_iio_execute()
120 (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); in atom_iio_execute()
121 ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); in atom_iio_execute()
161 ((ctx-> in atom_iio_execute()
178 static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr, in atom_get_src_int() argument
182 struct atom_context *gctx = ctx->ctx; in atom_get_src_int()
226 val = get_unaligned_le32((u32 *)&ctx->ps[idx]); in atom_get_src_int()
264 val = ctx->ws[idx]; in atom_get_src_int()
366 static void atom_skip_src_int(atom_exec_context *ctx, uint8_t attr, int *ptr) in atom_skip_src_int() argument
402 static uint32_t atom_get_src(atom_exec_context *ctx, uint8_t attr, int *ptr) in atom_get_src() argument
404 return atom_get_src_int(ctx, attr, ptr, NULL, 1); in atom_get_src()
407 static uint32_t atom_get_src_direct(atom_exec_context *ctx, uint8_t align, int *ptr) in atom_get_src_direct() argument
433 static uint32_t atom_get_dst(atom_exec_context *ctx, int arg, uint8_t attr, in atom_get_dst() argument
436 return atom_get_src_int(ctx, in atom_get_dst()
442 static void atom_skip_dst(atom_exec_context *ctx, int arg, uint8_t attr, int *ptr) in atom_skip_dst() argument
444 atom_skip_src_int(ctx, in atom_skip_dst()
449 static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr, in atom_put_dst() argument
455 struct atom_context *gctx = ctx->ctx; in atom_put_dst()
502 ctx->ps[idx] = cpu_to_le32(val); in atom_put_dst()
534 ctx->ws[idx] = val; in atom_put_dst()
588 static void atom_op_add(atom_exec_context *ctx, int *ptr, int arg) in atom_op_add() argument
594 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_add()
596 src = atom_get_src(ctx, attr, ptr); in atom_op_add()
599 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_add()
602 static void atom_op_and(atom_exec_context *ctx, int *ptr, int arg) in atom_op_and() argument
608 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_and()
610 src = atom_get_src(ctx, attr, ptr); in atom_op_and()
613 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_and()
616 static void atom_op_beep(atom_exec_context *ctx, int *ptr, int arg) in atom_op_beep() argument
621 static void atom_op_calltable(atom_exec_context *ctx, int *ptr, int arg) in atom_op_calltable() argument
630 if (U16(ctx->ctx->cmd_table + 4 + 2 * idx)) in atom_op_calltable()
631 r = atom_execute_table_locked(ctx->ctx, idx, ctx->ps + ctx->ps_shift); in atom_op_calltable()
633 ctx->abort = true; in atom_op_calltable()
637 static void atom_op_clear(atom_exec_context *ctx, int *ptr, int arg) in atom_op_clear() argument
644 atom_get_dst(ctx, arg, attr, ptr, &saved, 0); in atom_op_clear()
646 atom_put_dst(ctx, arg, attr, &dptr, 0, saved); in atom_op_clear()
649 static void atom_op_compare(atom_exec_context *ctx, int *ptr, int arg) in atom_op_compare() argument
654 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_compare()
656 src = atom_get_src(ctx, attr, ptr); in atom_op_compare()
657 ctx->ctx->cs_equal = (dst == src); in atom_op_compare()
658 ctx->ctx->cs_above = (dst > src); in atom_op_compare()
659 SDEBUG(" result: %s %s\n", ctx->ctx->cs_equal ? "EQ" : "NE", in atom_op_compare()
660 ctx->ctx->cs_above ? "GT" : "LE"); in atom_op_compare()
663 static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg) in atom_op_delay() argument
675 static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg) in atom_op_div() argument
680 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_div()
682 src = atom_get_src(ctx, attr, ptr); in atom_op_div()
684 ctx->ctx->divmul[0] = dst / src; in atom_op_div()
685 ctx->ctx->divmul[1] = dst % src; in atom_op_div()
687 ctx->ctx->divmul[0] = 0; in atom_op_div()
688 ctx->ctx->divmul[1] = 0; in atom_op_div()
692 static void atom_op_eot(atom_exec_context *ctx, int *ptr, int arg) in atom_op_eot() argument
697 static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg) in atom_op_jump() argument
705 execute = ctx->ctx->cs_above; in atom_op_jump()
708 execute = ctx->ctx->cs_above || ctx->ctx->cs_equal; in atom_op_jump()
714 execute = !(ctx->ctx->cs_above || ctx->ctx->cs_equal); in atom_op_jump()
717 execute = !ctx->ctx->cs_above; in atom_op_jump()
720 execute = ctx->ctx->cs_equal; in atom_op_jump()
723 execute = !ctx->ctx->cs_equal; in atom_op_jump()
730 if (ctx->last_jump == (ctx->start + target)) { in atom_op_jump()
732 if (time_after(cjiffies, ctx->last_jump_jiffies)) { in atom_op_jump()
733 cjiffies -= ctx->last_jump_jiffies; in atom_op_jump()
736 ctx->abort = true; in atom_op_jump()
740 ctx->last_jump_jiffies = jiffies; in atom_op_jump()
743 ctx->last_jump = ctx->start + target; in atom_op_jump()
744 ctx->last_jump_jiffies = jiffies; in atom_op_jump()
746 *ptr = ctx->start + target; in atom_op_jump()
750 static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg) in atom_op_mask() argument
756 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_mask()
757 mask = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr); in atom_op_mask()
760 src = atom_get_src(ctx, attr, ptr); in atom_op_mask()
764 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_mask()
767 static void atom_op_move(atom_exec_context *ctx, int *ptr, int arg) in atom_op_move() argument
773 atom_get_dst(ctx, arg, attr, ptr, &saved, 0); in atom_op_move()
775 atom_skip_dst(ctx, arg, attr, ptr); in atom_op_move()
779 src = atom_get_src(ctx, attr, ptr); in atom_op_move()
781 atom_put_dst(ctx, arg, attr, &dptr, src, saved); in atom_op_move()
784 static void atom_op_mul(atom_exec_context *ctx, int *ptr, int arg) in atom_op_mul() argument
789 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_mul()
791 src = atom_get_src(ctx, attr, ptr); in atom_op_mul()
792 ctx->ctx->divmul[0] = dst * src; in atom_op_mul()
795 static void atom_op_nop(atom_exec_context *ctx, int *ptr, int arg) in atom_op_nop() argument
800 static void atom_op_or(atom_exec_context *ctx, int *ptr, int arg) in atom_op_or() argument
806 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_or()
808 src = atom_get_src(ctx, attr, ptr); in atom_op_or()
811 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_or()
814 static void atom_op_postcard(atom_exec_context *ctx, int *ptr, int arg) in atom_op_postcard() argument
820 static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg) in atom_op_repeat() argument
825 static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg) in atom_op_restorereg() argument
830 static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg) in atom_op_savereg() argument
835 static void atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setdatablock() argument
841 ctx->ctx->data_block = 0; in atom_op_setdatablock()
843 ctx->ctx->data_block = ctx->start; in atom_op_setdatablock()
845 ctx->ctx->data_block = U16(ctx->ctx->data_table + 4 + 2 * idx); in atom_op_setdatablock()
846 SDEBUG(" base: 0x%04X\n", ctx->ctx->data_block); in atom_op_setdatablock()
849 static void atom_op_setfbbase(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setfbbase() argument
853 ctx->ctx->fb_base = atom_get_src(ctx, attr, ptr); in atom_op_setfbbase()
856 static void atom_op_setport(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setport() argument
867 ctx->ctx->io_mode = ATOM_IO_MM; in atom_op_setport()
869 ctx->ctx->io_mode = ATOM_IO_IIO | port; in atom_op_setport()
873 ctx->ctx->io_mode = ATOM_IO_PCI; in atom_op_setport()
877 ctx->ctx->io_mode = ATOM_IO_SYSIO; in atom_op_setport()
883 static void atom_op_setregblock(atom_exec_context *ctx, int *ptr, int arg) in atom_op_setregblock() argument
885 ctx->ctx->reg_block = U16(*ptr); in atom_op_setregblock()
887 SDEBUG(" base: 0x%04X\n", ctx->ctx->reg_block); in atom_op_setregblock()
890 static void atom_op_shift_left(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shift_left() argument
898 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shift_left()
899 shift = atom_get_src_direct(ctx, ATOM_SRC_BYTE0, ptr); in atom_op_shift_left()
903 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shift_left()
906 static void atom_op_shift_right(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shift_right() argument
914 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shift_right()
915 shift = atom_get_src_direct(ctx, ATOM_SRC_BYTE0, ptr); in atom_op_shift_right()
919 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shift_right()
922 static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shl() argument
929 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shl()
932 shift = atom_get_src(ctx, attr, ptr); in atom_op_shl()
938 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shl()
941 static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg) in atom_op_shr() argument
948 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_shr()
951 shift = atom_get_src(ctx, attr, ptr); in atom_op_shr()
957 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_shr()
960 static void atom_op_sub(atom_exec_context *ctx, int *ptr, int arg) in atom_op_sub() argument
966 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_sub()
968 src = atom_get_src(ctx, attr, ptr); in atom_op_sub()
971 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_sub()
974 static void atom_op_switch(atom_exec_context *ctx, int *ptr, int arg) in atom_op_switch() argument
979 src = atom_get_src(ctx, attr, ptr); in atom_op_switch()
985 atom_get_src(ctx, (attr & 0x38) | ATOM_ARG_IMM, in atom_op_switch()
990 *ptr = ctx->start + target; in atom_op_switch()
1001 static void atom_op_test(atom_exec_context *ctx, int *ptr, int arg) in atom_op_test() argument
1006 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1); in atom_op_test()
1008 src = atom_get_src(ctx, attr, ptr); in atom_op_test()
1009 ctx->ctx->cs_equal = ((dst & src) == 0); in atom_op_test()
1010 SDEBUG(" result: %s\n", ctx->ctx->cs_equal ? "EQ" : "NE"); in atom_op_test()
1013 static void atom_op_xor(atom_exec_context *ctx, int *ptr, int arg) in atom_op_xor() argument
1019 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); in atom_op_xor()
1021 src = atom_get_src(ctx, attr, ptr); in atom_op_xor()
1024 atom_put_dst(ctx, arg, attr, &dptr, dst, saved); in atom_op_xor()
1027 static void atom_op_debug(atom_exec_context *ctx, int *ptr, int arg) in atom_op_debug() argument
1160 static int atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params) in atom_execute_table_locked() argument
1162 int base = CU16(ctx->cmd_table + 4 + 2 * index); in atom_execute_table_locked()
1178 ectx.ctx = ctx; in atom_execute_table_locked()
1221 int atom_execute_table_scratch_unlocked(struct atom_context *ctx, int index, uint32_t * params) in atom_execute_table_scratch_unlocked() argument
1225 mutex_lock(&ctx->mutex); in atom_execute_table_scratch_unlocked()
1227 ctx->data_block = 0; in atom_execute_table_scratch_unlocked()
1229 ctx->reg_block = 0; in atom_execute_table_scratch_unlocked()
1231 ctx->fb_base = 0; in atom_execute_table_scratch_unlocked()
1233 ctx->io_mode = ATOM_IO_MM; in atom_execute_table_scratch_unlocked()
1235 ctx->divmul[0] = 0; in atom_execute_table_scratch_unlocked()
1236 ctx->divmul[1] = 0; in atom_execute_table_scratch_unlocked()
1237 r = atom_execute_table_locked(ctx, index, params); in atom_execute_table_scratch_unlocked()
1238 mutex_unlock(&ctx->mutex); in atom_execute_table_scratch_unlocked()
1242 int atom_execute_table(struct atom_context *ctx, int index, uint32_t * params) in atom_execute_table() argument
1245 mutex_lock(&ctx->scratch_mutex); in atom_execute_table()
1246 r = atom_execute_table_scratch_unlocked(ctx, index, params); in atom_execute_table()
1247 mutex_unlock(&ctx->scratch_mutex); in atom_execute_table()
1253 static void atom_index_iio(struct atom_context *ctx, int base) in atom_index_iio() argument
1255 ctx->iio = kzalloc(2 * 256, GFP_KERNEL); in atom_index_iio()
1256 if (!ctx->iio) in atom_index_iio()
1259 ctx->iio[CU8(base + 1)] = base + 2; in atom_index_iio()
1270 struct atom_context *ctx = in atom_parse() local
1276 if (!ctx) in atom_parse()
1279 ctx->card = card; in atom_parse()
1280 ctx->bios = bios; in atom_parse()
1284 kfree(ctx); in atom_parse()
1291 kfree(ctx); in atom_parse()
1300 kfree(ctx); in atom_parse()
1304 ctx->cmd_table = CU16(base + ATOM_ROM_CMD_PTR); in atom_parse()
1305 ctx->data_table = CU16(base + ATOM_ROM_DATA_PTR); in atom_parse()
1306 atom_index_iio(ctx, CU16(ctx->data_table + ATOM_DATA_IIO_PTR) + 4); in atom_parse()
1307 if (!ctx->iio) { in atom_parse()
1308 atom_destroy(ctx); in atom_parse()
1325 return ctx; in atom_parse()
1328 int atom_asic_init(struct atom_context *ctx) in atom_asic_init() argument
1330 struct radeon_device *rdev = ctx->card->dev->dev_private; in atom_asic_init()
1331 int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR); in atom_asic_init()
1342 if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT)) in atom_asic_init()
1344 ret = atom_execute_table(ctx, ATOM_CMD_INIT, ps); in atom_asic_init()
1351 if (CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_SPDFANCNTL)) in atom_asic_init()
1352 atom_execute_table(ctx, ATOM_CMD_SPDFANCNTL, ps); in atom_asic_init()
1357 void atom_destroy(struct atom_context *ctx) in atom_destroy() argument
1359 kfree(ctx->iio); in atom_destroy()
1360 kfree(ctx); in atom_destroy()
1363 bool atom_parse_data_header(struct atom_context *ctx, int index, in atom_parse_data_header() argument
1368 int idx = CU16(ctx->data_table + offset); in atom_parse_data_header()
1369 u16 *mdt = (u16 *)(ctx->bios + ctx->data_table + 4); in atom_parse_data_header()
1384 bool atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t * frev, in atom_parse_cmd_header() argument
1388 int idx = CU16(ctx->cmd_table + offset); in atom_parse_cmd_header()
1389 u16 *mct = (u16 *)(ctx->bios + ctx->cmd_table + 4); in atom_parse_cmd_header()
1401 int atom_allocate_fb_scratch(struct atom_context *ctx) in atom_allocate_fb_scratch() argument
1408 if (atom_parse_data_header(ctx, index, NULL, NULL, NULL, &data_offset)) { in atom_allocate_fb_scratch()
1409 firmware_usage = (struct _ATOM_VRAM_USAGE_BY_FIRMWARE *)(ctx->bios + data_offset); in atom_allocate_fb_scratch()
1417 ctx->scratch_size_bytes = 0; in atom_allocate_fb_scratch()
1421 ctx->scratch = kzalloc(usage_bytes, GFP_KERNEL); in atom_allocate_fb_scratch()
1422 if (!ctx->scratch) in atom_allocate_fb_scratch()
1424 ctx->scratch_size_bytes = usage_bytes; in atom_allocate_fb_scratch()