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) |