Subversion Repositories Kolibri OS

Rev

Rev 1268 | Rev 1403 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1268 Rev 1321
Line 61... Line 61...
61
 
61
 
62
/* This files gather functions specifics to:
62
/* This files gather functions specifics to:
63
 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
63
 * r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280
Line -... Line 64...
-
 
64
 */
-
 
65
 
-
 
66
/* hpd for digital panel detect/disconnect */
-
 
67
bool r100_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
-
 
68
{
-
 
69
	bool connected = false;
-
 
70
 
-
 
71
	switch (hpd) {
-
 
72
	case RADEON_HPD_1:
-
 
73
		if (RREG32(RADEON_FP_GEN_CNTL) & RADEON_FP_DETECT_SENSE)
-
 
74
			connected = true;
-
 
75
		break;
-
 
76
	case RADEON_HPD_2:
-
 
77
		if (RREG32(RADEON_FP2_GEN_CNTL) & RADEON_FP2_DETECT_SENSE)
-
 
78
			connected = true;
-
 
79
		break;
-
 
80
	default:
-
 
81
		break;
-
 
82
	}
-
 
83
	return connected;
-
 
84
}
-
 
85
 
-
 
86
void r100_hpd_set_polarity(struct radeon_device *rdev,
-
 
87
			   enum radeon_hpd_id hpd)
-
 
88
{
-
 
89
	u32 tmp;
-
 
90
	bool connected = r100_hpd_sense(rdev, hpd);
-
 
91
 
-
 
92
	switch (hpd) {
-
 
93
	case RADEON_HPD_1:
-
 
94
		tmp = RREG32(RADEON_FP_GEN_CNTL);
-
 
95
		if (connected)
-
 
96
			tmp &= ~RADEON_FP_DETECT_INT_POL;
-
 
97
		else
-
 
98
			tmp |= RADEON_FP_DETECT_INT_POL;
-
 
99
		WREG32(RADEON_FP_GEN_CNTL, tmp);
-
 
100
		break;
-
 
101
	case RADEON_HPD_2:
-
 
102
		tmp = RREG32(RADEON_FP2_GEN_CNTL);
-
 
103
		if (connected)
-
 
104
			tmp &= ~RADEON_FP2_DETECT_INT_POL;
-
 
105
		else
-
 
106
			tmp |= RADEON_FP2_DETECT_INT_POL;
-
 
107
		WREG32(RADEON_FP2_GEN_CNTL, tmp);
-
 
108
		break;
-
 
109
	default:
-
 
110
		break;
-
 
111
	}
-
 
112
}
-
 
113
 
-
 
114
void r100_hpd_init(struct radeon_device *rdev)
-
 
115
{
-
 
116
	struct drm_device *dev = rdev->ddev;
-
 
117
	struct drm_connector *connector;
-
 
118
 
-
 
119
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-
 
120
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-
 
121
		switch (radeon_connector->hpd.hpd) {
-
 
122
		case RADEON_HPD_1:
-
 
123
			rdev->irq.hpd[0] = true;
-
 
124
			break;
-
 
125
		case RADEON_HPD_2:
-
 
126
			rdev->irq.hpd[1] = true;
-
 
127
			break;
-
 
128
		default:
-
 
129
			break;
-
 
130
		}
-
 
131
	}
-
 
132
	r100_irq_set(rdev);
-
 
133
}
-
 
134
 
-
 
135
void r100_hpd_fini(struct radeon_device *rdev)
-
 
136
{
-
 
137
	struct drm_device *dev = rdev->ddev;
-
 
138
	struct drm_connector *connector;
-
 
139
 
-
 
140
	list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
-
 
141
		struct radeon_connector *radeon_connector = to_radeon_connector(connector);
-
 
142
		switch (radeon_connector->hpd.hpd) {
-
 
143
		case RADEON_HPD_1:
-
 
144
			rdev->irq.hpd[0] = false;
-
 
145
			break;
-
 
146
		case RADEON_HPD_2:
-
 
147
			rdev->irq.hpd[1] = false;
-
 
148
			break;
-
 
149
		default:
-
 
150
			break;
-
 
151
		}
-
 
152
	}
64
 */
153
}
65
 
154
 
66
/*
155
/*
67
 * PCI GART
156
 * PCI GART
68
 */
157
 */
Line 90... Line 179...
90
	rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
179
	rdev->asic->gart_tlb_flush = &r100_pci_gart_tlb_flush;
91
	rdev->asic->gart_set_page = &r100_pci_gart_set_page;
180
	rdev->asic->gart_set_page = &r100_pci_gart_set_page;
92
	return radeon_gart_table_ram_alloc(rdev);
181
	return radeon_gart_table_ram_alloc(rdev);
93
}
182
}
Line -... Line 183...
-
 
