diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r100.c')
-rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index 376884f1bcd2..8ff7cac222dc 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -4135,23 +4135,36 @@ int r100_init(struct radeon_device *rdev) | |||
4135 | return 0; | 4135 | return 0; |
4136 | } | 4136 | } |
4137 | 4137 | ||
4138 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) | 4138 | uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg, |
4139 | bool always_indirect) | ||
4139 | { | 4140 | { |
4140 | if (reg < rdev->rmmio_size) | 4141 | if (reg < rdev->rmmio_size && !always_indirect) |
4141 | return readl(((void __iomem *)rdev->rmmio) + reg); | 4142 | return readl(((void __iomem *)rdev->rmmio) + reg); |
4142 | else { | 4143 | else { |
4144 | unsigned long flags; | ||
4145 | uint32_t ret; | ||
4146 | |||
4147 | spin_lock_irqsave(&rdev->mmio_idx_lock, flags); | ||
4143 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | 4148 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); |
4144 | return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | 4149 | ret = readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); |
4150 | spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags); | ||
4151 | |||
4152 | return ret; | ||
4145 | } | 4153 | } |
4146 | } | 4154 | } |
4147 | 4155 | ||
4148 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | 4156 | void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v, |
4157 | bool always_indirect) | ||
4149 | { | 4158 | { |
4150 | if (reg < rdev->rmmio_size) | 4159 | if (reg < rdev->rmmio_size && !always_indirect) |
4151 | writel(v, ((void __iomem *)rdev->rmmio) + reg); | 4160 | writel(v, ((void __iomem *)rdev->rmmio) + reg); |
4152 | else { | 4161 | else { |
4162 | unsigned long flags; | ||
4163 | |||
4164 | spin_lock_irqsave(&rdev->mmio_idx_lock, flags); | ||
4153 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | 4165 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); |
4154 | writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | 4166 | writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); |
4167 | spin_unlock_irqrestore(&rdev->mmio_idx_lock, flags); | ||
4155 | } | 4168 | } |
4156 | } | 4169 | } |
4157 | 4170 | ||