Subversion Repositories Kolibri OS

Rev

Rev 5346 | Rev 6661 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5346 Rev 6104
1
/*
1
/*
2
 * Copyright 2008 Advanced Micro Devices, Inc.
2
 * Copyright 2008 Advanced Micro Devices, Inc.
3
 * Copyright 2008 Red Hat Inc.
3
 * Copyright 2008 Red Hat Inc.
4
 * Copyright 2009 Jerome Glisse.
4
 * Copyright 2009 Jerome Glisse.
5
 *
5
 *
6
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * Permission is hereby granted, free of charge, to any person obtaining a
7
 * copy of this software and associated documentation files (the "Software"),
7
 * copy of this software and associated documentation files (the "Software"),
8
 * to deal in the Software without restriction, including without limitation
8
 * to deal in the Software without restriction, including without limitation
9
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * and/or sell copies of the Software, and to permit persons to whom the
11
 * Software is furnished to do so, subject to the following conditions:
11
 * Software is furnished to do so, subject to the following conditions:
12
 *
12
 *
13
 * The above copyright notice and this permission notice shall be included in
13
 * The above copyright notice and this permission notice shall be included in
14
 * all copies or substantial portions of the Software.
14
 * all copies or substantial portions of the Software.
15
 *
15
 *
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
 * OTHER DEALINGS IN THE SOFTWARE.
22
 * OTHER DEALINGS IN THE SOFTWARE.
23
 *
23
 *
24
 * Authors: Dave Airlie
24
 * Authors: Dave Airlie
25
 *          Alex Deucher
25
 *          Alex Deucher
26
 *          Jerome Glisse
26
 *          Jerome Glisse
27
 */
27
 */
28
//#include 
28
//#include 
29
#include 
29
#include 
30
#include 
30
#include 
31
#include 
31
#include 
32
#include 
32
#include 
-
 
33
#include 
33
#include "radeon_reg.h"
34
#include "radeon_reg.h"
34
#include "radeon.h"
35
#include "radeon.h"
35
#include "atom.h"
36
#include "atom.h"
36
 
37
 
37
#include "bitmap.h"
38
#include "bitmap.h"
38
#include "display.h"
39
#include "display.h"
39
 
40
 
40
 
41
 
41
#include 
42
#include 
42
 
43
 
43
#define PCI_VENDOR_ID_ATI               0x1002
44
#define PCI_VENDOR_ID_ATI               0x1002
44
#define PCI_VENDOR_ID_APPLE             0x106b
45
#define PCI_VENDOR_ID_APPLE             0x106b
45
 
46
 
46
int radeon_no_wb;
47
int radeon_no_wb;
47
int radeon_modeset = -1;
48
int radeon_modeset = -1;
48
int radeon_dynclks = -1;
49
int radeon_dynclks = -1;
49
int radeon_r4xx_atom = 0;
50
int radeon_r4xx_atom = 0;
50
int radeon_agpmode = 0;
51
int radeon_agpmode = 0;
51
int radeon_vram_limit = 0;
52
int radeon_vram_limit = 0;
52
int radeon_gart_size = -1; /* auto */
53
int radeon_gart_size = -1; /* auto */
53
int radeon_benchmarking = 0;
54
int radeon_benchmarking = 0;
54
int radeon_testing = 0;
55
int radeon_testing = 0;
55
int radeon_connector_table = 0;
56
int radeon_connector_table = 0;
56
int radeon_tv = 1;
57
int radeon_tv = 1;
57
int radeon_audio = -1;
58
int radeon_audio = -1;
58
int radeon_disp_priority = 0;
59
int radeon_disp_priority = 0;
59
int radeon_hw_i2c = 0;
60
int radeon_hw_i2c = 0;
60
int radeon_pcie_gen2 = -1;
61
int radeon_pcie_gen2 = -1;
61
int radeon_msi = -1;
62
int radeon_msi = -1;
62
int radeon_lockup_timeout = 10000;
63
int radeon_lockup_timeout = 10000;
63
int radeon_fastfb = 0;
64
int radeon_fastfb = 0;
64
int radeon_dpm = -1;
65
int radeon_dpm = -1;
65
int radeon_aspm = -1;
66
int radeon_aspm = -1;
66
int radeon_runtime_pm = -1;
67
int radeon_runtime_pm = -1;
67
int radeon_hard_reset = 0;
68
int radeon_hard_reset = 0;
68
int radeon_vm_size = 8;
69
int radeon_vm_size = 8;
69
int radeon_vm_block_size = -1;
70
int radeon_vm_block_size = -1;
70
int radeon_deep_color = 0;
71
int radeon_deep_color = 0;
71
int radeon_use_pflipirq = 2;
72
int radeon_use_pflipirq = 2;
72
int irq_override = 0;
73
int irq_override = 0;
73
int radeon_bapm = -1;
74
int radeon_bapm = -1;
74
int radeon_backlight = 0;
75
int radeon_backlight = 0;
-
 
76
int radeon_auxch = -1;
-
 
77
int radeon_mst = 0;
75
 
78
 
76
extern display_t *os_display;
79
extern display_t *os_display;
77
extern struct drm_device *main_device;
80
extern struct drm_device *main_device;
78
extern videomode_t usermode;
81
extern videomode_t usermode;
79
 
82
 
80
 
83
 
81
void parse_cmdline(char *cmdline, videomode_t *mode, char *log, int *kms);
84
void parse_cmdline(char *cmdline, videomode_t *mode, char *log, int *kms);
82
int init_display(struct radeon_device *rdev, videomode_t *mode);
85
int init_display(struct radeon_device *rdev, videomode_t *mode);
83
int init_display_kms(struct drm_device *dev, videomode_t *usermode);
86
int init_display_kms(struct drm_device *dev, videomode_t *usermode);
84
 
87
 
85
int get_modes(videomode_t *mode, u32 *count);
88
int get_modes(videomode_t *mode, u32 *count);
86
int set_user_mode(videomode_t *mode);
89
int set_user_mode(videomode_t *mode);
87
int r100_2D_test(struct radeon_device *rdev);
90
int r100_2D_test(struct radeon_device *rdev);
88
 
91
 
89
 
92
 
90
 /* Legacy VGA regions */
93
 /* Legacy VGA regions */
91
#define VGA_RSRC_NONE          0x00
94
#define VGA_RSRC_NONE          0x00
92
#define VGA_RSRC_LEGACY_IO     0x01
95
#define VGA_RSRC_LEGACY_IO     0x01
93
#define VGA_RSRC_LEGACY_MEM    0x02
96
#define VGA_RSRC_LEGACY_MEM    0x02
94
#define VGA_RSRC_LEGACY_MASK   (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM)
97
#define VGA_RSRC_LEGACY_MASK   (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM)
95
/* Non-legacy access */
98
/* Non-legacy access */
96
#define VGA_RSRC_NORMAL_IO     0x04
99
#define VGA_RSRC_NORMAL_IO     0x04
97
#define VGA_RSRC_NORMAL_MEM    0x08
100
#define VGA_RSRC_NORMAL_MEM    0x08
98
 
101
 
99
 
102
 
100
static const char radeon_family_name[][16] = {
103
static const char radeon_family_name[][16] = {
101
	"R100",
104
	"R100",
102
	"RV100",
105
	"RV100",
103
	"RS100",
106
	"RS100",
104
	"RV200",
107
	"RV200",
105
	"RS200",
108
	"RS200",
106
	"R200",
109
	"R200",
107
	"RV250",
110
	"RV250",
108
	"RS300",
111
	"RS300",
109
	"RV280",
112
	"RV280",
110
	"R300",
113
	"R300",
111
	"R350",
114
	"R350",
112
	"RV350",
115
	"RV350",
113
	"RV380",
116
	"RV380",
114
	"R420",
117
	"R420",
115
	"R423",
118
	"R423",
116
	"RV410",
119
	"RV410",
117
	"RS400",
120
	"RS400",
118
	"RS480",
121
	"RS480",
119
	"RS600",
122
	"RS600",
120
	"RS690",
123
	"RS690",
121
	"RS740",
124
	"RS740",
122
	"RV515",
125
	"RV515",
123
	"R520",
126
	"R520",
124
	"RV530",
127
	"RV530",
125
	"RV560",
128
	"RV560",
126
	"RV570",
129
	"RV570",
127
	"R580",
130
	"R580",
128
	"R600",
131
	"R600",
129
	"RV610",
132
	"RV610",
130
	"RV630",
133
	"RV630",
131
	"RV670",
134
	"RV670",
132
	"RV620",
135
	"RV620",
133
	"RV635",
136
	"RV635",
134
	"RS780",
137
	"RS780",
135
	"RS880",
138
	"RS880",
136
	"RV770",
139
	"RV770",
137
	"RV730",
140
	"RV730",
138
	"RV710",
141
	"RV710",
139
	"RV740",
142
	"RV740",
140
	"CEDAR",
143
	"CEDAR",
141
	"REDWOOD",
144
	"REDWOOD",
142
	"JUNIPER",
145
	"JUNIPER",
143
	"CYPRESS",
146
	"CYPRESS",
144
	"HEMLOCK",
147
	"HEMLOCK",
145
	"PALM",
148
	"PALM",
146
	"SUMO",
149
	"SUMO",
147
	"SUMO2",
150
	"SUMO2",
148
	"BARTS",
151
	"BARTS",
149
	"TURKS",
152
	"TURKS",
150
	"CAICOS",
153
	"CAICOS",
151
	"CAYMAN",
154
	"CAYMAN",
152
	"ARUBA",
155
	"ARUBA",
153
	"TAHITI",
156
	"TAHITI",
154
	"PITCAIRN",
157
	"PITCAIRN",
155
	"VERDE",
158
	"VERDE",
156
	"OLAND",
159
	"OLAND",
157
	"HAINAN",
160
	"HAINAN",
158
	"BONAIRE",
161
	"BONAIRE",
159
	"KAVERI",
162
	"KAVERI",
160
	"KABINI",
163
	"KABINI",
161
	"HAWAII",
164
	"HAWAII",
162
	"MULLINS",
165
	"MULLINS",
163
	"LAST",
166
	"LAST",
164
};
167
};
165
 
168
 
166
#define RADEON_PX_QUIRK_DISABLE_PX  (1 << 0)
169
#define RADEON_PX_QUIRK_DISABLE_PX  (1 << 0)
167
#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
170
#define RADEON_PX_QUIRK_LONG_WAKEUP (1 << 1)
168
 
171
 
169
struct radeon_px_quirk {
172
struct radeon_px_quirk {
170
	u32 chip_vendor;
173
	u32 chip_vendor;
171
	u32 chip_device;
174
	u32 chip_device;
172
	u32 subsys_vendor;
175
	u32 subsys_vendor;
173
	u32 subsys_device;
176
	u32 subsys_device;
174
	u32 px_quirk_flags;
177
	u32 px_quirk_flags;
175
};
178
};
176
 
179
 
177
static struct radeon_px_quirk radeon_px_quirk_list[] = {
180
static struct radeon_px_quirk radeon_px_quirk_list[] = {
178
	/* Acer aspire 5560g (CPU: AMD A4-3305M; GPU: AMD Radeon HD 6480g + 7470m)
181
	/* Acer aspire 5560g (CPU: AMD A4-3305M; GPU: AMD Radeon HD 6480g + 7470m)
179
	 * https://bugzilla.kernel.org/show_bug.cgi?id=74551
182
	 * https://bugzilla.kernel.org/show_bug.cgi?id=74551
180
	 */
183
	 */
181
	{ PCI_VENDOR_ID_ATI, 0x6760, 0x1025, 0x0672, RADEON_PX_QUIRK_DISABLE_PX },
184
	{ PCI_VENDOR_ID_ATI, 0x6760, 0x1025, 0x0672, RADEON_PX_QUIRK_DISABLE_PX },
182
	/* Asus K73TA laptop with AMD A6-3400M APU and Radeon 6550 GPU
185
	/* Asus K73TA laptop with AMD A6-3400M APU and Radeon 6550 GPU
183
	 * https://bugzilla.kernel.org/show_bug.cgi?id=51381
186
	 * https://bugzilla.kernel.org/show_bug.cgi?id=51381
184
	 */
187
	 */
185
	{ PCI_VENDOR_ID_ATI, 0x6741, 0x1043, 0x108c, RADEON_PX_QUIRK_DISABLE_PX },
188
	{ PCI_VENDOR_ID_ATI, 0x6741, 0x1043, 0x108c, RADEON_PX_QUIRK_DISABLE_PX },
186
	/* Asus K53TK laptop with AMD A6-3420M APU and Radeon 7670m GPU
189
	/* Asus K53TK laptop with AMD A6-3420M APU and Radeon 7670m GPU
187
	 * https://bugzilla.kernel.org/show_bug.cgi?id=51381
190
	 * https://bugzilla.kernel.org/show_bug.cgi?id=51381
188
	 */
191
	 */
189
	{ PCI_VENDOR_ID_ATI, 0x6840, 0x1043, 0x2122, RADEON_PX_QUIRK_DISABLE_PX },
192
	{ PCI_VENDOR_ID_ATI, 0x6840, 0x1043, 0x2122, RADEON_PX_QUIRK_DISABLE_PX },
190
	/* macbook pro 8.2 */
193
	/* macbook pro 8.2 */
191
	{ PCI_VENDOR_ID_ATI, 0x6741, PCI_VENDOR_ID_APPLE, 0x00e2, RADEON_PX_QUIRK_LONG_WAKEUP },
194
	{ PCI_VENDOR_ID_ATI, 0x6741, PCI_VENDOR_ID_APPLE, 0x00e2, RADEON_PX_QUIRK_LONG_WAKEUP },
192
	{ 0, 0, 0, 0, 0 },
195
	{ 0, 0, 0, 0, 0 },
193
};
196
};
194
 
197
 
195
bool radeon_is_px(struct drm_device *dev)
198
bool radeon_is_px(struct drm_device *dev)
196
{
199
{
197
	struct radeon_device *rdev = dev->dev_private;
200
	struct radeon_device *rdev = dev->dev_private;
198
 
201
 
199
	if (rdev->flags & RADEON_IS_PX)
202
	if (rdev->flags & RADEON_IS_PX)
200
		return true;
203
		return true;
201
	return false;
204
	return false;
202
}
205
}
203
 
206
 
204
static void radeon_device_handle_px_quirks(struct radeon_device *rdev)
207
static void radeon_device_handle_px_quirks(struct radeon_device *rdev)
205
{
208
{
206
	struct radeon_px_quirk *p = radeon_px_quirk_list;
209
	struct radeon_px_quirk *p = radeon_px_quirk_list;
207
 
210
 
208
	/* Apply PX quirks */
211
	/* Apply PX quirks */
209
	while (p && p->chip_device != 0) {
212
	while (p && p->chip_device != 0) {
210
		if (rdev->pdev->vendor == p->chip_vendor &&
213
		if (rdev->pdev->vendor == p->chip_vendor &&
211
		    rdev->pdev->device == p->chip_device &&
214
		    rdev->pdev->device == p->chip_device &&
212
		    rdev->pdev->subsystem_vendor == p->subsys_vendor &&
215
		    rdev->pdev->subsystem_vendor == p->subsys_vendor &&
213
		    rdev->pdev->subsystem_device == p->subsys_device) {
216
		    rdev->pdev->subsystem_device == p->subsys_device) {
214
			rdev->px_quirk_flags = p->px_quirk_flags;
217
			rdev->px_quirk_flags = p->px_quirk_flags;
215
			break;
218
			break;
216
		}
219
		}
217
		++p;
220
		++p;
218
	}
221
	}
219
 
222
 
220
	if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX)
223
	if (rdev->px_quirk_flags & RADEON_PX_QUIRK_DISABLE_PX)
221
		rdev->flags &= ~RADEON_IS_PX;
224
		rdev->flags &= ~RADEON_IS_PX;
222
}
225
}
223
 
226
 
