diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/atom.c')
-rw-r--r-- | drivers/gpu/drm/radeon/atom.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/gpu/drm/radeon/atom.c b/drivers/gpu/drm/radeon/atom.c index 8e421f644a54..ebdb0fdb8348 100644 --- a/drivers/gpu/drm/radeon/atom.c +++ b/drivers/gpu/drm/radeon/atom.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "atom.h" | 32 | #include "atom.h" |
33 | #include "atom-names.h" | 33 | #include "atom-names.h" |
34 | #include "atom-bits.h" | 34 | #include "atom-bits.h" |
35 | #include "radeon.h" | ||
35 | 36 | ||
36 | #define ATOM_COND_ABOVE 0 | 37 | #define ATOM_COND_ABOVE 0 |
37 | #define ATOM_COND_ABOVEOREQUAL 1 | 38 | #define ATOM_COND_ABOVEOREQUAL 1 |
@@ -101,7 +102,9 @@ static void debug_print_spaces(int n) | |||
101 | static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | 102 | static uint32_t atom_iio_execute(struct atom_context *ctx, int base, |
102 | uint32_t index, uint32_t data) | 103 | uint32_t index, uint32_t data) |
103 | { | 104 | { |
105 | struct radeon_device *rdev = ctx->card->dev->dev_private; | ||
104 | uint32_t temp = 0xCDCDCDCD; | 106 | uint32_t temp = 0xCDCDCDCD; |
107 | |||
105 | while (1) | 108 | while (1) |
106 | switch (CU8(base)) { | 109 | switch (CU8(base)) { |
107 | case ATOM_IIO_NOP: | 110 | case ATOM_IIO_NOP: |
@@ -112,6 +115,8 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
112 | base += 3; | 115 | base += 3; |
113 | break; | 116 | break; |
114 | case ATOM_IIO_WRITE: | 117 | case ATOM_IIO_WRITE: |
118 | if (rdev->family == CHIP_RV515) | ||
119 | (void)ctx->card->ioreg_read(ctx->card, CU16(base + 1)); | ||
115 | ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); | 120 | ctx->card->ioreg_write(ctx->card, CU16(base + 1), temp); |
116 | base += 3; | 121 | base += 3; |
117 | break; | 122 | break; |
@@ -130,7 +135,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
130 | case ATOM_IIO_MOVE_INDEX: | 135 | case ATOM_IIO_MOVE_INDEX: |
131 | temp &= | 136 | temp &= |
132 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << | 137 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << |
133 | CU8(base + 2)); | 138 | CU8(base + 3)); |
134 | temp |= | 139 | temp |= |
135 | ((index >> CU8(base + 2)) & | 140 | ((index >> CU8(base + 2)) & |
136 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + | 141 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + |
@@ -140,7 +145,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
140 | case ATOM_IIO_MOVE_DATA: | 145 | case ATOM_IIO_MOVE_DATA: |
141 | temp &= | 146 | temp &= |
142 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << | 147 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << |
143 | CU8(base + 2)); | 148 | CU8(base + 3)); |
144 | temp |= | 149 | temp |= |
145 | ((data >> CU8(base + 2)) & | 150 | ((data >> CU8(base + 2)) & |
146 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + | 151 | (0xFFFFFFFF >> (32 - CU8(base + 1)))) << CU8(base + |
@@ -150,7 +155,7 @@ static uint32_t atom_iio_execute(struct atom_context *ctx, int base, | |||
150 | case ATOM_IIO_MOVE_ATTR: | 155 | case ATOM_IIO_MOVE_ATTR: |
151 | temp &= | 156 | temp &= |
152 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << | 157 | ~((0xFFFFFFFF >> (32 - CU8(base + 1))) << |
153 | CU8(base + 2)); | 158 | CU8(base + 3)); |
154 | temp |= | 159 | temp |= |
155 | ((ctx-> | 160 | ((ctx-> |
156 | io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 - | 161 | io_attr >> CU8(base + 2)) & (0xFFFFFFFF >> (32 - |
@@ -647,12 +652,12 @@ static void atom_op_compare(atom_exec_context *ctx, int *ptr, int arg) | |||
647 | 652 | ||
648 | static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg) | 653 | static void atom_op_delay(atom_exec_context *ctx, int *ptr, int arg) |
649 | { | 654 | { |
650 | uint8_t count = U8((*ptr)++); | 655 | unsigned count = U8((*ptr)++); |
651 | SDEBUG(" count: %d\n", count); | 656 | SDEBUG(" count: %d\n", count); |
652 | if (arg == ATOM_UNIT_MICROSEC) | 657 | if (arg == ATOM_UNIT_MICROSEC) |
653 | udelay(count); | 658 | udelay(count); |
654 | else | 659 | else |
655 | schedule_timeout_uninterruptible(msecs_to_jiffies(count)); | 660 | msleep(count); |
656 | } | 661 | } |
657 | 662 | ||
658 | static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg) | 663 | static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg) |
@@ -733,16 +738,16 @@ static void atom_op_jump(atom_exec_context *ctx, int *ptr, int arg) | |||
733 | static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg) | 738 | static void atom_op_mask(atom_exec_context *ctx, int *ptr, int arg) |
734 | { | 739 | { |
735 | uint8_t attr = U8((*ptr)++); | 740 | uint8_t attr = U8((*ptr)++); |
736 | uint32_t dst, src1, src2, saved; | 741 | uint32_t dst, mask, src, saved; |
737 | int dptr = *ptr; | 742 | int dptr = *ptr; |
738 | SDEBUG(" dst: "); | 743 | SDEBUG(" dst: "); |
739 | dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); | 744 | dst = atom_get_dst(ctx, arg, attr, ptr, &saved, 1); |
740 | SDEBUG(" src1: "); | 745 | mask = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr); |
741 | src1 = atom_get_src_direct(ctx, ((attr >> 3) & 7), ptr); | 746 | SDEBUG(" mask: 0x%08x", mask); |
742 | SDEBUG(" src2: "); | 747 | SDEBUG(" src: "); |
743 | src2 = atom_get_src(ctx, attr, ptr); | 748 | src = atom_get_src(ctx, attr, ptr); |
744 | dst &= src1; | 749 | dst &= mask; |
745 | dst |= src2; | 750 | dst |= src; |
746 | SDEBUG(" dst: "); | 751 | SDEBUG(" dst: "); |
747 | atom_put_dst(ctx, arg, attr, &dptr, dst, saved); | 752 | atom_put_dst(ctx, arg, attr, &dptr, dst, saved); |
748 | } | 753 | } |