183
 
-
 
184
/* required on r1xx, r2xx, r300, r(v)350, r420/r481, rs400/rs480 */
-
 
185
void r100_enable_bm(struct radeon_device *rdev)
-
 
186
{
-
 
187
	uint32_t tmp;
-
 
188
	/* Enable bus mastering */
-
 
189
	tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
-
 
190
	WREG32(RADEON_BUS_CNTL, tmp);
-
 
191
}
94
 
192
 
95
int r100_pci_gart_enable(struct radeon_device *rdev)
193
int r100_pci_gart_enable(struct radeon_device *rdev)
96
{
194
{
Line 97... Line 195...
97
	uint32_t tmp;
195
	uint32_t tmp;
Line 101... Line 199...
101
	WREG32(RADEON_AIC_CNTL, tmp);
199
	WREG32(RADEON_AIC_CNTL, tmp);
102
	/* set address range for PCI address translate */
200
	/* set address range for PCI address translate */
103
	WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_location);
201
	WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_location);
104
	tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
202
	tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
105
	WREG32(RADEON_AIC_HI_ADDR, tmp);
203
	WREG32(RADEON_AIC_HI_ADDR, tmp);
106
	/* Enable bus mastering */
-
 
107
	tmp = RREG32(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
-
 
108
	WREG32(RADEON_BUS_CNTL, tmp);
-
 
109
	/* set PCI GART page-table base address */
204
	/* set PCI GART page-table base address */
110
	WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr);
205
	WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr);
111
	tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN;
206
	tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN;
112
	WREG32(RADEON_AIC_CNTL, tmp);
207
	WREG32(RADEON_AIC_CNTL, tmp);
113
	r100_pci_gart_tlb_flush(rdev);
208
	r100_pci_gart_tlb_flush(rdev);
Line 155... Line 250...
155
}
250
}
Line 156... Line 251...
156
 
251
 
157
static inline uint32_t r100_irq_ack(struct radeon_device *rdev)
252
static inline uint32_t r100_irq_ack(struct radeon_device *rdev)
158
{
253
{
159
	uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS);
254
	uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS);
160
	uint32_t irq_mask = RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT |
255
	uint32_t irq_mask = RADEON_SW_INT_TEST |
-
 
256
		RADEON_CRTC_VBLANK_STAT | RADEON_CRTC2_VBLANK_STAT |
Line 161... Line 257...
161
		RADEON_CRTC2_VBLANK_STAT;
257
		RADEON_FP_DETECT_STAT | RADEON_FP2_DETECT_STAT;
162
 
258
 