224
/**
227
/**
225
 * radeon_program_register_sequence - program an array of registers.
228
 * radeon_program_register_sequence - program an array of registers.
226
 *
229
 *
227
 * @rdev: radeon_device pointer
230
 * @rdev: radeon_device pointer
228
 * @registers: pointer to the register array
231
 * @registers: pointer to the register array
229
 * @array_size: size of the register array
232
 * @array_size: size of the register array
230
 *
233
 *
231
 * Programs an array or registers with and and or masks.
234
 * Programs an array or registers with and and or masks.
232
 * This is a helper for setting golden registers.
235
 * This is a helper for setting golden registers.
233
 */
236
 */
234
void radeon_program_register_sequence(struct radeon_device *rdev,
237
void radeon_program_register_sequence(struct radeon_device *rdev,
235
				      const u32 *registers,
238
				      const u32 *registers,
236
				      const u32 array_size)
239
				      const u32 array_size)
237
{
240
{
238
	u32 tmp, reg, and_mask, or_mask;
241
	u32 tmp, reg, and_mask, or_mask;
239
	int i;
242
	int i;
240
 
243
 
241
	if (array_size % 3)
244
	if (array_size % 3)
242
		return;
245
		return;
243
 
246
 
244
	for (i = 0; i < array_size; i +=3) {
247
	for (i = 0; i < array_size; i +=3) {
245
		reg = registers[i + 0];
248
		reg = registers[i + 0];
246
		and_mask = registers[i + 1];
249
		and_mask = registers[i + 1];
247
		or_mask = registers[i + 2];
250
		or_mask = registers[i + 2];
248
 
251
 
249
		if (and_mask == 0xffffffff) {
252
		if (and_mask == 0xffffffff) {
250
			tmp = or_mask;
253
			tmp = or_mask;
251
		} else {
254
		} else {
252
			tmp = RREG32(reg);
255
			tmp = RREG32(reg);
253
			tmp &= ~and_mask;
256
			tmp &= ~and_mask;
254
			tmp |= or_mask;
257
			tmp |= or_mask;
255
		}
258
		}
256
		WREG32(reg, tmp);
259
		WREG32(reg, tmp);
257
	}
260
	}
258
}
261
}
259
 
262
 
260
void radeon_pci_config_reset(struct radeon_device *rdev)
263
void radeon_pci_config_reset(struct radeon_device *rdev)
261
{
264
{
262
	pci_write_config_dword(rdev->pdev, 0x7c, RADEON_ASIC_RESET_DATA);
265
	pci_write_config_dword(rdev->pdev, 0x7c, RADEON_ASIC_RESET_DATA);
263
}
266
}
264
 
267
 
265
/**
268
/**
266
 * radeon_surface_init - Clear GPU surface registers.
269
 * radeon_surface_init - Clear GPU surface registers.
267
 *
270
 *
268
 * @rdev: radeon_device pointer
271
 * @rdev: radeon_device pointer
269
 *
272
 *
270
 * Clear GPU surface registers (r1xx-r5xx).
273
 * Clear GPU surface registers (r1xx-r5xx).
271
 */
274
 */
272
void radeon_surface_init(struct radeon_device *rdev)
275
void radeon_surface_init(struct radeon_device *rdev)
273
{
276
{
274
    /* FIXME: check this out */
277
	/* FIXME: check this out */
275
    if (rdev->family < CHIP_R600) {
278
	if (rdev->family < CHIP_R600) {
276
        int i;
279
		int i;
277
 
280
 
278
		for (i = 0; i < RADEON_GEM_MAX_SURFACES; i++) {
281
		for (i = 0; i < RADEON_GEM_MAX_SURFACES; i++) {
279
			if (rdev->surface_regs[i].bo)
282
			if (rdev->surface_regs[i].bo)
280
				radeon_bo_get_surface_reg(rdev->surface_regs[i].bo);
283
				radeon_bo_get_surface_reg(rdev->surface_regs[i].bo);
281
			else
284
			else
282
           radeon_clear_surface_reg(rdev, i);
285
				radeon_clear_surface_reg(rdev, i);
283
        }
286
		}
284
		/* enable surfaces */
287
		/* enable surfaces */
285
		WREG32(RADEON_SURFACE_CNTL, 0);
288
		WREG32(RADEON_SURFACE_CNTL, 0);
286
    }
289
	}
287
}
290
}
288
 
291
 
289
/*
292
/*
290
 * GPU scratch registers helpers function.
293
 * GPU scratch registers helpers function.
291
 */
294
 */
292
/**
295
/**
293
 * radeon_scratch_init - Init scratch register driver information.
296
 * radeon_scratch_init - Init scratch register driver information.
294
 *
297
 *
295
 * @rdev: radeon_device pointer
298
 * @rdev: radeon_device pointer
296
 *
299
 *
297
 * Init CP scratch register driver information (r1xx-r5xx)
300
 * Init CP scratch register driver information (r1xx-r5xx)
298
 */
301
 */
299
void radeon_scratch_init(struct radeon_device *rdev)
302
void radeon_scratch_init(struct radeon_device *rdev)
300
{
303
{
301
    int i;
304
	int i;
302
 
305
 
303
    /* FIXME: check this out */
306
	/* FIXME: check this out */
304
    if (rdev->family < CHIP_R300) {
307
	if (rdev->family < CHIP_R300) {
305
        rdev->scratch.num_reg = 5;
308
		rdev->scratch.num_reg = 5;
306
    } else {
309
	} else {
307
        rdev->scratch.num_reg = 7;
310
		rdev->scratch.num_reg = 7;
308
    }
311
	}
309
	rdev->scratch.reg_base = RADEON_SCRATCH_REG0;
312
	rdev->scratch.reg_base = RADEON_SCRATCH_REG0;
310
    for (i = 0; i < rdev->scratch.num_reg; i++) {
313
	for (i = 0; i < rdev->scratch.num_reg; i++) {
311
        rdev->scratch.free[i] = true;
314
		rdev->scratch.free[i] = true;
312
		rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
315
		rdev->scratch.reg[i] = rdev->scratch.reg_base + (i * 4);
313
    }
316
	}
314
}
317
}
315
 
318
 
316
/**
319
/**
317
 * radeon_scratch_get - Allocate a scratch register
320
 * radeon_scratch_get - Allocate a scratch register
318
 *
321
 *
319
 * @rdev: radeon_device pointer
322
 * @rdev: radeon_device pointer
320
 * @reg: scratch register mmio offset
323
 * @reg: scratch register mmio offset
321
 *
324
 *
322
 * Allocate a CP scratch register for use by the driver (all asics).
325
 * Allocate a CP scratch register for use by the driver (all asics).
323
 * Returns 0 on success or -EINVAL on failure.
326
 * Returns 0 on success or -EINVAL on failure.
324
 */
327
 */
325
int radeon_scratch_get(struct radeon_device *rdev, uint32_t *reg)
328
int radeon_scratch_get(struct radeon_device *rdev, uint32_t *reg)
326
{
329
{
327
	int i;
330
	int i;
328
 
331
 
329
	for (i = 0; i < rdev->scratch.num_reg; i++) {
332
	for (i = 0; i < rdev->scratch.num_reg; i++) {
330
		if (rdev->scratch.free[i]) {
333
		if (rdev->scratch.free[i]) {
331
			rdev->scratch.free[i] = false;
334
			rdev->scratch.free[i] = false;
332
			*reg = rdev->scratch.reg[i];
335
			*reg = rdev->scratch.reg[i];
333
			return 0;
336
			return 0;
334
		}
337
		}
335
	}
338
	}
336
	return -EINVAL;
339
	return -EINVAL;
337
}
340
}
338
 
341
 
339
/**
342
/**
340
 * radeon_scratch_free - Free a scratch register
343
 * radeon_scratch_free - Free a scratch register
341
 *
344
 *
342
 * @rdev: radeon_device pointer
345
 * @rdev: radeon_device pointer
343
 * @reg: scratch register mmio offset
346
 * @reg: scratch register mmio offset
344
 *
347
 *
345
 * Free a CP scratch register allocated for use by the driver (all asics)
348
 * Free a CP scratch register allocated for use by the driver (all asics)
346
 */
349
 */
347
void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg)
350
void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg)
348
{
351
{
349
	int i;
352
	int i;
350
 
353
 
351
	for (i = 0; i < rdev->scratch.num_reg; i++) {
354
	for (i = 0; i < rdev->scratch.num_reg; i++) {
352
		if (rdev->scratch.reg[i] == reg) {
355
		if (rdev->scratch.reg[i] == reg) {
353
			rdev->scratch.free[i] = true;
356
			rdev->scratch.free[i] = true;
354
			return;
357
			return;
355
		}
358
		}
356
	}
359
	}
357
}
360
}
358
 
361
 
359
/*
362
/*
360
 * GPU doorbell aperture helpers function.
363
 * GPU doorbell aperture helpers function.
361
 */
364
 */
362
/**
365
/**
363
 * radeon_doorbell_init - Init doorbell driver information.
366
 * radeon_doorbell_init - Init doorbell driver information.
364
 *
367
 *
365
 * @rdev: radeon_device pointer
368
 * @rdev: radeon_device pointer
366
 *
369
 *
367
 * Init doorbell driver information (CIK)
370
 * Init doorbell driver information (CIK)
368
 * Returns 0 on success, error on failure.
371
 * Returns 0 on success, error on failure.
369
 */
372
 */
370
static int radeon_doorbell_init(struct radeon_device *rdev)
373
static int radeon_doorbell_init(struct radeon_device *rdev)
371
{
374
{
372
	/* doorbell bar mapping */
375
	/* doorbell bar mapping */
373
	rdev->doorbell.base = pci_resource_start(rdev->pdev, 2);
376
	rdev->doorbell.base = pci_resource_start(rdev->pdev, 2);
374
	rdev->doorbell.size = pci_resource_len(rdev->pdev, 2);
377
	rdev->doorbell.size = pci_resource_len(rdev->pdev, 2);
375
 
378
 
376
	rdev->doorbell.num_doorbells = min_t(u32, rdev->doorbell.size / sizeof(u32), RADEON_MAX_DOORBELLS);
379
	rdev->doorbell.num_doorbells = min_t(u32, rdev->doorbell.size / sizeof(u32), RADEON_MAX_DOORBELLS);
377
	if (rdev->doorbell.num_doorbells == 0)
380
	if (rdev->doorbell.num_doorbells == 0)
378
		return -EINVAL;
381
		return -EINVAL;
379
 
382
 
380
	rdev->doorbell.ptr = ioremap(rdev->doorbell.base, rdev->doorbell.num_doorbells * sizeof(u32));
383
	rdev->doorbell.ptr = ioremap(rdev->doorbell.base, rdev->doorbell.num_doorbells * sizeof(u32));
381
	if (rdev->doorbell.ptr == NULL) {
384
	if (rdev->doorbell.ptr == NULL) {
382
		return -ENOMEM;
385
		return -ENOMEM;
383
	}
386
	}
384
	DRM_INFO("doorbell mmio base: 0x%08X\n", (uint32_t)rdev->doorbell.base);
387
	DRM_INFO("doorbell mmio base: 0x%08X\n", (uint32_t)rdev->doorbell.base);
385
	DRM_INFO("doorbell mmio size: %u\n", (unsigned)rdev->doorbell.size);
388
	DRM_INFO("doorbell mmio size: %u\n", (unsigned)rdev->doorbell.size);
386
 
389
 
387
	memset(&rdev->doorbell.used, 0, sizeof(rdev->doorbell.used));
390
	memset(&rdev->doorbell.used, 0, sizeof(rdev->doorbell.used));
388
 
391
 
389
	return 0;
392
	return 0;
390
}
393
}
391
 
394
 
392
/**
395
/**
393
 * radeon_doorbell_fini - Tear down doorbell driver information.
396
 * radeon_doorbell_fini - Tear down doorbell driver information.
394
 *
397
 *
395
 * @rdev: radeon_device pointer
398
 * @rdev: radeon_device pointer
396
 *
399
 *
397
 * Tear down doorbell driver information (CIK)
400
 * Tear down doorbell driver information (CIK)
398
 */
401
 */
399
static void radeon_doorbell_fini(struct radeon_device *rdev)
402
static void radeon_doorbell_fini(struct radeon_device *rdev)
400
{
403
{
401
	iounmap(rdev->doorbell.ptr);
404
	iounmap(rdev->doorbell.ptr);
402
	rdev->doorbell.ptr = NULL;
405
	rdev->doorbell.ptr = NULL;
403
}
406
}
404
 
407
 
405
/**
408
/**
406
 * radeon_doorbell_get - Allocate a doorbell entry
409
 * radeon_doorbell_get - Allocate a doorbell entry
407
 *
410
 *
408
 * @rdev: radeon_device pointer
411
 * @rdev: radeon_device pointer
409
 * @doorbell: doorbell index
412
 * @doorbell: doorbell index
410
 *
413
 *
411
 * Allocate a doorbell for use by the driver (all asics).
414
 * Allocate a doorbell for use by the driver (all asics).
412
 * Returns 0 on success or -EINVAL on failure.
415
 * Returns 0 on success or -EINVAL on failure.
413
 */
416
 */
414
int radeon_doorbell_get(struct radeon_device *rdev, u32 *doorbell)
417
int radeon_doorbell_get(struct radeon_device *rdev, u32 *doorbell)
415
{
418
{
416
	unsigned long offset = find_first_zero_bit(rdev->doorbell.used, rdev->doorbell.num_doorbells);
419
	unsigned long offset = find_first_zero_bit(rdev->doorbell.used, rdev->doorbell.num_doorbells);
417
	if (offset < rdev->doorbell.num_doorbells) {
420
	if (offset < rdev->doorbell.num_doorbells) {
418
		__set_bit(offset, rdev->doorbell.used);
421
		__set_bit(offset, rdev->doorbell.used);
419
		*doorbell = offset;
422
		*doorbell = offset;
420
		return 0;
423
		return 0;
421
	} else {
424
	} else {
422
		return -EINVAL;
425
		return -EINVAL;
423
	}
426
	}
424
}
427
}
425
 
428
 
426
/**
429
/**
427
 * radeon_doorbell_free - Free a doorbell entry
430
 * radeon_doorbell_free - Free a doorbell entry
428
 *
431
 *
429
 * @rdev: radeon_device pointer
432
 * @rdev: radeon_device pointer
430
 * @doorbell: doorbell index
433
 * @doorbell: doorbell index
431
 *
434
 *
432
 * Free a doorbell allocated for use by the driver (all asics)
435
 * Free a doorbell allocated for use by the driver (all asics)
433
 */
436
 */
434
void radeon_doorbell_free(struct radeon_device *rdev, u32 doorbell)
437
void radeon_doorbell_free(struct radeon_device *rdev, u32 doorbell)
435
{
438
{
436
	if (doorbell < rdev->doorbell.num_doorbells)
439
	if (doorbell < rdev->doorbell.num_doorbells)
437
		__clear_bit(doorbell, rdev->doorbell.used);
440
		__clear_bit(doorbell, rdev->doorbell.used);
438
}
441
}
439
 
442
 
440
/**
443
/**
441
 * radeon_doorbell_get_kfd_info - Report doorbell configuration required to
444
 * radeon_doorbell_get_kfd_info - Report doorbell configuration required to
442
 *                                setup KFD
445
 *                                setup KFD
443
 *
446
 *
444
 * @rdev: radeon_device pointer
447
 * @rdev: radeon_device pointer
445
 * @aperture_base: output returning doorbell aperture base physical address
448
 * @aperture_base: output returning doorbell aperture base physical address
446
 * @aperture_size: output returning doorbell aperture size in bytes
449
 * @aperture_size: output returning doorbell aperture size in bytes
447
 * @start_offset: output returning # of doorbell bytes reserved for radeon.
450
 * @start_offset: output returning # of doorbell bytes reserved for radeon.
448
 *
451
 *
449
 * Radeon and the KFD share the doorbell aperture. Radeon sets it up,
452
 * Radeon and the KFD share the doorbell aperture. Radeon sets it up,
450
 * takes doorbells required for its own rings and reports the setup to KFD.
453
 * takes doorbells required for its own rings and reports the setup to KFD.
451
 * Radeon reserved doorbells are at the start of the doorbell aperture.
454
 * Radeon reserved doorbells are at the start of the doorbell aperture.
452
 */
455
 */
