diff options
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 3 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 36 |
2 files changed, 39 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 856a67d5bd9b..d6c8cbaa8693 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -1946,6 +1946,9 @@ extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc | |||
1946 | extern int radeon_resume_kms(struct drm_device *dev); | 1946 | extern int radeon_resume_kms(struct drm_device *dev); |
1947 | extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); | 1947 | extern int radeon_suspend_kms(struct drm_device *dev, pm_message_t state); |
1948 | extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size); | 1948 | extern void radeon_ttm_set_active_vram_size(struct radeon_device *rdev, u64 size); |
1949 | extern void radeon_program_register_sequence(struct radeon_device *rdev, | ||
1950 | const u32 *registers, | ||
1951 | const u32 array_size); | ||
1949 | 1952 | ||
1950 | /* | 1953 | /* |
1951 | * vm | 1954 | * vm |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index 62d0ba338582..237b7a7549e6 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
@@ -98,6 +98,42 @@ static const char radeon_family_name[][16] = { | |||
98 | }; | 98 | }; |
99 | 99 | ||
100 | /** | 100 | /** |
101 | * radeon_program_register_sequence - program an array of registers. | ||
102 | * | ||
103 | * @rdev: radeon_device pointer | ||
104 | * @registers: pointer to the register array | ||
105 | * @array_size: size of the register array | ||
106 | * | ||
107 | * Programs an array or registers with and and or masks. | ||
108 | * This is a helper for setting golden registers. | ||
109 | */ | ||
110 | void radeon_program_register_sequence(struct radeon_device *rdev, | ||
111 | const u32 *registers, | ||
112 | const u32 array_size) | ||
113 | { | ||
114 | u32 tmp, reg, and_mask, or_mask; | ||
115 | int i; | ||
116 | |||
117 | if (array_size % 3) | ||
118 | return; | ||
119 | |||
120 | for (i = 0; i < array_size; i +=3) { | ||
121 | reg = registers[i + 0]; | ||
122 | and_mask = registers[i + 1]; | ||
123 | or_mask = registers[i + 2]; | ||
124 | |||
125 | if (and_mask == 0xffffffff) { | ||
126 | tmp = or_mask; | ||
127 | } else { | ||
128 | tmp = RREG32(reg); | ||
129 | tmp &= ~and_mask; | ||
130 | tmp |= or_mask; | ||
131 | } | ||
132 | WREG32(reg, tmp); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | /** | ||
101 | * radeon_surface_init - Clear GPU surface registers. | 137 | * radeon_surface_init - Clear GPU surface registers. |
102 | * | 138 | * |
103 | * @rdev: radeon_device pointer | 139 | * @rdev: radeon_device pointer |