163
	if (irqs) {
259
	if (irqs) {
164
		WREG32(RADEON_GEN_INT_STATUS, irqs);
260
		WREG32(RADEON_GEN_INT_STATUS, irqs);
Line 190... Line 286...
190
int r100_wb_init(struct radeon_device *rdev)
286
int r100_wb_init(struct radeon_device *rdev)
191
{
287
{
192
	int r;
288
	int r;
Line 193... Line 289...
193
 
289
 
194
	if (rdev->wb.wb_obj == NULL) {
290
	if (rdev->wb.wb_obj == NULL) {
195
		r = radeon_object_create(rdev, NULL, RADEON_GPU_PAGE_SIZE,
-
 
196
					 true,
291
		r = radeon_bo_create(rdev, NULL, RADEON_GPU_PAGE_SIZE, true,
197
					 RADEON_GEM_DOMAIN_GTT,
292
					 RADEON_GEM_DOMAIN_GTT,
198
					 false, &rdev->wb.wb_obj);
293
					&rdev->wb.wb_obj);
199
		if (r) {
294
		if (r) {
200
			DRM_ERROR("radeon: failed to create WB buffer (%d).\n", r);
295
			dev_err(rdev->dev, "(%d) create WB buffer failed\n", r);
201
			return r;
296
			return r;
202
		}
297
		}
-
 
298
		r = radeon_bo_reserve(rdev->wb.wb_obj, false);
-
 
299
		if (unlikely(r != 0))
203
		r = radeon_object_pin(rdev->wb.wb_obj,
300
			return r;
204
				      RADEON_GEM_DOMAIN_GTT,
301
		r = radeon_bo_pin(rdev->wb.wb_obj, RADEON_GEM_DOMAIN_GTT,
205
				      &rdev->wb.gpu_addr);
302
				      &rdev->wb.gpu_addr);
206
		if (r) {
303
		if (r) {
-
 
304
			dev_err(rdev->dev, "(%d) pin WB buffer failed\n", r);
207
			DRM_ERROR("radeon: failed to pin WB buffer (%d).\n", r);
305
			radeon_bo_unreserve(rdev->wb.wb_obj);
208
			return r;
306
			return r;
209
		}
307
		}
-
 
308
		r = radeon_bo_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
210
		r = radeon_object_kmap(rdev->wb.wb_obj, (void **)&rdev->wb.wb);
309
		radeon_bo_unreserve(rdev->wb.wb_obj);
211
		if (r) {
310
		if (r) {
212
			DRM_ERROR("radeon: failed to map WB buffer (%d).\n", r);
311
			dev_err(rdev->dev, "(%d) map WB buffer failed\n", r);
213
			return r;
312
			return r;
214
		}
313
		}
215
	}
314
	}
216
	WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr);
315
	WREG32(R_000774_SCRATCH_ADDR, rdev->wb.gpu_addr);
Line 225... Line 324...
225
	WREG32(R_000770_SCRATCH_UMSK, 0);
324
	WREG32(R_000770_SCRATCH_UMSK, 0);
226
}
325
}
Line 227... Line 326...
227
 
326
 
228
void r100_wb_fini(struct radeon_device *rdev)
327
void r100_wb_fini(struct radeon_device *rdev)
-
 
328
{
-
 
329
	int r;
229
{
330
 
230
	r100_wb_disable(rdev);
331
	r100_wb_disable(rdev);
231
	if (rdev->wb.wb_obj) {
332
	if (rdev->wb.wb_obj) {
232
//       radeon_object_kunmap(rdev->wb.wb_obj);
333
//       radeon_object_kunmap(rdev->wb.wb_obj);
233
//       radeon_object_unpin(rdev->wb.wb_obj);
334
//       radeon_object_unpin(rdev->wb.wb_obj);
Line 1243... Line 1344...
1243
	return 0;
1344
	return 0;
1244
}
1345
}
Line 1245... Line 1346...
1245
 
1346
 
1246
int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
1347
int r100_cs_track_check_pkt3_indx_buffer(struct radeon_cs_parser *p,
1247
					 struct radeon_cs_packet *pkt,
1348
					 struct radeon_cs_packet *pkt,
1248
					 struct radeon_object *robj)
1349
					 struct radeon_bo *robj)
1249
{
1350
{
1250
	unsigned idx;
1351
	unsigned idx;
1251
	u32 value;
1352
	u32 value;
1252
	idx = pkt->idx + 1;
1353
	idx = pkt->idx + 1;
1253
	value = radeon_get_ib_value(p, idx + 2);
1354
	value = radeon_get_ib_value(p, idx + 2);
1254
	if ((value + 1) > radeon_object_size(robj)) {
1355
	if ((value + 1) > radeon_bo_size(robj)) {
1255
		DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER "
1356
		DRM_ERROR("[drm] Buffer too small for PACKET3 INDX_BUFFER "
1256
			  "(need %u have %lu) !\n",
1357
			  "(need %u have %lu) !\n",
1257
			  value + 1,
1358
			  value + 1,
1258
			  radeon_object_size(robj));
1359
			  radeon_bo_size(robj));
1259
		return -EINVAL;
1360
		return -EINVAL;
1260
	}
1361
	}
1261
	return 0;
1362
	return 0;
Line 1539... Line 1640...
1539
{
1640
{
1540
	/* TODO: anythings to do here ? pipes ? */
1641
	/* TODO: anythings to do here ? pipes ? */
1541
	r100_hdp_reset(rdev);
1642
	r100_hdp_reset(rdev);
1542
}
1643
}
Line -... Line 1644...
-
 
1644
 
-
 
1645
void r100_hdp_flush(struct radeon_device *rdev)
-
 
1646
{
-
 
1647
	u32 tmp;
-
 
1648
	tmp = RREG32(RADEON_HOST_PATH_CNTL);
-
 
1649
	tmp |= RADEON_HDP_READ_BUFFER_INVALIDATE;
-
 
1650
	WREG32(RADEON_HOST_PATH_CNTL, tmp);
-
 
1651
}
1543
 
1652
 
1544
void r100_hdp_reset(struct radeon_device *rdev)
1653
void r100_hdp_reset(struct radeon_device *rdev)
1545
{
1654
{
Line 1546... Line 1655...
1546
	uint32_t tmp;
1655
	uint32_t tmp;
Line 1610... Line 1719...
1610
	}
1719
	}
1611
	DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status);
1720
	DRM_INFO("GPU reset succeed (RBBM_STATUS=0x%08X)\n", status);
1612
	return 0;
1721
	return 0;
1613
}
1722
}
Line -... Line 1723...
-
 
1723
 
-
 
1724
void r100_set_common_regs(struct radeon_device *rdev)
-
 