453
void radeon_doorbell_get_kfd_info(struct radeon_device *rdev,
456
void radeon_doorbell_get_kfd_info(struct radeon_device *rdev,
454
				  phys_addr_t *aperture_base,
457
				  phys_addr_t *aperture_base,
455
				  size_t *aperture_size,
458
				  size_t *aperture_size,
456
				  size_t *start_offset)
459
				  size_t *start_offset)
457
{
460
{
458
	/* The first num_doorbells are used by radeon.
461
	/* The first num_doorbells are used by radeon.
459
	 * KFD takes whatever's left in the aperture. */
462
	 * KFD takes whatever's left in the aperture. */
460
	if (rdev->doorbell.size > rdev->doorbell.num_doorbells * sizeof(u32)) {
463
	if (rdev->doorbell.size > rdev->doorbell.num_doorbells * sizeof(u32)) {
461
		*aperture_base = rdev->doorbell.base;
464
		*aperture_base = rdev->doorbell.base;
462
		*aperture_size = rdev->doorbell.size;
465
		*aperture_size = rdev->doorbell.size;
463
		*start_offset = rdev->doorbell.num_doorbells * sizeof(u32);
466
		*start_offset = rdev->doorbell.num_doorbells * sizeof(u32);
464
	} else {
467
	} else {
465
		*aperture_base = 0;
468
		*aperture_base = 0;
466
		*aperture_size = 0;
469
		*aperture_size = 0;
467
		*start_offset = 0;
470
		*start_offset = 0;
468
	}
471
	}
469
}
472
}
470
 
473
 
471
/*
474
/*
472
 * radeon_wb_*()
475
 * radeon_wb_*()
473
 * Writeback is the the method by which the the GPU updates special pages
476
 * Writeback is the the method by which the the GPU updates special pages
474
 * in memory with the status of certain GPU events (fences, ring pointers,
477
 * in memory with the status of certain GPU events (fences, ring pointers,
475
 * etc.).
478
 * etc.).
476
 */
479
 */
477
 
480
 
478
/**
481
/**
479
 * radeon_wb_disable - Disable Writeback
482
 * radeon_wb_disable - Disable Writeback
480
 *
483
 *
481
 * @rdev: radeon_device pointer
484
 * @rdev: radeon_device pointer
482
 *
485
 *
483
 * Disables Writeback (all asics).  Used for suspend.
486
 * Disables Writeback (all asics).  Used for suspend.
484
 */
487
 */
485
void radeon_wb_disable(struct radeon_device *rdev)
488
void radeon_wb_disable(struct radeon_device *rdev)
486
{
489
{
487
	rdev->wb.enabled = false;
490
	rdev->wb.enabled = false;
488
}
491
}
489
 
492
 
490
/**
493
/**
491
 * radeon_wb_fini - Disable Writeback and free memory
494
 * radeon_wb_fini - Disable Writeback and free memory
492
 *
495
 *
493
 * @rdev: radeon_device pointer
496
 * @rdev: radeon_device pointer
494
 *
497
 *
495
 * Disables Writeback and frees the Writeback memory (all asics).
498
 * Disables Writeback and frees the Writeback memory (all asics).
496
 * Used at driver shutdown.
499
 * Used at driver shutdown.
497
 */
500
 */
498
void radeon_wb_fini(struct radeon_device *rdev)
501
void radeon_wb_fini(struct radeon_device *rdev)
499
{
502
{
500
	radeon_wb_disable(rdev);
503
	radeon_wb_disable(rdev);
501
	if (rdev->wb.wb_obj) {
504
	if (rdev->wb.wb_obj) {
502
		if (!radeon_bo_reserve(rdev->wb.wb_obj, false)) {
505
		if (!radeon_bo_reserve(rdev->wb.wb_obj, false)) {
503
			radeon_bo_kunmap(rdev->wb.wb_obj);
506
			radeon_bo_kunmap(rdev->wb.wb_obj);
504
			radeon_bo_unpin(rdev->wb.wb_obj);
507
			radeon_bo_unpin(rdev->wb.wb_obj);
505
			radeon_bo_unreserve(rdev->wb.wb_obj);
508
			radeon_bo_unreserve(rdev->wb.wb_obj);
506
		}
509
		}
507
		radeon_bo_unref(&rdev->wb.wb_obj);
510
		radeon_bo_unref(&rdev->wb.wb_obj);
508
		rdev->wb.wb = NULL;
511
		rdev->wb.wb = NULL;
509
		rdev->wb.wb_obj = NULL;
512
		rdev->wb.wb_obj = NULL;
510
	}
513
	}
511
}
514
}
512
 
515
 
513
/**
516
/**
514
 * radeon_wb_init- Init Writeback driver info and allocate memory
517
 * radeon_wb_init- Init Writeback driver info and allocate memory
515
 *
518
 *
516
 * @rdev: radeon_device pointer
519
 * @rdev: radeon_device pointer
517
 *
520
 *
518
 * Disables Writeback and frees the Writeback memory (all asics).
521
 * Disables Writeback and frees the Writeback memory (all asics).
519
 * Used at driver startup.
522
 * Used at driver startup.
520
 * Returns 0 on success or an -error on failure.
523
 * Returns 0 on success or an -error on failure.
521
 */
524
 */
522
int radeon_wb_init(struct radeon_device *rdev)
525
int radeon_wb_init(struct radeon_device *rdev)
523
{
526
{
524
	int r;
527
	int r;
525
 
528
 
526
	if (rdev->wb.wb_obj == NULL) {
529
	if (rdev->wb.wb_obj == NULL) {
527
		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
530
		r = radeon_bo_create(rdev, RADEON_GPU_PAGE_SIZE, PAGE_SIZE, true,
528
				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
531
				     RADEON_GEM_DOMAIN_GTT, 0, NULL, NULL,
529
				     &rdev->wb.wb_obj);
532
				     &rdev->wb.wb_obj);
530
		if (r) {
533
		if (r) {
531
			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
534
			dev_warn(rdev->dev, "(%d) create WB bo failed\n", r);
532
			return r;
535
			return r;
533
		}
536
		}
534
	r = radeon_bo_reserve(rdev->wb.wb_obj, false);
537
		r = radeon_bo_reserve(rdev->wb.wb_obj, false);
535
	if (unlikely(r != 0)) {
538
		if (unlikely(r != 0)) {
536
		radeon_wb_fini(rdev);
539
			radeon_wb_fini(rdev);
537
		return r;
540
			return r;
538
	}
541
		}
539
	r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
542
		r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
540
			  &rdev->wb.gpu_addr);
543
				&rdev->wb.gpu_addr);
541
	if (r) {
544
		if (r) {
542
		radeon_bo_unreserve(rdev->wb.wb_obj);
545
			radeon_bo_unreserve(rdev->wb.wb_obj);
543
		dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r);
546
			dev_warn(rdev->dev, "(%d) pin WB bo failed\n", r);
544
		radeon_wb_fini(rdev);
547
			radeon_wb_fini(rdev);
545
		return r;
548
			return r;
546
	}
549
		}
547
	r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
550
		r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
548
	radeon_bo_unreserve(rdev->wb.wb_obj);
551
		radeon_bo_unreserve(rdev->wb.wb_obj);
549
	if (r) {
552
		if (r) {
550
		dev_warn(rdev->dev, "(%d) map WB bo failed\n", r);
553
			dev_warn(rdev->dev, "(%d) map WB bo failed\n", r);
551
		radeon_wb_fini(rdev);
554
			radeon_wb_fini(rdev);
552
		return r;
555
			return r;
553
	}
556
		}
554
	}
557
	}
555
 
558
 
556
	/* clear wb memory */
559
	/* clear wb memory */
557
	memset((char *)rdev->wb.wb, 0, RADEON_GPU_PAGE_SIZE);
560
	memset((char *)rdev->wb.wb, 0, RADEON_GPU_PAGE_SIZE);
558
	/* disable event_write fences */
561
	/* disable event_write fences */
559
	rdev->wb.use_event = false;
562
	rdev->wb.use_event = false;
560
	/* disabled via module param */
563
	/* disabled via module param */
561
	if (radeon_no_wb == 1) {
564
	if (radeon_no_wb == 1) {
562
		rdev->wb.enabled = false;
565
		rdev->wb.enabled = false;
563
	} else {
566
	} else {
564
		if (rdev->flags & RADEON_IS_AGP) {
567
		if (rdev->flags & RADEON_IS_AGP) {
565
		/* often unreliable on AGP */
568
			/* often unreliable on AGP */
566
			rdev->wb.enabled = false;
569
			rdev->wb.enabled = false;
567
		} else if (rdev->family < CHIP_R300) {
570
		} else if (rdev->family < CHIP_R300) {
568
			/* often unreliable on pre-r300 */
571
			/* often unreliable on pre-r300 */
569
			rdev->wb.enabled = false;
572
			rdev->wb.enabled = false;
570
		} else {
573
		} else {
571
			rdev->wb.enabled = true;
574
			rdev->wb.enabled = true;
572
			/* event_write fences are only available on r600+ */
575
			/* event_write fences are only available on r600+ */
573
			if (rdev->family >= CHIP_R600) {
576
			if (rdev->family >= CHIP_R600) {
574
				rdev->wb.use_event = true;
577
				rdev->wb.use_event = true;
575
	}
578
			}
576
		}
579
		}
577
	}
580
	}
578
	/* always use writeback/events on NI, APUs */
581
	/* always use writeback/events on NI, APUs */
579
	if (rdev->family >= CHIP_PALM) {
582
	if (rdev->family >= CHIP_PALM) {
580
		rdev->wb.enabled = true;
583
		rdev->wb.enabled = true;
581
		rdev->wb.use_event = true;
584
		rdev->wb.use_event = true;
582
	}
585
	}
583
 
586
 
584
	dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis");
587
	dev_info(rdev->dev, "WB %sabled\n", rdev->wb.enabled ? "en" : "dis");
585
 
588
 
586
	return 0;
589
	return 0;
587
}
590
}
588
 
591
 
589
/**
592
/**
590
 * radeon_vram_location - try to find VRAM location
593
 * radeon_vram_location - try to find VRAM location
591
 * @rdev: radeon device structure holding all necessary informations
594
 * @rdev: radeon device structure holding all necessary informations
592
 * @mc: memory controller structure holding memory informations
595
 * @mc: memory controller structure holding memory informations
593
 * @base: base address at which to put VRAM
596
 * @base: base address at which to put VRAM
594
 *
597
 *
595
 * Function will place try to place VRAM at base address provided
598
 * Function will place try to place VRAM at base address provided
596
 * as parameter (which is so far either PCI aperture address or
599
 * as parameter (which is so far either PCI aperture address or
597
 * for IGP TOM base address).
600
 * for IGP TOM base address).
598
 *
601
 *
599
 * If there is not enough space to fit the unvisible VRAM in the 32bits
602
 * If there is not enough space to fit the unvisible VRAM in the 32bits
600
 * address space then we limit the VRAM size to the aperture.
603
 * address space then we limit the VRAM size to the aperture.
601
 *
604
 *
602
 * If we are using AGP and if the AGP aperture doesn't allow us to have
605
 * If we are using AGP and if the AGP aperture doesn't allow us to have
603
 * room for all the VRAM than we restrict the VRAM to the PCI aperture
606
 * room for all the VRAM than we restrict the VRAM to the PCI aperture
604
 * size and print a warning.
607
 * size and print a warning.
605
 *
608
 *
606
 * This function will never fails, worst case are limiting VRAM.
609
 * This function will never fails, worst case are limiting VRAM.
607
 *
610
 *
608
 * Note: GTT start, end, size should be initialized before calling this
611
 * Note: GTT start, end, size should be initialized before calling this
609
 * function on AGP platform.
612
 * function on AGP platform.
610
 *
613
 *
611
 * Note: We don't explicitly enforce VRAM start to be aligned on VRAM size,
614
 * Note: We don't explicitly enforce VRAM start to be aligned on VRAM size,
612
 * this shouldn't be a problem as we are using the PCI aperture as a reference.
615
 * this shouldn't be a problem as we are using the PCI aperture as a reference.
613
 * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but
616
 * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but
614
 * not IGP.
617
 * not IGP.
615
 *
618
 *
616
 * Note: we use mc_vram_size as on some board we need to program the mc to
619
 * Note: we use mc_vram_size as on some board we need to program the mc to
617
 * cover the whole aperture even if VRAM size is inferior to aperture size
620
 * cover the whole aperture even if VRAM size is inferior to aperture size
618
 * Novell bug 204882 + along with lots of ubuntu ones
621
 * Novell bug 204882 + along with lots of ubuntu ones
619
 *
622
 *
620
 * Note: when limiting vram it's safe to overwritte real_vram_size because
623
 * Note: when limiting vram it's safe to overwritte real_vram_size because
621
 * we are not in case where real_vram_size is inferior to mc_vram_size (ie
624
 * we are not in case where real_vram_size is inferior to mc_vram_size (ie
622
 * note afected by bogus hw of Novell bug 204882 + along with lots of ubuntu
625
 * note afected by bogus hw of Novell bug 204882 + along with lots of ubuntu
623
 * ones)
626
 * ones)
624
 *
627
 *
625
 * Note: IGP TOM addr should be the same as the aperture addr, we don't
628
 * Note: IGP TOM addr should be the same as the aperture addr, we don't
626
 * explicitly check for that thought.
629
 * explicitly check for that thought.
627
 *
630
 *
628
 * FIXME: when reducing VRAM size align new size on power of 2.
631
 * FIXME: when reducing VRAM size align new size on power of 2.
629
 */
632
 */
630
void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base)
633
void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base)
631
{
634
{
632
	uint64_t limit = (uint64_t)radeon_vram_limit << 20;
635
	uint64_t limit = (uint64_t)radeon_vram_limit << 20;
633
 
636
 
634
	mc->vram_start = base;
637
	mc->vram_start = base;
635
	if (mc->mc_vram_size > (rdev->mc.mc_mask - base + 1)) {
638
	if (mc->mc_vram_size > (rdev->mc.mc_mask - base + 1)) {
636
		dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
639
		dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
637
		mc->real_vram_size = mc->aper_size;
640
		mc->real_vram_size = mc->aper_size;
638
		mc->mc_vram_size = mc->aper_size;
641
		mc->mc_vram_size = mc->aper_size;
639
	}
642
	}
640
	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
643
	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
641
	if (rdev->flags & RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_start <= mc->gtt_end) {
644
	if (rdev->flags & RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_start <= mc->gtt_end) {
642
		dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
645
		dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
643
		mc->real_vram_size = mc->aper_size;
646
		mc->real_vram_size = mc->aper_size;
644
		mc->mc_vram_size = mc->aper_size;
647
		mc->mc_vram_size = mc->aper_size;
645
		}
648
	}
646
	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
649
	mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
647
	if (limit && limit < mc->real_vram_size)
650
	if (limit && limit < mc->real_vram_size)
648
		mc->real_vram_size = limit;
651
		mc->real_vram_size = limit;
649
	dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
652
	dev_info(rdev->dev, "VRAM: %lluM 0x%016llX - 0x%016llX (%lluM used)\n",
650
			mc->mc_vram_size >> 20, mc->vram_start,
653
			mc->mc_vram_size >> 20, mc->vram_start,
651
			mc->vram_end, mc->real_vram_size >> 20);
654
			mc->vram_end, mc->real_vram_size >> 20);
652
}
655
}
653
 
656
 
654
/**
657
/**
655
 * radeon_gtt_location - try to find GTT location
658
 * radeon_gtt_location - try to find GTT location
656
 * @rdev: radeon device structure holding all necessary informations
659
 * @rdev: radeon device structure holding all necessary informations
657
 * @mc: memory controller structure holding memory informations
660
 * @mc: memory controller structure holding memory informations
658
 *
661
 *
659
 * Function will place try to place GTT before or after VRAM.
662
 * Function will place try to place GTT before or after VRAM.
660
 *
663
 *
661
 * If GTT size is bigger than space left then we ajust GTT size.
664
 * If GTT size is bigger than space left then we ajust GTT size.
662
 * Thus function will never fails.
665
 * Thus function will never fails.
663
 *
666
 *
664
 * FIXME: when reducing GTT size align new size on power of 2.
667
 * FIXME: when reducing GTT size align new size on power of 2.
665
 */
