diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/r100.c | 13 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_device.c | 1 |
3 files changed, 15 insertions, 1 deletions
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index ae4c857fb17..8ff7cac222d 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -4141,8 +4141,15 @@ uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg, | |||
| 4141 | if (reg < rdev->rmmio_size && !always_indirect) | 4141 | if (reg < rdev->rmmio_size && !always_indirect) |
| 4142 | return readl(((void __iomem *)rdev->rmmio) + reg); | 4142 | return readl(((void __iomem *)rdev->rmmio) + reg); |
| 4143 | else { | 4143 | else { |
| 4144 | unsigned long flags; | ||
| 4145 | uint32_t ret; | ||
| 4146 | |||
| 4147 | spin_lock_irqsave(&rdev->mmio_idx_lock, flags); | ||
| 4144 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | 4148 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); |
| 4145 | 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; | ||
| 4146 | } | 4153 | } |
| 4147 | } | 4154 | } |
| 4148 | 4155 | ||
| @@ -4152,8 +4159,12 @@ void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v, | |||
| 4152 | if (reg < rdev->rmmio_size && !always_indirect) | 4159 | if (reg < rdev->rmmio_size && !always_indirect) |
| 4153 | writel(v, ((void __iomem *)rdev->rmmio) + reg); | 4160 | writel(v, ((void __iomem *)rdev->rmmio) + reg); |
| 4154 | else { | 4161 | else { |
| 4162 | unsigned long flags; | ||
| 4163 | |||
| 4164 | spin_lock_irqsave(&rdev->mmio_idx_lock, flags); | ||
| 4155 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | 4165 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); |
| 4156 | 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); | ||
| 4157 | } | 4168 | } |
| 4158 | } | 4169 | } |
| 4159 | 4170 | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 609bb18d09f..285fb3f203a 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -1556,6 +1556,8 @@ struct radeon_device { | |||
| 1556 | /* Register mmio */ | 1556 | /* Register mmio */ |
| 1557 | resource_size_t rmmio_base; | 1557 | resource_size_t rmmio_base; |
| 1558 | resource_size_t rmmio_size; | 1558 | resource_size_t rmmio_size; |
| 1559 | /* protects concurrent MM_INDEX/DATA based register access */ | ||
| 1560 | spinlock_t mmio_idx_lock; | ||
| 1559 | void __iomem *rmmio; | 1561 | void __iomem *rmmio; |
| 1560 | radeon_rreg_t mc_rreg; | 1562 | radeon_rreg_t mc_rreg; |
| 1561 | radeon_wreg_t mc_wreg; | 1563 | radeon_wreg_t mc_wreg; |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index e2f5f888c37..49b06590001 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -1059,6 +1059,7 @@ int radeon_device_init(struct radeon_device *rdev, | |||
| 1059 | 1059 | ||
| 1060 | /* Registers mapping */ | 1060 | /* Registers mapping */ |
| 1061 | /* TODO: block userspace mapping of io register */ | 1061 | /* TODO: block userspace mapping of io register */ |
| 1062 | spin_lock_init(&rdev->mmio_idx_lock); | ||
| 1062 | rdev->rmmio_base = pci_resource_start(rdev->pdev, 2); | 1063 | rdev->rmmio_base = pci_resource_start(rdev->pdev, 2); |
| 1063 | rdev->rmmio_size = pci_resource_len(rdev->pdev, 2); | 1064 | rdev->rmmio_size = pci_resource_len(rdev->pdev, 2); |
| 1064 | rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size); | 1065 | rdev->rmmio = ioremap(rdev->rmmio_base, rdev->rmmio_size); |