1725
{
-
 
1726
	/* set these so they don't interfere with anything */
-
 
1727
	WREG32(RADEON_OV0_SCALE_CNTL, 0);
-
 
1728
	WREG32(RADEON_SUBPIC_CNTL, 0);
-
 
1729
	WREG32(RADEON_VIPH_CONTROL, 0);
-
 
1730
	WREG32(RADEON_I2C_CNTL_1, 0);
-
 
1731
	WREG32(RADEON_DVI_I2C_CNTL_1, 0);
-
 
1732
	WREG32(RADEON_CAP0_TRIG_CNTL, 0);
-
 
1733
	WREG32(RADEON_CAP1_TRIG_CNTL, 0);
Line 1614... Line 1734...
1614
 
1734
}
1615
 
1735
 
1616
/*
1736
/*
1617
 * VRAM info
1737
 * VRAM info
Line 2675... Line 2795...
2675
 
2795
 
2676
static int r100_startup(struct radeon_device *rdev)
2796
static int r100_startup(struct radeon_device *rdev)
2677
{
2797
{
Line -... Line 2798...
-
 
2798
	int r;
-
 
2799
 
-
 
2800
	/* set common regs */
2678
	int r;
2801
	r100_set_common_regs(rdev);
2679
 
2802
	/* program mc */
2680
	r100_mc_program(rdev);
2803
	r100_mc_program(rdev);
2681
	/* Resume clock */
2804
	/* Resume clock */
2682
	r100_clock_startup(rdev);
2805
	r100_clock_startup(rdev);
2683
	/* Initialize GPU configuration (# pipes, ...) */
2806
	/* Initialize GPU configuration (# pipes, ...) */
2684
	r100_gpu_init(rdev);
2807
	r100_gpu_init(rdev);
-
 
2808
	/* Initialize GART (initialize after TTM so we can allocate
2685
	/* Initialize GART (initialize after TTM so we can allocate
2809
	 * memory through TTM but finalize after TTM) */
2686
	 * memory through TTM but finalize after TTM) */
2810
	r100_enable_bm(rdev);
2687
	if (rdev->flags & RADEON_IS_PCI) {
2811
	if (rdev->flags & RADEON_IS_PCI) {
2688
		r = r100_pci_gart_enable(rdev);
2812
		r = r100_pci_gart_enable(rdev);
2689
		if (r)
2813
		if (r)
2690
			return r;
2814
			return r;
2691
	}
-
 
2692
	/* Enable IRQ */
2815
	}
2693
//   rdev->irq.sw_int = true;
2816
	/* Enable IRQ */
2694
//   r100_irq_set(rdev);
2817
//   r100_irq_set(rdev);
2695
	/* 1M ring buffer */
2818
	/* 1M ring buffer */
2696
//   r = r100_cp_init(rdev, 1024 * 1024);
2819
//   r = r100_cp_init(rdev, 1024 * 1024);
Line 2770... Line 2893...
2770
			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
2893
			"GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
2771
			RREG32(R_000E40_RBBM_STATUS),
2894
			RREG32(R_000E40_RBBM_STATUS),
2772
			RREG32(R_0007C0_CP_STAT));
2895
			RREG32(R_0007C0_CP_STAT));
2773
	}
2896
	}
2774
	/* check if cards are posted or not */
2897
	/* check if cards are posted or not */
2775
	if (!radeon_card_posted(rdev) && rdev->bios) {
2898
	if (radeon_boot_test_post_card(rdev) == false)
2776
		DRM_INFO("GPU not posted. posting now...\n");
-
 
2777
		radeon_combios_asic_init(rdev->ddev);
2899
		return -EINVAL;
2778
	}
-
 
2779
	/* Set asic errata */
2900
	/* Set asic errata */
2780
	r100_errata(rdev);
2901
	r100_errata(rdev);
2781
	/* Initialize clocks */
2902
	/* Initialize clocks */
2782
	radeon_get_clock_info(rdev->ddev);
2903
	radeon_get_clock_info(rdev->ddev);
2783
	/* Get vram informations */
2904
	/* Get vram informations */
Line 2793... Line 2914...
2793
//		return r;
2914
//		return r;
2794
//	r = radeon_irq_kms_init(rdev);
2915
//	r = radeon_irq_kms_init(rdev);
2795
//	if (r)
2916
//	if (r)
2796
//		return r;
2917
//		return r;
2797
	/* Memory manager */
2918
	/* Memory manager */
2798
	r = radeon_object_init(rdev);
2919
	r = radeon_bo_init(rdev);
2799
	if (r)
2920
	if (r)
2800
		return r;
2921
		return r;
2801
	if (rdev->flags & RADEON_IS_PCI) {
2922
	if (rdev->flags & RADEON_IS_PCI) {
2802
		r = r100_pci_gart_init(rdev);
2923
		r = r100_pci_gart_init(rdev);
2803
		if (r)
2924
		if (r)