668
 */
666
void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
669
void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
667
{
670
{
668
	u64 size_af, size_bf;
671
	u64 size_af, size_bf;
669
 
672
 
670
	size_af = ((rdev->mc.mc_mask - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
673
	size_af = ((rdev->mc.mc_mask - mc->vram_end) + mc->gtt_base_align) & ~mc->gtt_base_align;
671
	size_bf = mc->vram_start & ~mc->gtt_base_align;
674
	size_bf = mc->vram_start & ~mc->gtt_base_align;
672
	if (size_bf > size_af) {
675
	if (size_bf > size_af) {
673
		if (mc->gtt_size > size_bf) {
676
		if (mc->gtt_size > size_bf) {
674
			dev_warn(rdev->dev, "limiting GTT\n");
677
			dev_warn(rdev->dev, "limiting GTT\n");
675
			mc->gtt_size = size_bf;
678
			mc->gtt_size = size_bf;
676
		}
679
		}
677
		mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size;
680
		mc->gtt_start = (mc->vram_start & ~mc->gtt_base_align) - mc->gtt_size;
678
	} else {
681
	} else {
679
		if (mc->gtt_size > size_af) {
682
		if (mc->gtt_size > size_af) {
680
			dev_warn(rdev->dev, "limiting GTT\n");
683
			dev_warn(rdev->dev, "limiting GTT\n");
681
			mc->gtt_size = size_af;
684
			mc->gtt_size = size_af;
682
		}
685
		}
683
		mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
686
		mc->gtt_start = (mc->vram_end + 1 + mc->gtt_base_align) & ~mc->gtt_base_align;
684
	}
687
	}
685
	mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
688
	mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
686
	dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
689
	dev_info(rdev->dev, "GTT: %lluM 0x%016llX - 0x%016llX\n",
687
			mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
690
			mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
688
}
691
}
689
 
692
 
690
/*
693
/*
691
 * GPU helpers function.
694
 * GPU helpers function.
692
 */
695
 */
693
/**
696
/**
694
 * radeon_card_posted - check if the hw has already been initialized
697
 * radeon_card_posted - check if the hw has already been initialized
695
 *
698
 *
696
 * @rdev: radeon_device pointer
699
 * @rdev: radeon_device pointer
697
 *
700
 *
698
 * Check if the asic has been initialized (all asics).
701
 * Check if the asic has been initialized (all asics).
699
 * Used at driver startup.
702
 * Used at driver startup.
700
 * Returns true if initialized or false if not.
703
 * Returns true if initialized or false if not.
701
 */
704
 */
702
bool radeon_card_posted(struct radeon_device *rdev)
705
bool radeon_card_posted(struct radeon_device *rdev)
703
{
706
{
704
	uint32_t reg;
707
	uint32_t reg;
705
 
708
 
706
	if (ASIC_IS_NODCE(rdev))
709
	if (ASIC_IS_NODCE(rdev))
707
		goto check_memsize;
710
		goto check_memsize;
708
 
711
 
709
	/* first check CRTCs */
712
	/* first check CRTCs */
710
	if (ASIC_IS_DCE4(rdev)) {
713
	if (ASIC_IS_DCE4(rdev)) {
711
		reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
714
		reg = RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC0_REGISTER_OFFSET) |
712
			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
715
			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC1_REGISTER_OFFSET);
713
			if (rdev->num_crtc >= 4) {
716
			if (rdev->num_crtc >= 4) {
714
				reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
717
				reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC2_REGISTER_OFFSET) |
715
					RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
718
					RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC3_REGISTER_OFFSET);
716
			}
719
			}
717
			if (rdev->num_crtc >= 6) {
720
			if (rdev->num_crtc >= 6) {
718
				reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
721
				reg |= RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC4_REGISTER_OFFSET) |
719
			RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
722
					RREG32(EVERGREEN_CRTC_CONTROL + EVERGREEN_CRTC5_REGISTER_OFFSET);
720
			}
723
			}
721
		if (reg & EVERGREEN_CRTC_MASTER_EN)
724
		if (reg & EVERGREEN_CRTC_MASTER_EN)
722
			return true;
725
			return true;
723
	} else if (ASIC_IS_AVIVO(rdev)) {
726
	} else if (ASIC_IS_AVIVO(rdev)) {
724
		reg = RREG32(AVIVO_D1CRTC_CONTROL) |
727
		reg = RREG32(AVIVO_D1CRTC_CONTROL) |
725
		      RREG32(AVIVO_D2CRTC_CONTROL);
728
		      RREG32(AVIVO_D2CRTC_CONTROL);
726
		if (reg & AVIVO_CRTC_EN) {
729
		if (reg & AVIVO_CRTC_EN) {
727
			return true;
730
			return true;
728
		}
731
		}
729
	} else {
732
	} else {
730
		reg = RREG32(RADEON_CRTC_GEN_CNTL) |
733
		reg = RREG32(RADEON_CRTC_GEN_CNTL) |
731
		      RREG32(RADEON_CRTC2_GEN_CNTL);
734
		      RREG32(RADEON_CRTC2_GEN_CNTL);
732
		if (reg & RADEON_CRTC_EN) {
735
		if (reg & RADEON_CRTC_EN) {
733
			return true;
736
			return true;
734
		}
737
		}
735
	}
738
	}
736
 
739
 
737
check_memsize:
740
check_memsize:
738
	/* then check MEM_SIZE, in case the crtcs are off */
741
	/* then check MEM_SIZE, in case the crtcs are off */
739
	if (rdev->family >= CHIP_R600)
742
	if (rdev->family >= CHIP_R600)
740
		reg = RREG32(R600_CONFIG_MEMSIZE);
743
		reg = RREG32(R600_CONFIG_MEMSIZE);
741
	else
744
	else
742
		reg = RREG32(RADEON_CONFIG_MEMSIZE);
745
		reg = RREG32(RADEON_CONFIG_MEMSIZE);
743
 
746
 
744
	if (reg)
747
	if (reg)
745
		return true;
748
		return true;
746
 
749
 
747
	return false;
750
	return false;
748
 
751
 
749
}
752
}
750
 
753
 
751
/**
754
/**
752
 * radeon_update_bandwidth_info - update display bandwidth params
755
 * radeon_update_bandwidth_info - update display bandwidth params
753
 *
756
 *
754
 * @rdev: radeon_device pointer
757
 * @rdev: radeon_device pointer
755
 *
758
 *
756
 * Used when sclk/mclk are switched or display modes are set.
759
 * Used when sclk/mclk are switched or display modes are set.
757
 * params are used to calculate display watermarks (all asics)
760
 * params are used to calculate display watermarks (all asics)
758
 */
761
 */
759
void radeon_update_bandwidth_info(struct radeon_device *rdev)
762
void radeon_update_bandwidth_info(struct radeon_device *rdev)
760
{
763
{
761
	fixed20_12 a;
764
	fixed20_12 a;
762
	u32 sclk = rdev->pm.current_sclk;
765
	u32 sclk = rdev->pm.current_sclk;
763
	u32 mclk = rdev->pm.current_mclk;
766
	u32 mclk = rdev->pm.current_mclk;
764
 
767
 
765
	/* sclk/mclk in Mhz */
768
	/* sclk/mclk in Mhz */
766
		a.full = dfixed_const(100);
769
	a.full = dfixed_const(100);
767
		rdev->pm.sclk.full = dfixed_const(sclk);
770
	rdev->pm.sclk.full = dfixed_const(sclk);
768
		rdev->pm.sclk.full = dfixed_div(rdev->pm.sclk, a);
771
	rdev->pm.sclk.full = dfixed_div(rdev->pm.sclk, a);
769
		rdev->pm.mclk.full = dfixed_const(mclk);
772
	rdev->pm.mclk.full = dfixed_const(mclk);
770
		rdev->pm.mclk.full = dfixed_div(rdev->pm.mclk, a);
773
	rdev->pm.mclk.full = dfixed_div(rdev->pm.mclk, a);
771
 
774
 
772
	if (rdev->flags & RADEON_IS_IGP) {
775
	if (rdev->flags & RADEON_IS_IGP) {
773
		a.full = dfixed_const(16);
776
		a.full = dfixed_const(16);
774
		/* core_bandwidth = sclk(Mhz) * 16 */
777
		/* core_bandwidth = sclk(Mhz) * 16 */
775
		rdev->pm.core_bandwidth.full = dfixed_div(rdev->pm.sclk, a);
778
		rdev->pm.core_bandwidth.full = dfixed_div(rdev->pm.sclk, a);
776
	}
779
	}
777
}
780
}
778
 
781
 
779
/**
782
/**
780
 * radeon_boot_test_post_card - check and possibly initialize the hw
783
 * radeon_boot_test_post_card - check and possibly initialize the hw
781
 *
784
 *
782
 * @rdev: radeon_device pointer
785
 * @rdev: radeon_device pointer
783
 *
786
 *
784
 * Check if the asic is initialized and if not, attempt to initialize
787
 * Check if the asic is initialized and if not, attempt to initialize
785
 * it (all asics).
788
 * it (all asics).
786
 * Returns true if initialized or false if not.
789
 * Returns true if initialized or false if not.
787
 */
790
 */
788
bool radeon_boot_test_post_card(struct radeon_device *rdev)
791
bool radeon_boot_test_post_card(struct radeon_device *rdev)
789
{
792
{
790
	if (radeon_card_posted(rdev))
793
	if (radeon_card_posted(rdev))
791
		return true;
794
		return true;
792
 
795
 
793
	if (rdev->bios) {
796
	if (rdev->bios) {
794
		DRM_INFO("GPU not posted. posting now...\n");
797
		DRM_INFO("GPU not posted. posting now...\n");
795
		if (rdev->is_atom_bios)
798
		if (rdev->is_atom_bios)
796
			atom_asic_init(rdev->mode_info.atom_context);
799
			atom_asic_init(rdev->mode_info.atom_context);
797
		else
800
		else
798
			radeon_combios_asic_init(rdev->ddev);
801
			radeon_combios_asic_init(rdev->ddev);
799
		return true;
802
		return true;
800
	} else {
803
	} else {
801
		dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
804
		dev_err(rdev->dev, "Card not posted and no BIOS - ignoring\n");
802
		return false;
805
		return false;
803
	}
806
	}
804
}
807
}
805
 
808
 
806
/**
809
/**
807
 * radeon_dummy_page_init - init dummy page used by the driver
810
 * radeon_dummy_page_init - init dummy page used by the driver
808
 *
811
 *
809
 * @rdev: radeon_device pointer
812
 * @rdev: radeon_device pointer
810
 *
813
 *
811
 * Allocate the dummy page used by the driver (all asics).
814
 * Allocate the dummy page used by the driver (all asics).
812
 * This dummy page is used by the driver as a filler for gart entries
815
 * This dummy page is used by the driver as a filler for gart entries
813
 * when pages are taken out of the GART
816
 * when pages are taken out of the GART
814
 * Returns 0 on sucess, -ENOMEM on failure.
817
 * Returns 0 on sucess, -ENOMEM on failure.
815
 */
818
 */
