diff options
author | Jerome Glisse <jglisse@redhat.com> | 2009-09-14 12:29:49 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2009-09-14 18:53:14 -0400 |
commit | 4aac047323e3082d0866b8ad3784236632105af4 (patch) | |
tree | af4c118e42b9ea55c961c4f5bbb02998dc2cc4fe /drivers/gpu/drm/radeon/rs600.c | |
parent | 21f9a437222e92adb3abc68584a5f04801b92739 (diff) |
drm/radeon/kms: clear confusion in GART init/deinit path
GART static one time initialization was mixed up with GART
enabling/disabling which could happen several time for instance
during suspend/resume cycles. This patch splits all GART
handling into 4 differents function. gart_init is for one
time initialization, gart_deinit is called upon module unload
to free resources allocated by gart_init, gart_enable enable
the GART and is intented to be call after first initialization
and at each resume cycle or reset cycle. Finaly gart_disable
stop the GART and is intended to be call at suspend time or
when unloading the module.
Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/rs600.c')
-rw-r--r-- | drivers/gpu/drm/radeon/rs600.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 1b8d62f5e73c..c31bd8439259 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -68,22 +68,35 @@ void rs600_gart_tlb_flush(struct radeon_device *rdev) | |||
68 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); | 68 | tmp = RREG32_MC(RS600_MC_PT0_CNTL); |
69 | } | 69 | } |
70 | 70 | ||
71 | int rs600_gart_enable(struct radeon_device *rdev) | 71 | int rs600_gart_init(struct radeon_device *rdev) |
72 | { | 72 | { |
73 | uint32_t tmp; | ||
74 | int i; | ||
75 | int r; | 73 | int r; |
76 | 74 | ||
75 | if (rdev->gart.table.vram.robj) { | ||
76 | WARN(1, "RS600 GART already initialized.\n"); | ||
77 | return 0; | ||
78 | } | ||
77 | /* Initialize common gart structure */ | 79 | /* Initialize common gart structure */ |
78 | r = radeon_gart_init(rdev); | 80 | r = radeon_gart_init(rdev); |
79 | if (r) { | 81 | if (r) { |
80 | return r; | 82 | return r; |
81 | } | 83 | } |
82 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; | 84 | rdev->gart.table_size = rdev->gart.num_gpu_pages * 8; |
83 | r = radeon_gart_table_vram_alloc(rdev); | 85 | return radeon_gart_table_vram_alloc(rdev); |
84 | if (r) { | 86 | } |
85 | return r; | 87 | |
88 | int rs600_gart_enable(struct radeon_device *rdev) | ||
89 | { | ||
90 | uint32_t tmp; | ||
91 | int r, i; | ||
92 | |||
93 | if (rdev->gart.table.vram.robj == NULL) { | ||
94 | dev_err(rdev->dev, "No VRAM object for PCIE GART.\n"); | ||
95 | return -EINVAL; | ||
86 | } | 96 | } |
97 | r = radeon_gart_table_vram_pin(rdev); | ||
98 | if (r) | ||
99 | return r; | ||
87 | /* FIXME: setup default page */ | 100 | /* FIXME: setup default page */ |
88 | WREG32_MC(RS600_MC_PT0_CNTL, | 101 | WREG32_MC(RS600_MC_PT0_CNTL, |
89 | (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | | 102 | (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | |
@@ -138,8 +151,17 @@ void rs600_gart_disable(struct radeon_device *rdev) | |||
138 | tmp = RREG32_MC(RS600_MC_CNTL1); | 151 | tmp = RREG32_MC(RS600_MC_CNTL1); |
139 | tmp &= ~RS600_ENABLE_PAGE_TABLES; | 152 | tmp &= ~RS600_ENABLE_PAGE_TABLES; |
140 | WREG32_MC(RS600_MC_CNTL1, tmp); | 153 | WREG32_MC(RS600_MC_CNTL1, tmp); |
141 | radeon_object_kunmap(rdev->gart.table.vram.robj); | 154 | if (rdev->gart.table.vram.robj) { |
142 | radeon_object_unpin(rdev->gart.table.vram.robj); | 155 | radeon_object_kunmap(rdev->gart.table.vram.robj); |
156 | radeon_object_unpin(rdev->gart.table.vram.robj); | ||
157 | } | ||
158 | } | ||
159 | |||
160 | void rs600_gart_fini(struct radeon_device *rdev) | ||
161 | { | ||
162 | rs600_gart_disable(rdev); | ||
163 | radeon_gart_table_vram_free(rdev); | ||
164 | radeon_gart_fini(rdev); | ||
143 | } | 165 | } |
144 | 166 | ||
145 | #define R600_PTE_VALID (1 << 0) | 167 | #define R600_PTE_VALID (1 << 0) |
@@ -235,9 +257,6 @@ int rs600_mc_init(struct radeon_device *rdev) | |||
235 | 257 | ||
236 | void rs600_mc_fini(struct radeon_device *rdev) | 258 | void rs600_mc_fini(struct radeon_device *rdev) |
237 | { | 259 | { |
238 | rs600_gart_disable(rdev); | ||
239 | radeon_gart_table_vram_free(rdev); | ||
240 | radeon_gart_fini(rdev); | ||
241 | } | 260 | } |
242 | 261 | ||
243 | 262 | ||