Lines Matching refs:ctx
63 struct atom_context *ctx;
73 static int amdgpu_atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t *params);
74 int amdgpu_atom_execute_table(struct atom_context *ctx, int index, uint32_t *params);
109 static uint32_t atom_iio_execute(struct atom_context *ctx, int base,
120 temp = ctx->card->reg_read(ctx->card, CU16(base + 1));
124 ctx->card->reg_write(ctx->card, CU16(base + 1), temp);
164 ((ctx->
181 static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr,
185 struct atom_context *gctx = ctx->ctx;
226 val = get_unaligned_le32((u32 *)&ctx->ps[idx]);
264 val = ctx->ws[idx];
366 static void atom_skip_src_int(atom_exec_context *ctx, uint8_t attr, int *ptr)
402 static uint32_t atom_get_src(atom_exec_context *ctx, uint8_t attr, int *ptr)
404 return atom_get_src_int(ctx, attr, ptr, NULL, 1);
407 static uint32_t atom_get_src_direct(atom_exec_context *ctx, uint8_t align, int *ptr)
433 static uint32_t atom_get_dst(atom_exec_context *ctx, int arg, uint8_t attr,
436 return atom_get_src_int(ctx,
442 static void atom_skip_dst(atom_exec_context *ctx, int arg, uint8_t attr, int *ptr)
444 atom_skip_src_int(ctx,
449 static void atom_put_dst(atom_exec_context *ctx, int arg, uint8_t attr,
455 struct atom_context *gctx = ctx->ctx;
499 ctx->ps[idx] = cpu_to_le32(val);
531 ctx->ws[idx] = val;
585 static void atom_op_add(atom_exec_context *ctx, int *ptr, int arg)
591 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
593 src = atom_get_src(ctx, attr, ptr);
596 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
599 static void atom_op_and(atom_exec_context *ctx, int *ptr, int arg)
605 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
607 src = atom_get_src(ctx, attr, ptr);
610 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
613 static void atom_op_beep(atom_exec_context *ctx, int *ptr, int arg)
618 static void atom_op_calltable(atom_exec_context *ctx, int *ptr, int arg)
627 if (U16(ctx->ctx->cmd_table + 4 + 2 * idx))
628 r = amdgpu_atom_execute_table_locked(ctx->ctx, idx, ctx->ps + ctx->ps_shift);
630 ctx->abort = true;
634 static void atom_op_clear(atom_exec_context *ctx, int *ptr, int arg)
641 atom_get_dst(ctx, arg, attr, ptr, &saved, 0);
643 atom_put_dst(ctx, arg, attr, &dptr, 0, saved);
646 static void atom_op_compare(atom_exec_context *ctx, int *ptr, int arg)
651 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
653 src = atom_get_src(ctx, attr, ptr);
654 ctx->ctx->cs_equal = (dst == src);
655 ctx->ctx->cs_above = (dst > src);
656 SDEBUG(" result: %s %s\n", ctx->ctx->cs_equal ? "EQ" : "NE",
657 ctx->ctx->cs_above ? "GT" : "LE");
660 static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg)
672 static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg)
677 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
679 src = atom_get_src(ctx, attr, ptr);
681 ctx->ctx->divmul[0] = dst / src;
682 ctx->ctx->divmul[1] = dst % src;
684 ctx->ctx->divmul[0] = 0;
685 ctx->ctx->divmul[1] = 0;
689 static void atom_op_div32(atom_exec_context *ctx, int *ptr, int arg)
695 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
697 src = atom_get_src(ctx, attr, ptr);
700 val64 |= ((uint64_t)ctx->ctx->divmul[1]) << 32;
702 ctx->ctx->divmul[0] = lower_32_bits(val64);
703 ctx->ctx->divmul[1] = upper_32_bits(val64);
705 ctx->ctx->divmul[0] = 0;
706 ctx->ctx->divmul[1] = 0;
710 static void atom_op_eot(atom_exec_context *ctx, int *ptr, int arg)
715 static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg)
723 execute = ctx->ctx->cs_above;
726 execute = ctx->ctx->cs_above || ctx->ctx->cs_equal;
732 execute = !(ctx->ctx->cs_above || ctx->ctx->cs_equal);
735 execute = !ctx->ctx->cs_above;
738 execute = ctx->ctx->cs_equal;
741 execute = !ctx->ctx->cs_equal;
748 if (ctx->last_jump == (ctx->start + target)) {
750 if (time_after(cjiffies, ctx->last_jump_jiffies)) {
751 cjiffies -= ctx->last_jump_jiffies;
755 ctx->abort = true;
759 ctx->last_jump_jiffies = jiffies;
762 ctx->last_jump = ctx->start + target;
763 ctx->last_jump_jiffies = jiffies;
765 *ptr = ctx->start + target;
769 static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg)
775 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
776 mask = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr);
779 src = atom_get_src(ctx, attr, ptr);
783 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
786 static void atom_op_move(atom_exec_context *ctx, int *ptr, int arg)
792 atom_get_dst(ctx, arg, attr, ptr, &saved, 0);
794 atom_skip_dst(ctx, arg, attr, ptr);
798 src = atom_get_src(ctx, attr, ptr);
800 atom_put_dst(ctx, arg, attr, &dptr, src, saved);
803 static void atom_op_mul(atom_exec_context *ctx, int *ptr, int arg)
808 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
810 src = atom_get_src(ctx, attr, ptr);
811 ctx->ctx->divmul[0] = dst * src;
814 static void atom_op_mul32(atom_exec_context *ctx, int *ptr, int arg)
820 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
822 src = atom_get_src(ctx, attr, ptr);
824 ctx->ctx->divmul[0] = lower_32_bits(val64);
825 ctx->ctx->divmul[1] = upper_32_bits(val64);
828 static void atom_op_nop(atom_exec_context *ctx, int *ptr, int arg)
833 static void atom_op_or(atom_exec_context *ctx, int *ptr, int arg)
839 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
841 src = atom_get_src(ctx, attr, ptr);
844 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
847 static void atom_op_postcard(atom_exec_context *ctx, int *ptr, int arg)
853 static void atom_op_repeat(atom_exec_context *ctx, int *ptr, int arg)
858 static void atom_op_restorereg(atom_exec_context *ctx, int *ptr, int arg)
863 static void atom_op_savereg(atom_exec_context *ctx, int *ptr, int arg)
868 static void atom_op_setdatablock(atom_exec_context *ctx, int *ptr, int arg)
874 ctx->ctx->data_block = 0;
876 ctx->ctx->data_block = ctx->start;
878 ctx->ctx->data_block = U16(ctx->ctx->data_table + 4 + 2 * idx);
879 SDEBUG(" base: 0x%04X\n", ctx->ctx->data_block);
882 static void atom_op_setfbbase(atom_exec_context *ctx, int *ptr, int arg)
886 ctx->ctx->fb_base = atom_get_src(ctx, attr, ptr);
889 static void atom_op_setport(atom_exec_context *ctx, int *ptr, int arg)
900 ctx->ctx->io_mode = ATOM_IO_MM;
902 ctx->ctx->io_mode = ATOM_IO_IIO | port;
906 ctx->ctx->io_mode = ATOM_IO_PCI;
910 ctx->ctx->io_mode = ATOM_IO_SYSIO;
916 static void atom_op_setregblock(atom_exec_context *ctx, int *ptr, int arg)
918 ctx->ctx->reg_block = U16(*ptr);
920 SDEBUG(" base: 0x%04X\n", ctx->ctx->reg_block);
923 static void atom_op_shift_left(atom_exec_context *ctx, int *ptr, int arg)
931 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
932 shift = atom_get_src_direct(ctx, ATOM_SRC_BYTE0, ptr);
936 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
939 static void atom_op_shift_right(atom_exec_context *ctx, int *ptr, int arg)
947 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
948 shift = atom_get_src_direct(ctx, ATOM_SRC_BYTE0, ptr);
952 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
955 static void atom_op_shl(atom_exec_context *ctx, int *ptr, int arg)
962 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
965 shift = atom_get_src(ctx, attr, ptr);
971 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
974 static void atom_op_shr(atom_exec_context *ctx, int *ptr, int arg)
981 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
984 shift = atom_get_src(ctx, attr, ptr);
990 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
993 static void atom_op_sub(atom_exec_context *ctx, int *ptr, int arg)
999 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
1001 src = atom_get_src(ctx, attr, ptr);
1004 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
1007 static void atom_op_switch(atom_exec_context *ctx, int *ptr, int arg)
1012 src = atom_get_src(ctx, attr, ptr);
1018 atom_get_src(ctx, (attr & 0x38) | ATOM_ARG_IMM,
1023 *ptr = ctx->start + target;
1034 static void atom_op_test(atom_exec_context *ctx, int *ptr, int arg)
1039 dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
1041 src = atom_get_src(ctx, attr, ptr);
1042 ctx->ctx->cs_equal = ((dst & src) == 0);
1043 SDEBUG(" result: %s\n", ctx->ctx->cs_equal ? "EQ" : "NE");
1046 static void atom_op_xor(atom_exec_context *ctx, int *ptr, int arg)
1052 dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1);
1054 src = atom_get_src(ctx, attr, ptr);
1057 atom_put_dst(ctx, arg, attr, &dptr, dst, saved);
1060 static void atom_op_debug(atom_exec_context *ctx, int *ptr, int arg)
1066 static void atom_op_processds(atom_exec_context *ctx, int *ptr, int arg)
1207 static int amdgpu_atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t *params)
1209 int base = CU16(ctx->cmd_table + 4 + 2 * index);
1225 ectx.ctx = ctx;
1268 int amdgpu_atom_execute_table(struct atom_context *ctx, int index, uint32_t *params)
1272 mutex_lock(&ctx->mutex);
1274 ctx->data_block = 0;
1276 ctx->reg_block = 0;
1278 ctx->fb_base = 0;
1280 ctx->io_mode = ATOM_IO_MM;
1282 ctx->divmul[0] = 0;
1283 ctx->divmul[1] = 0;
1284 r = amdgpu_atom_execute_table_locked(ctx, index, params);
1285 mutex_unlock(&ctx->mutex);
1291 static void atom_index_iio(struct atom_context *ctx, int base)
1293 ctx->iio = kzalloc(2 * 256, GFP_KERNEL);
1294 if (!ctx->iio)
1297 ctx->iio[CU8(base + 1)] = base + 2;
1305 static void atom_get_vbios_name(struct atom_context *ctx)
1317 p_rom = ctx->bios;
1327 memcpy(ctx->name, na, 7);
1328 ctx->name[7] = 0;
1346 memcpy(ctx->name, c_ptr, name_size);
1347 back = ctx->name + name_size;
1353 static void atom_get_vbios_date(struct atom_context *ctx)
1358 p_rom = ctx->bios;
1362 ctx->date[0] = '2';
1363 ctx->date[1] = '0';
1364 ctx->date[2] = date_in_rom[6];
1365 ctx->date[3] = date_in_rom[7];
1366 ctx->date[4] = '/';
1367 ctx->date[5] = date_in_rom[0];
1368 ctx->date[6] = date_in_rom[1];
1369 ctx->date[7] = '/';
1370 ctx->date[8] = date_in_rom[3];
1371 ctx->date[9] = date_in_rom[4];
1372 ctx->date[10] = ' ';
1373 ctx->date[11] = date_in_rom[9];
1374 ctx->date[12] = date_in_rom[10];
1375 ctx->date[13] = date_in_rom[11];
1376 ctx->date[14] = date_in_rom[12];
1377 ctx->date[15] = date_in_rom[13];
1378 ctx->date[16] = '\0';
1381 static unsigned char *atom_find_str_in_rom(struct atom_context *ctx, char *str, int start,
1390 p_rom = ctx->bios;
1404 static void atom_get_vbios_pn(struct atom_context *ctx)
1412 p_rom = ctx->bios;
1424 vbios_str = atom_find_str_in_rom(ctx, BIOS_ATOM_PREFIX, 3, 1024, 64);
1435 ctx->vbios_pn[count] = vbios_str[count];
1439 ctx->vbios_pn[count] = 0;
1442 pr_info("ATOM BIOS: %s\n", ctx->vbios_pn);
1445 static void atom_get_vbios_version(struct atom_context *ctx)
1450 vbios_ver = atom_find_str_in_rom(ctx, BIOS_VERSION_PREFIX, 3, 1024, 64);
1454 memcpy(ctx->vbios_ver_str, vbios_ver, STRLEN_NORMAL);
1456 ctx->vbios_ver_str[0] = '\0';
1463 struct atom_context *ctx =
1469 if (!ctx)
1472 ctx->card = card;
1473 ctx->bios = bios;
1477 kfree(ctx);
1484 kfree(ctx);
1493 kfree(ctx);
1497 ctx->cmd_table = CU16(base + ATOM_ROM_CMD_PTR);
1498 ctx->data_table = CU16(base + ATOM_ROM_DATA_PTR);
1499 atom_index_iio(ctx, CU16(ctx->data_table + ATOM_DATA_IIO_PTR) + 4);
1500 if (!ctx->iio) {
1501 amdgpu_atom_destroy(ctx);
1512 ctx->version = atom_fw_info->ulFirmwareRevision;
1516 atom_get_vbios_name(ctx);
1517 atom_get_vbios_pn(ctx);
1518 atom_get_vbios_date(ctx);
1519 atom_get_vbios_version(ctx);
1521 return ctx;
1524 int amdgpu_atom_asic_init(struct atom_context *ctx)
1526 int hwi = CU16(ctx->data_table + ATOM_DATA_FWI_PTR);
1537 if (!CU16(ctx->cmd_table + 4 + 2 * ATOM_CMD_INIT))
1539 ret = amdgpu_atom_execute_table(ctx, ATOM_CMD_INIT, ps);
1548 void amdgpu_atom_destroy(struct atom_context *ctx)
1550 kfree(ctx->iio);
1551 kfree(ctx);
1554 bool amdgpu_atom_parse_data_header(struct atom_context *ctx, int index,
1559 int idx = CU16(ctx->data_table + offset);
1560 u16 *mdt = (u16 *)(ctx->bios + ctx->data_table + 4);
1575 bool amdgpu_atom_parse_cmd_header(struct atom_context *ctx, int index, uint8_t *frev,
1579 int idx = CU16(ctx->cmd_table + offset);
1580 u16 *mct = (u16 *)(ctx->bios + ctx->cmd_table + 4);