816
int radeon_dummy_page_init(struct radeon_device *rdev)
819
int radeon_dummy_page_init(struct radeon_device *rdev)
817
{
820
{
818
	if (rdev->dummy_page.page)
821
	if (rdev->dummy_page.page)
819
		return 0;
822
		return 0;
820
	rdev->dummy_page.page = alloc_page(GFP_DMA32 | GFP_KERNEL | __GFP_ZERO);
823
	rdev->dummy_page.page = alloc_page(GFP_DMA32 | GFP_KERNEL | __GFP_ZERO);
821
	if (rdev->dummy_page.page == NULL)
824
	if (rdev->dummy_page.page == NULL)
822
		return -ENOMEM;
825
		return -ENOMEM;
823
	rdev->dummy_page.addr = pci_map_page(rdev->pdev, rdev->dummy_page.page,
826
	rdev->dummy_page.addr = pci_map_page(rdev->pdev, rdev->dummy_page.page,
824
					0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
827
					0, PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
825
	return 0;
828
	return 0;
826
}
829
}
827
 
830
 
828
/**
831
/**
829
 * radeon_dummy_page_fini - free dummy page used by the driver
832
 * radeon_dummy_page_fini - free dummy page used by the driver
830
 *
833
 *
831
 * @rdev: radeon_device pointer
834
 * @rdev: radeon_device pointer
832
 *
835
 *
833
 * Frees the dummy page used by the driver (all asics).
836
 * Frees the dummy page used by the driver (all asics).
834
 */
837
 */
835
void radeon_dummy_page_fini(struct radeon_device *rdev)
838
void radeon_dummy_page_fini(struct radeon_device *rdev)
836
{
839
{
837
	if (rdev->dummy_page.page == NULL)
840
	if (rdev->dummy_page.page == NULL)
838
		return;
841
		return;
839
 
842
 
840
	rdev->dummy_page.page = NULL;
843
	rdev->dummy_page.page = NULL;
841
}
844
}
842
 
845
 
843
 
846
 
844
/* ATOM accessor methods */
847
/* ATOM accessor methods */
845
/*
848
/*
846
 * ATOM is an interpreted byte code stored in tables in the vbios.  The
849
 * ATOM is an interpreted byte code stored in tables in the vbios.  The
847
 * driver registers callbacks to access registers and the interpreter
850
 * driver registers callbacks to access registers and the interpreter
848
 * in the driver parses the tables and executes then to program specific
851
 * in the driver parses the tables and executes then to program specific
849
 * actions (set display modes, asic init, etc.).  See radeon_atombios.c,
852
 * actions (set display modes, asic init, etc.).  See radeon_atombios.c,
850
 * atombios.h, and atom.c
853
 * atombios.h, and atom.c
851
 */
854
 */
852
 
855
 
853
/**
856
/**
854
 * cail_pll_read - read PLL register
857
 * cail_pll_read - read PLL register
855
 *
858
 *
856
 * @info: atom card_info pointer
859
 * @info: atom card_info pointer
857
 * @reg: PLL register offset
860
 * @reg: PLL register offset
858
 *
861
 *
859
 * Provides a PLL register accessor for the atom interpreter (r4xx+).
862
 * Provides a PLL register accessor for the atom interpreter (r4xx+).
860
 * Returns the value of the PLL register.
863
 * Returns the value of the PLL register.
861
 */
864
 */
862
static uint32_t cail_pll_read(struct card_info *info, uint32_t reg)
865
static uint32_t cail_pll_read(struct card_info *info, uint32_t reg)
863
{
866
{
864
    struct radeon_device *rdev = info->dev->dev_private;
867
	struct radeon_device *rdev = info->dev->dev_private;
865
    uint32_t r;
868
	uint32_t r;
866
 
869
 
867
    r = rdev->pll_rreg(rdev, reg);
870
	r = rdev->pll_rreg(rdev, reg);
868
    return r;
871
	return r;
869
}
872
}
870
 
873
 
871
/**
874
/**
872
 * cail_pll_write - write PLL register
875
 * cail_pll_write - write PLL register
873
 *
876
 *
874
 * @info: atom card_info pointer
877
 * @info: atom card_info pointer
875
 * @reg: PLL register offset
878
 * @reg: PLL register offset
876
 * @val: value to write to the pll register
879
 * @val: value to write to the pll register
877
 *
880
 *
878
 * Provides a PLL register accessor for the atom interpreter (r4xx+).
881
 * Provides a PLL register accessor for the atom interpreter (r4xx+).
879
 */
882
 */
880
static void cail_pll_write(struct card_info *info, uint32_t reg, uint32_t val)
883
static void cail_pll_write(struct card_info *info, uint32_t reg, uint32_t val)
881
{
884
{
882
    struct radeon_device *rdev = info->dev->dev_private;
885
	struct radeon_device *rdev = info->dev->dev_private;
883
 
886
 
884
    rdev->pll_wreg(rdev, reg, val);
887
	rdev->pll_wreg(rdev, reg, val);
885
}
888
}
886
 
889
 
887
/**
890
/**
888
 * cail_mc_read - read MC (Memory Controller) register
891
 * cail_mc_read - read MC (Memory Controller) register
889
 *
892
 *
890
 * @info: atom card_info pointer
893
 * @info: atom card_info pointer
891
 * @reg: MC register offset
894
 * @reg: MC register offset
892
 *
895
 *
893
 * Provides an MC register accessor for the atom interpreter (r4xx+).
896
 * Provides an MC register accessor for the atom interpreter (r4xx+).
894
 * Returns the value of the MC register.
897
 * Returns the value of the MC register.
895
 */
898
 */
896
static uint32_t cail_mc_read(struct card_info *info, uint32_t reg)
899
static uint32_t cail_mc_read(struct card_info *info, uint32_t reg)
897
{
900
{
898
    struct radeon_device *rdev = info->dev->dev_private;
901
	struct radeon_device *rdev = info->dev->dev_private;
899
    uint32_t r;
902
	uint32_t r;
900
 
903
 
901
    r = rdev->mc_rreg(rdev, reg);
904
	r = rdev->mc_rreg(rdev, reg);
902
    return r;
905
	return r;
903
}
906
}
904
 
907
 
905
/**
908
/**
906
 * cail_mc_write - write MC (Memory Controller) register
909
 * cail_mc_write - write MC (Memory Controller) register
907
 *
910
 *
908
 * @info: atom card_info pointer
911
 * @info: atom card_info pointer
909
 * @reg: MC register offset
912
 * @reg: MC register offset
910
 * @val: value to write to the pll register
913
 * @val: value to write to the pll register
911
 *
914
 *
912
 * Provides a MC register accessor for the atom interpreter (r4xx+).
915
 * Provides a MC register accessor for the atom interpreter (r4xx+).
913
 */
916
 */
914
static void cail_mc_write(struct card_info *info, uint32_t reg, uint32_t val)
917
static void cail_mc_write(struct card_info *info, uint32_t reg, uint32_t val)
915
{
918
{
916
    struct radeon_device *rdev = info->dev->dev_private;
919
	struct radeon_device *rdev = info->dev->dev_private;
917
 
920
 
918
    rdev->mc_wreg(rdev, reg, val);
921
	rdev->mc_wreg(rdev, reg, val);
919
}
922
}
920
 
923
 
921
/**
924
/**
922
 * cail_reg_write - write MMIO register
925
 * cail_reg_write - write MMIO register
923
 *
926
 *
924
 * @info: atom card_info pointer
927
 * @info: atom card_info pointer
925
 * @reg: MMIO register offset
928
 * @reg: MMIO register offset
926
 * @val: value to write to the pll register
929
 * @val: value to write to the pll register
927
 *
930
 *
928
 * Provides a MMIO register accessor for the atom interpreter (r4xx+).
931
 * Provides a MMIO register accessor for the atom interpreter (r4xx+).
929
 */
932
 */
930
static void cail_reg_write(struct card_info *info, uint32_t reg, uint32_t val)
933
static void cail_reg_write(struct card_info *info, uint32_t reg, uint32_t val)
931
{
934
{
932
    struct radeon_device *rdev = info->dev->dev_private;
935
	struct radeon_device *rdev = info->dev->dev_private;
933
 
936
 
934
    WREG32(reg*4, val);
937
	WREG32(reg*4, val);
935
}
938
}
936
 
939
 
937
/**
940
/**
938
 * cail_reg_read - read MMIO register
941
 * cail_reg_read - read MMIO register
939
 *
942
 *
940
 * @info: atom card_info pointer
943
 * @info: atom card_info pointer
941
 * @reg: MMIO register offset
944
 * @reg: MMIO register offset
942
 *
945
 *
943
 * Provides an MMIO register accessor for the atom interpreter (r4xx+).
946
 * Provides an MMIO register accessor for the atom interpreter (r4xx+).
944
 * Returns the value of the MMIO register.
947
 * Returns the value of the MMIO register.
945
 */
948
 */
946
static uint32_t cail_reg_read(struct card_info *info, uint32_t reg)
949
static uint32_t cail_reg_read(struct card_info *info, uint32_t reg)
947
{
950
{
948
    struct radeon_device *rdev = info->dev->dev_private;
951
	struct radeon_device *rdev = info->dev->dev_private;
949
    uint32_t r;
952
	uint32_t r;
950
 
953
 
951
    r = RREG32(reg*4);
954
	r = RREG32(reg*4);
952
    return r;
955
	return r;
953
}
956
}
954
 
957
 
955
/**
958
/**
956
 * cail_ioreg_write - write IO register
959
 * cail_ioreg_write - write IO register
957
 *
960
 *
958
 * @info: atom card_info pointer
961
 * @info: atom card_info pointer
959
 * @reg: IO register offset
962
 * @reg: IO register offset
960
 * @val: value to write to the pll register
963
 * @val: value to write to the pll register
961
 *
964
 *
962
 * Provides a IO register accessor for the atom interpreter (r4xx+).
965
 * Provides a IO register accessor for the atom interpreter (r4xx+).
963
 */
966
 */
964
static void cail_ioreg_write(struct card_info *info, uint32_t reg, uint32_t val)
967
static void cail_ioreg_write(struct card_info *info, uint32_t reg, uint32_t val)
965
{
968
{
966
	struct radeon_device *rdev = info->dev->dev_private;
969
	struct radeon_device *rdev = info->dev->dev_private;
967
 
970
 
968
	WREG32_IO(reg*4, val);
971
	WREG32_IO(reg*4, val);
969
}
972
}
970
 
973
 
971
/**
974
/**
972
 * cail_ioreg_read - read IO register
975
 * cail_ioreg_read - read IO register
973
 *
976
 *
974
 * @info: atom card_info pointer
977
 * @info: atom card_info pointer
975
 * @reg: IO register offset
978
 * @reg: IO register offset
976
 *
979
 *
977
 * Provides an IO register accessor for the atom interpreter (r4xx+).
980
 * Provides an IO register accessor for the atom interpreter (r4xx+).
978
 * Returns the value of the IO register.
981
 * Returns the value of the IO register.
979
 */
982
 */
980
static uint32_t cail_ioreg_read(struct card_info *info, uint32_t reg)
983
static uint32_t cail_ioreg_read(struct card_info *info, uint32_t reg)
981
{
984
{
982
	struct radeon_device *rdev = info->dev->dev_private;
985
	struct radeon_device *rdev = info->dev->dev_private;
983
	uint32_t r;
986
	uint32_t r;
984
 
987
 
985
	r = RREG32_IO(reg*4);
988
	r = RREG32_IO(reg*4);
986
	return r;
989
	return r;
987
}
990
}
988
 
991
 
989
/**
992
/**
990
 * radeon_atombios_init - init the driver info and callbacks for atombios
993
 * radeon_atombios_init - init the driver info and callbacks for atombios
991
 *
994
 *
992
 * @rdev: radeon_device pointer
995
 * @rdev: radeon_device pointer
993
 *
996
 *
994
 * Initializes the driver info and register access callbacks for the
997
 * Initializes the driver info and register access callbacks for the
995
 * ATOM interpreter (r4xx+).
998
 * ATOM interpreter (r4xx+).
996
 * Returns 0 on sucess, -ENOMEM on failure.
999
 * Returns 0 on sucess, -ENOMEM on failure.
997
 * Called at driver startup.
1000
 * Called at driver startup.
998
 */
1001
 */
999
int radeon_atombios_init(struct radeon_device *rdev)
1002
int radeon_atombios_init(struct radeon_device *rdev)
1000
{
1003
{
1001
	struct card_info *atom_card_info =
1004
	struct card_info *atom_card_info =
1002
	    kzalloc(sizeof(struct card_info), GFP_KERNEL);
1005
	    kzalloc(sizeof(struct card_info), GFP_KERNEL);
1003
 
1006
 
1004
	if (!atom_card_info)
1007
	if (!atom_card_info)
1005
		return -ENOMEM;
1008
		return -ENOMEM;
1006
 
1009
 
1007
	rdev->mode_info.atom_card_info = atom_card_info;
1010
	rdev->mode_info.atom_card_info = atom_card_info;
1008
	atom_card_info->dev = rdev->ddev;
1011
	atom_card_info->dev = rdev->ddev;
1009
	atom_card_info->reg_read = cail_reg_read;
1012
	atom_card_info->reg_read = cail_reg_read;
1010
	atom_card_info->reg_write = cail_reg_write;
1013
	atom_card_info->reg_write = cail_reg_write;
1011
	/* needed for iio ops */
1014
	/* needed for iio ops */
1012
	if (rdev->rio_mem) {
1015
	if (rdev->rio_mem) {
1013
		atom_card_info->ioreg_read = cail_ioreg_read;
1016
		atom_card_info->ioreg_read = cail_ioreg_read;
1014
		atom_card_info->ioreg_write = cail_ioreg_write;
1017
		atom_card_info->ioreg_write = cail_ioreg_write;
1015
	} else {
1018
	} else {
1016
		DRM_ERROR("Unable to find PCI I/O BAR; using MMIO for ATOM IIO\n");
1019
		DRM_ERROR("Unable to find PCI I/O BAR; using MMIO for ATOM IIO\n");
1017
		atom_card_info->ioreg_read = cail_reg_read;
1020
		atom_card_info->ioreg_read = cail_reg_read;
1018
		atom_card_info->ioreg_write = cail_reg_write;
1021
		atom_card_info->ioreg_write = cail_reg_write;
1019
	}
1022
	}
1020
	atom_card_info->mc_read = cail_mc_read;
1023
	atom_card_info->mc_read = cail_mc_read;
1021
	atom_card_info->mc_write = cail_mc_write;
1024
	atom_card_info->mc_write = cail_mc_write;
1022
	atom_card_info->pll_read = cail_pll_read;
1025
	atom_card_info->pll_read = cail_pll_read;
1023
	atom_card_info->pll_write = cail_pll_write;
1026
	atom_card_info->pll_write = cail_pll_write;
1024
 
1027
 
1025
	rdev->mode_info.atom_context = atom_parse(atom_card_info, rdev->bios);
1028
	rdev->mode_info.atom_context = atom_parse(atom_card_info, rdev->bios);
1026
	if (!rdev->mode_info.atom_context) {
1029
	if (!rdev->mode_info.atom_context) {
1027
		radeon_atombios_fini(rdev);
1030
		radeon_atombios_fini(rdev);
1028
		return -ENOMEM;
1031
		return -ENOMEM;
1029
	}
1032
	}
1030
 
1033
 
1031
	mutex_init(&rdev->mode_info.atom_context->mutex);
1034
	mutex_init(&rdev->mode_info.atom_context->mutex);
1032
	mutex_init(&rdev->mode_info.atom_context->scratch_mutex);
1035
	mutex_init(&rdev->mode_info.atom_context->scratch_mutex);
1033
    radeon_atom_initialize_bios_scratch_regs(rdev->ddev);
1036
	radeon_atom_initialize_bios_scratch_regs(rdev->ddev);
1034
	atom_allocate_fb_scratch(rdev->mode_info.atom_context);
1037
	atom_allocate_fb_scratch(rdev->mode_info.atom_context);
1035
    return 0;
1038
	return 0;
1036
}
1039
}
1037
 
1040
 
1038
/**
1041
/**
1039
 * radeon_atombios_fini - free the driver info and callbacks for atombios
1042
 * radeon_atombios_fini - free the driver info and callbacks for atombios
1040
 *
1043
 *
1041
 * @rdev: radeon_device pointer
1044
 * @rdev: radeon_device pointer
1042
 *
1045
 *
1043
 * Frees the driver info and register access callbacks for the ATOM
1046
 * Frees the driver info and register access callbacks for the ATOM
1044
 * interpreter (r4xx+).
1047
 * interpreter (r4xx+).
1045
 * Called at driver shutdown.
1048
 * Called at driver shutdown.
1046
 */
1049
 */
1047
void radeon_atombios_fini(struct radeon_device *rdev)
1050
void radeon_atombios_fini(struct radeon_device *rdev)
1048
{
1051
{
1049
	if (rdev->mode_info.atom_context) {
1052
	if (rdev->mode_info.atom_context) {
1050
		kfree(rdev->mode_info.atom_context->scratch);
1053
		kfree(rdev->mode_info.atom_context->scratch);
1051
	}
1054
	}
1052
	kfree(rdev->mode_info.atom_context);
1055
	kfree(rdev->mode_info.atom_context);
1053
	rdev->mode_info.atom_context = NULL;
1056
	rdev->mode_info.atom_context = NULL;
1054
	kfree(rdev->mode_info.atom_card_info);
1057
	kfree(rdev->mode_info.atom_card_info);
1055
	rdev->mode_info.atom_card_info = NULL;
1058
	rdev->mode_info.atom_card_info = NULL;
1056
}
1059
}
1057
 
1060
 
1058
/* COMBIOS */
1061
/* COMBIOS */
1059
/*
1062
/*
1060
 * COMBIOS is the bios format prior to ATOM. It provides
1063
 * COMBIOS is the bios format prior to ATOM. It provides
1061
 * command tables similar to ATOM, but doesn't have a unified
1064
 * command tables similar to ATOM, but doesn't have a unified
1062
 * parser.  See radeon_combios.c
1065
 * parser.  See radeon_combios.c
1063
 */
1066
 */
1064
 
1067
 
1065
/**
1068
/**
1066
 * radeon_combios_init - init the driver info for combios
1069
 * radeon_combios_init - init the driver info for combios
1067
 *
1070
 *
1068
 * @rdev: radeon_device pointer
1071
 * @rdev: radeon_device pointer
1069
 *
1072
 *
1070
 * Initializes the driver info for combios (r1xx-r3xx).
1073
 * Initializes the driver info for combios (r1xx-r3xx).
1071
 * Returns 0 on sucess.
1074
 * Returns 0 on sucess.
1072
 * Called at driver startup.
1075
 * Called at driver startup.
1073
 */
1076
 */
1074
int radeon_combios_init(struct radeon_device *rdev)
1077
int radeon_combios_init(struct radeon_device *rdev)
1075
{
1078
{
1076
	radeon_combios_initialize_bios_scratch_regs(rdev->ddev);
1079
	radeon_combios_initialize_bios_scratch_regs(rdev->ddev);
1077
	return 0;
1080
	return 0;
1078
}
1081
}
1079
 
1082
 
1080
/**
1083
/**
1081
 * radeon_combios_fini - free the driver info for combios
1084
 * radeon_combios_fini - free the driver info for combios
1082
 *
1085
 *
1083
 * @rdev: radeon_device pointer
1086
 * @rdev: radeon_device pointer
1084
 *
1087
 *
1085
 * Frees the driver info for combios (r1xx-r3xx).
1088
 * Frees the driver info for combios (r1xx-r3xx).
1086
 * Called at driver shutdown.
1089
 * Called at driver shutdown.
1087
 */
1090
 */
1088
void radeon_combios_fini(struct radeon_device *rdev)
1091
void radeon_combios_fini(struct radeon_device *rdev)
1089
{
1092
{
1090
}
1093
}
1091
 
1094
 
1092
/* if we get transitioned to only one device, take VGA back */
1095
/* if we get transitioned to only one device, take VGA back */
1093
/**
1096
/**
1094
 * radeon_vga_set_decode - enable/disable vga decode
1097
 * radeon_vga_set_decode - enable/disable vga decode
1095
 *
1098
 *
1096
 * @cookie: radeon_device pointer
1099
 * @cookie: radeon_device pointer
1097
 * @state: enable/disable vga decode
1100
 * @state: enable/disable vga decode
1098
 *
1101
 *
1099
 * Enable/disable vga decode (all asics).
1102
 * Enable/disable vga decode (all asics).
1100
 * Returns VGA resource flags.
1103
 * Returns VGA resource flags.
1101
 */
1104
 */
1102
static unsigned int radeon_vga_set_decode(void *cookie, bool state)
1105
static unsigned int radeon_vga_set_decode(void *cookie, bool state)
1103
{
1106
{
1104
	struct radeon_device *rdev = cookie;
1107
	struct radeon_device *rdev = cookie;
1105
	radeon_vga_set_state(rdev, state);
1108
	radeon_vga_set_state(rdev, state);
1106
	if (state)
1109
	if (state)
1107
		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
1110
		return VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM |
1108
		       VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1111
		       VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1109
	else
1112
	else
1110
		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1113
		return VGA_RSRC_NORMAL_IO | VGA_RSRC_NORMAL_MEM;
1111
}
1114
}
1112
 
1115
 
1113
/**
1116
/**
1114
 * radeon_check_pot_argument - check that argument is a power of two
1117
 * radeon_check_pot_argument - check that argument is a power of two
1115
 *
1118
 *
1116
 * @arg: value to check
1119
 * @arg: value to check
1117
 *
1120
 *
1118
 * Validates that a certain argument is a power of two (all asics).
1121
 * Validates that a certain argument is a power of two (all asics).
1119
 * Returns true if argument is valid.
1122
 * Returns true if argument is valid.
1120
 */
1123
 */
1121
static bool radeon_check_pot_argument(int arg)
1124
static bool radeon_check_pot_argument(int arg)
1122
{
1125
{
1123
	return (arg & (arg - 1)) == 0;
1126
	return (arg & (arg - 1)) == 0;
1124
}
1127
}
1125
 
1128
 
1126
/**
1129
/**
-
 
1130
 * Determine a sensible default GART size according to ASIC family.
-
 
1131
 *
-
 
1132
 * @family ASIC family name
-
 
1133
 */
-
 
1134
static int radeon_gart_size_auto(enum radeon_family family)
-
 
1135
{
-
 
1136
	/* default to a larger gart size on newer asics */
-
 
1137
	if (family >= CHIP_TAHITI)
-
 
1138
		return 2048;
-
 
1139
	else if (family >= CHIP_RV770)
-
 
1140
		return 1024;
-
 
1141
	else
-
 
1142
		return 512;
-
 
1143
}
-
 
1144
 
-
 
1145
/**
1127
 * radeon_check_arguments - validate module params
1146
 * radeon_check_arguments - validate module params
1128
 *
1147
 *
1129
 * @rdev: radeon_device pointer
1148
 * @rdev: radeon_device pointer
1130
 *
1149
 *
1131
 * Validates certain module parameters and updates
1150
 * Validates certain module parameters and updates
1132
 * the associated values used by the driver (all asics).
1151
 * the associated values used by the driver (all asics).
1133
 */
1152
 */
1134
static void radeon_check_arguments(struct radeon_device *rdev)
1153
static void radeon_check_arguments(struct radeon_device *rdev)
1135
{
1154
{
1136
	/* vramlimit must be a power of two */
1155
	/* vramlimit must be a power of two */
1137
	if (!radeon_check_pot_argument(radeon_vram_limit)) {
1156
	if (!radeon_check_pot_argument(radeon_vram_limit)) {
1138
		dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n",
1157
		dev_warn(rdev->dev, "vram limit (%d) must be a power of 2\n",
1139
				radeon_vram_limit);
1158
				radeon_vram_limit);
1140
		radeon_vram_limit = 0;
1159
		radeon_vram_limit = 0;
1141
	}
1160
	}
1142
 
1161
 
1143
	if (radeon_gart_size == -1) {
1162
	if (radeon_gart_size == -1) {
1144
		/* default to a larger gart size on newer asics */
1163
		radeon_gart_size = radeon_gart_size_auto(rdev->family);
1145
		if (rdev->family >= CHIP_RV770)
-
 
1146
			radeon_gart_size = 1024;
-
 
1147
		else
-
 
1148
			radeon_gart_size = 512;
-
 
1149
	}
1164
	}
1150
	/* gtt size must be power of two and greater or equal to 32M */
1165
	/* gtt size must be power of two and greater or equal to 32M */
1151
	if (radeon_gart_size < 32) {
1166
	if (radeon_gart_size < 32) {
1152
		dev_warn(rdev->dev, "gart size (%d) too small\n",
1167
		dev_warn(rdev->dev, "gart size (%d) too small\n",
1153
				radeon_gart_size);
1168
				radeon_gart_size);
1154
		if (rdev->family >= CHIP_RV770)
-
 
1155
			radeon_gart_size = 1024;
-
 
1156
		else
-
 
1157
		radeon_gart_size = 512;
1169
		radeon_gart_size = radeon_gart_size_auto(rdev->family);
1158
	} else if (!radeon_check_pot_argument(radeon_gart_size)) {
1170
	} else if (!radeon_check_pot_argument(radeon_gart_size)) {
1159
		dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n",
1171
		dev_warn(rdev->dev, "gart size (%d) must be a power of 2\n",
1160
				radeon_gart_size);
1172
				radeon_gart_size);
1161
		if (rdev->family >= CHIP_RV770)
-
 
1162
			radeon_gart_size = 1024;
-
 
1163
		else
-
 
1164
		radeon_gart_size = 512;
1173
		radeon_gart_size = radeon_gart_size_auto(rdev->family);
1165
	}
1174
	}
1166
	rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20;
1175
	rdev->mc.gtt_size = (uint64_t)radeon_gart_size << 20;
1167
 
1176
 
1168
	/* AGP mode can only be -1, 1, 2, 4, 8 */
1177
	/* AGP mode can only be -1, 1, 2, 4, 8 */
1169
	switch (radeon_agpmode) {
1178
	switch (radeon_agpmode) {
1170
	case -1:
1179
	case -1:
1171
	case 0:
1180
	case 0:
1172
	case 1:
1181
	case 1:
1173
	case 2:
1182
	case 2:
1174
	case 4:
1183
	case 4:
1175
	case 8:
1184
	case 8:
1176
		break;
1185
		break;
1177
	default:
1186
	default:
1178
		dev_warn(rdev->dev, "invalid AGP mode %d (valid mode: "
1187
		dev_warn(rdev->dev, "invalid AGP mode %d (valid mode: "
1179
				"-1, 0, 1, 2, 4, 8)\n", radeon_agpmode);
1188
				"-1, 0, 1, 2, 4, 8)\n", radeon_agpmode);
1180
		radeon_agpmode = 0;
1189
		radeon_agpmode = 0;
1181
		break;
1190
		break;
1182
	}
1191
	}
1183
 
1192
 
1184
	if (!radeon_check_pot_argument(radeon_vm_size)) {
1193
	if (!radeon_check_pot_argument(radeon_vm_size)) {
1185
		dev_warn(rdev->dev, "VM size (%d) must be a power of 2\n",
1194
		dev_warn(rdev->dev, "VM size (%d) must be a power of 2\n",
1186
			 radeon_vm_size);
1195
			 radeon_vm_size);
1187
		radeon_vm_size = 4;
1196
		radeon_vm_size = 4;
1188
	}
1197
	}
1189
 
1198
 
1190
	if (radeon_vm_size < 1) {
1199
	if (radeon_vm_size < 1) {
1191
		dev_warn(rdev->dev, "VM size (%d) to small, min is 1GB\n",
1200
		dev_warn(rdev->dev, "VM size (%d) to small, min is 1GB\n",
1192
			 radeon_vm_size);
1201
			 radeon_vm_size);
1193
		radeon_vm_size = 4;
1202
		radeon_vm_size = 4;
1194
	}
1203
	}
1195
 
1204
 
1196
       /*
1205
       /*
1197
        * Max GPUVM size for Cayman, SI and CI are 40 bits.
1206
        * Max GPUVM size for Cayman, SI and CI are 40 bits.
1198
        */
1207
        */
1199
	if (radeon_vm_size > 1024) {
1208
	if (radeon_vm_size > 1024) {
1200
		dev_warn(rdev->dev, "VM size (%d) too large, max is 1TB\n",
1209
		dev_warn(rdev->dev, "VM size (%d) too large, max is 1TB\n",
1201
			 radeon_vm_size);
1210
			 radeon_vm_size);
1202
		radeon_vm_size = 4;
1211
		radeon_vm_size = 4;
1203
	}
1212
	}
1204
 
1213
 
1205
	/* defines number of bits in page table versus page directory,
1214
	/* defines number of bits in page table versus page directory,
1206
	 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1215
	 * a page is 4KB so we have 12 bits offset, minimum 9 bits in the
1207
	 * page table and the remaining bits are in the page directory */
1216
	 * page table and the remaining bits are in the page directory */
1208
	if (radeon_vm_block_size == -1) {
1217
	if (radeon_vm_block_size == -1) {
1209
 
1218
 
1210
		/* Total bits covered by PD + PTs */
1219
		/* Total bits covered by PD + PTs */
1211
		unsigned bits = ilog2(radeon_vm_size) + 18;
1220
		unsigned bits = ilog2(radeon_vm_size) + 18;
1212
 
1221
 
1213
		/* Make sure the PD is 4K in size up to 8GB address space.
1222
		/* Make sure the PD is 4K in size up to 8GB address space.
1214
		   Above that split equal between PD and PTs */
1223
		   Above that split equal between PD and PTs */
1215
		if (radeon_vm_size <= 8)
1224
		if (radeon_vm_size <= 8)
1216
			radeon_vm_block_size = bits - 9;
1225
			radeon_vm_block_size = bits - 9;
1217
		else
1226
		else
1218
			radeon_vm_block_size = (bits + 3) / 2;
1227
			radeon_vm_block_size = (bits + 3) / 2;
1219
 
1228
 
1220
	} else if (radeon_vm_block_size < 9) {
1229
	} else if (radeon_vm_block_size < 9) {
1221
		dev_warn(rdev->dev, "VM page table size (%d) too small\n",
1230
		dev_warn(rdev->dev, "VM page table size (%d) too small\n",
1222
			 radeon_vm_block_size);
1231
			 radeon_vm_block_size);
1223
		radeon_vm_block_size = 9;
1232
		radeon_vm_block_size = 9;
1224
	}
1233
	}
1225
 
1234
 
1226
	if (radeon_vm_block_size > 24 ||
1235
	if (radeon_vm_block_size > 24 ||
1227
	    (radeon_vm_size * 1024) < (1ull << radeon_vm_block_size)) {
1236
	    (radeon_vm_size * 1024) < (1ull << radeon_vm_block_size)) {
1228
		dev_warn(rdev->dev, "VM page table size (%d) too large\n",
1237
		dev_warn(rdev->dev, "VM page table size (%d) too large\n",
1229
			 radeon_vm_block_size);
1238
			 radeon_vm_block_size);
1230
		radeon_vm_block_size = 9;
1239
		radeon_vm_block_size = 9;
1231
	}
1240
	}
1232
}
1241
}
1233
 
