diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 96 |
1 files changed, 76 insertions, 20 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index f1ba8ff41130..68e728e8be4d 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -254,6 +254,72 @@ void r100_mc_fini(struct radeon_device *rdev) | |||
| 254 | 254 | ||
| 255 | 255 | ||
| 256 | /* | 256 | /* |
| 257 | * Interrupts | ||
| 258 | */ | ||
| 259 | int r100_irq_set(struct radeon_device *rdev) | ||
| 260 | { | ||
| 261 | uint32_t tmp = 0; | ||
| 262 | |||
| 263 | if (rdev->irq.sw_int) { | ||
| 264 | tmp |= RADEON_SW_INT_ENABLE; | ||
| 265 | } | ||
| 266 | if (rdev->irq.crtc_vblank_int[0]) { | ||
| 267 | tmp |= RADEON_CRTC_VBLANK_MASK; | ||
| 268 | } | ||
| 269 | if (rdev->irq.crtc_vblank_int[1]) { | ||
| 270 | tmp |= RADEON_CRTC2_VBLANK_MASK; | ||
| 271 | } | ||
| 272 | WREG32(RADEON_GEN_INT_CNTL, tmp); | ||
| 273 | return 0; | ||
| 274 | } | ||
| 275 | |||
| 276 | static inline uint32_t r100_irq_ack(struct radeon_device *rdev) | ||
| 277 | { | ||
| 278 | uint32_t irqs = RREG32(RADEON_GEN_INT_STATUS); | ||
| 279 | uint32_t irq_mask = RADEON_SW_INT_TEST | RADEON_CRTC_VBLANK_STAT | | ||
| 280 | RADEON_CRTC2_VBLANK_STAT; | ||
| 281 | |||
| 282 | if (irqs) { | ||
| 283 | WREG32(RADEON_GEN_INT_STATUS, irqs); | ||
| 284 | } | ||
| 285 | return irqs & irq_mask; | ||
| 286 | } | ||
| 287 | |||
| 288 | int r100_irq_process(struct radeon_device *rdev) | ||
| 289 | { | ||
| 290 | uint32_t status; | ||
| 291 | |||
| 292 | status = r100_irq_ack(rdev); | ||
| 293 | if (!status) { | ||
| 294 | return IRQ_NONE; | ||
| 295 | } | ||
| 296 | while (status) { | ||
| 297 | /* SW interrupt */ | ||
| 298 | if (status & RADEON_SW_INT_TEST) { | ||
| 299 | radeon_fence_process(rdev); | ||
| 300 | } | ||
| 301 | /* Vertical blank interrupts */ | ||
| 302 | if (status & RADEON_CRTC_VBLANK_STAT) { | ||
| 303 | drm_handle_vblank(rdev->ddev, 0); | ||
| 304 | } | ||
| 305 | if (status & RADEON_CRTC2_VBLANK_STAT) { | ||
| 306 | drm_handle_vblank(rdev->ddev, 1); | ||
| 307 | } | ||
| 308 | status = r100_irq_ack(rdev); | ||
| 309 | } | ||
| 310 | return IRQ_HANDLED; | ||
| 311 | } | ||
| 312 | |||
| 313 | u32 r100_get_vblank_counter(struct radeon_device *rdev, int crtc) | ||
| 314 | { | ||
| 315 | if (crtc == 0) | ||
| 316 | return RREG32(RADEON_CRTC_CRNT_FRAME); | ||
| 317 | else | ||
| 318 | return RREG32(RADEON_CRTC2_CRNT_FRAME); | ||
| 319 | } | ||
| 320 | |||
| 321 | |||
| 322 | /* | ||
| 257 | * Fence emission | 323 | * Fence emission |
| 258 | */ | 324 | */ |
| 259 | void r100_fence_ring_emit(struct radeon_device *rdev, | 325 | void r100_fence_ring_emit(struct radeon_device *rdev, |
| @@ -1025,6 +1091,16 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1025 | tmp |= tile_flags; | 1091 | tmp |= tile_flags; |
| 1026 | ib[idx] = tmp; | 1092 | ib[idx] = tmp; |
| 1027 | break; | 1093 | break; |
| 1094 | case RADEON_RB3D_ZPASS_ADDR: | ||
| 1095 | r = r100_cs_packet_next_reloc(p, &reloc); | ||
| 1096 | if (r) { | ||
| 1097 | DRM_ERROR("No reloc for ib[%d]=0x%04X\n", | ||
| 1098 | idx, reg); | ||
| 1099 | r100_cs_dump_packet(p, pkt); | ||
| 1100 | return r; | ||
| 1101 | } | ||
| 1102 | ib[idx] = ib_chunk->kdata[idx] + ((u32)reloc->lobj.gpu_offset); | ||
| 1103 | break; | ||
| 1028 | default: | 1104 | default: |
| 1029 | /* FIXME: we don't want to allow anyothers packet */ | 1105 | /* FIXME: we don't want to allow anyothers packet */ |
| 1030 | break; | 1106 | break; |
| @@ -1556,26 +1632,6 @@ void r100_pll_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | |||
| 1556 | r100_pll_errata_after_data(rdev); | 1632 | r100_pll_errata_after_data(rdev); |
| 1557 | } | 1633 | } |
| 1558 | 1634 | ||
| 1559 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 1560 | { | ||
| 1561 | if (reg < 0x10000) | ||
| 1562 | return readl(((void __iomem *)rdev->rmmio) + reg); | ||
| 1563 | else { | ||
| 1564 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | ||
| 1565 | return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | ||
| 1566 | } | ||
| 1567 | } | ||
| 1568 | |||
| 1569 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 1570 | { | ||
| 1571 | if (reg < 0x10000) | ||
| 1572 | writel(v, ((void __iomem *)rdev->rmmio) + reg); | ||
| 1573 | else { | ||
| 1574 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | ||
| 1575 | writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | ||
| 1576 | } | ||
| 1577 | } | ||
| 1578 | |||
| 1579 | int r100_init(struct radeon_device *rdev) | 1635 | int r100_init(struct radeon_device *rdev) |
| 1580 | { | 1636 | { |
| 1581 | return 0; | 1637 | return 0; |