1242
 
1234
/**
1243
/**
1235
 * radeon_device_init - initialize the driver
1244
 * radeon_device_init - initialize the driver
1236
 *
1245
 *
1237
 * @rdev: radeon_device pointer
1246
 * @rdev: radeon_device pointer
1238
 * @pdev: drm dev pointer
1247
 * @pdev: drm dev pointer
1239
 * @pdev: pci dev pointer
1248
 * @pdev: pci dev pointer
1240
 * @flags: driver flags
1249
 * @flags: driver flags
1241
 *
1250
 *
1242
 * Initializes the driver info and hw (all asics).
1251
 * Initializes the driver info and hw (all asics).
1243
 * Returns 0 for success or an error on failure.
1252
 * Returns 0 for success or an error on failure.
1244
 * Called at driver startup.
1253
 * Called at driver startup.
1245
 */
1254
 */
1246
int radeon_device_init(struct radeon_device *rdev,
1255
int radeon_device_init(struct radeon_device *rdev,
1247
               struct drm_device *ddev,
1256
		       struct drm_device *ddev,
1248
               struct pci_dev *pdev,
1257
		       struct pci_dev *pdev,
1249
               uint32_t flags)
1258
		       uint32_t flags)
1250
{
1259
{
1251
	int r, i;
1260
	int r, i;
1252
	int dma_bits;
1261
	int dma_bits;
1253
	bool runtime = false;
1262
	bool runtime = false;
1254
 
1263
 
1255
    rdev->shutdown = false;
1264
	rdev->shutdown = false;
1256
	rdev->dev = &pdev->dev;
1265
	rdev->dev = &pdev->dev;
1257
    rdev->ddev = ddev;
1266
	rdev->ddev = ddev;
1258
    rdev->pdev = pdev;
1267
	rdev->pdev = pdev;
1259
    rdev->flags = flags;
1268
	rdev->flags = flags;
1260
    rdev->family = flags & RADEON_FAMILY_MASK;
1269
	rdev->family = flags & RADEON_FAMILY_MASK;
1261
    rdev->is_atom_bios = false;
1270
	rdev->is_atom_bios = false;
1262
    rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
1271
	rdev->usec_timeout = RADEON_MAX_USEC_TIMEOUT;
1263
	rdev->mc.gtt_size = 512 * 1024 * 1024;
1272
	rdev->mc.gtt_size = 512 * 1024 * 1024;
1264
	rdev->accel_working = false;
1273
	rdev->accel_working = false;
1265
	/* set up ring ids */
1274
	/* set up ring ids */
1266
	for (i = 0; i < RADEON_NUM_RINGS; i++) {
1275
	for (i = 0; i < RADEON_NUM_RINGS; i++) {
1267
		rdev->ring[i].idx = i;
1276
		rdev->ring[i].idx = i;
1268
	}
1277
	}
1269
	rdev->fence_context = fence_context_alloc(RADEON_NUM_RINGS);
1278
	rdev->fence_context = fence_context_alloc(RADEON_NUM_RINGS);
1270
 
1279
 
1271
	DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X).\n",
1280
	DRM_INFO("initializing kernel modesetting (%s 0x%04X:0x%04X 0x%04X:0x%04X).\n",
1272
		radeon_family_name[rdev->family], pdev->vendor, pdev->device,
1281
		radeon_family_name[rdev->family], pdev->vendor, pdev->device,
1273
		pdev->subsystem_vendor, pdev->subsystem_device);
1282
		pdev->subsystem_vendor, pdev->subsystem_device);
1274
 
1283
 
1275
    /* mutex initialization are all done here so we
1284
	/* mutex initialization are all done here so we
1276
     * can recall function without having locking issues */
1285
	 * can recall function without having locking issues */
1277
	mutex_init(&rdev->ring_lock);
1286
	mutex_init(&rdev->ring_lock);
1278
	mutex_init(&rdev->dc_hw_i2c_mutex);
1287
	mutex_init(&rdev->dc_hw_i2c_mutex);
1279
	atomic_set(&rdev->ih.lock, 0);
1288
	atomic_set(&rdev->ih.lock, 0);
1280
	mutex_init(&rdev->gem.mutex);
1289
	mutex_init(&rdev->gem.mutex);
1281
	mutex_init(&rdev->pm.mutex);
1290
	mutex_init(&rdev->pm.mutex);
1282
	mutex_init(&rdev->gpu_clock_mutex);
1291
	mutex_init(&rdev->gpu_clock_mutex);
1283
	mutex_init(&rdev->srbm_mutex);
1292
	mutex_init(&rdev->srbm_mutex);
1284
	mutex_init(&rdev->grbm_idx_mutex);
1293
	mutex_init(&rdev->grbm_idx_mutex);
1285
	init_rwsem(&rdev->pm.mclk_lock);
1294
	init_rwsem(&rdev->pm.mclk_lock);
1286
	init_rwsem(&rdev->exclusive_lock);
1295
	init_rwsem(&rdev->exclusive_lock);
1287
	init_waitqueue_head(&rdev->irq.vblank_queue);
1296
	init_waitqueue_head(&rdev->irq.vblank_queue);
1288
	mutex_init(&rdev->mn_lock);
1297
	mutex_init(&rdev->mn_lock);
1289
//	hash_init(rdev->mn_hash);
1298
//	hash_init(rdev->mn_hash);
1290
	r = radeon_gem_init(rdev);
1299
	r = radeon_gem_init(rdev);
1291
	if (r)
1300
	if (r)
1292
		return r;
1301
		return r;
1293
 
1302
 
1294
	radeon_check_arguments(rdev);
1303
	radeon_check_arguments(rdev);
1295
	/* Adjust VM size here.
1304
	/* Adjust VM size here.
1296
	 * Max GPUVM size for cayman+ is 40 bits.
1305
	 * Max GPUVM size for cayman+ is 40 bits.
1297
	 */
1306
	 */
1298
	rdev->vm_manager.max_pfn = radeon_vm_size << 18;
1307
	rdev->vm_manager.max_pfn = radeon_vm_size << 18;
1299
 
1308
 
1300
	/* Set asic functions */
1309
	/* Set asic functions */
1301
	r = radeon_asic_init(rdev);
1310
	r = radeon_asic_init(rdev);
1302
	if (r)
1311
	if (r)
1303
		return r;
1312
		return r;
1304
 
1313
 
1305
	/* all of the newer IGP chips have an internal gart
1314
	/* all of the newer IGP chips have an internal gart
1306
	 * However some rs4xx report as AGP, so remove that here.
1315
	 * However some rs4xx report as AGP, so remove that here.
1307
	 */
1316
	 */
1308
	if ((rdev->family >= CHIP_RS400) &&
1317
	if ((rdev->family >= CHIP_RS400) &&
1309
	    (rdev->flags & RADEON_IS_IGP)) {
1318
	    (rdev->flags & RADEON_IS_IGP)) {
1310
		rdev->flags &= ~RADEON_IS_AGP;
1319
		rdev->flags &= ~RADEON_IS_AGP;
1311
	}
1320
	}
1312
 
1321
 
1313
	if (rdev->flags & RADEON_IS_AGP && radeon_agpmode == -1) {
1322
	if (rdev->flags & RADEON_IS_AGP && radeon_agpmode == -1) {
1314
		radeon_agp_disable(rdev);
1323
		radeon_agp_disable(rdev);
1315
    }
1324
	}
1316
 
1325
 
1317
	/* Set the internal MC address mask
1326
	/* Set the internal MC address mask
1318
	 * This is the max address of the GPU's
1327
	 * This is the max address of the GPU's
1319
	 * internal address space.
1328
	 * internal address space.
1320
	 */
1329
	 */
1321
	if (rdev->family >= CHIP_CAYMAN)
1330
	if (rdev->family >= CHIP_CAYMAN)
1322
		rdev->mc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
1331
		rdev->mc.mc_mask = 0xffffffffffULL; /* 40 bit MC */
1323
	else if (rdev->family >= CHIP_CEDAR)
1332
	else if (rdev->family >= CHIP_CEDAR)
1324
		rdev->mc.mc_mask = 0xfffffffffULL; /* 36 bit MC */
1333
		rdev->mc.mc_mask = 0xfffffffffULL; /* 36 bit MC */
1325
	else
1334
	else
1326
		rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */
1335
		rdev->mc.mc_mask = 0xffffffffULL; /* 32 bit MC */
1327
 
1336
 
1328
	/* set DMA mask + need_dma32 flags.
1337
	/* set DMA mask + need_dma32 flags.
1329
	 * PCIE - can handle 40-bits.
1338
	 * PCIE - can handle 40-bits.
1330
	 * IGP - can handle 40-bits
1339
	 * IGP - can handle 40-bits
1331
	 * AGP - generally dma32 is safest
1340
	 * AGP - generally dma32 is safest
1332
	 * PCI - dma32 for legacy pci gart, 40 bits on newer asics
1341
	 * PCI - dma32 for legacy pci gart, 40 bits on newer asics
1333
	 */
1342
	 */
1334
	rdev->need_dma32 = false;
1343
	rdev->need_dma32 = false;
1335
	if (rdev->flags & RADEON_IS_AGP)
1344
	if (rdev->flags & RADEON_IS_AGP)
1336
		rdev->need_dma32 = true;
1345
		rdev->need_dma32 = true;
1337
	if ((rdev->flags & RADEON_IS_PCI) &&
1346
	if ((rdev->flags & RADEON_IS_PCI) &&
1338
	    (rdev->family <= CHIP_RS740))
1347
	    (rdev->family <= CHIP_RS740))
1339
		rdev->need_dma32 = true;
1348
		rdev->need_dma32 = true;
1340
 
1349
 
1341
	dma_bits = rdev->need_dma32 ? 32 : 40;
1350
	dma_bits = rdev->need_dma32 ? 32 : 40;
1342
	r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
1351
	r = pci_set_dma_mask(rdev->pdev, DMA_BIT_MASK(dma_bits));
1343
    if (r) {
1352
	if (r) {
1344
		rdev->need_dma32 = true;
1353
		rdev->need_dma32 = true;
1345
		dma_bits = 32;
1354
		dma_bits = 32;
1346
        printk(KERN_WARNING "radeon: No suitable DMA available.\n");
1355
		printk(KERN_WARNING "radeon: No suitable DMA available.\n");
1347
    }
1356
	}
1348
 
1357
 
1349
    /* Registers mapping */
1358
	/* Registers mapping */
1350
    /* TODO: block userspace mapping of io register */
1359
	/* TODO: block userspace mapping of io register */
1351
	spin_lock_init(&rdev->mmio_idx_lock);
1360
	spin_lock_init(&rdev->mmio_idx_lock);
1352
	spin_lock_init(&rdev->smc_idx_lock);
1361
	spin_lock_init(&rdev->smc_idx_lock);
1353
	spin_lock_init(&rdev->pll_idx_lock);
1362
	spin_lock_init(&rdev->pll_idx_lock);
1354
	spin_lock_init(&rdev->mc_idx_lock);
1363
	spin_lock_init(&rdev->mc_idx_lock);
1355
	spin_lock_init(&rdev->pcie_idx_lock);
1364
	spin_lock_init(&rdev->pcie_idx_lock);
1356
	spin_lock_init(&rdev->pciep_idx_lock);
1365
	spin_lock_init(&rdev->pciep_idx_lock);
1357
	spin_lock_init(&rdev->pif_idx_lock);
1366
	spin_lock_init(&rdev->pif_idx_lock);
1358
	spin_lock_init(&rdev->cg_idx_lock);
1367
	spin_lock_init(&rdev->cg_idx_lock);
1359
	spin_lock_init(&rdev->uvd_idx_lock);
1368
	spin_lock_init(&rdev->uvd_idx_lock);
1360
	spin_lock_init(&rdev->rcu_idx_lock);
1369
	spin_lock_init(&rdev->rcu_idx_lock);
1361
	spin_lock_init(&rdev->didt_idx_lock);
1370
	spin_lock_init(&rdev->didt_idx_lock);
1362
	spin_lock_init(&rdev->end_idx_lock);
1371
	spin_lock_init(&rdev->end_idx_lock);
1363
	if (rdev->family >= CHIP_BONAIRE) {
1372
	if (rdev->family >= CHIP_BONAIRE) {
1364
		rdev->rmmio_base = pci_resource_start(rdev->pdev, 5);
1373
		rdev->rmmio_base = pci_resource_start(rdev->pdev, 5);
1365
		rdev->rmmio_size = pci_resource_len(rdev->pdev, 5);
1374
		rdev->rmmio_size = pci_resource_len(rdev->pdev, 5);
1366
	} else {
1375
	} else {
1367
    rdev->rmmio_base = pci_resource_start(rdev->pdev, 2);
1376
		rdev->rmmio_base = pci_resource_start(rdev->pdev, 2);
1368
    rdev->rmmio_size = pci_resource_len(rdev->pdev, 2);
1377
		rdev->rmmio_size = pci_resource_len(rdev->pdev, 2);
1369
	}
1378
	}
1370
	rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size);
1379
	rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size);
1371
    if (rdev->rmmio == NULL) {
1380
	if (rdev->rmmio == NULL) {
1372
        return -ENOMEM;
1381
		return -ENOMEM;
1373
    }
1382
	}
1374
    DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base);
1383
	DRM_INFO("register mmio base: 0x%08X\n", (uint32_t)rdev->rmmio_base);
1375
    DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size);
1384
	DRM_INFO("register mmio size: %u\n", (unsigned)rdev->rmmio_size);
1376
 
1385
 
1377
	/* doorbell bar mapping */
1386
	/* doorbell bar mapping */
1378
	if (rdev->family >= CHIP_BONAIRE)
1387
	if (rdev->family >= CHIP_BONAIRE)
1379
		radeon_doorbell_init(rdev);
1388
		radeon_doorbell_init(rdev);
1380
 
1389
 
1381
	/* io port mapping */
1390
	/* io port mapping */
1382
	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
1391
	for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
1383
		if (pci_resource_flags(rdev->pdev, i) & IORESOURCE_IO) {
1392
		if (pci_resource_flags(rdev->pdev, i) & IORESOURCE_IO) {
1384
			rdev->rio_mem_size = pci_resource_len(rdev->pdev, i);
1393
			rdev->rio_mem_size = pci_resource_len(rdev->pdev, i);
1385
			rdev->rio_mem = pci_iomap(rdev->pdev, i, rdev->rio_mem_size);
1394
			rdev->rio_mem = pci_iomap(rdev->pdev, i, rdev->rio_mem_size);
1386
			break;
1395
			break;
1387
		}
1396
		}
1388
	}
1397
	}
1389
	if (rdev->rio_mem == NULL)
1398
	if (rdev->rio_mem == NULL)
1390
		DRM_ERROR("Unable to find PCI I/O BAR\n");
1399
		DRM_ERROR("Unable to find PCI I/O BAR\n");
1391
 
1400
 
1392
	if (rdev->flags & RADEON_IS_PX)
1401
	if (rdev->flags & RADEON_IS_PX)
1393
		radeon_device_handle_px_quirks(rdev);
1402
		radeon_device_handle_px_quirks(rdev);
1394
	if (rdev->flags & RADEON_IS_PX)
1403
	if (rdev->flags & RADEON_IS_PX)
1395
		runtime = true;
1404
		runtime = true;
1396
 
1405
 
1397
	r = radeon_init(rdev);
1406
	r = radeon_init(rdev);
1398
	if (r)
1407
	if (r)
1399
        return r;
1408
		goto failed;
1400
 
1409
 
1401
 
1410
 
1402
 
1411
 
1403
	if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) {
1412
	if (rdev->flags & RADEON_IS_AGP && !rdev->accel_working) {
1404
		/* Acceleration not working on AGP card try again
1413
		/* Acceleration not working on AGP card try again
1405
		 * with fallback to PCI or PCIE GART
1414
		 * with fallback to PCI or PCIE GART
1406
		 */
1415
		 */
1407
		radeon_asic_reset(rdev);
1416
		radeon_asic_reset(rdev);
1408
		radeon_fini(rdev);
1417
		radeon_fini(rdev);
1409
		radeon_agp_disable(rdev);
1418
		radeon_agp_disable(rdev);
1410
		r = radeon_init(rdev);
1419
		r = radeon_init(rdev);
1411
		if (r)
1420
		if (r)
1412
		return r;
1421
			goto failed;
1413
	}
1422
	}
1414
 
1423
 
1415
//   r = radeon_ib_ring_tests(rdev);
1424
//   r = radeon_ib_ring_tests(rdev);
1416
//   if (r)
1425
//   if (r)
1417
//       DRM_ERROR("ib ring test failed (%d).\n", r);
1426
//       DRM_ERROR("ib ring test failed (%d).\n", r);
1418
 
1427
 
1419
	if ((radeon_testing & 1)) {
1428
	if ((radeon_testing & 1)) {
1420
		if (rdev->accel_working)
1429
		if (rdev->accel_working)
1421
			radeon_test_moves(rdev);
1430
			radeon_test_moves(rdev);
1422
		else
1431
		else
1423
			DRM_INFO("radeon: acceleration disabled, skipping move tests\n");
1432
			DRM_INFO("radeon: acceleration disabled, skipping move tests\n");
1424
	}
1433
	}
1425
	if ((radeon_testing & 2)) {
1434
	if ((radeon_testing & 2)) {
1426
		if (rdev->accel_working)
1435
		if (rdev->accel_working)
1427
			radeon_test_syncing(rdev);
1436
			radeon_test_syncing(rdev);
1428
		else
1437
		else
1429
			DRM_INFO("radeon: acceleration disabled, skipping sync tests\n");
1438
			DRM_INFO("radeon: acceleration disabled, skipping sync tests\n");
1430
	}
1439
	}
1431
   if (radeon_benchmarking) {
1440
	if (radeon_benchmarking) {
1432
		if (rdev->accel_working)
1441
		if (rdev->accel_working)
1433
		radeon_benchmark(rdev, radeon_benchmarking);
1442
			radeon_benchmark(rdev, radeon_benchmarking);
1434
		else
1443
		else
1435
			DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n");
1444
			DRM_INFO("radeon: acceleration disabled, skipping benchmarks\n");
1436
    }
1445
	}
1437
	return 0;
1446
	return 0;
-
 
1447
 
-
 
1448
failed:
-
 
1449
	return r;
1438
}
1450
}
1439
 
1451
 
1440
/**
1452
/**
1441
 * radeon_gpu_reset - reset the asic
1453
 * radeon_gpu_reset - reset the asic
1442
 *
1454
 *
1443
 * @rdev: radeon device pointer
1455
 * @rdev: radeon device pointer
1444
 *
1456
 *
1445
 * Attempt the reset the GPU if it has hung (all asics).
1457
 * Attempt the reset the GPU if it has hung (all asics).
1446
 * Returns 0 for success or an error on failure.
1458
 * Returns 0 for success or an error on failure.
1447
 */
1459
 */
1448
int radeon_gpu_reset(struct radeon_device *rdev)
1460
int radeon_gpu_reset(struct radeon_device *rdev)
1449
{
1461
{
1450
    unsigned ring_sizes[RADEON_NUM_RINGS];
1462
    unsigned ring_sizes[RADEON_NUM_RINGS];
1451
    uint32_t *ring_data[RADEON_NUM_RINGS];
1463
    uint32_t *ring_data[RADEON_NUM_RINGS];
1452
 
1464
 
1453
    bool saved = false;
1465
    bool saved = false;
1454
 
1466
 
1455
    int i, r;
1467
    int i, r;
1456
    int resched;
1468
    int resched;
1457
 
1469
 
1458
	down_write(&rdev->exclusive_lock);
1470
	down_write(&rdev->exclusive_lock);
1459
 
1471
 
1460
	if (!rdev->needs_reset) {
1472
	if (!rdev->needs_reset) {
1461
		up_write(&rdev->exclusive_lock);
1473
		up_write(&rdev->exclusive_lock);
1462
		return 0;
1474
		return 0;
1463
	}
1475
	}
1464
 
1476
 
1465
    radeon_save_bios_scratch_regs(rdev);
1477
    radeon_save_bios_scratch_regs(rdev);
1466
    /* block TTM */
1478
    /* block TTM */
1467
//    resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
1479
//    resched = ttm_bo_lock_delayed_workqueue(&rdev->mman.bdev);
1468
    radeon_suspend(rdev);
1480
    radeon_suspend(rdev);
1469
 
1481
 
1470
    for (i = 0; i < RADEON_NUM_RINGS; ++i) {
1482
    for (i = 0; i < RADEON_NUM_RINGS; ++i) {
1471
        ring_sizes[i] = radeon_ring_backup(rdev, &rdev->ring[i],
1483
        ring_sizes[i] = radeon_ring_backup(rdev, &rdev->ring[i],
1472
                           &ring_data[i]);
1484
                           &ring_data[i]);
1473
        if (ring_sizes[i]) {
1485
        if (ring_sizes[i]) {
1474
            saved = true;
1486
            saved = true;
1475
            dev_info(rdev->dev, "Saved %d dwords of commands "
1487
            dev_info(rdev->dev, "Saved %d dwords of commands "
1476
                 "on ring %d.\n", ring_sizes[i], i);
1488
                 "on ring %d.\n", ring_sizes[i], i);
1477
        }
1489
        }
1478
    }
1490
    }
1479
 
1491
 
1480
    r = radeon_asic_reset(rdev);
1492
    r = radeon_asic_reset(rdev);
1481
    if (!r) {
1493
    if (!r) {
1482
        dev_info(rdev->dev, "GPU reset succeeded, trying to resume\n");
1494
        dev_info(rdev->dev, "GPU reset succeeded, trying to resume\n");
1483
        radeon_resume(rdev);
1495
        radeon_resume(rdev);
1484
    }
1496
    }
1485
 
1497
 
1486
    radeon_restore_bios_scratch_regs(rdev);
1498
    radeon_restore_bios_scratch_regs(rdev);
1487
 
1499
 
1488
        for (i = 0; i < RADEON_NUM_RINGS; ++i) {
1500
        for (i = 0; i < RADEON_NUM_RINGS; ++i) {
1489
		if (!r && ring_data[i]) {
1501
		if (!r && ring_data[i]) {
1490
            radeon_ring_restore(rdev, &rdev->ring[i],
1502
            radeon_ring_restore(rdev, &rdev->ring[i],
1491
                        ring_sizes[i], ring_data[i]);
1503
                        ring_sizes[i], ring_data[i]);
1492
    } else {
1504
    } else {
1493
			radeon_fence_driver_force_completion(rdev, i);
1505
			radeon_fence_driver_force_completion(rdev, i);
1494
            kfree(ring_data[i]);
1506
            kfree(ring_data[i]);
1495
        }
1507
        }
1496
    }
1508
    }
1497
 
1509
 
1498
//    ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
1510
//    ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched);
1499
    if (r) {
1511
    if (r) {
1500
        /* bad news, how to tell it to userspace ? */
1512
        /* bad news, how to tell it to userspace ? */
1501
        dev_info(rdev->dev, "GPU reset failed\n");
1513
        dev_info(rdev->dev, "GPU reset failed\n");
1502
    }
1514
    }
1503
 
1515
 
1504
	rdev->needs_reset = r == -EAGAIN;
1516
	rdev->needs_reset = r == -EAGAIN;
1505
	rdev->in_reset = false;
1517
	rdev->in_reset = false;
1506
 
1518
 
1507
	up_read(&rdev->exclusive_lock);
1519
	up_read(&rdev->exclusive_lock);
1508
    return r;
1520
    return r;
1509
}
1521
}
1510
 
1522
 
1511
 
1523
 
1512
/*
1524
/*
1513
 * Driver load/unload
1525
 * Driver load/unload
1514
 */
1526
 */
1515
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
1527
int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags)
1516
{
1528
{
1517
    struct radeon_device *rdev;
1529
    struct radeon_device *rdev;
1518
    int r;
1530
    int r;
1519
 
1531
 
1520
 
1532
 
1521
    rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL);
1533
    rdev = kzalloc(sizeof(struct radeon_device), GFP_KERNEL);
1522
    if (rdev == NULL) {
1534
    if (rdev == NULL) {
1523
        return -ENOMEM;
1535
        return -ENOMEM;
1524
    };
1536
    };
1525
 
1537
 
1526
    dev->dev_private = (void *)rdev;
1538
    dev->dev_private = (void *)rdev;
1527
 
1539
 
1528
    /* update BUS flag */
1540
    /* update BUS flag */
1529
    if (drm_pci_device_is_agp(dev)) {
1541
    if (drm_pci_device_is_agp(dev)) {
1530
        flags |= RADEON_IS_AGP;
1542
        flags |= RADEON_IS_AGP;
1531
    } else if (drm_device_is_pcie(dev)) {
1543
    } else if (drm_device_is_pcie(dev)) {
1532
        flags |= RADEON_IS_PCIE;
1544
        flags |= RADEON_IS_PCIE;
1533
    } else {
1545
    } else {
1534
        flags |= RADEON_IS_PCI;
1546
        flags |= RADEON_IS_PCI;
1535
    }
1547
    }
1536
 
1548
 
1537
    /* radeon_device_init should report only fatal error
1549
    /* radeon_device_init should report only fatal error
1538
     * like memory allocation failure or iomapping failure,
1550
     * like memory allocation failure or iomapping failure,
1539
     * or memory manager initialization failure, it must
1551
     * or memory manager initialization failure, it must
1540
     * properly initialize the GPU MC controller and permit
1552
     * properly initialize the GPU MC controller and permit
1541
     * VRAM allocation
1553
     * VRAM allocation
1542
     */
1554
     */
1543
    r = radeon_device_init(rdev, dev, dev->pdev, flags);
1555
    r = radeon_device_init(rdev, dev, dev->pdev, flags);
1544
    if (r) {
1556
    if (r) {
1545
        DRM_ERROR("Fatal error while trying to initialize radeon.\n");
1557
        DRM_ERROR("Fatal error while trying to initialize radeon.\n");
1546
        return r;
1558
        return r;
1547
    }
1559
    }
1548
    /* Again modeset_init should fail only on fatal error
1560
    /* Again modeset_init should fail only on fatal error
1549
     * otherwise it should provide enough functionalities
1561
     * otherwise it should provide enough functionalities
1550
     * for shadowfb to run
1562
     * for shadowfb to run
1551
     */
1563
     */
1552
    main_device = dev;
1564
    main_device = dev;
1553
 
1565
 
1554
    if( radeon_modeset )
1566
    if( radeon_modeset )
1555
    {
1567
    {
1556
        r = radeon_modeset_init(rdev);
1568
        r = radeon_modeset_init(rdev);
1557
        if (r) {
1569
        if (r) {
1558
            return r;
1570
            return r;
1559
        }
1571
        }
1560
        init_display_kms(dev, &usermode);
1572
        init_display_kms(dev, &usermode);
1561
    }
1573
    }
1562
    else
1574
    else
1563
        init_display(rdev, &usermode);
1575
        init_display(rdev, &usermode);
1564
 
1576
 
1565
    return 0;
1577
    return 0;
1566
}
1578
}
1567
 
1579
 
1568
 
1580
 
1569
 
1581
 
1570
resource_size_t drm_get_resource_start(struct drm_device *dev, unsigned int resource)
1582
resource_size_t drm_get_resource_start(struct drm_device *dev, unsigned int resource)
1571
{
1583
{
1572
    return pci_resource_start(dev->pdev, resource);
1584
    return pci_resource_start(dev->pdev, resource);
1573
}
1585
}
1574
 
1586
 
1575
resource_size_t drm_get_resource_len(struct drm_device *dev, unsigned int resource)
1587
resource_size_t drm_get_resource_len(struct drm_device *dev, unsigned int resource)
1576
{
1588
{
1577
    return pci_resource_len(dev->pdev, resource);
1589
    return pci_resource_len(dev->pdev, resource);
1578
}
1590
}
1579
 
1591
 
1580
 
1592
 
1581
uint32_t __div64_32(uint64_t *n, uint32_t base)
1593
uint32_t __div64_32(uint64_t *n, uint32_t base)
1582
{
1594
{
1583
        uint64_t rem = *n;
1595
        uint64_t rem = *n;
1584
        uint64_t b = base;
1596
        uint64_t b = base;
1585
        uint64_t res, d = 1;
1597
        uint64_t res, d = 1;
1586
        uint32_t high = rem >> 32;
1598
        uint32_t high = rem >> 32;
1587
 
1599
 
1588
        /* Reduce the thing a bit first */
1600
        /* Reduce the thing a bit first */
1589
        res = 0;
1601
        res = 0;
1590
        if (high >= base) {
1602
        if (high >= base) {
1591
                high /= base;
1603
                high /= base;
1592
                res = (uint64_t) high << 32;
1604
                res = (uint64_t) high << 32;
1593
                rem -= (uint64_t) (high*base) << 32;
1605
                rem -= (uint64_t) (high*base) << 32;
1594
        }
1606
        }
1595
 
1607
 
1596
        while ((int64_t)b > 0 && b < rem) {
1608
        while ((int64_t)b > 0 && b < rem) {
1597
                b = b+b;
1609
                b = b+b;
1598
                d = d+d;
1610
                d = d+d;
1599
        }
1611
        }
1600
 
1612
 
1601
        do {
1613
        do {
1602
                if (rem >= b) {
1614
                if (rem >= b) {
1603
                        rem -= b;
1615
                        rem -= b;
1604
                        res += d;
1616
                        res += d;
1605
                }
1617
                }
1606
                b >>= 1;
1618
                b >>= 1;
1607
                d >>= 1;
1619
                d >>= 1;
1608
        } while (d);
1620
        } while (d);
1609
 
1621
 
1610
        *n = res;
1622
        *n = res;
1611
        return rem;
1623
        return rem;
1612
}
1624
}
1613
 
1625
 
1614
static struct pci_device_id pciidlist[] = {
1626
static struct pci_device_id pciidlist[] = {
1615
    radeon_PCI_IDS
1627
    radeon_PCI_IDS
1616
};
1628
};
-
 
1629
 
-
 
1630
u32 radeon_get_vblank_counter_kms(struct drm_device *dev, unsigned int pipe);
-
 
1631
int radeon_enable_vblank_kms(struct drm_device *dev, unsigned int pipe);
-
 
1632
void radeon_disable_vblank_kms(struct drm_device *dev, unsigned int pipe);
-
 
1633
int radeon_get_vblank_timestamp_kms(struct drm_device *dev, unsigned int pipe,
-
 
1634
				    int *max_error,
-
 
1635
				    struct timeval *vblank_time,
-
 
1636
				    unsigned flags); 
1617
 
1637
void radeon_gem_object_free(struct drm_gem_object *obj); 
1618
void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
1638
void radeon_driver_irq_preinstall_kms(struct drm_device *dev);
1619
int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
1639
int radeon_driver_irq_postinstall_kms(struct drm_device *dev);
1620
void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
1640
void radeon_driver_irq_uninstall_kms(struct drm_device *dev);
1621
irqreturn_t radeon_driver_irq_handler_kms(int irq, void *arg);
1641
irqreturn_t radeon_driver_irq_handler_kms(int irq, void *arg);
1622
 
1642
 
1623
 
1643
 
1624
static struct drm_driver kms_driver = {
1644
static struct drm_driver kms_driver = {
1625
    .driver_features =
1645
    .driver_features =
1626
        DRIVER_USE_AGP |
1646
        DRIVER_USE_AGP |
1627
        DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM |
1647
        DRIVER_HAVE_IRQ | DRIVER_IRQ_SHARED | DRIVER_GEM |
1628
        DRIVER_PRIME | DRIVER_RENDER,
1648
        DRIVER_PRIME | DRIVER_RENDER,
1629
    .load = radeon_driver_load_kms,
1649
    .load = radeon_driver_load_kms,
1630
//    .open = radeon_driver_open_kms,
1650
//    .open = radeon_driver_open_kms,
1631
//    .preclose = radeon_driver_preclose_kms,
1651
//    .preclose = radeon_driver_preclose_kms,
1632
//    .postclose = radeon_driver_postclose_kms,
1652
//    .postclose = radeon_driver_postclose_kms,
1633
//    .lastclose = radeon_driver_lastclose_kms,
1653
//    .lastclose = radeon_driver_lastclose_kms,
1634
//    .unload = radeon_driver_unload_kms,
1654
//    .unload = radeon_driver_unload_kms,
1635
//    .get_vblank_counter = radeon_get_vblank_counter_kms,
1655
    .get_vblank_counter = radeon_get_vblank_counter_kms,
1636
//    .enable_vblank = radeon_enable_vblank_kms,
1656
    .enable_vblank = radeon_enable_vblank_kms,
1637
//    .disable_vblank = radeon_disable_vblank_kms,
1657
    .disable_vblank = radeon_disable_vblank_kms,
1638
//    .get_vblank_timestamp = radeon_get_vblank_timestamp_kms,
1658
    .get_vblank_timestamp = radeon_get_vblank_timestamp_kms,
1639
//    .get_scanout_position = radeon_get_crtc_scanoutpos,
1659
    .get_scanout_position = radeon_get_crtc_scanoutpos,
1640
#if defined(CONFIG_DEBUG_FS)
1660
#if defined(CONFIG_DEBUG_FS)
1641
    .debugfs_init = radeon_debugfs_init,
1661
    .debugfs_init = radeon_debugfs_init,
1642
    .debugfs_cleanup = radeon_debugfs_cleanup,
1662
    .debugfs_cleanup = radeon_debugfs_cleanup,
1643
#endif
1663
#endif
1644
    .irq_preinstall = radeon_driver_irq_preinstall_kms,
1664
    .irq_preinstall = radeon_driver_irq_preinstall_kms,
1645
    .irq_postinstall = radeon_driver_irq_postinstall_kms,
1665
    .irq_postinstall = radeon_driver_irq_postinstall_kms,
1646
    .irq_uninstall = radeon_driver_irq_uninstall_kms,
1666
    .irq_uninstall = radeon_driver_irq_uninstall_kms,
1647
    .irq_handler = radeon_driver_irq_handler_kms,
1667
    .irq_handler = radeon_driver_irq_handler_kms,
1648
//    .ioctls = radeon_ioctls_kms,
1668
//    .ioctls = radeon_ioctls_kms,
1649
//    .gem_free_object = radeon_gem_object_free,
1669
    .gem_free_object = radeon_gem_object_free,
1650
//    .gem_open_object = radeon_gem_object_open,
1670
//    .gem_open_object = radeon_gem_object_open,
1651
//    .gem_close_object = radeon_gem_object_close,
1671
//    .gem_close_object = radeon_gem_object_close,
1652
//    .dumb_create = radeon_mode_dumb_create,
1672
//    .dumb_create = radeon_mode_dumb_create,
1653
//    .dumb_map_offset = radeon_mode_dumb_mmap,
1673
//    .dumb_map_offset = radeon_mode_dumb_mmap,
1654
//    .dumb_destroy = drm_gem_dumb_destroy,
1674
//    .dumb_destroy = drm_gem_dumb_destroy,
1655
//    .fops = &radeon_driver_kms_fops,
1675
//    .fops = &radeon_driver_kms_fops,
1656
 
1676
 
1657
//    .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
1677
//    .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
1658
//    .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
1678
//    .prime_fd_to_handle = drm_gem_prime_fd_to_handle,
1659
//    .gem_prime_export = drm_gem_prime_export,
1679
//    .gem_prime_export = drm_gem_prime_export,
1660
//    .gem_prime_import = drm_gem_prime_import,
1680
//    .gem_prime_import = drm_gem_prime_import,
1661
//    .gem_prime_pin = radeon_gem_prime_pin,
1681
//    .gem_prime_pin = radeon_gem_prime_pin,
1662
//    .gem_prime_unpin = radeon_gem_prime_unpin,
1682
//    .gem_prime_unpin = radeon_gem_prime_unpin,
1663
//    .gem_prime_get_sg_table = radeon_gem_prime_get_sg_table,
1683
//    .gem_prime_get_sg_table = radeon_gem_prime_get_sg_table,
1664
//    .gem_prime_import_sg_table = radeon_gem_prime_import_sg_table,
1684
//    .gem_prime_import_sg_table = radeon_gem_prime_import_sg_table,
1665
//    .gem_prime_vmap = radeon_gem_prime_vmap,
1685
//    .gem_prime_vmap = radeon_gem_prime_vmap,
1666
//    .gem_prime_vunmap = radeon_gem_prime_vunmap,
1686
//    .gem_prime_vunmap = radeon_gem_prime_vunmap,
1667
 
1687
 
1668
};
1688
};
1669
 
1689
 
1670
int ati_init(void)
1690
int ati_init(void)
1671
{
1691
{
1672
    static pci_dev_t device;
1692
    static pci_dev_t device;
1673
    const struct pci_device_id  *ent;
1693
    const struct pci_device_id  *ent;
1674
    int  err;
1694
    int  err;
1675
 
1695
 
1676
    ent = find_pci_device(&device, pciidlist);
1696
    ent = find_pci_device(&device, pciidlist);
1677
    if( unlikely(ent == NULL) )
1697
    if( unlikely(ent == NULL) )
1678
    {
1698
    {
1679
        dbgprintf("device not found\n");
1699
        dbgprintf("device not found\n");
1680
        return -ENODEV;
1700
        return -ENODEV;
1681
    };
1701
    };
1682
 
1702
 
1683
    drm_core_init();
1703
    drm_core_init();
1684
 
1704
 
1685
    DRM_INFO("device %x:%x\n", device.pci_dev.vendor,
1705
    DRM_INFO("device %x:%x\n", device.pci_dev.vendor,
1686
                                device.pci_dev.device);
1706
                                device.pci_dev.device);
1687
 
1707
 
1688
    kms_driver.driver_features |= DRIVER_MODESET;
1708
    kms_driver.driver_features |= DRIVER_MODESET;
1689
 
1709
 
1690
    err = drm_get_pci_dev(&device.pci_dev, ent, &kms_driver);
1710
    err = drm_get_pci_dev(&device.pci_dev, ent, &kms_driver);
1691
 
1711
 
1692
    return err;
1712
    return err;
1693
}
1713
}