diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-06-25 13:06:12 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-06-25 13:10:36 -0400 |
commit | 7b0cfee1a24efdfe0235bac62e53f686fe8a8e24 (patch) | |
tree | eeeb8cc3bf7be5ec0e54b7c4f3808ef88ecca012 /drivers/gpu/drm | |
parent | 9756fe38d10b2bf90c81dc4d2f17d5632e135364 (diff) | |
parent | 6b16351acbd415e66ba16bf7d473ece1574cf0bc (diff) |
Merge tag 'v3.5-rc4' into drm-intel-next-queued
I want to merge the "no more fake agp on gen6+" patches into
drm-intel-next (well, the last pieces). But a patch in 3.5-rc4 also
adds a new use of dev->agp. Hence the backmarge to sort this out, for
otherwise drm-intel-next merged into Linus' tree would conflict in the
relevant code, things would compile but nicely OOPS at driver load :(
Conflicts in this merge are just simple cases of "both branches
changed/added lines at the same place". The only tricky part is to
keep the order correct wrt the unwind code in case of errors in
intel_ringbuffer.c (and the MI_DISPLAY_FLIP #defines in i915_reg.h
together, obviously).
Conflicts:
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_ringbuffer.c
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm')
51 files changed, 998 insertions, 1472 deletions
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.c b/drivers/gpu/drm/cirrus/cirrus_drv.c index d7038230b71e..7053140c6596 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.c +++ b/drivers/gpu/drm/cirrus/cirrus_drv.c | |||
@@ -35,9 +35,28 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = { | |||
35 | {0,} | 35 | {0,} |
36 | }; | 36 | }; |
37 | 37 | ||
38 | |||
39 | static void cirrus_kick_out_firmware_fb(struct pci_dev *pdev) | ||
40 | { | ||
41 | struct apertures_struct *ap; | ||
42 | bool primary = false; | ||
43 | |||
44 | ap = alloc_apertures(1); | ||
45 | ap->ranges[0].base = pci_resource_start(pdev, 0); | ||
46 | ap->ranges[0].size = pci_resource_len(pdev, 0); | ||
47 | |||
48 | #ifdef CONFIG_X86 | ||
49 | primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; | ||
50 | #endif | ||
51 | remove_conflicting_framebuffers(ap, "cirrusdrmfb", primary); | ||
52 | kfree(ap); | ||
53 | } | ||
54 | |||
38 | static int __devinit | 55 | static int __devinit |
39 | cirrus_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 56 | cirrus_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
40 | { | 57 | { |
58 | cirrus_kick_out_firmware_fb(pdev); | ||
59 | |||
41 | return drm_get_pci_dev(pdev, ent, &driver); | 60 | return drm_get_pci_dev(pdev, ent, &driver); |
42 | } | 61 | } |
43 | 62 | ||
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h index 21bdfa8836f7..64ea597cb6d3 100644 --- a/drivers/gpu/drm/cirrus/cirrus_drv.h +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h | |||
@@ -145,7 +145,7 @@ struct cirrus_device { | |||
145 | struct ttm_bo_device bdev; | 145 | struct ttm_bo_device bdev; |
146 | atomic_t validate_sequence; | 146 | atomic_t validate_sequence; |
147 | } ttm; | 147 | } ttm; |
148 | 148 | bool mm_inited; | |
149 | }; | 149 | }; |
150 | 150 | ||
151 | 151 | ||
diff --git a/drivers/gpu/drm/cirrus/cirrus_ttm.c b/drivers/gpu/drm/cirrus/cirrus_ttm.c index 2ebcd11a5023..50e170f879de 100644 --- a/drivers/gpu/drm/cirrus/cirrus_ttm.c +++ b/drivers/gpu/drm/cirrus/cirrus_ttm.c | |||
@@ -275,12 +275,17 @@ int cirrus_mm_init(struct cirrus_device *cirrus) | |||
275 | pci_resource_len(dev->pdev, 0), | 275 | pci_resource_len(dev->pdev, 0), |
276 | DRM_MTRR_WC); | 276 | DRM_MTRR_WC); |
277 | 277 | ||
278 | cirrus->mm_inited = true; | ||
278 | return 0; | 279 | return 0; |
279 | } | 280 | } |
280 | 281 | ||
281 | void cirrus_mm_fini(struct cirrus_device *cirrus) | 282 | void cirrus_mm_fini(struct cirrus_device *cirrus) |
282 | { | 283 | { |
283 | struct drm_device *dev = cirrus->dev; | 284 | struct drm_device *dev = cirrus->dev; |
285 | |||
286 | if (!cirrus->mm_inited) | ||
287 | return; | ||
288 | |||
284 | ttm_bo_device_release(&cirrus->ttm.bdev); | 289 | ttm_bo_device_release(&cirrus->ttm.bdev); |
285 | 290 | ||
286 | cirrus_ttm_global_release(cirrus); | 291 | cirrus_ttm_global_release(cirrus); |
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index c3b5139eba7f..5873e481e5d2 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
@@ -30,7 +30,7 @@ | |||
30 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
31 | #include <linux/slab.h> | 31 | #include <linux/slab.h> |
32 | #include <linux/i2c.h> | 32 | #include <linux/i2c.h> |
33 | #include <linux/export.h> | 33 | #include <linux/module.h> |
34 | #include "drmP.h" | 34 | #include "drmP.h" |
35 | #include "drm_edid.h" | 35 | #include "drm_edid.h" |
36 | #include "drm_edid_modes.h" | 36 | #include "drm_edid_modes.h" |
@@ -149,6 +149,10 @@ int drm_edid_header_is_valid(const u8 *raw_edid) | |||
149 | } | 149 | } |
150 | EXPORT_SYMBOL(drm_edid_header_is_valid); | 150 | EXPORT_SYMBOL(drm_edid_header_is_valid); |
151 | 151 | ||
152 | static int edid_fixup __read_mostly = 6; | ||
153 | module_param_named(edid_fixup, edid_fixup, int, 0400); | ||
154 | MODULE_PARM_DESC(edid_fixup, | ||
155 | "Minimum number of valid EDID header bytes (0-8, default 6)"); | ||
152 | 156 | ||
153 | /* | 157 | /* |
154 | * Sanity check the EDID block (base or extension). Return 0 if the block | 158 | * Sanity check the EDID block (base or extension). Return 0 if the block |
@@ -160,10 +164,13 @@ bool drm_edid_block_valid(u8 *raw_edid, int block) | |||
160 | u8 csum = 0; | 164 | u8 csum = 0; |
161 | struct edid *edid = (struct edid *)raw_edid; | 165 | struct edid *edid = (struct edid *)raw_edid; |
162 | 166 | ||
167 | if (edid_fixup > 8 || edid_fixup < 0) | ||
168 | edid_fixup = 6; | ||
169 | |||
163 | if (block == 0) { | 170 | if (block == 0) { |
164 | int score = drm_edid_header_is_valid(raw_edid); | 171 | int score = drm_edid_header_is_valid(raw_edid); |
165 | if (score == 8) ; | 172 | if (score == 8) ; |
166 | else if (score >= 6) { | 173 | else if (score >= edid_fixup) { |
167 | DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); | 174 | DRM_DEBUG("Fixing EDID header, your hardware may be failing\n"); |
168 | memcpy(raw_edid, edid_header, sizeof(edid_header)); | 175 | memcpy(raw_edid, edid_header, sizeof(edid_header)); |
169 | } else { | 176 | } else { |
@@ -603,7 +610,7 @@ static bool | |||
603 | drm_monitor_supports_rb(struct edid *edid) | 610 | drm_monitor_supports_rb(struct edid *edid) |
604 | { | 611 | { |
605 | if (edid->revision >= 4) { | 612 | if (edid->revision >= 4) { |
606 | bool ret; | 613 | bool ret = false; |
607 | drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); | 614 | drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); |
608 | return ret; | 615 | return ret; |
609 | } | 616 | } |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 420953197d0a..d6de2e07fa03 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c | |||
@@ -244,8 +244,8 @@ static const struct file_operations exynos_drm_driver_fops = { | |||
244 | }; | 244 | }; |
245 | 245 | ||
246 | static struct drm_driver exynos_drm_driver = { | 246 | static struct drm_driver exynos_drm_driver = { |
247 | .driver_features = DRIVER_HAVE_IRQ | DRIVER_BUS_PLATFORM | | 247 | .driver_features = DRIVER_HAVE_IRQ | DRIVER_MODESET | |
248 | DRIVER_MODESET | DRIVER_GEM | DRIVER_PRIME, | 248 | DRIVER_GEM | DRIVER_PRIME, |
249 | .load = exynos_drm_load, | 249 | .load = exynos_drm_load, |
250 | .unload = exynos_drm_unload, | 250 | .unload = exynos_drm_unload, |
251 | .open = exynos_drm_open, | 251 | .open = exynos_drm_open, |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_encoder.c b/drivers/gpu/drm/exynos/exynos_drm_encoder.c index 6e9ac7bd1dcf..23d5ad379f86 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_encoder.c +++ b/drivers/gpu/drm/exynos/exynos_drm_encoder.c | |||
@@ -172,19 +172,12 @@ static void exynos_drm_encoder_commit(struct drm_encoder *encoder) | |||
172 | manager_ops->commit(manager->dev); | 172 | manager_ops->commit(manager->dev); |
173 | } | 173 | } |
174 | 174 | ||
175 | static struct drm_crtc * | ||
176 | exynos_drm_encoder_get_crtc(struct drm_encoder *encoder) | ||
177 | { | ||
178 | return encoder->crtc; | ||
179 | } | ||
180 | |||
181 | static struct drm_encoder_helper_funcs exynos_encoder_helper_funcs = { | 175 | static struct drm_encoder_helper_funcs exynos_encoder_helper_funcs = { |
182 | .dpms = exynos_drm_encoder_dpms, | 176 | .dpms = exynos_drm_encoder_dpms, |
183 | .mode_fixup = exynos_drm_encoder_mode_fixup, | 177 | .mode_fixup = exynos_drm_encoder_mode_fixup, |
184 | .mode_set = exynos_drm_encoder_mode_set, | 178 | .mode_set = exynos_drm_encoder_mode_set, |
185 | .prepare = exynos_drm_encoder_prepare, | 179 | .prepare = exynos_drm_encoder_prepare, |
186 | .commit = exynos_drm_encoder_commit, | 180 | .commit = exynos_drm_encoder_commit, |
187 | .get_crtc = exynos_drm_encoder_get_crtc, | ||
188 | }; | 181 | }; |
189 | 182 | ||
190 | static void exynos_drm_encoder_destroy(struct drm_encoder *encoder) | 183 | static void exynos_drm_encoder_destroy(struct drm_encoder *encoder) |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c index f82a299553fb..4ccfe4328fab 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c | |||
@@ -51,11 +51,22 @@ struct exynos_drm_fb { | |||
51 | static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) | 51 | static void exynos_drm_fb_destroy(struct drm_framebuffer *fb) |
52 | { | 52 | { |
53 | struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); | 53 | struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb); |
54 | unsigned int i; | ||
54 | 55 | ||
55 | DRM_DEBUG_KMS("%s\n", __FILE__); | 56 | DRM_DEBUG_KMS("%s\n", __FILE__); |
56 | 57 | ||
57 | drm_framebuffer_cleanup(fb); | 58 | drm_framebuffer_cleanup(fb); |
58 | 59 | ||
60 | for (i = 0; i < ARRAY_SIZE(exynos_fb->exynos_gem_obj); i++) { | ||
61 | struct drm_gem_object *obj; | ||
62 | |||
63 | if (exynos_fb->exynos_gem_obj[i] == NULL) | ||
64 | continue; | ||
65 | |||
66 | obj = &exynos_fb->exynos_gem_obj[i]->base; | ||
67 | drm_gem_object_unreference_unlocked(obj); | ||
68 | } | ||
69 | |||
59 | kfree(exynos_fb); | 70 | kfree(exynos_fb); |
60 | exynos_fb = NULL; | 71 | exynos_fb = NULL; |
61 | } | 72 | } |
@@ -134,11 +145,11 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, | |||
134 | return ERR_PTR(-ENOENT); | 145 | return ERR_PTR(-ENOENT); |
135 | } | 146 | } |
136 | 147 | ||
137 | drm_gem_object_unreference_unlocked(obj); | ||
138 | |||
139 | fb = exynos_drm_framebuffer_init(dev, mode_cmd, obj); | 148 | fb = exynos_drm_framebuffer_init(dev, mode_cmd, obj); |
140 | if (IS_ERR(fb)) | 149 | if (IS_ERR(fb)) { |
150 | drm_gem_object_unreference_unlocked(obj); | ||
141 | return fb; | 151 | return fb; |
152 | } | ||
142 | 153 | ||
143 | exynos_fb = to_exynos_fb(fb); | 154 | exynos_fb = to_exynos_fb(fb); |
144 | nr = exynos_drm_format_num_buffers(fb->pixel_format); | 155 | nr = exynos_drm_format_num_buffers(fb->pixel_format); |
@@ -152,8 +163,6 @@ exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv, | |||
152 | return ERR_PTR(-ENOENT); | 163 | return ERR_PTR(-ENOENT); |
153 | } | 164 | } |
154 | 165 | ||
155 | drm_gem_object_unreference_unlocked(obj); | ||
156 | |||
157 | exynos_fb->exynos_gem_obj[i] = to_exynos_gem_obj(obj); | 166 | exynos_fb->exynos_gem_obj[i] = to_exynos_gem_obj(obj); |
158 | } | 167 | } |
159 | 168 | ||
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h index 3ecb30d93552..50823756cdea 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h | |||
@@ -31,10 +31,10 @@ | |||
31 | static inline int exynos_drm_format_num_buffers(uint32_t format) | 31 | static inline int exynos_drm_format_num_buffers(uint32_t format) |
32 | { | 32 | { |
33 | switch (format) { | 33 | switch (format) { |
34 | case DRM_FORMAT_NV12M: | 34 | case DRM_FORMAT_NV12: |
35 | case DRM_FORMAT_NV12MT: | 35 | case DRM_FORMAT_NV12MT: |
36 | return 2; | 36 | return 2; |
37 | case DRM_FORMAT_YUV420M: | 37 | case DRM_FORMAT_YUV420: |
38 | return 3; | 38 | return 3; |
39 | default: | 39 | default: |
40 | return 1; | 40 | return 1; |
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index fc91293c4560..5c8b683029ea 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c | |||
@@ -689,7 +689,6 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, | |||
689 | struct drm_device *dev, uint32_t handle, | 689 | struct drm_device *dev, uint32_t handle, |
690 | uint64_t *offset) | 690 | uint64_t *offset) |
691 | { | 691 | { |
692 | struct exynos_drm_gem_obj *exynos_gem_obj; | ||
693 | struct drm_gem_object *obj; | 692 | struct drm_gem_object *obj; |
694 | int ret = 0; | 693 | int ret = 0; |
695 | 694 | ||
@@ -710,15 +709,13 @@ int exynos_drm_gem_dumb_map_offset(struct drm_file *file_priv, | |||
710 | goto unlock; | 709 | goto unlock; |
711 | } | 710 | } |
712 | 711 | ||
713 | exynos_gem_obj = to_exynos_gem_obj(obj); | 712 | if (!obj->map_list.map) { |
714 | 713 | ret = drm_gem_create_mmap_offset(obj); | |
715 | if (!exynos_gem_obj->base.map_list.map) { | ||
716 | ret = drm_gem_create_mmap_offset(&exynos_gem_obj->base); | ||
717 | if (ret) | 714 | if (ret) |
718 | goto out; | 715 | goto out; |
719 | } | 716 | } |
720 | 717 | ||
721 | *offset = (u64)exynos_gem_obj->base.map_list.hash.key << PAGE_SHIFT; | 718 | *offset = (u64)obj->map_list.hash.key << PAGE_SHIFT; |
722 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); | 719 | DRM_DEBUG_KMS("offset = 0x%lx\n", (unsigned long)*offset); |
723 | 720 | ||
724 | out: | 721 | out: |
diff --git a/drivers/gpu/drm/exynos/exynos_mixer.c b/drivers/gpu/drm/exynos/exynos_mixer.c index 68ef01028375..e2147a2ddcec 100644 --- a/drivers/gpu/drm/exynos/exynos_mixer.c +++ b/drivers/gpu/drm/exynos/exynos_mixer.c | |||
@@ -365,7 +365,7 @@ static void vp_video_buffer(struct mixer_context *ctx, int win) | |||
365 | switch (win_data->pixel_format) { | 365 | switch (win_data->pixel_format) { |
366 | case DRM_FORMAT_NV12MT: | 366 | case DRM_FORMAT_NV12MT: |
367 | tiled_mode = true; | 367 | tiled_mode = true; |
368 | case DRM_FORMAT_NV12M: | 368 | case DRM_FORMAT_NV12: |
369 | crcb_mode = false; | 369 | crcb_mode = false; |
370 | buf_num = 2; | 370 | buf_num = 2; |
371 | break; | 371 | break; |
@@ -601,18 +601,20 @@ static void mixer_win_reset(struct mixer_context *ctx) | |||
601 | mixer_reg_write(res, MXR_BG_COLOR2, 0x008080); | 601 | mixer_reg_write(res, MXR_BG_COLOR2, 0x008080); |
602 | 602 | ||
603 | /* setting graphical layers */ | 603 | /* setting graphical layers */ |
604 | |||
605 | val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ | 604 | val = MXR_GRP_CFG_COLOR_KEY_DISABLE; /* no blank key */ |
606 | val |= MXR_GRP_CFG_WIN_BLEND_EN; | 605 | val |= MXR_GRP_CFG_WIN_BLEND_EN; |
606 | val |= MXR_GRP_CFG_BLEND_PRE_MUL; | ||
607 | val |= MXR_GRP_CFG_PIXEL_BLEND_EN; | ||
607 | val |= MXR_GRP_CFG_ALPHA_VAL(0xff); /* non-transparent alpha */ | 608 | val |= MXR_GRP_CFG_ALPHA_VAL(0xff); /* non-transparent alpha */ |
608 | 609 | ||
609 | /* the same configuration for both layers */ | 610 | /* the same configuration for both layers */ |
610 | mixer_reg_write(res, MXR_GRAPHIC_CFG(0), val); | 611 | mixer_reg_write(res, MXR_GRAPHIC_CFG(0), val); |
611 | |||
612 | val |= MXR_GRP_CFG_BLEND_PRE_MUL; | ||
613 | val |= MXR_GRP_CFG_PIXEL_BLEND_EN; | ||
614 | mixer_reg_write(res, MXR_GRAPHIC_CFG(1), val); | 612 | mixer_reg_write(res, MXR_GRAPHIC_CFG(1), val); |
615 | 613 | ||
614 | /* setting video layers */ | ||
615 | val = MXR_GRP_CFG_ALPHA_VAL(0); | ||
616 | mixer_reg_write(res, MXR_VIDEO_CFG, val); | ||
617 | |||
616 | /* configuration of Video Processor Registers */ | 618 | /* configuration of Video Processor Registers */ |
617 | vp_win_reset(ctx); | 619 | vp_win_reset(ctx); |
618 | vp_default_filter(res); | 620 | vp_default_filter(res); |
diff --git a/drivers/gpu/drm/i810/i810_dma.c b/drivers/gpu/drm/i810/i810_dma.c index f920fb5e42b6..fa9439159ebd 100644 --- a/drivers/gpu/drm/i810/i810_dma.c +++ b/drivers/gpu/drm/i810/i810_dma.c | |||
@@ -130,11 +130,10 @@ static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv) | |||
130 | return -EINVAL; | 130 | return -EINVAL; |
131 | 131 | ||
132 | /* This is all entirely broken */ | 132 | /* This is all entirely broken */ |
133 | down_write(¤t->mm->mmap_sem); | ||
134 | old_fops = file_priv->filp->f_op; | 133 | old_fops = file_priv->filp->f_op; |
135 | file_priv->filp->f_op = &i810_buffer_fops; | 134 | file_priv->filp->f_op = &i810_buffer_fops; |
136 | dev_priv->mmap_buffer = buf; | 135 | dev_priv->mmap_buffer = buf; |
137 | buf_priv->virtual = (void *)do_mmap(file_priv->filp, 0, buf->total, | 136 | buf_priv->virtual = (void *)vm_mmap(file_priv->filp, 0, buf->total, |
138 | PROT_READ | PROT_WRITE, | 137 | PROT_READ | PROT_WRITE, |
139 | MAP_SHARED, buf->bus_address); | 138 | MAP_SHARED, buf->bus_address); |
140 | dev_priv->mmap_buffer = NULL; | 139 | dev_priv->mmap_buffer = NULL; |
@@ -145,7 +144,6 @@ static int i810_map_buffer(struct drm_buf *buf, struct drm_file *file_priv) | |||
145 | retcode = PTR_ERR(buf_priv->virtual); | 144 | retcode = PTR_ERR(buf_priv->virtual); |
146 | buf_priv->virtual = NULL; | 145 | buf_priv->virtual = NULL; |
147 | } | 146 | } |
148 | up_write(¤t->mm->mmap_sem); | ||
149 | 147 | ||
150 | return retcode; | 148 | return retcode; |
151 | } | 149 | } |
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c index 05adbf23951a..a378c0800304 100644 --- a/drivers/gpu/drm/i915/i915_drv.c +++ b/drivers/gpu/drm/i915/i915_drv.c | |||
@@ -233,6 +233,7 @@ static const struct intel_device_info intel_sandybridge_d_info = { | |||
233 | .has_blt_ring = 1, | 233 | .has_blt_ring = 1, |
234 | .has_llc = 1, | 234 | .has_llc = 1, |
235 | .has_pch_split = 1, | 235 | .has_pch_split = 1, |
236 | .has_force_wake = 1, | ||
236 | }; | 237 | }; |
237 | 238 | ||
238 | static const struct intel_device_info intel_sandybridge_m_info = { | 239 | static const struct intel_device_info intel_sandybridge_m_info = { |
@@ -243,6 +244,7 @@ static const struct intel_device_info intel_sandybridge_m_info = { | |||
243 | .has_blt_ring = 1, | 244 | .has_blt_ring = 1, |
244 | .has_llc = 1, | 245 | .has_llc = 1, |
245 | .has_pch_split = 1, | 246 | .has_pch_split = 1, |
247 | .has_force_wake = 1, | ||
246 | }; | 248 | }; |
247 | 249 | ||
248 | static const struct intel_device_info intel_ivybridge_d_info = { | 250 | static const struct intel_device_info intel_ivybridge_d_info = { |
@@ -252,6 +254,7 @@ static const struct intel_device_info intel_ivybridge_d_info = { | |||
252 | .has_blt_ring = 1, | 254 | .has_blt_ring = 1, |
253 | .has_llc = 1, | 255 | .has_llc = 1, |
254 | .has_pch_split = 1, | 256 | .has_pch_split = 1, |
257 | .has_force_wake = 1, | ||
255 | }; | 258 | }; |
256 | 259 | ||
257 | static const struct intel_device_info intel_ivybridge_m_info = { | 260 | static const struct intel_device_info intel_ivybridge_m_info = { |
@@ -262,6 +265,7 @@ static const struct intel_device_info intel_ivybridge_m_info = { | |||
262 | .has_blt_ring = 1, | 265 | .has_blt_ring = 1, |
263 | .has_llc = 1, | 266 | .has_llc = 1, |
264 | .has_pch_split = 1, | 267 | .has_pch_split = 1, |
268 | .has_force_wake = 1, | ||
265 | }; | 269 | }; |
266 | 270 | ||
267 | static const struct intel_device_info intel_valleyview_m_info = { | 271 | static const struct intel_device_info intel_valleyview_m_info = { |
@@ -289,6 +293,7 @@ static const struct intel_device_info intel_haswell_d_info = { | |||
289 | .has_blt_ring = 1, | 293 | .has_blt_ring = 1, |
290 | .has_llc = 1, | 294 | .has_llc = 1, |
291 | .has_pch_split = 1, | 295 | .has_pch_split = 1, |
296 | .has_force_wake = 1, | ||
292 | }; | 297 | }; |
293 | 298 | ||
294 | static const struct intel_device_info intel_haswell_m_info = { | 299 | static const struct intel_device_info intel_haswell_m_info = { |
@@ -298,6 +303,7 @@ static const struct intel_device_info intel_haswell_m_info = { | |||
298 | .has_blt_ring = 1, | 303 | .has_blt_ring = 1, |
299 | .has_llc = 1, | 304 | .has_llc = 1, |
300 | .has_pch_split = 1, | 305 | .has_pch_split = 1, |
306 | .has_force_wake = 1, | ||
301 | }; | 307 | }; |
302 | 308 | ||
303 | static const struct pci_device_id pciidlist[] = { /* aka */ | 309 | static const struct pci_device_id pciidlist[] = { /* aka */ |
@@ -1144,10 +1150,9 @@ MODULE_LICENSE("GPL and additional rights"); | |||
1144 | 1150 | ||
1145 | /* We give fast paths for the really cool registers */ | 1151 | /* We give fast paths for the really cool registers */ |
1146 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ | 1152 | #define NEEDS_FORCE_WAKE(dev_priv, reg) \ |
1147 | (((dev_priv)->info->gen >= 6) && \ | 1153 | ((HAS_FORCE_WAKE((dev_priv)->dev)) && \ |
1148 | ((reg) < 0x40000) && \ | 1154 | ((reg) < 0x40000) && \ |
1149 | ((reg) != FORCEWAKE)) && \ | 1155 | ((reg) != FORCEWAKE)) |
1150 | (!IS_VALLEYVIEW((dev_priv)->dev)) | ||
1151 | 1156 | ||
1152 | static bool IS_DISPLAYREG(u32 reg) | 1157 | static bool IS_DISPLAYREG(u32 reg) |
1153 | { | 1158 | { |
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 24ef5d77927f..a0c15abbdcef 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -286,6 +286,7 @@ struct intel_device_info { | |||
286 | u8 is_ivybridge:1; | 286 | u8 is_ivybridge:1; |
287 | u8 is_valleyview:1; | 287 | u8 is_valleyview:1; |
288 | u8 has_pch_split:1; | 288 | u8 has_pch_split:1; |
289 | u8 has_force_wake:1; | ||
289 | u8 is_haswell:1; | 290 | u8 is_haswell:1; |
290 | u8 has_fbc:1; | 291 | u8 has_fbc:1; |
291 | u8 has_pipe_cxsr:1; | 292 | u8 has_pipe_cxsr:1; |
@@ -1122,6 +1123,8 @@ struct drm_i915_file_private { | |||
1122 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) | 1123 | #define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT) |
1123 | #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) | 1124 | #define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX) |
1124 | 1125 | ||
1126 | #define HAS_FORCE_WAKE(dev) (INTEL_INFO(dev)->has_force_wake) | ||
1127 | |||
1125 | #include "i915_trace.h" | 1128 | #include "i915_trace.h" |
1126 | 1129 | ||
1127 | /** | 1130 | /** |
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c index 84975e1e1f05..23f2ea0f0651 100644 --- a/drivers/gpu/drm/i915/i915_irq.c +++ b/drivers/gpu/drm/i915/i915_irq.c | |||
@@ -585,7 +585,7 @@ out: | |||
585 | return ret; | 585 | return ret; |
586 | } | 586 | } |
587 | 587 | ||
588 | static void pch_irq_handler(struct drm_device *dev, u32 pch_iir) | 588 | static void ibx_irq_handler(struct drm_device *dev, u32 pch_iir) |
589 | { | 589 | { |
590 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | 590 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; |
591 | int pipe; | 591 | int pipe; |
@@ -625,6 +625,35 @@ static void pch_irq_handler(struct drm_device *dev, u32 pch_iir) | |||
625 | DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); | 625 | DRM_DEBUG_DRIVER("PCH transcoder A underrun interrupt\n"); |
626 | } | 626 | } |
627 | 627 | ||
628 | static void cpt_irq_handler(struct drm_device *dev, u32 pch_iir) | ||
629 | { | ||
630 | drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; | ||
631 | int pipe; | ||
632 | |||
633 | if (pch_iir & SDE_AUDIO_POWER_MASK_CPT) | ||
634 | DRM_DEBUG_DRIVER("PCH audio power change on port %d\n", | ||
635 | (pch_iir & SDE_AUDIO_POWER_MASK_CPT) >> | ||
636 | SDE_AUDIO_POWER_SHIFT_CPT); | ||
637 | |||
638 | if (pch_iir & SDE_AUX_MASK_CPT) | ||
639 | DRM_DEBUG_DRIVER("AUX channel interrupt\n"); | ||
640 | |||
641 | if (pch_iir & SDE_GMBUS_CPT) | ||
642 | DRM_DEBUG_DRIVER("PCH GMBUS interrupt\n"); | ||
643 | |||
644 | if (pch_iir & SDE_AUDIO_CP_REQ_CPT) | ||
645 | DRM_DEBUG_DRIVER("Audio CP request interrupt\n"); | ||
646 | |||
647 | if (pch_iir & SDE_AUDIO_CP_CHG_CPT) | ||
648 | DRM_DEBUG_DRIVER("Audio CP change interrupt\n"); | ||
649 | |||
650 | if (pch_iir & SDE_FDI_MASK_CPT) | ||
651 | for_each_pipe(pipe) | ||
652 | DRM_DEBUG_DRIVER(" pipe %c FDI IIR: 0x%08x\n", | ||
653 | pipe_name(pipe), | ||
654 | I915_READ(FDI_RX_IIR(pipe))); | ||
655 | } | ||
656 | |||
628 | static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | 657 | static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) |
629 | { | 658 | { |
630 | struct drm_device *dev = (struct drm_device *) arg; | 659 | struct drm_device *dev = (struct drm_device *) arg; |
@@ -666,7 +695,7 @@ static irqreturn_t ivybridge_irq_handler(DRM_IRQ_ARGS) | |||
666 | 695 | ||
667 | if (pch_iir & SDE_HOTPLUG_MASK_CPT) | 696 | if (pch_iir & SDE_HOTPLUG_MASK_CPT) |
668 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); | 697 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
669 | pch_irq_handler(dev, pch_iir); | 698 | cpt_irq_handler(dev, pch_iir); |
670 | 699 | ||
671 | /* clear PCH hotplug event before clear CPU irq */ | 700 | /* clear PCH hotplug event before clear CPU irq */ |
672 | I915_WRITE(SDEIIR, pch_iir); | 701 | I915_WRITE(SDEIIR, pch_iir); |
@@ -759,7 +788,10 @@ static irqreturn_t ironlake_irq_handler(DRM_IRQ_ARGS) | |||
759 | if (de_iir & DE_PCH_EVENT) { | 788 | if (de_iir & DE_PCH_EVENT) { |
760 | if (pch_iir & hotplug_mask) | 789 | if (pch_iir & hotplug_mask) |
761 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); | 790 | queue_work(dev_priv->wq, &dev_priv->hotplug_work); |
762 | pch_irq_handler(dev, pch_iir); | 791 | if (HAS_PCH_CPT(dev)) |
792 | cpt_irq_handler(dev, pch_iir); | ||
793 | else | ||
794 | ibx_irq_handler(dev, pch_iir); | ||
763 | } | 795 | } |
764 | 796 | ||
765 | if (de_iir & DE_PCU_EVENT) { | 797 | if (de_iir & DE_PCU_EVENT) { |
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h index 0a61481cd2c2..9dfc4c5ff31e 100644 --- a/drivers/gpu/drm/i915/i915_reg.h +++ b/drivers/gpu/drm/i915/i915_reg.h | |||
@@ -210,9 +210,17 @@ | |||
210 | #define MI_DISPLAY_FLIP MI_INSTR(0x14, 2) | 210 | #define MI_DISPLAY_FLIP MI_INSTR(0x14, 2) |
211 | #define MI_DISPLAY_FLIP_I915 MI_INSTR(0x14, 1) | 211 | #define MI_DISPLAY_FLIP_I915 MI_INSTR(0x14, 1) |
212 | #define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20) | 212 | #define MI_DISPLAY_FLIP_PLANE(n) ((n) << 20) |
213 | /* IVB has funny definitions for which plane to flip. */ | ||
214 | #define MI_DISPLAY_FLIP_IVB_PLANE_A (0 << 19) | ||
215 | #define MI_DISPLAY_FLIP_IVB_PLANE_B (1 << 19) | ||
216 | #define MI_DISPLAY_FLIP_IVB_SPRITE_A (2 << 19) | ||
217 | #define MI_DISPLAY_FLIP_IVB_SPRITE_B (3 << 19) | ||
218 | #define MI_DISPLAY_FLIP_IVB_PLANE_C (4 << 19) | ||
219 | #define MI_DISPLAY_FLIP_IVB_SPRITE_C (5 << 19) | ||
213 | #define MI_ARB_ON_OFF MI_INSTR(0x08, 0) | 220 | #define MI_ARB_ON_OFF MI_INSTR(0x08, 0) |
214 | #define MI_ARB_ENABLE (1<<0) | 221 | #define MI_ARB_ENABLE (1<<0) |
215 | #define MI_ARB_DISABLE (0<<0) | 222 | #define MI_ARB_DISABLE (0<<0) |
223 | |||
216 | #define MI_SET_CONTEXT MI_INSTR(0x18, 0) | 224 | #define MI_SET_CONTEXT MI_INSTR(0x18, 0) |
217 | #define MI_MM_SPACE_GTT (1<<8) | 225 | #define MI_MM_SPACE_GTT (1<<8) |
218 | #define MI_MM_SPACE_PHYSICAL (0<<8) | 226 | #define MI_MM_SPACE_PHYSICAL (0<<8) |
@@ -3391,7 +3399,7 @@ | |||
3391 | 3399 | ||
3392 | /* PCH */ | 3400 | /* PCH */ |
3393 | 3401 | ||
3394 | /* south display engine interrupt */ | 3402 | /* south display engine interrupt: IBX */ |
3395 | #define SDE_AUDIO_POWER_D (1 << 27) | 3403 | #define SDE_AUDIO_POWER_D (1 << 27) |
3396 | #define SDE_AUDIO_POWER_C (1 << 26) | 3404 | #define SDE_AUDIO_POWER_C (1 << 26) |
3397 | #define SDE_AUDIO_POWER_B (1 << 25) | 3405 | #define SDE_AUDIO_POWER_B (1 << 25) |
@@ -3427,15 +3435,44 @@ | |||
3427 | #define SDE_TRANSA_CRC_ERR (1 << 1) | 3435 | #define SDE_TRANSA_CRC_ERR (1 << 1) |
3428 | #define SDE_TRANSA_FIFO_UNDER (1 << 0) | 3436 | #define SDE_TRANSA_FIFO_UNDER (1 << 0) |
3429 | #define SDE_TRANS_MASK (0x3f) | 3437 | #define SDE_TRANS_MASK (0x3f) |
3430 | /* CPT */ | 3438 | |
3431 | #define SDE_CRT_HOTPLUG_CPT (1 << 19) | 3439 | /* south display engine interrupt: CPT/PPT */ |
3440 | #define SDE_AUDIO_POWER_D_CPT (1 << 31) | ||
3441 | #define SDE_AUDIO_POWER_C_CPT (1 << 30) | ||
3442 | #define SDE_AUDIO_POWER_B_CPT (1 << 29) | ||
3443 | #define SDE_AUDIO_POWER_SHIFT_CPT 29 | ||
3444 | #define SDE_AUDIO_POWER_MASK_CPT (7 << 29) | ||
3445 | #define SDE_AUXD_CPT (1 << 27) | ||
3446 | #define SDE_AUXC_CPT (1 << 26) | ||
3447 | #define SDE_AUXB_CPT (1 << 25) | ||
3448 | #define SDE_AUX_MASK_CPT (7 << 25) | ||
3432 | #define SDE_PORTD_HOTPLUG_CPT (1 << 23) | 3449 | #define SDE_PORTD_HOTPLUG_CPT (1 << 23) |
3433 | #define SDE_PORTC_HOTPLUG_CPT (1 << 22) | 3450 | #define SDE_PORTC_HOTPLUG_CPT (1 << 22) |
3434 | #define SDE_PORTB_HOTPLUG_CPT (1 << 21) | 3451 | #define SDE_PORTB_HOTPLUG_CPT (1 << 21) |
3452 | #define SDE_CRT_HOTPLUG_CPT (1 << 19) | ||
3435 | #define SDE_HOTPLUG_MASK_CPT (SDE_CRT_HOTPLUG_CPT | \ | 3453 | #define SDE_HOTPLUG_MASK_CPT (SDE_CRT_HOTPLUG_CPT | \ |
3436 | SDE_PORTD_HOTPLUG_CPT | \ | 3454 | SDE_PORTD_HOTPLUG_CPT | \ |
3437 | SDE_PORTC_HOTPLUG_CPT | \ | 3455 | SDE_PORTC_HOTPLUG_CPT | \ |
3438 | SDE_PORTB_HOTPLUG_CPT) | 3456 | SDE_PORTB_HOTPLUG_CPT) |
3457 | #define SDE_GMBUS_CPT (1 << 17) | ||
3458 | #define SDE_AUDIO_CP_REQ_C_CPT (1 << 10) | ||
3459 | #define SDE_AUDIO_CP_CHG_C_CPT (1 << 9) | ||
3460 | #define SDE_FDI_RXC_CPT (1 << 8) | ||
3461 | #define SDE_AUDIO_CP_REQ_B_CPT (1 << 6) | ||
3462 | #define SDE_AUDIO_CP_CHG_B_CPT (1 << 5) | ||
3463 | #define SDE_FDI_RXB_CPT (1 << 4) | ||
3464 | #define SDE_AUDIO_CP_REQ_A_CPT (1 << 2) | ||
3465 | #define SDE_AUDIO_CP_CHG_A_CPT (1 << 1) | ||
3466 | #define SDE_FDI_RXA_CPT (1 << 0) | ||
3467 | #define SDE_AUDIO_CP_REQ_CPT (SDE_AUDIO_CP_REQ_C_CPT | \ | ||
3468 | SDE_AUDIO_CP_REQ_B_CPT | \ | ||
3469 | SDE_AUDIO_CP_REQ_A_CPT) | ||
3470 | #define SDE_AUDIO_CP_CHG_CPT (SDE_AUDIO_CP_CHG_C_CPT | \ | ||
3471 | SDE_AUDIO_CP_CHG_B_CPT | \ | ||
3472 | SDE_AUDIO_CP_CHG_A_CPT) | ||
3473 | #define SDE_FDI_MASK_CPT (SDE_FDI_RXC_CPT | \ | ||
3474 | SDE_FDI_RXB_CPT | \ | ||
3475 | SDE_FDI_RXA_CPT) | ||
3439 | 3476 | ||
3440 | #define SDEISR 0xc4000 | 3477 | #define SDEISR 0xc4000 |
3441 | #define SDEIMR 0xc4004 | 3478 | #define SDEIMR 0xc4004 |
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 06721c0e9f98..b3052ef70d16 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c | |||
@@ -6377,17 +6377,34 @@ static int intel_gen7_queue_flip(struct drm_device *dev, | |||
6377 | struct drm_i915_private *dev_priv = dev->dev_private; | 6377 | struct drm_i915_private *dev_priv = dev->dev_private; |
6378 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); | 6378 | struct intel_crtc *intel_crtc = to_intel_crtc(crtc); |
6379 | struct intel_ring_buffer *ring = &dev_priv->ring[BCS]; | 6379 | struct intel_ring_buffer *ring = &dev_priv->ring[BCS]; |
6380 | uint32_t plane_bit = 0; | ||
6380 | int ret; | 6381 | int ret; |
6381 | 6382 | ||
6382 | ret = intel_pin_and_fence_fb_obj(dev, obj, ring); | 6383 | ret = intel_pin_and_fence_fb_obj(dev, obj, ring); |
6383 | if (ret) | 6384 | if (ret) |
6384 | goto err; | 6385 | goto err; |
6385 | 6386 | ||
6387 | switch(intel_crtc->plane) { | ||
6388 | case PLANE_A: | ||
6389 | plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_A; | ||
6390 | break; | ||
6391 | case PLANE_B: | ||
6392 | plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_B; | ||
6393 | break; | ||
6394 | case PLANE_C: | ||
6395 | plane_bit = MI_DISPLAY_FLIP_IVB_PLANE_C; | ||
6396 | break; | ||
6397 | default: | ||
6398 | WARN_ONCE(1, "unknown plane in flip command\n"); | ||
6399 | ret = -ENODEV; | ||
6400 | goto err; | ||
6401 | } | ||
6402 | |||
6386 | ret = intel_ring_begin(ring, 4); | 6403 | ret = intel_ring_begin(ring, 4); |
6387 | if (ret) | 6404 | if (ret) |
6388 | goto err_unpin; | 6405 | goto err_unpin; |
6389 | 6406 | ||
6390 | intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | (intel_crtc->plane << 19)); | 6407 | intel_ring_emit(ring, MI_DISPLAY_FLIP_I915 | plane_bit); |
6391 | intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); | 6408 | intel_ring_emit(ring, (fb->pitches[0] | obj->tiling_mode)); |
6392 | intel_ring_emit(ring, (obj->gtt_offset)); | 6409 | intel_ring_emit(ring, (obj->gtt_offset)); |
6393 | intel_ring_emit(ring, (MI_NOOP)); | 6410 | intel_ring_emit(ring, (MI_NOOP)); |
@@ -6760,7 +6777,7 @@ static void intel_setup_outputs(struct drm_device *dev) | |||
6760 | if (I915_READ(HDMIC) & PORT_DETECTED) | 6777 | if (I915_READ(HDMIC) & PORT_DETECTED) |
6761 | intel_hdmi_init(dev, HDMIC); | 6778 | intel_hdmi_init(dev, HDMIC); |
6762 | 6779 | ||
6763 | if (I915_READ(HDMID) & PORT_DETECTED) | 6780 | if (!dpd_is_edp && I915_READ(HDMID) & PORT_DETECTED) |
6764 | intel_hdmi_init(dev, HDMID); | 6781 | intel_hdmi_init(dev, HDMID); |
6765 | 6782 | ||
6766 | if (I915_READ(PCH_DP_C) & DP_DETECTED) | 6783 | if (I915_READ(PCH_DP_C) & DP_DETECTED) |
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c index 6538c46fe959..76a708029dcb 100644 --- a/drivers/gpu/drm/i915/intel_dp.c +++ b/drivers/gpu/drm/i915/intel_dp.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "drm.h" | 32 | #include "drm.h" |
33 | #include "drm_crtc.h" | 33 | #include "drm_crtc.h" |
34 | #include "drm_crtc_helper.h" | 34 | #include "drm_crtc_helper.h" |
35 | #include "drm_edid.h" | ||
35 | #include "intel_drv.h" | 36 | #include "intel_drv.h" |
36 | #include "i915_drm.h" | 37 | #include "i915_drm.h" |
37 | #include "i915_drv.h" | 38 | #include "i915_drv.h" |
@@ -67,6 +68,8 @@ struct intel_dp { | |||
67 | struct drm_display_mode *panel_fixed_mode; /* for eDP */ | 68 | struct drm_display_mode *panel_fixed_mode; /* for eDP */ |
68 | struct delayed_work panel_vdd_work; | 69 | struct delayed_work panel_vdd_work; |
69 | bool want_panel_vdd; | 70 | bool want_panel_vdd; |
71 | struct edid *edid; /* cached EDID for eDP */ | ||
72 | int edid_mode_count; | ||
70 | }; | 73 | }; |
71 | 74 | ||
72 | /** | 75 | /** |
@@ -383,7 +386,7 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
383 | int recv_bytes; | 386 | int recv_bytes; |
384 | uint32_t status; | 387 | uint32_t status; |
385 | uint32_t aux_clock_divider; | 388 | uint32_t aux_clock_divider; |
386 | int try, precharge = 5; | 389 | int try, precharge; |
387 | 390 | ||
388 | intel_dp_check_edp(intel_dp); | 391 | intel_dp_check_edp(intel_dp); |
389 | /* The clock divider is based off the hrawclk, | 392 | /* The clock divider is based off the hrawclk, |
@@ -403,6 +406,11 @@ intel_dp_aux_ch(struct intel_dp *intel_dp, | |||
403 | else | 406 | else |
404 | aux_clock_divider = intel_hrawclk(dev) / 2; | 407 | aux_clock_divider = intel_hrawclk(dev) / 2; |
405 | 408 | ||
409 | if (IS_GEN6(dev)) | ||
410 | precharge = 3; | ||
411 | else | ||
412 | precharge = 5; | ||
413 | |||
406 | /* Try to wait for any previous AUX channel activity */ | 414 | /* Try to wait for any previous AUX channel activity */ |
407 | for (try = 0; try < 3; try++) { | 415 | for (try = 0; try < 3; try++) { |
408 | status = I915_READ(ch_ctl); | 416 | status = I915_READ(ch_ctl); |
@@ -1980,6 +1988,8 @@ intel_dp_probe_oui(struct intel_dp *intel_dp) | |||
1980 | if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT)) | 1988 | if (!(intel_dp->dpcd[DP_DOWN_STREAM_PORT_COUNT] & DP_OUI_SUPPORT)) |
1981 | return; | 1989 | return; |
1982 | 1990 | ||
1991 | ironlake_edp_panel_vdd_on(intel_dp); | ||
1992 | |||
1983 | if (intel_dp_aux_native_read_retry(intel_dp, DP_SINK_OUI, buf, 3)) | 1993 | if (intel_dp_aux_native_read_retry(intel_dp, DP_SINK_OUI, buf, 3)) |
1984 | DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n", | 1994 | DRM_DEBUG_KMS("Sink OUI: %02hx%02hx%02hx\n", |
1985 | buf[0], buf[1], buf[2]); | 1995 | buf[0], buf[1], buf[2]); |
@@ -1987,6 +1997,8 @@ intel_dp_probe_oui(struct intel_dp *intel_dp) | |||
1987 | if (intel_dp_aux_native_read_retry(intel_dp, DP_BRANCH_OUI, buf, 3)) | 1997 | if (intel_dp_aux_native_read_retry(intel_dp, DP_BRANCH_OUI, buf, 3)) |
1988 | DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n", | 1998 | DRM_DEBUG_KMS("Branch OUI: %02hx%02hx%02hx\n", |
1989 | buf[0], buf[1], buf[2]); | 1999 | buf[0], buf[1], buf[2]); |
2000 | |||
2001 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
1990 | } | 2002 | } |
1991 | 2003 | ||
1992 | static bool | 2004 | static bool |
@@ -2121,10 +2133,22 @@ intel_dp_get_edid(struct drm_connector *connector, struct i2c_adapter *adapter) | |||
2121 | { | 2133 | { |
2122 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 2134 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
2123 | struct edid *edid; | 2135 | struct edid *edid; |
2136 | int size; | ||
2137 | |||
2138 | if (is_edp(intel_dp)) { | ||
2139 | if (!intel_dp->edid) | ||
2140 | return NULL; | ||
2141 | |||
2142 | size = (intel_dp->edid->extensions + 1) * EDID_LENGTH; | ||
2143 | edid = kmalloc(size, GFP_KERNEL); | ||
2144 | if (!edid) | ||
2145 | return NULL; | ||
2146 | |||
2147 | memcpy(edid, intel_dp->edid, size); | ||
2148 | return edid; | ||
2149 | } | ||
2124 | 2150 | ||
2125 | ironlake_edp_panel_vdd_on(intel_dp); | ||
2126 | edid = drm_get_edid(connector, adapter); | 2151 | edid = drm_get_edid(connector, adapter); |
2127 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
2128 | return edid; | 2152 | return edid; |
2129 | } | 2153 | } |
2130 | 2154 | ||
@@ -2134,9 +2158,17 @@ intel_dp_get_edid_modes(struct drm_connector *connector, struct i2c_adapter *ada | |||
2134 | struct intel_dp *intel_dp = intel_attached_dp(connector); | 2158 | struct intel_dp *intel_dp = intel_attached_dp(connector); |
2135 | int ret; | 2159 | int ret; |
2136 | 2160 | ||
2137 | ironlake_edp_panel_vdd_on(intel_dp); | 2161 | if (is_edp(intel_dp)) { |
2162 | drm_mode_connector_update_edid_property(connector, | ||
2163 | intel_dp->edid); | ||
2164 | ret = drm_add_edid_modes(connector, intel_dp->edid); | ||
2165 | drm_edid_to_eld(connector, | ||
2166 | intel_dp->edid); | ||
2167 | connector->display_info.raw_edid = NULL; | ||
2168 | return intel_dp->edid_mode_count; | ||
2169 | } | ||
2170 | |||
2138 | ret = intel_ddc_get_modes(connector, adapter); | 2171 | ret = intel_ddc_get_modes(connector, adapter); |
2139 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
2140 | return ret; | 2172 | return ret; |
2141 | } | 2173 | } |
2142 | 2174 | ||
@@ -2326,6 +2358,7 @@ static void intel_dp_encoder_destroy(struct drm_encoder *encoder) | |||
2326 | i2c_del_adapter(&intel_dp->adapter); | 2358 | i2c_del_adapter(&intel_dp->adapter); |
2327 | drm_encoder_cleanup(encoder); | 2359 | drm_encoder_cleanup(encoder); |
2328 | if (is_edp(intel_dp)) { | 2360 | if (is_edp(intel_dp)) { |
2361 | kfree(intel_dp->edid); | ||
2329 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); | 2362 | cancel_delayed_work_sync(&intel_dp->panel_vdd_work); |
2330 | ironlake_panel_vdd_off_sync(intel_dp); | 2363 | ironlake_panel_vdd_off_sync(intel_dp); |
2331 | } | 2364 | } |
@@ -2509,11 +2542,14 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
2509 | break; | 2542 | break; |
2510 | } | 2543 | } |
2511 | 2544 | ||
2545 | intel_dp_i2c_init(intel_dp, intel_connector, name); | ||
2546 | |||
2512 | /* Cache some DPCD data in the eDP case */ | 2547 | /* Cache some DPCD data in the eDP case */ |
2513 | if (is_edp(intel_dp)) { | 2548 | if (is_edp(intel_dp)) { |
2514 | bool ret; | 2549 | bool ret; |
2515 | struct edp_power_seq cur, vbt; | 2550 | struct edp_power_seq cur, vbt; |
2516 | u32 pp_on, pp_off, pp_div; | 2551 | u32 pp_on, pp_off, pp_div; |
2552 | struct edid *edid; | ||
2517 | 2553 | ||
2518 | pp_on = I915_READ(PCH_PP_ON_DELAYS); | 2554 | pp_on = I915_READ(PCH_PP_ON_DELAYS); |
2519 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); | 2555 | pp_off = I915_READ(PCH_PP_OFF_DELAYS); |
@@ -2581,9 +2617,19 @@ intel_dp_init(struct drm_device *dev, int output_reg) | |||
2581 | intel_dp_destroy(&intel_connector->base); | 2617 | intel_dp_destroy(&intel_connector->base); |
2582 | return; | 2618 | return; |
2583 | } | 2619 | } |
2584 | } | ||
2585 | 2620 | ||
2586 | intel_dp_i2c_init(intel_dp, intel_connector, name); | 2621 | ironlake_edp_panel_vdd_on(intel_dp); |
2622 | edid = drm_get_edid(connector, &intel_dp->adapter); | ||
2623 | if (edid) { | ||
2624 | drm_mode_connector_update_edid_property(connector, | ||
2625 | edid); | ||
2626 | intel_dp->edid_mode_count = | ||
2627 | drm_add_edid_modes(connector, edid); | ||
2628 | drm_edid_to_eld(connector, edid); | ||
2629 | intel_dp->edid = edid; | ||
2630 | } | ||
2631 | ironlake_edp_panel_vdd_off(intel_dp, false); | ||
2632 | } | ||
2587 | 2633 | ||
2588 | intel_encoder->hot_plug = intel_dp_hot_plug; | 2634 | intel_encoder->hot_plug = intel_dp_hot_plug; |
2589 | 2635 | ||
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 7a16f16371e6..f30a53a8917e 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -267,10 +267,15 @@ u32 intel_ring_get_active_head(struct intel_ring_buffer *ring) | |||
267 | 267 | ||
268 | static int init_ring_common(struct intel_ring_buffer *ring) | 268 | static int init_ring_common(struct intel_ring_buffer *ring) |
269 | { | 269 | { |
270 | drm_i915_private_t *dev_priv = ring->dev->dev_private; | 270 | struct drm_device *dev = ring->dev; |
271 | drm_i915_private_t *dev_priv = dev->dev_private; | ||
271 | struct drm_i915_gem_object *obj = ring->obj; | 272 | struct drm_i915_gem_object *obj = ring->obj; |
273 | int ret = 0; | ||
272 | u32 head; | 274 | u32 head; |
273 | 275 | ||
276 | if (HAS_FORCE_WAKE(dev)) | ||
277 | gen6_gt_force_wake_get(dev_priv); | ||
278 | |||
274 | /* Stop the ring if it's running. */ | 279 | /* Stop the ring if it's running. */ |
275 | I915_WRITE_CTL(ring, 0); | 280 | I915_WRITE_CTL(ring, 0); |
276 | I915_WRITE_HEAD(ring, 0); | 281 | I915_WRITE_HEAD(ring, 0); |
@@ -318,7 +323,8 @@ static int init_ring_common(struct intel_ring_buffer *ring) | |||
318 | I915_READ_HEAD(ring), | 323 | I915_READ_HEAD(ring), |
319 | I915_READ_TAIL(ring), | 324 | I915_READ_TAIL(ring), |
320 | I915_READ_START(ring)); | 325 | I915_READ_START(ring)); |
321 | return -EIO; | 326 | ret = -EIO; |
327 | goto out; | ||
322 | } | 328 | } |
323 | 329 | ||
324 | if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) | 330 | if (!drm_core_check_feature(ring->dev, DRIVER_MODESET)) |
@@ -327,9 +333,14 @@ static int init_ring_common(struct intel_ring_buffer *ring) | |||
327 | ring->head = I915_READ_HEAD(ring); | 333 | ring->head = I915_READ_HEAD(ring); |
328 | ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; | 334 | ring->tail = I915_READ_TAIL(ring) & TAIL_ADDR; |
329 | ring->space = ring_space(ring); | 335 | ring->space = ring_space(ring); |
336 | ring->last_retired_head = -1; | ||
330 | } | 337 | } |
331 | 338 | ||
332 | return 0; | 339 | out: |
340 | if (HAS_FORCE_WAKE(dev)) | ||
341 | gen6_gt_force_wake_put(dev_priv); | ||
342 | |||
343 | return ret; | ||
333 | } | 344 | } |
334 | 345 | ||
335 | static int | 346 | static int |
@@ -1006,6 +1017,10 @@ static int intel_init_ring_buffer(struct drm_device *dev, | |||
1006 | if (ret) | 1017 | if (ret) |
1007 | goto err_unref; | 1018 | goto err_unref; |
1008 | 1019 | ||
1020 | ret = i915_gem_object_set_to_gtt_domain(obj, true); | ||
1021 | if (ret) | ||
1022 | goto err_unpin; | ||
1023 | |||
1009 | ring->virtual_start = | 1024 | ring->virtual_start = |
1010 | ioremap_wc(dev_priv->mm.gtt->gma_bus_addr + obj->gtt_offset, | 1025 | ioremap_wc(dev_priv->mm.gtt->gma_bus_addr + obj->gtt_offset, |
1011 | ring->size); | 1026 | ring->size); |
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.c b/drivers/gpu/drm/mgag200/mgag200_drv.c index 3c8e04f54713..93e832d6c328 100644 --- a/drivers/gpu/drm/mgag200/mgag200_drv.c +++ b/drivers/gpu/drm/mgag200/mgag200_drv.c | |||
@@ -41,9 +41,28 @@ static DEFINE_PCI_DEVICE_TABLE(pciidlist) = { | |||
41 | 41 | ||
42 | MODULE_DEVICE_TABLE(pci, pciidlist); | 42 | MODULE_DEVICE_TABLE(pci, pciidlist); |
43 | 43 | ||
44 | static void mgag200_kick_out_firmware_fb(struct pci_dev *pdev) | ||
45 | { | ||
46 | struct apertures_struct *ap; | ||
47 | bool primary = false; | ||
48 | |||
49 | ap = alloc_apertures(1); | ||
50 | ap->ranges[0].base = pci_resource_start(pdev, 0); | ||
51 | ap->ranges[0].size = pci_resource_len(pdev, 0); | ||
52 | |||
53 | #ifdef CONFIG_X86 | ||
54 | primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; | ||
55 | #endif | ||
56 | remove_conflicting_framebuffers(ap, "mgag200drmfb", primary); | ||
57 | kfree(ap); | ||
58 | } | ||
59 | |||
60 | |||
44 | static int __devinit | 61 | static int __devinit |
45 | mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) | 62 | mga_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
46 | { | 63 | { |
64 | mgag200_kick_out_firmware_fb(pdev); | ||
65 | |||
47 | return drm_get_pci_dev(pdev, ent, &driver); | 66 | return drm_get_pci_dev(pdev, ent, &driver); |
48 | } | 67 | } |
49 | 68 | ||
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 01d77d1554f4..3904d7964a4b 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -1149,7 +1149,9 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1149 | } | 1149 | } |
1150 | 1150 | ||
1151 | if (tiling_flags & RADEON_TILING_MACRO) { | 1151 | if (tiling_flags & RADEON_TILING_MACRO) { |
1152 | if (rdev->family >= CHIP_CAYMAN) | 1152 | if (rdev->family >= CHIP_TAHITI) |
1153 | tmp = rdev->config.si.tile_config; | ||
1154 | else if (rdev->family >= CHIP_CAYMAN) | ||
1153 | tmp = rdev->config.cayman.tile_config; | 1155 | tmp = rdev->config.cayman.tile_config; |
1154 | else | 1156 | else |
1155 | tmp = rdev->config.evergreen.tile_config; | 1157 | tmp = rdev->config.evergreen.tile_config; |
@@ -1177,6 +1179,12 @@ static int dce4_crtc_do_set_base(struct drm_crtc *crtc, | |||
1177 | } else if (tiling_flags & RADEON_TILING_MICRO) | 1179 | } else if (tiling_flags & RADEON_TILING_MICRO) |
1178 | fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1); | 1180 | fb_format |= EVERGREEN_GRPH_ARRAY_MODE(EVERGREEN_GRPH_ARRAY_1D_TILED_THIN1); |
1179 | 1181 | ||
1182 | if ((rdev->family == CHIP_TAHITI) || | ||
1183 | (rdev->family == CHIP_PITCAIRN)) | ||
1184 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P8_32x32_8x16); | ||
1185 | else if (rdev->family == CHIP_VERDE) | ||
1186 | fb_format |= SI_GRPH_PIPE_CONFIG(SI_ADDR_SURF_P4_8x16); | ||
1187 | |||
1180 | switch (radeon_crtc->crtc_id) { | 1188 | switch (radeon_crtc->crtc_id) { |
1181 | case 0: | 1189 | case 0: |
1182 | WREG32(AVIVO_D1VGA_CONTROL, 0); | 1190 | WREG32(AVIVO_D1VGA_CONTROL, 0); |
diff --git a/drivers/gpu/drm/radeon/atombios_encoders.c b/drivers/gpu/drm/radeon/atombios_encoders.c index e7b1ec5ae8c6..486ccdf4aacd 100644 --- a/drivers/gpu/drm/radeon/atombios_encoders.c +++ b/drivers/gpu/drm/radeon/atombios_encoders.c | |||
@@ -1926,7 +1926,9 @@ radeon_atom_encoder_mode_set(struct drm_encoder *encoder, | |||
1926 | 1926 | ||
1927 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { | 1927 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_HDMI) { |
1928 | r600_hdmi_enable(encoder); | 1928 | r600_hdmi_enable(encoder); |
1929 | if (ASIC_IS_DCE4(rdev)) | 1929 | if (ASIC_IS_DCE6(rdev)) |
1930 | ; /* TODO (use pointers instead of if-s?) */ | ||
1931 | else if (ASIC_IS_DCE4(rdev)) | ||
1930 | evergreen_hdmi_setmode(encoder, adjusted_mode); | 1932 | evergreen_hdmi_setmode(encoder, adjusted_mode); |
1931 | else | 1933 | else |
1932 | r600_hdmi_setmode(encoder, adjusted_mode); | 1934 | r600_hdmi_setmode(encoder, adjusted_mode); |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 58991af90502..7fb3d2e0434c 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -1029,6 +1029,11 @@ int evergreen_pcie_gart_enable(struct radeon_device *rdev) | |||
1029 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | 1029 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); |
1030 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | 1030 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); |
1031 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | 1031 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); |
1032 | if ((rdev->family == CHIP_JUNIPER) || | ||
1033 | (rdev->family == CHIP_CYPRESS) || | ||
1034 | (rdev->family == CHIP_HEMLOCK) || | ||
1035 | (rdev->family == CHIP_BARTS)) | ||
1036 | WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); | ||
1032 | } | 1037 | } |
1033 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | 1038 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); |
1034 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | 1039 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); |
@@ -1553,163 +1558,10 @@ int evergreen_cp_resume(struct radeon_device *rdev) | |||
1553 | /* | 1558 | /* |
1554 | * Core functions | 1559 | * Core functions |
1555 | */ | 1560 | */ |
1556 | static u32 evergreen_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | ||
1557 | u32 num_tile_pipes, | ||
1558 | u32 num_backends, | ||
1559 | u32 backend_disable_mask) | ||
1560 | { | ||
1561 | u32 backend_map = 0; | ||
1562 | u32 enabled_backends_mask = 0; | ||
1563 | u32 enabled_backends_count = 0; | ||
1564 | u32 cur_pipe; | ||
1565 | u32 swizzle_pipe[EVERGREEN_MAX_PIPES]; | ||
1566 | u32 cur_backend = 0; | ||
1567 | u32 i; | ||
1568 | bool force_no_swizzle; | ||
1569 | |||
1570 | if (num_tile_pipes > EVERGREEN_MAX_PIPES) | ||
1571 | num_tile_pipes = EVERGREEN_MAX_PIPES; | ||
1572 | if (num_tile_pipes < 1) | ||
1573 | num_tile_pipes = 1; | ||
1574 | if (num_backends > EVERGREEN_MAX_BACKENDS) | ||
1575 | num_backends = EVERGREEN_MAX_BACKENDS; | ||
1576 | if (num_backends < 1) | ||
1577 | num_backends = 1; | ||
1578 | |||
1579 | for (i = 0; i < EVERGREEN_MAX_BACKENDS; ++i) { | ||
1580 | if (((backend_disable_mask >> i) & 1) == 0) { | ||
1581 | enabled_backends_mask |= (1 << i); | ||
1582 | ++enabled_backends_count; | ||
1583 | } | ||
1584 | if (enabled_backends_count == num_backends) | ||
1585 | break; | ||
1586 | } | ||
1587 | |||
1588 | if (enabled_backends_count == 0) { | ||
1589 | enabled_backends_mask = 1; | ||
1590 | enabled_backends_count = 1; | ||
1591 | } | ||
1592 | |||
1593 | if (enabled_backends_count != num_backends) | ||
1594 | num_backends = enabled_backends_count; | ||
1595 | |||
1596 | memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * EVERGREEN_MAX_PIPES); | ||
1597 | switch (rdev->family) { | ||
1598 | case CHIP_CEDAR: | ||
1599 | case CHIP_REDWOOD: | ||
1600 | case CHIP_PALM: | ||
1601 | case CHIP_SUMO: | ||
1602 | case CHIP_SUMO2: | ||
1603 | case CHIP_TURKS: | ||
1604 | case CHIP_CAICOS: | ||
1605 | force_no_swizzle = false; | ||
1606 | break; | ||
1607 | case CHIP_CYPRESS: | ||
1608 | case CHIP_HEMLOCK: | ||
1609 | case CHIP_JUNIPER: | ||
1610 | case CHIP_BARTS: | ||
1611 | default: | ||
1612 | force_no_swizzle = true; | ||
1613 | break; | ||
1614 | } | ||
1615 | if (force_no_swizzle) { | ||
1616 | bool last_backend_enabled = false; | ||
1617 | |||
1618 | force_no_swizzle = false; | ||
1619 | for (i = 0; i < EVERGREEN_MAX_BACKENDS; ++i) { | ||
1620 | if (((enabled_backends_mask >> i) & 1) == 1) { | ||
1621 | if (last_backend_enabled) | ||
1622 | force_no_swizzle = true; | ||
1623 | last_backend_enabled = true; | ||
1624 | } else | ||
1625 | last_backend_enabled = false; | ||
1626 | } | ||
1627 | } | ||
1628 | |||
1629 | switch (num_tile_pipes) { | ||
1630 | case 1: | ||
1631 | case 3: | ||
1632 | case 5: | ||
1633 | case 7: | ||
1634 | DRM_ERROR("odd number of pipes!\n"); | ||
1635 | break; | ||
1636 | case 2: | ||
1637 | swizzle_pipe[0] = 0; | ||
1638 | swizzle_pipe[1] = 1; | ||
1639 | break; | ||
1640 | case 4: | ||
1641 | if (force_no_swizzle) { | ||
1642 | swizzle_pipe[0] = 0; | ||
1643 | swizzle_pipe[1] = 1; | ||
1644 | swizzle_pipe[2] = 2; | ||
1645 | swizzle_pipe[3] = 3; | ||
1646 | } else { | ||
1647 | swizzle_pipe[0] = 0; | ||
1648 | swizzle_pipe[1] = 2; | ||
1649 | swizzle_pipe[2] = 1; | ||
1650 | swizzle_pipe[3] = 3; | ||
1651 | } | ||
1652 | break; | ||
1653 | case 6: | ||
1654 | if (force_no_swizzle) { | ||
1655 | swizzle_pipe[0] = 0; | ||
1656 | swizzle_pipe[1] = 1; | ||
1657 | swizzle_pipe[2] = 2; | ||
1658 | swizzle_pipe[3] = 3; | ||
1659 | swizzle_pipe[4] = 4; | ||
1660 | swizzle_pipe[5] = 5; | ||
1661 | } else { | ||
1662 | swizzle_pipe[0] = 0; | ||
1663 | swizzle_pipe[1] = 2; | ||
1664 | swizzle_pipe[2] = 4; | ||
1665 | swizzle_pipe[3] = 1; | ||
1666 | swizzle_pipe[4] = 3; | ||
1667 | swizzle_pipe[5] = 5; | ||
1668 | } | ||
1669 | break; | ||
1670 | case 8: | ||
1671 | if (force_no_swizzle) { | ||
1672 | swizzle_pipe[0] = 0; | ||
1673 | swizzle_pipe[1] = 1; | ||
1674 | swizzle_pipe[2] = 2; | ||
1675 | swizzle_pipe[3] = 3; | ||
1676 | swizzle_pipe[4] = 4; | ||
1677 | swizzle_pipe[5] = 5; | ||
1678 | swizzle_pipe[6] = 6; | ||
1679 | swizzle_pipe[7] = 7; | ||
1680 | } else { | ||
1681 | swizzle_pipe[0] = 0; | ||
1682 | swizzle_pipe[1] = 2; | ||
1683 | swizzle_pipe[2] = 4; | ||
1684 | swizzle_pipe[3] = 6; | ||
1685 | swizzle_pipe[4] = 1; | ||
1686 | swizzle_pipe[5] = 3; | ||
1687 | swizzle_pipe[6] = 5; | ||
1688 | swizzle_pipe[7] = 7; | ||
1689 | } | ||
1690 | break; | ||
1691 | } | ||
1692 | |||
1693 | for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) { | ||
1694 | while (((1 << cur_backend) & enabled_backends_mask) == 0) | ||
1695 | cur_backend = (cur_backend + 1) % EVERGREEN_MAX_BACKENDS; | ||
1696 | |||
1697 | backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4))); | ||
1698 | |||
1699 | cur_backend = (cur_backend + 1) % EVERGREEN_MAX_BACKENDS; | ||
1700 | } | ||
1701 | |||
1702 | return backend_map; | ||
1703 | } | ||
1704 | |||
1705 | static void evergreen_gpu_init(struct radeon_device *rdev) | 1561 | static void evergreen_gpu_init(struct radeon_device *rdev) |
1706 | { | 1562 | { |
1707 | u32 cc_rb_backend_disable = 0; | 1563 | u32 gb_addr_config; |
1708 | u32 cc_gc_shader_pipe_config; | ||
1709 | u32 gb_addr_config = 0; | ||
1710 | u32 mc_shared_chmap, mc_arb_ramcfg; | 1564 | u32 mc_shared_chmap, mc_arb_ramcfg; |
1711 | u32 gb_backend_map; | ||
1712 | u32 grbm_gfx_index; | ||
1713 | u32 sx_debug_1; | 1565 | u32 sx_debug_1; |
1714 | u32 smx_dc_ctl0; | 1566 | u32 smx_dc_ctl0; |
1715 | u32 sq_config; | 1567 | u32 sq_config; |
@@ -1724,6 +1576,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1724 | u32 sq_stack_resource_mgmt_3; | 1576 | u32 sq_stack_resource_mgmt_3; |
1725 | u32 vgt_cache_invalidation; | 1577 | u32 vgt_cache_invalidation; |
1726 | u32 hdp_host_path_cntl, tmp; | 1578 | u32 hdp_host_path_cntl, tmp; |
1579 | u32 disabled_rb_mask; | ||
1727 | int i, j, num_shader_engines, ps_thread_count; | 1580 | int i, j, num_shader_engines, ps_thread_count; |
1728 | 1581 | ||
1729 | switch (rdev->family) { | 1582 | switch (rdev->family) { |
@@ -1748,6 +1601,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1748 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | 1601 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; |
1749 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1602 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1750 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1603 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1604 | gb_addr_config = CYPRESS_GB_ADDR_CONFIG_GOLDEN; | ||
1751 | break; | 1605 | break; |
1752 | case CHIP_JUNIPER: | 1606 | case CHIP_JUNIPER: |
1753 | rdev->config.evergreen.num_ses = 1; | 1607 | rdev->config.evergreen.num_ses = 1; |
@@ -1769,6 +1623,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1769 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | 1623 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; |
1770 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1624 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1771 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1625 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1626 | gb_addr_config = JUNIPER_GB_ADDR_CONFIG_GOLDEN; | ||
1772 | break; | 1627 | break; |
1773 | case CHIP_REDWOOD: | 1628 | case CHIP_REDWOOD: |
1774 | rdev->config.evergreen.num_ses = 1; | 1629 | rdev->config.evergreen.num_ses = 1; |
@@ -1790,6 +1645,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1790 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | 1645 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; |
1791 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1646 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1792 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1647 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1648 | gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | ||
1793 | break; | 1649 | break; |
1794 | case CHIP_CEDAR: | 1650 | case CHIP_CEDAR: |
1795 | default: | 1651 | default: |
@@ -1812,6 +1668,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1812 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1668 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
1813 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1669 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1814 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1670 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1671 | gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN; | ||
1815 | break; | 1672 | break; |
1816 | case CHIP_PALM: | 1673 | case CHIP_PALM: |
1817 | rdev->config.evergreen.num_ses = 1; | 1674 | rdev->config.evergreen.num_ses = 1; |
@@ -1833,6 +1690,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1833 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1690 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
1834 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1691 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1835 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1692 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1693 | gb_addr_config = CEDAR_GB_ADDR_CONFIG_GOLDEN; | ||
1836 | break; | 1694 | break; |
1837 | case CHIP_SUMO: | 1695 | case CHIP_SUMO: |
1838 | rdev->config.evergreen.num_ses = 1; | 1696 | rdev->config.evergreen.num_ses = 1; |
@@ -1860,6 +1718,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1860 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1718 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
1861 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1719 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1862 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1720 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1721 | gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | ||
1863 | break; | 1722 | break; |
1864 | case CHIP_SUMO2: | 1723 | case CHIP_SUMO2: |
1865 | rdev->config.evergreen.num_ses = 1; | 1724 | rdev->config.evergreen.num_ses = 1; |
@@ -1881,6 +1740,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1881 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1740 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
1882 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1741 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1883 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1742 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1743 | gb_addr_config = REDWOOD_GB_ADDR_CONFIG_GOLDEN; | ||
1884 | break; | 1744 | break; |
1885 | case CHIP_BARTS: | 1745 | case CHIP_BARTS: |
1886 | rdev->config.evergreen.num_ses = 2; | 1746 | rdev->config.evergreen.num_ses = 2; |
@@ -1902,6 +1762,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1902 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | 1762 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; |
1903 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1763 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1904 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1764 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1765 | gb_addr_config = BARTS_GB_ADDR_CONFIG_GOLDEN; | ||
1905 | break; | 1766 | break; |
1906 | case CHIP_TURKS: | 1767 | case CHIP_TURKS: |
1907 | rdev->config.evergreen.num_ses = 1; | 1768 | rdev->config.evergreen.num_ses = 1; |
@@ -1923,6 +1784,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1923 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; | 1784 | rdev->config.evergreen.sc_prim_fifo_size = 0x100; |
1924 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1785 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1925 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1786 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1787 | gb_addr_config = TURKS_GB_ADDR_CONFIG_GOLDEN; | ||
1926 | break; | 1788 | break; |
1927 | case CHIP_CAICOS: | 1789 | case CHIP_CAICOS: |
1928 | rdev->config.evergreen.num_ses = 1; | 1790 | rdev->config.evergreen.num_ses = 1; |
@@ -1944,6 +1806,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1944 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; | 1806 | rdev->config.evergreen.sc_prim_fifo_size = 0x40; |
1945 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; | 1807 | rdev->config.evergreen.sc_hiz_tile_fifo_size = 0x30; |
1946 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; | 1808 | rdev->config.evergreen.sc_earlyz_tile_fifo_size = 0x130; |
1809 | gb_addr_config = CAICOS_GB_ADDR_CONFIG_GOLDEN; | ||
1947 | break; | 1810 | break; |
1948 | } | 1811 | } |
1949 | 1812 | ||
@@ -1960,20 +1823,6 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1960 | 1823 | ||
1961 | evergreen_fix_pci_max_read_req_size(rdev); | 1824 | evergreen_fix_pci_max_read_req_size(rdev); |
1962 | 1825 | ||
1963 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & ~2; | ||
1964 | |||
1965 | cc_gc_shader_pipe_config |= | ||
1966 | INACTIVE_QD_PIPES((EVERGREEN_MAX_PIPES_MASK << rdev->config.evergreen.max_pipes) | ||
1967 | & EVERGREEN_MAX_PIPES_MASK); | ||
1968 | cc_gc_shader_pipe_config |= | ||
1969 | INACTIVE_SIMDS((EVERGREEN_MAX_SIMDS_MASK << rdev->config.evergreen.max_simds) | ||
1970 | & EVERGREEN_MAX_SIMDS_MASK); | ||
1971 | |||
1972 | cc_rb_backend_disable = | ||
1973 | BACKEND_DISABLE((EVERGREEN_MAX_BACKENDS_MASK << rdev->config.evergreen.max_backends) | ||
1974 | & EVERGREEN_MAX_BACKENDS_MASK); | ||
1975 | |||
1976 | |||
1977 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); | 1826 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); |
1978 | if ((rdev->family == CHIP_PALM) || | 1827 | if ((rdev->family == CHIP_PALM) || |
1979 | (rdev->family == CHIP_SUMO) || | 1828 | (rdev->family == CHIP_SUMO) || |
@@ -1982,134 +1831,6 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
1982 | else | 1831 | else |
1983 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); | 1832 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); |
1984 | 1833 | ||
1985 | switch (rdev->config.evergreen.max_tile_pipes) { | ||
1986 | case 1: | ||
1987 | default: | ||
1988 | gb_addr_config |= NUM_PIPES(0); | ||
1989 | break; | ||
1990 | case 2: | ||
1991 | gb_addr_config |= NUM_PIPES(1); | ||
1992 | break; | ||
1993 | case 4: | ||
1994 | gb_addr_config |= NUM_PIPES(2); | ||
1995 | break; | ||
1996 | case 8: | ||
1997 | gb_addr_config |= NUM_PIPES(3); | ||
1998 | break; | ||
1999 | } | ||
2000 | |||
2001 | gb_addr_config |= PIPE_INTERLEAVE_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); | ||
2002 | gb_addr_config |= BANK_INTERLEAVE_SIZE(0); | ||
2003 | gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.evergreen.num_ses - 1); | ||
2004 | gb_addr_config |= SHADER_ENGINE_TILE_SIZE(1); | ||
2005 | gb_addr_config |= NUM_GPUS(0); /* Hemlock? */ | ||
2006 | gb_addr_config |= MULTI_GPU_TILE_SIZE(2); | ||
2007 | |||
2008 | if (((mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT) > 2) | ||
2009 | gb_addr_config |= ROW_SIZE(2); | ||
2010 | else | ||
2011 | gb_addr_config |= ROW_SIZE((mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT); | ||
2012 | |||
2013 | if (rdev->ddev->pdev->device == 0x689e) { | ||
2014 | u32 efuse_straps_4; | ||
2015 | u32 efuse_straps_3; | ||
2016 | u8 efuse_box_bit_131_124; | ||
2017 | |||
2018 | WREG32(RCU_IND_INDEX, 0x204); | ||
2019 | efuse_straps_4 = RREG32(RCU_IND_DATA); | ||
2020 | WREG32(RCU_IND_INDEX, 0x203); | ||
2021 | efuse_straps_3 = RREG32(RCU_IND_DATA); | ||
2022 | efuse_box_bit_131_124 = (u8)(((efuse_straps_4 & 0xf) << 4) | ((efuse_straps_3 & 0xf0000000) >> 28)); | ||
2023 | |||
2024 | switch(efuse_box_bit_131_124) { | ||
2025 | case 0x00: | ||
2026 | gb_backend_map = 0x76543210; | ||
2027 | break; | ||
2028 | case 0x55: | ||
2029 | gb_backend_map = 0x77553311; | ||
2030 | break; | ||
2031 | case 0x56: | ||
2032 | gb_backend_map = 0x77553300; | ||
2033 | break; | ||
2034 | case 0x59: | ||
2035 | gb_backend_map = 0x77552211; | ||
2036 | break; | ||
2037 | case 0x66: | ||
2038 | gb_backend_map = 0x77443300; | ||
2039 | break; | ||
2040 | case 0x99: | ||
2041 | gb_backend_map = 0x66552211; | ||
2042 | break; | ||
2043 | case 0x5a: | ||
2044 | gb_backend_map = 0x77552200; | ||
2045 | break; | ||
2046 | case 0xaa: | ||
2047 | gb_backend_map = 0x66442200; | ||
2048 | break; | ||
2049 | case 0x95: | ||
2050 | gb_backend_map = 0x66553311; | ||
2051 | break; | ||
2052 | default: | ||
2053 | DRM_ERROR("bad backend map, using default\n"); | ||
2054 | gb_backend_map = | ||
2055 | evergreen_get_tile_pipe_to_backend_map(rdev, | ||
2056 | rdev->config.evergreen.max_tile_pipes, | ||
2057 | rdev->config.evergreen.max_backends, | ||
2058 | ((EVERGREEN_MAX_BACKENDS_MASK << | ||
2059 | rdev->config.evergreen.max_backends) & | ||
2060 | EVERGREEN_MAX_BACKENDS_MASK)); | ||
2061 | break; | ||
2062 | } | ||
2063 | } else if (rdev->ddev->pdev->device == 0x68b9) { | ||
2064 | u32 efuse_straps_3; | ||
2065 | u8 efuse_box_bit_127_124; | ||
2066 | |||
2067 | WREG32(RCU_IND_INDEX, 0x203); | ||
2068 | efuse_straps_3 = RREG32(RCU_IND_DATA); | ||
2069 | efuse_box_bit_127_124 = (u8)((efuse_straps_3 & 0xF0000000) >> 28); | ||
2070 | |||
2071 | switch(efuse_box_bit_127_124) { | ||
2072 | case 0x0: | ||
2073 | gb_backend_map = 0x00003210; | ||
2074 | break; | ||
2075 | case 0x5: | ||
2076 | case 0x6: | ||
2077 | case 0x9: | ||
2078 | case 0xa: | ||
2079 | gb_backend_map = 0x00003311; | ||
2080 | break; | ||
2081 | default: | ||
2082 | DRM_ERROR("bad backend map, using default\n"); | ||
2083 | gb_backend_map = | ||
2084 | evergreen_get_tile_pipe_to_backend_map(rdev, | ||
2085 | rdev->config.evergreen.max_tile_pipes, | ||
2086 | rdev->config.evergreen.max_backends, | ||
2087 | ((EVERGREEN_MAX_BACKENDS_MASK << | ||
2088 | rdev->config.evergreen.max_backends) & | ||
2089 | EVERGREEN_MAX_BACKENDS_MASK)); | ||
2090 | break; | ||
2091 | } | ||
2092 | } else { | ||
2093 | switch (rdev->family) { | ||
2094 | case CHIP_CYPRESS: | ||
2095 | case CHIP_HEMLOCK: | ||
2096 | case CHIP_BARTS: | ||
2097 | gb_backend_map = 0x66442200; | ||
2098 | break; | ||
2099 | case CHIP_JUNIPER: | ||
2100 | gb_backend_map = 0x00002200; | ||
2101 | break; | ||
2102 | default: | ||
2103 | gb_backend_map = | ||
2104 | evergreen_get_tile_pipe_to_backend_map(rdev, | ||
2105 | rdev->config.evergreen.max_tile_pipes, | ||
2106 | rdev->config.evergreen.max_backends, | ||
2107 | ((EVERGREEN_MAX_BACKENDS_MASK << | ||
2108 | rdev->config.evergreen.max_backends) & | ||
2109 | EVERGREEN_MAX_BACKENDS_MASK)); | ||
2110 | } | ||
2111 | } | ||
2112 | |||
2113 | /* setup tiling info dword. gb_addr_config is not adequate since it does | 1834 | /* setup tiling info dword. gb_addr_config is not adequate since it does |
2114 | * not have bank info, so create a custom tiling dword. | 1835 | * not have bank info, so create a custom tiling dword. |
2115 | * bits 3:0 num_pipes | 1836 | * bits 3:0 num_pipes |
@@ -2136,45 +1857,54 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
2136 | /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ | 1857 | /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ |
2137 | if (rdev->flags & RADEON_IS_IGP) | 1858 | if (rdev->flags & RADEON_IS_IGP) |
2138 | rdev->config.evergreen.tile_config |= 1 << 4; | 1859 | rdev->config.evergreen.tile_config |= 1 << 4; |
2139 | else | 1860 | else { |
2140 | rdev->config.evergreen.tile_config |= | 1861 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) |
2141 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; | 1862 | rdev->config.evergreen.tile_config |= 1 << 4; |
2142 | rdev->config.evergreen.tile_config |= | 1863 | else |
2143 | ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) << 8; | 1864 | rdev->config.evergreen.tile_config |= 0 << 4; |
1865 | } | ||
1866 | rdev->config.evergreen.tile_config |= 0 << 8; | ||
2144 | rdev->config.evergreen.tile_config |= | 1867 | rdev->config.evergreen.tile_config |= |
2145 | ((gb_addr_config & 0x30000000) >> 28) << 12; | 1868 | ((gb_addr_config & 0x30000000) >> 28) << 12; |
2146 | 1869 | ||
2147 | rdev->config.evergreen.backend_map = gb_backend_map; | 1870 | num_shader_engines = (gb_addr_config & NUM_SHADER_ENGINES(3) >> 12) + 1; |
2148 | WREG32(GB_BACKEND_MAP, gb_backend_map); | ||
2149 | WREG32(GB_ADDR_CONFIG, gb_addr_config); | ||
2150 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | ||
2151 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); | ||
2152 | 1871 | ||
2153 | num_shader_engines = ((RREG32(GB_ADDR_CONFIG) & NUM_SHADER_ENGINES(3)) >> 12) + 1; | 1872 | if ((rdev->family >= CHIP_CEDAR) && (rdev->family <= CHIP_HEMLOCK)) { |
2154 | grbm_gfx_index = INSTANCE_BROADCAST_WRITES; | 1873 | u32 efuse_straps_4; |
2155 | 1874 | u32 efuse_straps_3; | |
2156 | for (i = 0; i < rdev->config.evergreen.num_ses; i++) { | ||
2157 | u32 rb = cc_rb_backend_disable | (0xf0 << 16); | ||
2158 | u32 sp = cc_gc_shader_pipe_config; | ||
2159 | u32 gfx = grbm_gfx_index | SE_INDEX(i); | ||
2160 | 1875 | ||
2161 | if (i == num_shader_engines) { | 1876 | WREG32(RCU_IND_INDEX, 0x204); |
2162 | rb |= BACKEND_DISABLE(EVERGREEN_MAX_BACKENDS_MASK); | 1877 | efuse_straps_4 = RREG32(RCU_IND_DATA); |
2163 | sp |= INACTIVE_SIMDS(EVERGREEN_MAX_SIMDS_MASK); | 1878 | WREG32(RCU_IND_INDEX, 0x203); |
1879 | efuse_straps_3 = RREG32(RCU_IND_DATA); | ||
1880 | tmp = (((efuse_straps_4 & 0xf) << 4) | | ||
1881 | ((efuse_straps_3 & 0xf0000000) >> 28)); | ||
1882 | } else { | ||
1883 | tmp = 0; | ||
1884 | for (i = (rdev->config.evergreen.num_ses - 1); i >= 0; i--) { | ||
1885 | u32 rb_disable_bitmap; | ||
1886 | |||
1887 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); | ||
1888 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); | ||
1889 | rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16; | ||
1890 | tmp <<= 4; | ||
1891 | tmp |= rb_disable_bitmap; | ||
2164 | } | 1892 | } |
1893 | } | ||
1894 | /* enabled rb are just the one not disabled :) */ | ||
1895 | disabled_rb_mask = tmp; | ||
2165 | 1896 | ||
2166 | WREG32(GRBM_GFX_INDEX, gfx); | 1897 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); |
2167 | WREG32(RLC_GFX_INDEX, gfx); | 1898 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); |
2168 | 1899 | ||
2169 | WREG32(CC_RB_BACKEND_DISABLE, rb); | 1900 | WREG32(GB_ADDR_CONFIG, gb_addr_config); |
2170 | WREG32(CC_SYS_RB_BACKEND_DISABLE, rb); | 1901 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
2171 | WREG32(GC_USER_RB_BACKEND_DISABLE, rb); | 1902 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); |
2172 | WREG32(CC_GC_SHADER_PIPE_CONFIG, sp); | ||
2173 | } | ||
2174 | 1903 | ||
2175 | grbm_gfx_index |= SE_BROADCAST_WRITES; | 1904 | tmp = gb_addr_config & NUM_PIPES_MASK; |
2176 | WREG32(GRBM_GFX_INDEX, grbm_gfx_index); | 1905 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.evergreen.max_backends, |
2177 | WREG32(RLC_GFX_INDEX, grbm_gfx_index); | 1906 | EVERGREEN_MAX_BACKENDS, disabled_rb_mask); |
1907 | WREG32(GB_BACKEND_MAP, tmp); | ||
2178 | 1908 | ||
2179 | WREG32(CGTS_SYS_TCC_DISABLE, 0); | 1909 | WREG32(CGTS_SYS_TCC_DISABLE, 0); |
2180 | WREG32(CGTS_TCC_DISABLE, 0); | 1910 | WREG32(CGTS_TCC_DISABLE, 0); |
@@ -2202,6 +1932,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
2202 | smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets); | 1932 | smx_dc_ctl0 |= NUMBER_OF_SETS(rdev->config.evergreen.sx_num_of_sets); |
2203 | WREG32(SMX_DC_CTL0, smx_dc_ctl0); | 1933 | WREG32(SMX_DC_CTL0, smx_dc_ctl0); |
2204 | 1934 | ||
1935 | if (rdev->family <= CHIP_SUMO2) | ||
1936 | WREG32(SMX_SAR_CTL0, 0x00010000); | ||
1937 | |||
2205 | WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) | | 1938 | WREG32(SX_EXPORT_BUFFER_SIZES, (COLOR_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_size / 4) - 1) | |
2206 | POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) | | 1939 | POSITION_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_pos_size / 4) - 1) | |
2207 | SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1))); | 1940 | SMX_BUFFER_SIZE((rdev->config.evergreen.sx_max_export_smx_size / 4) - 1))); |
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 4e7dd2b4843d..c16554122ccd 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -52,6 +52,7 @@ struct evergreen_cs_track { | |||
52 | u32 cb_color_view[12]; | 52 | u32 cb_color_view[12]; |
53 | u32 cb_color_pitch[12]; | 53 | u32 cb_color_pitch[12]; |
54 | u32 cb_color_slice[12]; | 54 | u32 cb_color_slice[12]; |
55 | u32 cb_color_slice_idx[12]; | ||
55 | u32 cb_color_attrib[12]; | 56 | u32 cb_color_attrib[12]; |
56 | u32 cb_color_cmask_slice[8];/* unused */ | 57 | u32 cb_color_cmask_slice[8];/* unused */ |
57 | u32 cb_color_fmask_slice[8];/* unused */ | 58 | u32 cb_color_fmask_slice[8];/* unused */ |
@@ -127,12 +128,14 @@ static void evergreen_cs_track_init(struct evergreen_cs_track *track) | |||
127 | track->cb_color_info[i] = 0; | 128 | track->cb_color_info[i] = 0; |
128 | track->cb_color_view[i] = 0xFFFFFFFF; | 129 | track->cb_color_view[i] = 0xFFFFFFFF; |
129 | track->cb_color_pitch[i] = 0; | 130 | track->cb_color_pitch[i] = 0; |
130 | track->cb_color_slice[i] = 0; | 131 | track->cb_color_slice[i] = 0xfffffff; |
132 | track->cb_color_slice_idx[i] = 0; | ||
131 | } | 133 | } |
132 | track->cb_target_mask = 0xFFFFFFFF; | 134 | track->cb_target_mask = 0xFFFFFFFF; |
133 | track->cb_shader_mask = 0xFFFFFFFF; | 135 | track->cb_shader_mask = 0xFFFFFFFF; |
134 | track->cb_dirty = true; | 136 | track->cb_dirty = true; |
135 | 137 | ||
138 | track->db_depth_slice = 0xffffffff; | ||
136 | track->db_depth_view = 0xFFFFC000; | 139 | track->db_depth_view = 0xFFFFC000; |
137 | track->db_depth_size = 0xFFFFFFFF; | 140 | track->db_depth_size = 0xFFFFFFFF; |
138 | track->db_depth_control = 0xFFFFFFFF; | 141 | track->db_depth_control = 0xFFFFFFFF; |
@@ -250,10 +253,9 @@ static int evergreen_surface_check_2d(struct radeon_cs_parser *p, | |||
250 | { | 253 | { |
251 | struct evergreen_cs_track *track = p->track; | 254 | struct evergreen_cs_track *track = p->track; |
252 | unsigned palign, halign, tileb, slice_pt; | 255 | unsigned palign, halign, tileb, slice_pt; |
256 | unsigned mtile_pr, mtile_ps, mtileb; | ||
253 | 257 | ||
254 | tileb = 64 * surf->bpe * surf->nsamples; | 258 | tileb = 64 * surf->bpe * surf->nsamples; |
255 | palign = track->group_size / (8 * surf->bpe * surf->nsamples); | ||
256 | palign = MAX(8, palign); | ||
257 | slice_pt = 1; | 259 | slice_pt = 1; |
258 | if (tileb > surf->tsplit) { | 260 | if (tileb > surf->tsplit) { |
259 | slice_pt = tileb / surf->tsplit; | 261 | slice_pt = tileb / surf->tsplit; |
@@ -262,7 +264,10 @@ static int evergreen_surface_check_2d(struct radeon_cs_parser *p, | |||
262 | /* macro tile width & height */ | 264 | /* macro tile width & height */ |
263 | palign = (8 * surf->bankw * track->npipes) * surf->mtilea; | 265 | palign = (8 * surf->bankw * track->npipes) * surf->mtilea; |
264 | halign = (8 * surf->bankh * surf->nbanks) / surf->mtilea; | 266 | halign = (8 * surf->bankh * surf->nbanks) / surf->mtilea; |
265 | surf->layer_size = surf->nbx * surf->nby * surf->bpe * slice_pt; | 267 | mtileb = (palign / 8) * (halign / 8) * tileb;; |
268 | mtile_pr = surf->nbx / palign; | ||
269 | mtile_ps = (mtile_pr * surf->nby) / halign; | ||
270 | surf->layer_size = mtile_ps * mtileb * slice_pt; | ||
266 | surf->base_align = (palign / 8) * (halign / 8) * tileb; | 271 | surf->base_align = (palign / 8) * (halign / 8) * tileb; |
267 | surf->palign = palign; | 272 | surf->palign = palign; |
268 | surf->halign = halign; | 273 | surf->halign = halign; |
@@ -434,6 +439,39 @@ static int evergreen_cs_track_validate_cb(struct radeon_cs_parser *p, unsigned i | |||
434 | 439 | ||
435 | offset += surf.layer_size * mslice; | 440 | offset += surf.layer_size * mslice; |
436 | if (offset > radeon_bo_size(track->cb_color_bo[id])) { | 441 | if (offset > radeon_bo_size(track->cb_color_bo[id])) { |
442 | /* old ddx are broken they allocate bo with w*h*bpp but | ||
443 | * program slice with ALIGN(h, 8), catch this and patch | ||
444 | * command stream. | ||
445 | */ | ||
446 | if (!surf.mode) { | ||
447 | volatile u32 *ib = p->ib.ptr; | ||
448 | unsigned long tmp, nby, bsize, size, min = 0; | ||
449 | |||
450 | /* find the height the ddx wants */ | ||
451 | if (surf.nby > 8) { | ||
452 | min = surf.nby - 8; | ||
453 | } | ||
454 | bsize = radeon_bo_size(track->cb_color_bo[id]); | ||
455 | tmp = track->cb_color_bo_offset[id] << 8; | ||
456 | for (nby = surf.nby; nby > min; nby--) { | ||
457 | size = nby * surf.nbx * surf.bpe * surf.nsamples; | ||
458 | if ((tmp + size * mslice) <= bsize) { | ||
459 | break; | ||
460 | } | ||
461 | } | ||
462 | if (nby > min) { | ||
463 | surf.nby = nby; | ||
464 | slice = ((nby * surf.nbx) / 64) - 1; | ||
465 | if (!evergreen_surface_check(p, &surf, "cb")) { | ||
466 | /* check if this one works */ | ||
467 | tmp += surf.layer_size * mslice; | ||
468 | if (tmp <= bsize) { | ||
469 | ib[track->cb_color_slice_idx[id]] = slice; | ||
470 | goto old_ddx_ok; | ||
471 | } | ||
472 | } | ||
473 | } | ||
474 | } | ||
437 | dev_warn(p->dev, "%s:%d cb[%d] bo too small (layer size %d, " | 475 | dev_warn(p->dev, "%s:%d cb[%d] bo too small (layer size %d, " |
438 | "offset %d, max layer %d, bo size %ld, slice %d)\n", | 476 | "offset %d, max layer %d, bo size %ld, slice %d)\n", |
439 | __func__, __LINE__, id, surf.layer_size, | 477 | __func__, __LINE__, id, surf.layer_size, |
@@ -446,6 +484,7 @@ static int evergreen_cs_track_validate_cb(struct radeon_cs_parser *p, unsigned i | |||
446 | surf.tsplit, surf.mtilea); | 484 | surf.tsplit, surf.mtilea); |
447 | return -EINVAL; | 485 | return -EINVAL; |
448 | } | 486 | } |
487 | old_ddx_ok: | ||
449 | 488 | ||
450 | return 0; | 489 | return 0; |
451 | } | 490 | } |
@@ -1532,6 +1571,7 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) | |||
1532 | case CB_COLOR7_SLICE: | 1571 | case CB_COLOR7_SLICE: |
1533 | tmp = (reg - CB_COLOR0_SLICE) / 0x3c; | 1572 | tmp = (reg - CB_COLOR0_SLICE) / 0x3c; |
1534 | track->cb_color_slice[tmp] = radeon_get_ib_value(p, idx); | 1573 | track->cb_color_slice[tmp] = radeon_get_ib_value(p, idx); |
1574 | track->cb_color_slice_idx[tmp] = idx; | ||
1535 | track->cb_dirty = true; | 1575 | track->cb_dirty = true; |
1536 | break; | 1576 | break; |
1537 | case CB_COLOR8_SLICE: | 1577 | case CB_COLOR8_SLICE: |
@@ -1540,6 +1580,7 @@ static int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx) | |||
1540 | case CB_COLOR11_SLICE: | 1580 | case CB_COLOR11_SLICE: |
1541 | tmp = ((reg - CB_COLOR8_SLICE) / 0x1c) + 8; | 1581 | tmp = ((reg - CB_COLOR8_SLICE) / 0x1c) + 8; |
1542 | track->cb_color_slice[tmp] = radeon_get_ib_value(p, idx); | 1582 | track->cb_color_slice[tmp] = radeon_get_ib_value(p, idx); |
1583 | track->cb_color_slice_idx[tmp] = idx; | ||
1543 | track->cb_dirty = true; | 1584 | track->cb_dirty = true; |
1544 | break; | 1585 | break; |
1545 | case CB_COLOR0_ATTRIB: | 1586 | case CB_COLOR0_ATTRIB: |
diff --git a/drivers/gpu/drm/radeon/evergreen_hdmi.c b/drivers/gpu/drm/radeon/evergreen_hdmi.c index a51f880985f8..65c54160028b 100644 --- a/drivers/gpu/drm/radeon/evergreen_hdmi.c +++ b/drivers/gpu/drm/radeon/evergreen_hdmi.c | |||
@@ -156,9 +156,6 @@ void evergreen_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode | |||
156 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 156 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
157 | uint32_t offset; | 157 | uint32_t offset; |
158 | 158 | ||
159 | if (ASIC_IS_DCE5(rdev)) | ||
160 | return; | ||
161 | |||
162 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 159 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
163 | if (!dig->afmt->enabled) | 160 | if (!dig->afmt->enabled) |
164 | return; | 161 | return; |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 79130bfd1d6f..b50b15c70498 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
@@ -37,6 +37,15 @@ | |||
37 | #define EVERGREEN_MAX_PIPES_MASK 0xFF | 37 | #define EVERGREEN_MAX_PIPES_MASK 0xFF |
38 | #define EVERGREEN_MAX_LDS_NUM 0xFFFF | 38 | #define EVERGREEN_MAX_LDS_NUM 0xFFFF |
39 | 39 | ||
40 | #define CYPRESS_GB_ADDR_CONFIG_GOLDEN 0x02011003 | ||
41 | #define BARTS_GB_ADDR_CONFIG_GOLDEN 0x02011003 | ||
42 | #define CAYMAN_GB_ADDR_CONFIG_GOLDEN 0x02011003 | ||
43 | #define JUNIPER_GB_ADDR_CONFIG_GOLDEN 0x02010002 | ||
44 | #define REDWOOD_GB_ADDR_CONFIG_GOLDEN 0x02010002 | ||
45 | #define TURKS_GB_ADDR_CONFIG_GOLDEN 0x02010002 | ||
46 | #define CEDAR_GB_ADDR_CONFIG_GOLDEN 0x02010001 | ||
47 | #define CAICOS_GB_ADDR_CONFIG_GOLDEN 0x02010001 | ||
48 | |||
40 | /* Registers */ | 49 | /* Registers */ |
41 | 50 | ||
42 | #define RCU_IND_INDEX 0x100 | 51 | #define RCU_IND_INDEX 0x100 |
@@ -54,6 +63,7 @@ | |||
54 | #define BACKEND_DISABLE(x) ((x) << 16) | 63 | #define BACKEND_DISABLE(x) ((x) << 16) |
55 | #define GB_ADDR_CONFIG 0x98F8 | 64 | #define GB_ADDR_CONFIG 0x98F8 |
56 | #define NUM_PIPES(x) ((x) << 0) | 65 | #define NUM_PIPES(x) ((x) << 0) |
66 | #define NUM_PIPES_MASK 0x0000000f | ||
57 | #define PIPE_INTERLEAVE_SIZE(x) ((x) << 4) | 67 | #define PIPE_INTERLEAVE_SIZE(x) ((x) << 4) |
58 | #define BANK_INTERLEAVE_SIZE(x) ((x) << 8) | 68 | #define BANK_INTERLEAVE_SIZE(x) ((x) << 8) |
59 | #define NUM_SHADER_ENGINES(x) ((x) << 12) | 69 | #define NUM_SHADER_ENGINES(x) ((x) << 12) |
@@ -452,6 +462,7 @@ | |||
452 | #define MC_VM_MD_L1_TLB0_CNTL 0x2654 | 462 | #define MC_VM_MD_L1_TLB0_CNTL 0x2654 |
453 | #define MC_VM_MD_L1_TLB1_CNTL 0x2658 | 463 | #define MC_VM_MD_L1_TLB1_CNTL 0x2658 |
454 | #define MC_VM_MD_L1_TLB2_CNTL 0x265C | 464 | #define MC_VM_MD_L1_TLB2_CNTL 0x265C |
465 | #define MC_VM_MD_L1_TLB3_CNTL 0x2698 | ||
455 | 466 | ||
456 | #define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C | 467 | #define FUS_MC_VM_MD_L1_TLB0_CNTL 0x265C |
457 | #define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660 | 468 | #define FUS_MC_VM_MD_L1_TLB1_CNTL 0x2660 |
@@ -492,6 +503,7 @@ | |||
492 | #define SCRATCH_UMSK 0x8540 | 503 | #define SCRATCH_UMSK 0x8540 |
493 | #define SCRATCH_ADDR 0x8544 | 504 | #define SCRATCH_ADDR 0x8544 |
494 | 505 | ||
506 | #define SMX_SAR_CTL0 0xA008 | ||
495 | #define SMX_DC_CTL0 0xA020 | 507 | #define SMX_DC_CTL0 0xA020 |
496 | #define USE_HASH_FUNCTION (1 << 0) | 508 | #define USE_HASH_FUNCTION (1 << 0) |
497 | #define NUMBER_OF_SETS(x) ((x) << 1) | 509 | #define NUMBER_OF_SETS(x) ((x) << 1) |
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index ce4e7cc6c905..b7bf18e40215 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -417,215 +417,17 @@ out: | |||
417 | /* | 417 | /* |
418 | * Core functions | 418 | * Core functions |
419 | */ | 419 | */ |
420 | static u32 cayman_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | ||
421 | u32 num_tile_pipes, | ||
422 | u32 num_backends_per_asic, | ||
423 | u32 *backend_disable_mask_per_asic, | ||
424 | u32 num_shader_engines) | ||
425 | { | ||
426 | u32 backend_map = 0; | ||
427 | u32 enabled_backends_mask = 0; | ||
428 | u32 enabled_backends_count = 0; | ||
429 | u32 num_backends_per_se; | ||
430 | u32 cur_pipe; | ||
431 | u32 swizzle_pipe[CAYMAN_MAX_PIPES]; | ||
432 | u32 cur_backend = 0; | ||
433 | u32 i; | ||
434 | bool force_no_swizzle; | ||
435 | |||
436 | /* force legal values */ | ||
437 | if (num_tile_pipes < 1) | ||
438 | num_tile_pipes = 1; | ||
439 | if (num_tile_pipes > rdev->config.cayman.max_tile_pipes) | ||
440 | num_tile_pipes = rdev->config.cayman.max_tile_pipes; | ||
441 | if (num_shader_engines < 1) | ||
442 | num_shader_engines = 1; | ||
443 | if (num_shader_engines > rdev->config.cayman.max_shader_engines) | ||
444 | num_shader_engines = rdev->config.cayman.max_shader_engines; | ||
445 | if (num_backends_per_asic < num_shader_engines) | ||
446 | num_backends_per_asic = num_shader_engines; | ||
447 | if (num_backends_per_asic > (rdev->config.cayman.max_backends_per_se * num_shader_engines)) | ||
448 | num_backends_per_asic = rdev->config.cayman.max_backends_per_se * num_shader_engines; | ||
449 | |||
450 | /* make sure we have the same number of backends per se */ | ||
451 | num_backends_per_asic = ALIGN(num_backends_per_asic, num_shader_engines); | ||
452 | /* set up the number of backends per se */ | ||
453 | num_backends_per_se = num_backends_per_asic / num_shader_engines; | ||
454 | if (num_backends_per_se > rdev->config.cayman.max_backends_per_se) { | ||
455 | num_backends_per_se = rdev->config.cayman.max_backends_per_se; | ||
456 | num_backends_per_asic = num_backends_per_se * num_shader_engines; | ||
457 | } | ||
458 | |||
459 | /* create enable mask and count for enabled backends */ | ||
460 | for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) { | ||
461 | if (((*backend_disable_mask_per_asic >> i) & 1) == 0) { | ||
462 | enabled_backends_mask |= (1 << i); | ||
463 | ++enabled_backends_count; | ||
464 | } | ||
465 | if (enabled_backends_count == num_backends_per_asic) | ||
466 | break; | ||
467 | } | ||
468 | |||
469 | /* force the backends mask to match the current number of backends */ | ||
470 | if (enabled_backends_count != num_backends_per_asic) { | ||
471 | u32 this_backend_enabled; | ||
472 | u32 shader_engine; | ||
473 | u32 backend_per_se; | ||
474 | |||
475 | enabled_backends_mask = 0; | ||
476 | enabled_backends_count = 0; | ||
477 | *backend_disable_mask_per_asic = CAYMAN_MAX_BACKENDS_MASK; | ||
478 | for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) { | ||
479 | /* calc the current se */ | ||
480 | shader_engine = i / rdev->config.cayman.max_backends_per_se; | ||
481 | /* calc the backend per se */ | ||
482 | backend_per_se = i % rdev->config.cayman.max_backends_per_se; | ||
483 | /* default to not enabled */ | ||
484 | this_backend_enabled = 0; | ||
485 | if ((shader_engine < num_shader_engines) && | ||
486 | (backend_per_se < num_backends_per_se)) | ||
487 | this_backend_enabled = 1; | ||
488 | if (this_backend_enabled) { | ||
489 | enabled_backends_mask |= (1 << i); | ||
490 | *backend_disable_mask_per_asic &= ~(1 << i); | ||
491 | ++enabled_backends_count; | ||
492 | } | ||
493 | } | ||
494 | } | ||
495 | |||
496 | |||
497 | memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * CAYMAN_MAX_PIPES); | ||
498 | switch (rdev->family) { | ||
499 | case CHIP_CAYMAN: | ||
500 | case CHIP_ARUBA: | ||
501 | force_no_swizzle = true; | ||
502 | break; | ||
503 | default: | ||
504 | force_no_swizzle = false; | ||
505 | break; | ||
506 | } | ||
507 | if (force_no_swizzle) { | ||
508 | bool last_backend_enabled = false; | ||
509 | |||
510 | force_no_swizzle = false; | ||
511 | for (i = 0; i < CAYMAN_MAX_BACKENDS; ++i) { | ||
512 | if (((enabled_backends_mask >> i) & 1) == 1) { | ||
513 | if (last_backend_enabled) | ||
514 | force_no_swizzle = true; | ||
515 | last_backend_enabled = true; | ||
516 | } else | ||
517 | last_backend_enabled = false; | ||
518 | } | ||
519 | } | ||
520 | |||
521 | switch (num_tile_pipes) { | ||
522 | case 1: | ||
523 | case 3: | ||
524 | case 5: | ||
525 | case 7: | ||
526 | DRM_ERROR("odd number of pipes!\n"); | ||
527 | break; | ||
528 | case 2: | ||
529 | swizzle_pipe[0] = 0; | ||
530 | swizzle_pipe[1] = 1; | ||
531 | break; | ||
532 | case 4: | ||
533 | if (force_no_swizzle) { | ||
534 | swizzle_pipe[0] = 0; | ||
535 | swizzle_pipe[1] = 1; | ||
536 | swizzle_pipe[2] = 2; | ||
537 | swizzle_pipe[3] = 3; | ||
538 | } else { | ||
539 | swizzle_pipe[0] = 0; | ||
540 | swizzle_pipe[1] = 2; | ||
541 | swizzle_pipe[2] = 1; | ||
542 | swizzle_pipe[3] = 3; | ||
543 | } | ||
544 | break; | ||
545 | case 6: | ||
546 | if (force_no_swizzle) { | ||
547 | swizzle_pipe[0] = 0; | ||
548 | swizzle_pipe[1] = 1; | ||
549 | swizzle_pipe[2] = 2; | ||
550 | swizzle_pipe[3] = 3; | ||
551 | swizzle_pipe[4] = 4; | ||
552 | swizzle_pipe[5] = 5; | ||
553 | } else { | ||
554 | swizzle_pipe[0] = 0; | ||
555 | swizzle_pipe[1] = 2; | ||
556 | swizzle_pipe[2] = 4; | ||
557 | swizzle_pipe[3] = 1; | ||
558 | swizzle_pipe[4] = 3; | ||
559 | swizzle_pipe[5] = 5; | ||
560 | } | ||
561 | break; | ||
562 | case 8: | ||
563 | if (force_no_swizzle) { | ||
564 | swizzle_pipe[0] = 0; | ||
565 | swizzle_pipe[1] = 1; | ||
566 | swizzle_pipe[2] = 2; | ||
567 | swizzle_pipe[3] = 3; | ||
568 | swizzle_pipe[4] = 4; | ||
569 | swizzle_pipe[5] = 5; | ||
570 | swizzle_pipe[6] = 6; | ||
571 | swizzle_pipe[7] = 7; | ||
572 | } else { | ||
573 | swizzle_pipe[0] = 0; | ||
574 | swizzle_pipe[1] = 2; | ||
575 | swizzle_pipe[2] = 4; | ||
576 | swizzle_pipe[3] = 6; | ||
577 | swizzle_pipe[4] = 1; | ||
578 | swizzle_pipe[5] = 3; | ||
579 | swizzle_pipe[6] = 5; | ||
580 | swizzle_pipe[7] = 7; | ||
581 | } | ||
582 | break; | ||
583 | } | ||
584 | |||
585 | for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) { | ||
586 | while (((1 << cur_backend) & enabled_backends_mask) == 0) | ||
587 | cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS; | ||
588 | |||
589 | backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4))); | ||
590 | |||
591 | cur_backend = (cur_backend + 1) % CAYMAN_MAX_BACKENDS; | ||
592 | } | ||
593 | |||
594 | return backend_map; | ||
595 | } | ||
596 | |||
597 | static u32 cayman_get_disable_mask_per_asic(struct radeon_device *rdev, | ||
598 | u32 disable_mask_per_se, | ||
599 | u32 max_disable_mask_per_se, | ||
600 | u32 num_shader_engines) | ||
601 | { | ||
602 | u32 disable_field_width_per_se = r600_count_pipe_bits(disable_mask_per_se); | ||
603 | u32 disable_mask_per_asic = disable_mask_per_se & max_disable_mask_per_se; | ||
604 | |||
605 | if (num_shader_engines == 1) | ||
606 | return disable_mask_per_asic; | ||
607 | else if (num_shader_engines == 2) | ||
608 | return disable_mask_per_asic | (disable_mask_per_asic << disable_field_width_per_se); | ||
609 | else | ||
610 | return 0xffffffff; | ||
611 | } | ||
612 | |||
613 | static void cayman_gpu_init(struct radeon_device *rdev) | 420 | static void cayman_gpu_init(struct radeon_device *rdev) |
614 | { | 421 | { |
615 | u32 cc_rb_backend_disable = 0; | ||
616 | u32 cc_gc_shader_pipe_config; | ||
617 | u32 gb_addr_config = 0; | 422 | u32 gb_addr_config = 0; |
618 | u32 mc_shared_chmap, mc_arb_ramcfg; | 423 | u32 mc_shared_chmap, mc_arb_ramcfg; |
619 | u32 gb_backend_map; | ||
620 | u32 cgts_tcc_disable; | 424 | u32 cgts_tcc_disable; |
621 | u32 sx_debug_1; | 425 | u32 sx_debug_1; |
622 | u32 smx_dc_ctl0; | 426 | u32 smx_dc_ctl0; |
623 | u32 gc_user_shader_pipe_config; | ||
624 | u32 gc_user_rb_backend_disable; | ||
625 | u32 cgts_user_tcc_disable; | ||
626 | u32 cgts_sm_ctrl_reg; | 427 | u32 cgts_sm_ctrl_reg; |
627 | u32 hdp_host_path_cntl; | 428 | u32 hdp_host_path_cntl; |
628 | u32 tmp; | 429 | u32 tmp; |
430 | u32 disabled_rb_mask; | ||
629 | int i, j; | 431 | int i, j; |
630 | 432 | ||
631 | switch (rdev->family) { | 433 | switch (rdev->family) { |
@@ -650,6 +452,7 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
650 | rdev->config.cayman.sc_prim_fifo_size = 0x100; | 452 | rdev->config.cayman.sc_prim_fifo_size = 0x100; |
651 | rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; | 453 | rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; |
652 | rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; | 454 | rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; |
455 | gb_addr_config = CAYMAN_GB_ADDR_CONFIG_GOLDEN; | ||
653 | break; | 456 | break; |
654 | case CHIP_ARUBA: | 457 | case CHIP_ARUBA: |
655 | default: | 458 | default: |
@@ -657,15 +460,28 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
657 | rdev->config.cayman.max_pipes_per_simd = 4; | 460 | rdev->config.cayman.max_pipes_per_simd = 4; |
658 | rdev->config.cayman.max_tile_pipes = 2; | 461 | rdev->config.cayman.max_tile_pipes = 2; |
659 | if ((rdev->pdev->device == 0x9900) || | 462 | if ((rdev->pdev->device == 0x9900) || |
660 | (rdev->pdev->device == 0x9901)) { | 463 | (rdev->pdev->device == 0x9901) || |
464 | (rdev->pdev->device == 0x9905) || | ||
465 | (rdev->pdev->device == 0x9906) || | ||
466 | (rdev->pdev->device == 0x9907) || | ||
467 | (rdev->pdev->device == 0x9908) || | ||
468 | (rdev->pdev->device == 0x9909) || | ||
469 | (rdev->pdev->device == 0x9910) || | ||
470 | (rdev->pdev->device == 0x9917)) { | ||
661 | rdev->config.cayman.max_simds_per_se = 6; | 471 | rdev->config.cayman.max_simds_per_se = 6; |
662 | rdev->config.cayman.max_backends_per_se = 2; | 472 | rdev->config.cayman.max_backends_per_se = 2; |
663 | } else if ((rdev->pdev->device == 0x9903) || | 473 | } else if ((rdev->pdev->device == 0x9903) || |
664 | (rdev->pdev->device == 0x9904)) { | 474 | (rdev->pdev->device == 0x9904) || |
475 | (rdev->pdev->device == 0x990A) || | ||
476 | (rdev->pdev->device == 0x9913) || | ||
477 | (rdev->pdev->device == 0x9918)) { | ||
665 | rdev->config.cayman.max_simds_per_se = 4; | 478 | rdev->config.cayman.max_simds_per_se = 4; |
666 | rdev->config.cayman.max_backends_per_se = 2; | 479 | rdev->config.cayman.max_backends_per_se = 2; |
667 | } else if ((rdev->pdev->device == 0x9990) || | 480 | } else if ((rdev->pdev->device == 0x9919) || |
668 | (rdev->pdev->device == 0x9991)) { | 481 | (rdev->pdev->device == 0x9990) || |
482 | (rdev->pdev->device == 0x9991) || | ||
483 | (rdev->pdev->device == 0x9994) || | ||
484 | (rdev->pdev->device == 0x99A0)) { | ||
669 | rdev->config.cayman.max_simds_per_se = 3; | 485 | rdev->config.cayman.max_simds_per_se = 3; |
670 | rdev->config.cayman.max_backends_per_se = 1; | 486 | rdev->config.cayman.max_backends_per_se = 1; |
671 | } else { | 487 | } else { |
@@ -687,6 +503,7 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
687 | rdev->config.cayman.sc_prim_fifo_size = 0x40; | 503 | rdev->config.cayman.sc_prim_fifo_size = 0x40; |
688 | rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; | 504 | rdev->config.cayman.sc_hiz_tile_fifo_size = 0x30; |
689 | rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; | 505 | rdev->config.cayman.sc_earlyz_tile_fifo_size = 0x130; |
506 | gb_addr_config = ARUBA_GB_ADDR_CONFIG_GOLDEN; | ||
690 | break; | 507 | break; |
691 | } | 508 | } |
692 | 509 | ||
@@ -706,39 +523,6 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
706 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); | 523 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); |
707 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); | 524 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); |
708 | 525 | ||
709 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE); | ||
710 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG); | ||
711 | cgts_tcc_disable = 0xffff0000; | ||
712 | for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++) | ||
713 | cgts_tcc_disable &= ~(1 << (16 + i)); | ||
714 | gc_user_rb_backend_disable = RREG32(GC_USER_RB_BACKEND_DISABLE); | ||
715 | gc_user_shader_pipe_config = RREG32(GC_USER_SHADER_PIPE_CONFIG); | ||
716 | cgts_user_tcc_disable = RREG32(CGTS_USER_TCC_DISABLE); | ||
717 | |||
718 | rdev->config.cayman.num_shader_engines = rdev->config.cayman.max_shader_engines; | ||
719 | tmp = ((~gc_user_shader_pipe_config) & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT; | ||
720 | rdev->config.cayman.num_shader_pipes_per_simd = r600_count_pipe_bits(tmp); | ||
721 | rdev->config.cayman.num_tile_pipes = rdev->config.cayman.max_tile_pipes; | ||
722 | tmp = ((~gc_user_shader_pipe_config) & INACTIVE_SIMDS_MASK) >> INACTIVE_SIMDS_SHIFT; | ||
723 | rdev->config.cayman.num_simds_per_se = r600_count_pipe_bits(tmp); | ||
724 | tmp = ((~gc_user_rb_backend_disable) & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT; | ||
725 | rdev->config.cayman.num_backends_per_se = r600_count_pipe_bits(tmp); | ||
726 | tmp = (gc_user_rb_backend_disable & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT; | ||
727 | rdev->config.cayman.backend_disable_mask_per_asic = | ||
728 | cayman_get_disable_mask_per_asic(rdev, tmp, CAYMAN_MAX_BACKENDS_PER_SE_MASK, | ||
729 | rdev->config.cayman.num_shader_engines); | ||
730 | rdev->config.cayman.backend_map = | ||
731 | cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes, | ||
732 | rdev->config.cayman.num_backends_per_se * | ||
733 | rdev->config.cayman.num_shader_engines, | ||
734 | &rdev->config.cayman.backend_disable_mask_per_asic, | ||
735 | rdev->config.cayman.num_shader_engines); | ||
736 | tmp = ((~cgts_user_tcc_disable) & TCC_DISABLE_MASK) >> TCC_DISABLE_SHIFT; | ||
737 | rdev->config.cayman.num_texture_channel_caches = r600_count_pipe_bits(tmp); | ||
738 | tmp = (mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT; | ||
739 | rdev->config.cayman.mem_max_burst_length_bytes = (tmp + 1) * 256; | ||
740 | if (rdev->config.cayman.mem_max_burst_length_bytes > 512) | ||
741 | rdev->config.cayman.mem_max_burst_length_bytes = 512; | ||
742 | tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; | 526 | tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; |
743 | rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; | 527 | rdev->config.cayman.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; |
744 | if (rdev->config.cayman.mem_row_size_in_kb > 4) | 528 | if (rdev->config.cayman.mem_row_size_in_kb > 4) |
@@ -748,73 +532,6 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
748 | rdev->config.cayman.num_gpus = 1; | 532 | rdev->config.cayman.num_gpus = 1; |
749 | rdev->config.cayman.multi_gpu_tile_size = 64; | 533 | rdev->config.cayman.multi_gpu_tile_size = 64; |
750 | 534 | ||
751 | //gb_addr_config = 0x02011003 | ||
752 | #if 0 | ||
753 | gb_addr_config = RREG32(GB_ADDR_CONFIG); | ||
754 | #else | ||
755 | gb_addr_config = 0; | ||
756 | switch (rdev->config.cayman.num_tile_pipes) { | ||
757 | case 1: | ||
758 | default: | ||
759 | gb_addr_config |= NUM_PIPES(0); | ||
760 | break; | ||
761 | case 2: | ||
762 | gb_addr_config |= NUM_PIPES(1); | ||
763 | break; | ||
764 | case 4: | ||
765 | gb_addr_config |= NUM_PIPES(2); | ||
766 | break; | ||
767 | case 8: | ||
768 | gb_addr_config |= NUM_PIPES(3); | ||
769 | break; | ||
770 | } | ||
771 | |||
772 | tmp = (rdev->config.cayman.mem_max_burst_length_bytes / 256) - 1; | ||
773 | gb_addr_config |= PIPE_INTERLEAVE_SIZE(tmp); | ||
774 | gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.cayman.num_shader_engines - 1); | ||
775 | tmp = (rdev->config.cayman.shader_engine_tile_size / 16) - 1; | ||
776 | gb_addr_config |= SHADER_ENGINE_TILE_SIZE(tmp); | ||
777 | switch (rdev->config.cayman.num_gpus) { | ||
778 | case 1: | ||
779 | default: | ||
780 | gb_addr_config |= NUM_GPUS(0); | ||
781 | break; | ||
782 | case 2: | ||
783 | gb_addr_config |= NUM_GPUS(1); | ||
784 | break; | ||
785 | case 4: | ||
786 | gb_addr_config |= NUM_GPUS(2); | ||
787 | break; | ||
788 | } | ||
789 | switch (rdev->config.cayman.multi_gpu_tile_size) { | ||
790 | case 16: | ||
791 | gb_addr_config |= MULTI_GPU_TILE_SIZE(0); | ||
792 | break; | ||
793 | case 32: | ||
794 | default: | ||
795 | gb_addr_config |= MULTI_GPU_TILE_SIZE(1); | ||
796 | break; | ||
797 | case 64: | ||
798 | gb_addr_config |= MULTI_GPU_TILE_SIZE(2); | ||
799 | break; | ||
800 | case 128: | ||
801 | gb_addr_config |= MULTI_GPU_TILE_SIZE(3); | ||
802 | break; | ||
803 | } | ||
804 | switch (rdev->config.cayman.mem_row_size_in_kb) { | ||
805 | case 1: | ||
806 | default: | ||
807 | gb_addr_config |= ROW_SIZE(0); | ||
808 | break; | ||
809 | case 2: | ||
810 | gb_addr_config |= ROW_SIZE(1); | ||
811 | break; | ||
812 | case 4: | ||
813 | gb_addr_config |= ROW_SIZE(2); | ||
814 | break; | ||
815 | } | ||
816 | #endif | ||
817 | |||
818 | tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT; | 535 | tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT; |
819 | rdev->config.cayman.num_tile_pipes = (1 << tmp); | 536 | rdev->config.cayman.num_tile_pipes = (1 << tmp); |
820 | tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT; | 537 | tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT; |
@@ -828,17 +545,7 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
828 | tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT; | 545 | tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT; |
829 | rdev->config.cayman.mem_row_size_in_kb = 1 << tmp; | 546 | rdev->config.cayman.mem_row_size_in_kb = 1 << tmp; |
830 | 547 | ||
831 | //gb_backend_map = 0x76541032; | 548 | |
832 | #if 0 | ||
833 | gb_backend_map = RREG32(GB_BACKEND_MAP); | ||
834 | #else | ||
835 | gb_backend_map = | ||
836 | cayman_get_tile_pipe_to_backend_map(rdev, rdev->config.cayman.num_tile_pipes, | ||
837 | rdev->config.cayman.num_backends_per_se * | ||
838 | rdev->config.cayman.num_shader_engines, | ||
839 | &rdev->config.cayman.backend_disable_mask_per_asic, | ||
840 | rdev->config.cayman.num_shader_engines); | ||
841 | #endif | ||
842 | /* setup tiling info dword. gb_addr_config is not adequate since it does | 549 | /* setup tiling info dword. gb_addr_config is not adequate since it does |
843 | * not have bank info, so create a custom tiling dword. | 550 | * not have bank info, so create a custom tiling dword. |
844 | * bits 3:0 num_pipes | 551 | * bits 3:0 num_pipes |
@@ -866,33 +573,49 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
866 | /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ | 573 | /* num banks is 8 on all fusion asics. 0 = 4, 1 = 8, 2 = 16 */ |
867 | if (rdev->flags & RADEON_IS_IGP) | 574 | if (rdev->flags & RADEON_IS_IGP) |
868 | rdev->config.cayman.tile_config |= 1 << 4; | 575 | rdev->config.cayman.tile_config |= 1 << 4; |
869 | else | 576 | else { |
870 | rdev->config.cayman.tile_config |= | 577 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) |
871 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; | 578 | rdev->config.cayman.tile_config |= 1 << 4; |
579 | else | ||
580 | rdev->config.cayman.tile_config |= 0 << 4; | ||
581 | } | ||
872 | rdev->config.cayman.tile_config |= | 582 | rdev->config.cayman.tile_config |= |
873 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; | 583 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; |
874 | rdev->config.cayman.tile_config |= | 584 | rdev->config.cayman.tile_config |= |
875 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; | 585 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; |
876 | 586 | ||
877 | rdev->config.cayman.backend_map = gb_backend_map; | 587 | tmp = 0; |
878 | WREG32(GB_BACKEND_MAP, gb_backend_map); | 588 | for (i = (rdev->config.cayman.max_shader_engines - 1); i >= 0; i--) { |
589 | u32 rb_disable_bitmap; | ||
590 | |||
591 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); | ||
592 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_INDEX(i)); | ||
593 | rb_disable_bitmap = (RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000) >> 16; | ||
594 | tmp <<= 4; | ||
595 | tmp |= rb_disable_bitmap; | ||
596 | } | ||
597 | /* enabled rb are just the one not disabled :) */ | ||
598 | disabled_rb_mask = tmp; | ||
599 | |||
600 | WREG32(GRBM_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); | ||
601 | WREG32(RLC_GFX_INDEX, INSTANCE_BROADCAST_WRITES | SE_BROADCAST_WRITES); | ||
602 | |||
879 | WREG32(GB_ADDR_CONFIG, gb_addr_config); | 603 | WREG32(GB_ADDR_CONFIG, gb_addr_config); |
880 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | 604 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
881 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); | 605 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); |
882 | 606 | ||
883 | /* primary versions */ | 607 | tmp = gb_addr_config & NUM_PIPES_MASK; |
884 | WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); | 608 | tmp = r6xx_remap_render_backend(rdev, tmp, |
885 | WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); | 609 | rdev->config.cayman.max_backends_per_se * |
886 | WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); | 610 | rdev->config.cayman.max_shader_engines, |
611 | CAYMAN_MAX_BACKENDS, disabled_rb_mask); | ||
612 | WREG32(GB_BACKEND_MAP, tmp); | ||
887 | 613 | ||
614 | cgts_tcc_disable = 0xffff0000; | ||
615 | for (i = 0; i < rdev->config.cayman.max_texture_channel_caches; i++) | ||
616 | cgts_tcc_disable &= ~(1 << (16 + i)); | ||
888 | WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable); | 617 | WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable); |
889 | WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable); | 618 | WREG32(CGTS_SYS_TCC_DISABLE, cgts_tcc_disable); |
890 | |||
891 | /* user versions */ | ||
892 | WREG32(GC_USER_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
893 | WREG32(GC_USER_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
894 | WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); | ||
895 | |||
896 | WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable); | 619 | WREG32(CGTS_USER_SYS_TCC_DISABLE, cgts_tcc_disable); |
897 | WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable); | 620 | WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable); |
898 | 621 | ||
@@ -1580,6 +1303,10 @@ static int cayman_startup(struct radeon_device *rdev) | |||
1580 | if (r) | 1303 | if (r) |
1581 | return r; | 1304 | return r; |
1582 | 1305 | ||
1306 | r = r600_audio_init(rdev); | ||
1307 | if (r) | ||
1308 | return r; | ||
1309 | |||
1583 | return 0; | 1310 | return 0; |
1584 | } | 1311 | } |
1585 | 1312 | ||
@@ -1606,6 +1333,7 @@ int cayman_resume(struct radeon_device *rdev) | |||
1606 | 1333 | ||
1607 | int cayman_suspend(struct radeon_device *rdev) | 1334 | int cayman_suspend(struct radeon_device *rdev) |
1608 | { | 1335 | { |
1336 | r600_audio_fini(rdev); | ||
1609 | /* FIXME: we should wait for ring to be empty */ | 1337 | /* FIXME: we should wait for ring to be empty */ |
1610 | radeon_ib_pool_suspend(rdev); | 1338 | radeon_ib_pool_suspend(rdev); |
1611 | radeon_vm_manager_suspend(rdev); | 1339 | radeon_vm_manager_suspend(rdev); |
diff --git a/drivers/gpu/drm/radeon/nid.h b/drivers/gpu/drm/radeon/nid.h index 2aa7046ada56..a0b98066e207 100644 --- a/drivers/gpu/drm/radeon/nid.h +++ b/drivers/gpu/drm/radeon/nid.h | |||
@@ -41,6 +41,9 @@ | |||
41 | #define CAYMAN_MAX_TCC 16 | 41 | #define CAYMAN_MAX_TCC 16 |
42 | #define CAYMAN_MAX_TCC_MASK 0xFF | 42 | #define CAYMAN_MAX_TCC_MASK 0xFF |
43 | 43 | ||
44 | #define CAYMAN_GB_ADDR_CONFIG_GOLDEN 0x02011003 | ||
45 | #define ARUBA_GB_ADDR_CONFIG_GOLDEN 0x12010001 | ||
46 | |||
44 | #define DMIF_ADDR_CONFIG 0xBD4 | 47 | #define DMIF_ADDR_CONFIG 0xBD4 |
45 | #define SRBM_GFX_CNTL 0x0E44 | 48 | #define SRBM_GFX_CNTL 0x0E44 |
46 | #define RINGID(x) (((x) & 0x3) << 0) | 49 | #define RINGID(x) (((x) & 0x3) << 0) |
@@ -148,6 +151,8 @@ | |||
148 | #define CGTS_SYS_TCC_DISABLE 0x3F90 | 151 | #define CGTS_SYS_TCC_DISABLE 0x3F90 |
149 | #define CGTS_USER_SYS_TCC_DISABLE 0x3F94 | 152 | #define CGTS_USER_SYS_TCC_DISABLE 0x3F94 |
150 | 153 | ||
154 | #define RLC_GFX_INDEX 0x3FC4 | ||
155 | |||
151 | #define CONFIG_MEMSIZE 0x5428 | 156 | #define CONFIG_MEMSIZE 0x5428 |
152 | 157 | ||
153 | #define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480 | 158 | #define HDP_MEM_COHERENCY_FLUSH_CNTL 0x5480 |
@@ -212,6 +217,12 @@ | |||
212 | #define SOFT_RESET_VGT (1 << 14) | 217 | #define SOFT_RESET_VGT (1 << 14) |
213 | #define SOFT_RESET_IA (1 << 15) | 218 | #define SOFT_RESET_IA (1 << 15) |
214 | 219 | ||
220 | #define GRBM_GFX_INDEX 0x802C | ||
221 | #define INSTANCE_INDEX(x) ((x) << 0) | ||
222 | #define SE_INDEX(x) ((x) << 16) | ||
223 | #define INSTANCE_BROADCAST_WRITES (1 << 30) | ||
224 | #define SE_BROADCAST_WRITES (1 << 31) | ||
225 | |||
215 | #define SCRATCH_REG0 0x8500 | 226 | #define SCRATCH_REG0 0x8500 |
216 | #define SCRATCH_REG1 0x8504 | 227 | #define SCRATCH_REG1 0x8504 |
217 | #define SCRATCH_REG2 0x8508 | 228 | #define SCRATCH_REG2 0x8508 |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index f388a1d73b63..bff627293812 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -1376,113 +1376,51 @@ int r600_asic_reset(struct radeon_device *rdev) | |||
1376 | return r600_gpu_soft_reset(rdev); | 1376 | return r600_gpu_soft_reset(rdev); |
1377 | } | 1377 | } |
1378 | 1378 | ||
1379 | static u32 r600_get_tile_pipe_to_backend_map(u32 num_tile_pipes, | 1379 | u32 r6xx_remap_render_backend(struct radeon_device *rdev, |
1380 | u32 num_backends, | 1380 | u32 tiling_pipe_num, |
1381 | u32 backend_disable_mask) | 1381 | u32 max_rb_num, |
1382 | { | 1382 | u32 total_max_rb_num, |
1383 | u32 backend_map = 0; | 1383 | u32 disabled_rb_mask) |
1384 | u32 enabled_backends_mask; | 1384 | { |
1385 | u32 enabled_backends_count; | 1385 | u32 rendering_pipe_num, rb_num_width, req_rb_num; |
1386 | u32 cur_pipe; | 1386 | u32 pipe_rb_ratio, pipe_rb_remain; |
1387 | u32 swizzle_pipe[R6XX_MAX_PIPES]; | 1387 | u32 data = 0, mask = 1 << (max_rb_num - 1); |
1388 | u32 cur_backend; | 1388 | unsigned i, j; |
1389 | u32 i; | 1389 | |
1390 | 1390 | /* mask out the RBs that don't exist on that asic */ | |
1391 | if (num_tile_pipes > R6XX_MAX_PIPES) | 1391 | disabled_rb_mask |= (0xff << max_rb_num) & 0xff; |
1392 | num_tile_pipes = R6XX_MAX_PIPES; | 1392 | |
1393 | if (num_tile_pipes < 1) | 1393 | rendering_pipe_num = 1 << tiling_pipe_num; |
1394 | num_tile_pipes = 1; | 1394 | req_rb_num = total_max_rb_num - r600_count_pipe_bits(disabled_rb_mask); |
1395 | if (num_backends > R6XX_MAX_BACKENDS) | 1395 | BUG_ON(rendering_pipe_num < req_rb_num); |
1396 | num_backends = R6XX_MAX_BACKENDS; | 1396 | |
1397 | if (num_backends < 1) | 1397 | pipe_rb_ratio = rendering_pipe_num / req_rb_num; |
1398 | num_backends = 1; | 1398 | pipe_rb_remain = rendering_pipe_num - pipe_rb_ratio * req_rb_num; |
1399 | 1399 | ||
1400 | enabled_backends_mask = 0; | 1400 | if (rdev->family <= CHIP_RV740) { |
1401 | enabled_backends_count = 0; | 1401 | /* r6xx/r7xx */ |
1402 | for (i = 0; i < R6XX_MAX_BACKENDS; ++i) { | 1402 | rb_num_width = 2; |
1403 | if (((backend_disable_mask >> i) & 1) == 0) { | 1403 | } else { |
1404 | enabled_backends_mask |= (1 << i); | 1404 | /* eg+ */ |
1405 | ++enabled_backends_count; | 1405 | rb_num_width = 4; |
1406 | } | ||
1407 | if (enabled_backends_count == num_backends) | ||
1408 | break; | ||
1409 | } | ||
1410 | |||
1411 | if (enabled_backends_count == 0) { | ||
1412 | enabled_backends_mask = 1; | ||
1413 | enabled_backends_count = 1; | ||
1414 | } | ||
1415 | |||
1416 | if (enabled_backends_count != num_backends) | ||
1417 | num_backends = enabled_backends_count; | ||
1418 | |||
1419 | memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R6XX_MAX_PIPES); | ||
1420 | switch (num_tile_pipes) { | ||
1421 | case 1: | ||
1422 | swizzle_pipe[0] = 0; | ||
1423 | break; | ||
1424 | case 2: | ||
1425 | swizzle_pipe[0] = 0; | ||
1426 | swizzle_pipe[1] = 1; | ||
1427 | break; | ||
1428 | case 3: | ||
1429 | swizzle_pipe[0] = 0; | ||
1430 | swizzle_pipe[1] = 1; | ||
1431 | swizzle_pipe[2] = 2; | ||
1432 | break; | ||
1433 | case 4: | ||
1434 | swizzle_pipe[0] = 0; | ||
1435 | swizzle_pipe[1] = 1; | ||
1436 | swizzle_pipe[2] = 2; | ||
1437 | swizzle_pipe[3] = 3; | ||
1438 | break; | ||
1439 | case 5: | ||
1440 | swizzle_pipe[0] = 0; | ||
1441 | swizzle_pipe[1] = 1; | ||
1442 | swizzle_pipe[2] = 2; | ||
1443 | swizzle_pipe[3] = 3; | ||
1444 | swizzle_pipe[4] = 4; | ||
1445 | break; | ||
1446 | case 6: | ||
1447 | swizzle_pipe[0] = 0; | ||
1448 | swizzle_pipe[1] = 2; | ||
1449 | swizzle_pipe[2] = 4; | ||
1450 | swizzle_pipe[3] = 5; | ||
1451 | swizzle_pipe[4] = 1; | ||
1452 | swizzle_pipe[5] = 3; | ||
1453 | break; | ||
1454 | case 7: | ||
1455 | swizzle_pipe[0] = 0; | ||
1456 | swizzle_pipe[1] = 2; | ||
1457 | swizzle_pipe[2] = 4; | ||
1458 | swizzle_pipe[3] = 6; | ||
1459 | swizzle_pipe[4] = 1; | ||
1460 | swizzle_pipe[5] = 3; | ||
1461 | swizzle_pipe[6] = 5; | ||
1462 | break; | ||
1463 | case 8: | ||
1464 | swizzle_pipe[0] = 0; | ||
1465 | swizzle_pipe[1] = 2; | ||
1466 | swizzle_pipe[2] = 4; | ||
1467 | swizzle_pipe[3] = 6; | ||
1468 | swizzle_pipe[4] = 1; | ||
1469 | swizzle_pipe[5] = 3; | ||
1470 | swizzle_pipe[6] = 5; | ||
1471 | swizzle_pipe[7] = 7; | ||
1472 | break; | ||
1473 | } | 1406 | } |
1474 | 1407 | ||
1475 | cur_backend = 0; | 1408 | for (i = 0; i < max_rb_num; i++) { |
1476 | for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) { | 1409 | if (!(mask & disabled_rb_mask)) { |
1477 | while (((1 << cur_backend) & enabled_backends_mask) == 0) | 1410 | for (j = 0; j < pipe_rb_ratio; j++) { |
1478 | cur_backend = (cur_backend + 1) % R6XX_MAX_BACKENDS; | 1411 | data <<= rb_num_width; |
1479 | 1412 | data |= max_rb_num - i - 1; | |
1480 | backend_map |= (u32)(((cur_backend & 3) << (swizzle_pipe[cur_pipe] * 2))); | 1413 | } |
1481 | 1414 | if (pipe_rb_remain) { | |
1482 | cur_backend = (cur_backend + 1) % R6XX_MAX_BACKENDS; | 1415 | data <<= rb_num_width; |
1416 | data |= max_rb_num - i - 1; | ||
1417 | pipe_rb_remain--; | ||
1418 | } | ||
1419 | } | ||
1420 | mask >>= 1; | ||
1483 | } | 1421 | } |
1484 | 1422 | ||
1485 | return backend_map; | 1423 | return data; |
1486 | } | 1424 | } |
1487 | 1425 | ||
1488 | int r600_count_pipe_bits(uint32_t val) | 1426 | int r600_count_pipe_bits(uint32_t val) |
@@ -1500,7 +1438,6 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1500 | { | 1438 | { |
1501 | u32 tiling_config; | 1439 | u32 tiling_config; |
1502 | u32 ramcfg; | 1440 | u32 ramcfg; |
1503 | u32 backend_map; | ||
1504 | u32 cc_rb_backend_disable; | 1441 | u32 cc_rb_backend_disable; |
1505 | u32 cc_gc_shader_pipe_config; | 1442 | u32 cc_gc_shader_pipe_config; |
1506 | u32 tmp; | 1443 | u32 tmp; |
@@ -1511,8 +1448,9 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1511 | u32 sq_thread_resource_mgmt = 0; | 1448 | u32 sq_thread_resource_mgmt = 0; |
1512 | u32 sq_stack_resource_mgmt_1 = 0; | 1449 | u32 sq_stack_resource_mgmt_1 = 0; |
1513 | u32 sq_stack_resource_mgmt_2 = 0; | 1450 | u32 sq_stack_resource_mgmt_2 = 0; |
1451 | u32 disabled_rb_mask; | ||
1514 | 1452 | ||
1515 | /* FIXME: implement */ | 1453 | rdev->config.r600.tiling_group_size = 256; |
1516 | switch (rdev->family) { | 1454 | switch (rdev->family) { |
1517 | case CHIP_R600: | 1455 | case CHIP_R600: |
1518 | rdev->config.r600.max_pipes = 4; | 1456 | rdev->config.r600.max_pipes = 4; |
@@ -1616,10 +1554,7 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1616 | rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); | 1554 | rdev->config.r600.tiling_nbanks = 4 << ((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); |
1617 | tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); | 1555 | tiling_config |= BANK_TILING((ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); |
1618 | tiling_config |= GROUP_SIZE((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); | 1556 | tiling_config |= GROUP_SIZE((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); |
1619 | if ((ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) | 1557 | |
1620 | rdev->config.r600.tiling_group_size = 512; | ||
1621 | else | ||
1622 | rdev->config.r600.tiling_group_size = 256; | ||
1623 | tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT; | 1558 | tmp = (ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT; |
1624 | if (tmp > 3) { | 1559 | if (tmp > 3) { |
1625 | tiling_config |= ROW_TILING(3); | 1560 | tiling_config |= ROW_TILING(3); |
@@ -1631,32 +1566,36 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1631 | tiling_config |= BANK_SWAPS(1); | 1566 | tiling_config |= BANK_SWAPS(1); |
1632 | 1567 | ||
1633 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; | 1568 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; |
1634 | cc_rb_backend_disable |= | 1569 | tmp = R6XX_MAX_BACKENDS - |
1635 | BACKEND_DISABLE((R6XX_MAX_BACKENDS_MASK << rdev->config.r600.max_backends) & R6XX_MAX_BACKENDS_MASK); | 1570 | r600_count_pipe_bits((cc_rb_backend_disable >> 16) & R6XX_MAX_BACKENDS_MASK); |
1636 | 1571 | if (tmp < rdev->config.r600.max_backends) { | |
1637 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; | 1572 | rdev->config.r600.max_backends = tmp; |
1638 | cc_gc_shader_pipe_config |= | 1573 | } |
1639 | INACTIVE_QD_PIPES((R6XX_MAX_PIPES_MASK << rdev->config.r600.max_pipes) & R6XX_MAX_PIPES_MASK); | 1574 | |
1640 | cc_gc_shader_pipe_config |= | 1575 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0x00ffff00; |
1641 | INACTIVE_SIMDS((R6XX_MAX_SIMDS_MASK << rdev->config.r600.max_simds) & R6XX_MAX_SIMDS_MASK); | 1576 | tmp = R6XX_MAX_PIPES - |
1642 | 1577 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R6XX_MAX_PIPES_MASK); | |
1643 | backend_map = r600_get_tile_pipe_to_backend_map(rdev->config.r600.max_tile_pipes, | 1578 | if (tmp < rdev->config.r600.max_pipes) { |
1644 | (R6XX_MAX_BACKENDS - | 1579 | rdev->config.r600.max_pipes = tmp; |
1645 | r600_count_pipe_bits((cc_rb_backend_disable & | 1580 | } |
1646 | R6XX_MAX_BACKENDS_MASK) >> 16)), | 1581 | tmp = R6XX_MAX_SIMDS - |
1647 | (cc_rb_backend_disable >> 16)); | 1582 | r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R6XX_MAX_SIMDS_MASK); |
1583 | if (tmp < rdev->config.r600.max_simds) { | ||
1584 | rdev->config.r600.max_simds = tmp; | ||
1585 | } | ||
1586 | |||
1587 | disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R6XX_MAX_BACKENDS_MASK; | ||
1588 | tmp = (tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; | ||
1589 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.r600.max_backends, | ||
1590 | R6XX_MAX_BACKENDS, disabled_rb_mask); | ||
1591 | tiling_config |= tmp << 16; | ||
1592 | rdev->config.r600.backend_map = tmp; | ||
1593 | |||
1648 | rdev->config.r600.tile_config = tiling_config; | 1594 | rdev->config.r600.tile_config = tiling_config; |
1649 | rdev->config.r600.backend_map = backend_map; | ||
1650 | tiling_config |= BACKEND_MAP(backend_map); | ||
1651 | WREG32(GB_TILING_CONFIG, tiling_config); | 1595 | WREG32(GB_TILING_CONFIG, tiling_config); |
1652 | WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); | 1596 | WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); |
1653 | WREG32(HDP_TILING_CONFIG, tiling_config & 0xffff); | 1597 | WREG32(HDP_TILING_CONFIG, tiling_config & 0xffff); |
1654 | 1598 | ||
1655 | /* Setup pipes */ | ||
1656 | WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
1657 | WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); | ||
1658 | WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); | ||
1659 | |||
1660 | tmp = R6XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); | 1599 | tmp = R6XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); |
1661 | WREG32(VGT_OUT_DEALLOC_CNTL, (tmp * 4) & DEALLOC_DIST_MASK); | 1600 | WREG32(VGT_OUT_DEALLOC_CNTL, (tmp * 4) & DEALLOC_DIST_MASK); |
1662 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((tmp * 4) - 2) & VTX_REUSE_DEPTH_MASK); | 1601 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((tmp * 4) - 2) & VTX_REUSE_DEPTH_MASK); |
@@ -1900,6 +1839,7 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1900 | WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | | 1839 | WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | |
1901 | NUM_CLIP_SEQ(3))); | 1840 | NUM_CLIP_SEQ(3))); |
1902 | WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095)); | 1841 | WREG32(PA_SC_ENHANCE, FORCE_EOV_MAX_CLK_CNT(4095)); |
1842 | WREG32(VC_ENHANCE, 0); | ||
1903 | } | 1843 | } |
1904 | 1844 | ||
1905 | 1845 | ||
@@ -2487,6 +2427,12 @@ int r600_startup(struct radeon_device *rdev) | |||
2487 | if (r) | 2427 | if (r) |
2488 | return r; | 2428 | return r; |
2489 | 2429 | ||
2430 | r = r600_audio_init(rdev); | ||
2431 | if (r) { | ||
2432 | DRM_ERROR("radeon: audio init failed\n"); | ||
2433 | return r; | ||
2434 | } | ||
2435 | |||
2490 | return 0; | 2436 | return 0; |
2491 | } | 2437 | } |
2492 | 2438 | ||
@@ -2523,12 +2469,6 @@ int r600_resume(struct radeon_device *rdev) | |||
2523 | return r; | 2469 | return r; |
2524 | } | 2470 | } |
2525 | 2471 | ||
2526 | r = r600_audio_init(rdev); | ||
2527 | if (r) { | ||
2528 | DRM_ERROR("radeon: audio resume failed\n"); | ||
2529 | return r; | ||
2530 | } | ||
2531 | |||
2532 | return r; | 2472 | return r; |
2533 | } | 2473 | } |
2534 | 2474 | ||
@@ -2638,9 +2578,6 @@ int r600_init(struct radeon_device *rdev) | |||
2638 | rdev->accel_working = false; | 2578 | rdev->accel_working = false; |
2639 | } | 2579 | } |
2640 | 2580 | ||
2641 | r = r600_audio_init(rdev); | ||
2642 | if (r) | ||
2643 | return r; /* TODO error handling */ | ||
2644 | return 0; | 2581 | return 0; |
2645 | } | 2582 | } |
2646 | 2583 | ||
diff --git a/drivers/gpu/drm/radeon/r600_audio.c b/drivers/gpu/drm/radeon/r600_audio.c index 7c4fa77f018f..79b55916cf90 100644 --- a/drivers/gpu/drm/radeon/r600_audio.c +++ b/drivers/gpu/drm/radeon/r600_audio.c | |||
@@ -57,7 +57,7 @@ static bool radeon_dig_encoder(struct drm_encoder *encoder) | |||
57 | */ | 57 | */ |
58 | static int r600_audio_chipset_supported(struct radeon_device *rdev) | 58 | static int r600_audio_chipset_supported(struct radeon_device *rdev) |
59 | { | 59 | { |
60 | return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE5(rdev)) | 60 | return (rdev->family >= CHIP_R600 && !ASIC_IS_DCE6(rdev)) |
61 | || rdev->family == CHIP_RS600 | 61 | || rdev->family == CHIP_RS600 |
62 | || rdev->family == CHIP_RS690 | 62 | || rdev->family == CHIP_RS690 |
63 | || rdev->family == CHIP_RS740; | 63 | || rdev->family == CHIP_RS740; |
@@ -192,6 +192,7 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock) | |||
192 | struct radeon_device *rdev = dev->dev_private; | 192 | struct radeon_device *rdev = dev->dev_private; |
193 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 193 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
194 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 194 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
195 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); | ||
195 | int base_rate = 48000; | 196 | int base_rate = 48000; |
196 | 197 | ||
197 | switch (radeon_encoder->encoder_id) { | 198 | switch (radeon_encoder->encoder_id) { |
@@ -217,8 +218,8 @@ void r600_audio_set_clock(struct drm_encoder *encoder, int clock) | |||
217 | WREG32(EVERGREEN_AUDIO_PLL1_DIV, clock * 10); | 218 | WREG32(EVERGREEN_AUDIO_PLL1_DIV, clock * 10); |
218 | WREG32(EVERGREEN_AUDIO_PLL1_UNK, 0x00000071); | 219 | WREG32(EVERGREEN_AUDIO_PLL1_UNK, 0x00000071); |
219 | 220 | ||
220 | /* Some magic trigger or src sel? */ | 221 | /* Select DTO source */ |
221 | WREG32_P(0x5ac, 0x01, ~0x77); | 222 | WREG32(0x5ac, radeon_crtc->crtc_id); |
222 | } else { | 223 | } else { |
223 | switch (dig->dig_encoder) { | 224 | switch (dig->dig_encoder) { |
224 | case 0: | 225 | case 0: |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 0133f5f09bd6..ca87f7afaf23 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -2079,6 +2079,48 @@ static int r600_packet3_check(struct radeon_cs_parser *p, | |||
2079 | return -EINVAL; | 2079 | return -EINVAL; |
2080 | } | 2080 | } |
2081 | break; | 2081 | break; |
2082 | case PACKET3_STRMOUT_BASE_UPDATE: | ||
2083 | if (p->family < CHIP_RV770) { | ||
2084 | DRM_ERROR("STRMOUT_BASE_UPDATE only supported on 7xx\n"); | ||
2085 | return -EINVAL; | ||
2086 | } | ||
2087 | if (pkt->count != 1) { | ||
2088 | DRM_ERROR("bad STRMOUT_BASE_UPDATE packet count\n"); | ||
2089 | return -EINVAL; | ||
2090 | } | ||
2091 | if (idx_value > 3) { | ||
2092 | DRM_ERROR("bad STRMOUT_BASE_UPDATE index\n"); | ||
2093 | return -EINVAL; | ||
2094 | } | ||
2095 | { | ||
2096 | u64 offset; | ||
2097 | |||
2098 | r = r600_cs_packet_next_reloc(p, &reloc); | ||
2099 | if (r) { | ||
2100 | DRM_ERROR("bad STRMOUT_BASE_UPDATE reloc\n"); | ||
2101 | return -EINVAL; | ||
2102 | } | ||
2103 | |||
2104 | if (reloc->robj != track->vgt_strmout_bo[idx_value]) { | ||
2105 | DRM_ERROR("bad STRMOUT_BASE_UPDATE, bo does not match\n"); | ||
2106 | return -EINVAL; | ||
2107 | } | ||
2108 | |||
2109 | offset = radeon_get_ib_value(p, idx+1) << 8; | ||
2110 | if (offset != track->vgt_strmout_bo_offset[idx_value]) { | ||
2111 | DRM_ERROR("bad STRMOUT_BASE_UPDATE, bo offset does not match: 0x%llx, 0x%x\n", | ||
2112 | offset, track->vgt_strmout_bo_offset[idx_value]); | ||
2113 | return -EINVAL; | ||
2114 | } | ||
2115 | |||
2116 | if ((offset + 4) > radeon_bo_size(reloc->robj)) { | ||
2117 | DRM_ERROR("bad STRMOUT_BASE_UPDATE bo too small: 0x%llx, 0x%lx\n", | ||
2118 | offset + 4, radeon_bo_size(reloc->robj)); | ||
2119 | return -EINVAL; | ||
2120 | } | ||
2121 | ib[idx+1] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
2122 | } | ||
2123 | break; | ||
2082 | case PACKET3_SURFACE_BASE_UPDATE: | 2124 | case PACKET3_SURFACE_BASE_UPDATE: |
2083 | if (p->family >= CHIP_RV770 || p->family == CHIP_R600) { | 2125 | if (p->family >= CHIP_RV770 || p->family == CHIP_R600) { |
2084 | DRM_ERROR("bad SURFACE_BASE_UPDATE\n"); | 2126 | DRM_ERROR("bad SURFACE_BASE_UPDATE\n"); |
diff --git a/drivers/gpu/drm/radeon/r600_hdmi.c b/drivers/gpu/drm/radeon/r600_hdmi.c index 226379e00ac1..82a0a4c919c0 100644 --- a/drivers/gpu/drm/radeon/r600_hdmi.c +++ b/drivers/gpu/drm/radeon/r600_hdmi.c | |||
@@ -322,9 +322,6 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
322 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 322 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
323 | uint32_t offset; | 323 | uint32_t offset; |
324 | 324 | ||
325 | if (ASIC_IS_DCE5(rdev)) | ||
326 | return; | ||
327 | |||
328 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 325 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
329 | if (!dig->afmt->enabled) | 326 | if (!dig->afmt->enabled) |
330 | return; | 327 | return; |
@@ -348,7 +345,6 @@ void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mod | |||
348 | WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset, | 345 | WREG32(HDMI0_AUDIO_PACKET_CONTROL + offset, |
349 | HDMI0_AUDIO_SAMPLE_SEND | /* send audio packets */ | 346 | HDMI0_AUDIO_SAMPLE_SEND | /* send audio packets */ |
350 | HDMI0_AUDIO_DELAY_EN(1) | /* default audio delay */ | 347 | HDMI0_AUDIO_DELAY_EN(1) | /* default audio delay */ |
351 | HDMI0_AUDIO_SEND_MAX_PACKETS | /* send NULL packets if no audio is available */ | ||
352 | HDMI0_AUDIO_PACKETS_PER_LINE(3) | /* should be suffient for all audio modes and small enough for all hblanks */ | 348 | HDMI0_AUDIO_PACKETS_PER_LINE(3) | /* should be suffient for all audio modes and small enough for all hblanks */ |
353 | HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ | 349 | HDMI0_60958_CS_UPDATE); /* allow 60958 channel status fields to be updated */ |
354 | } | 350 | } |
@@ -484,7 +480,7 @@ void r600_hdmi_enable(struct drm_encoder *encoder) | |||
484 | uint32_t offset; | 480 | uint32_t offset; |
485 | u32 hdmi; | 481 | u32 hdmi; |
486 | 482 | ||
487 | if (ASIC_IS_DCE5(rdev)) | 483 | if (ASIC_IS_DCE6(rdev)) |
488 | return; | 484 | return; |
489 | 485 | ||
490 | /* Silent, r600_hdmi_enable will raise WARN for us */ | 486 | /* Silent, r600_hdmi_enable will raise WARN for us */ |
@@ -544,7 +540,7 @@ void r600_hdmi_disable(struct drm_encoder *encoder) | |||
544 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; | 540 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
545 | uint32_t offset; | 541 | uint32_t offset; |
546 | 542 | ||
547 | if (ASIC_IS_DCE5(rdev)) | 543 | if (ASIC_IS_DCE6(rdev)) |
548 | return; | 544 | return; |
549 | 545 | ||
550 | /* Called for ATOM_ENCODER_MODE_HDMI only */ | 546 | /* Called for ATOM_ENCODER_MODE_HDMI only */ |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 15bd3b216243..025fd5b6c08c 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -219,6 +219,8 @@ | |||
219 | #define BACKEND_MAP(x) ((x) << 16) | 219 | #define BACKEND_MAP(x) ((x) << 16) |
220 | 220 | ||
221 | #define GB_TILING_CONFIG 0x98F0 | 221 | #define GB_TILING_CONFIG 0x98F0 |
222 | #define PIPE_TILING__SHIFT 1 | ||
223 | #define PIPE_TILING__MASK 0x0000000e | ||
222 | 224 | ||
223 | #define GC_USER_SHADER_PIPE_CONFIG 0x8954 | 225 | #define GC_USER_SHADER_PIPE_CONFIG 0x8954 |
224 | #define INACTIVE_QD_PIPES(x) ((x) << 8) | 226 | #define INACTIVE_QD_PIPES(x) ((x) << 8) |
@@ -483,6 +485,7 @@ | |||
483 | #define TC_L2_SIZE(x) ((x)<<5) | 485 | #define TC_L2_SIZE(x) ((x)<<5) |
484 | #define L2_DISABLE_LATE_HIT (1<<9) | 486 | #define L2_DISABLE_LATE_HIT (1<<9) |
485 | 487 | ||
488 | #define VC_ENHANCE 0x9714 | ||
486 | 489 | ||
487 | #define VGT_CACHE_INVALIDATION 0x88C4 | 490 | #define VGT_CACHE_INVALIDATION 0x88C4 |
488 | #define CACHE_INVALIDATION(x) ((x)<<0) | 491 | #define CACHE_INVALIDATION(x) ((x)<<0) |
@@ -1161,6 +1164,7 @@ | |||
1161 | #define PACKET3_SET_CTL_CONST 0x6F | 1164 | #define PACKET3_SET_CTL_CONST 0x6F |
1162 | #define PACKET3_SET_CTL_CONST_OFFSET 0x0003cff0 | 1165 | #define PACKET3_SET_CTL_CONST_OFFSET 0x0003cff0 |
1163 | #define PACKET3_SET_CTL_CONST_END 0x0003e200 | 1166 | #define PACKET3_SET_CTL_CONST_END 0x0003e200 |
1167 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ | ||
1164 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 | 1168 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 |
1165 | 1169 | ||
1166 | 1170 | ||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 2e24022b389a..fefcca55c1eb 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -1374,9 +1374,9 @@ struct cayman_asic { | |||
1374 | 1374 | ||
1375 | struct si_asic { | 1375 | struct si_asic { |
1376 | unsigned max_shader_engines; | 1376 | unsigned max_shader_engines; |
1377 | unsigned max_pipes_per_simd; | ||
1378 | unsigned max_tile_pipes; | 1377 | unsigned max_tile_pipes; |
1379 | unsigned max_simds_per_se; | 1378 | unsigned max_cu_per_sh; |
1379 | unsigned max_sh_per_se; | ||
1380 | unsigned max_backends_per_se; | 1380 | unsigned max_backends_per_se; |
1381 | unsigned max_texture_channel_caches; | 1381 | unsigned max_texture_channel_caches; |
1382 | unsigned max_gprs; | 1382 | unsigned max_gprs; |
@@ -1387,7 +1387,6 @@ struct si_asic { | |||
1387 | unsigned sc_hiz_tile_fifo_size; | 1387 | unsigned sc_hiz_tile_fifo_size; |
1388 | unsigned sc_earlyz_tile_fifo_size; | 1388 | unsigned sc_earlyz_tile_fifo_size; |
1389 | 1389 | ||
1390 | unsigned num_shader_engines; | ||
1391 | unsigned num_tile_pipes; | 1390 | unsigned num_tile_pipes; |
1392 | unsigned num_backends_per_se; | 1391 | unsigned num_backends_per_se; |
1393 | unsigned backend_disable_mask_per_asic; | 1392 | unsigned backend_disable_mask_per_asic; |
@@ -1848,6 +1847,11 @@ extern struct radeon_hdmi_acr r600_hdmi_acr(uint32_t clock); | |||
1848 | extern void r600_hdmi_enable(struct drm_encoder *encoder); | 1847 | extern void r600_hdmi_enable(struct drm_encoder *encoder); |
1849 | extern void r600_hdmi_disable(struct drm_encoder *encoder); | 1848 | extern void r600_hdmi_disable(struct drm_encoder *encoder); |
1850 | extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode); | 1849 | extern void r600_hdmi_setmode(struct drm_encoder *encoder, struct drm_display_mode *mode); |
1850 | extern u32 r6xx_remap_render_backend(struct radeon_device *rdev, | ||
1851 | u32 tiling_pipe_num, | ||
1852 | u32 max_rb_num, | ||
1853 | u32 total_max_rb_num, | ||
1854 | u32 enabled_rb_mask); | ||
1851 | 1855 | ||
1852 | /* | 1856 | /* |
1853 | * evergreen functions used by radeon_encoder.c | 1857 | * evergreen functions used by radeon_encoder.c |
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index 0137689ed461..142f89462aa4 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -147,6 +147,7 @@ static int radeon_cs_sync_rings(struct radeon_cs_parser *p) | |||
147 | sync_to_ring, p->ring); | 147 | sync_to_ring, p->ring); |
148 | } | 148 | } |
149 | 149 | ||
150 | /* XXX: note that this is called from the legacy UMS CS ioctl as well */ | ||
150 | int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | 151 | int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) |
151 | { | 152 | { |
152 | struct drm_radeon_cs *cs = data; | 153 | struct drm_radeon_cs *cs = data; |
@@ -245,22 +246,24 @@ int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) | |||
245 | } | 246 | } |
246 | } | 247 | } |
247 | 248 | ||
248 | if ((p->cs_flags & RADEON_CS_USE_VM) && | 249 | /* these are KMS only */ |
249 | !p->rdev->vm_manager.enabled) { | 250 | if (p->rdev) { |
250 | DRM_ERROR("VM not active on asic!\n"); | 251 | if ((p->cs_flags & RADEON_CS_USE_VM) && |
251 | return -EINVAL; | 252 | !p->rdev->vm_manager.enabled) { |
252 | } | 253 | DRM_ERROR("VM not active on asic!\n"); |
253 | 254 | return -EINVAL; | |
254 | /* we only support VM on SI+ */ | 255 | } |
255 | if ((p->rdev->family >= CHIP_TAHITI) && | ||
256 | ((p->cs_flags & RADEON_CS_USE_VM) == 0)) { | ||
257 | DRM_ERROR("VM required on SI+!\n"); | ||
258 | return -EINVAL; | ||
259 | } | ||
260 | 256 | ||
261 | if (radeon_cs_get_ring(p, ring, priority)) | 257 | /* we only support VM on SI+ */ |
262 | return -EINVAL; | 258 | if ((p->rdev->family >= CHIP_TAHITI) && |
259 | ((p->cs_flags & RADEON_CS_USE_VM) == 0)) { | ||
260 | DRM_ERROR("VM required on SI+!\n"); | ||
261 | return -EINVAL; | ||
262 | } | ||
263 | 263 | ||
264 | if (radeon_cs_get_ring(p, ring, priority)) | ||
265 | return -EINVAL; | ||
266 | } | ||
264 | 267 | ||
265 | /* deal with non-vm */ | 268 | /* deal with non-vm */ |
266 | if ((p->chunk_ib_idx != -1) && | 269 | if ((p->chunk_ib_idx != -1) && |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index f0bb2b543b13..2c4d53fd20c5 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -57,9 +57,11 @@ | |||
57 | * 2.13.0 - virtual memory support, streamout | 57 | * 2.13.0 - virtual memory support, streamout |
58 | * 2.14.0 - add evergreen tiling informations | 58 | * 2.14.0 - add evergreen tiling informations |
59 | * 2.15.0 - add max_pipes query | 59 | * 2.15.0 - add max_pipes query |
60 | * 2.16.0 - fix evergreen 2D tiled surface calculation | ||
61 | * 2.17.0 - add STRMOUT_BASE_UPDATE for r7xx | ||
60 | */ | 62 | */ |
61 | #define KMS_DRIVER_MAJOR 2 | 63 | #define KMS_DRIVER_MAJOR 2 |
62 | #define KMS_DRIVER_MINOR 15 | 64 | #define KMS_DRIVER_MINOR 17 |
63 | #define KMS_DRIVER_PATCHLEVEL 0 | 65 | #define KMS_DRIVER_PATCHLEVEL 0 |
64 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); | 66 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); |
65 | int radeon_driver_unload_kms(struct drm_device *dev); | 67 | int radeon_driver_unload_kms(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 79db56e6c2ac..59d44937dd9f 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -476,12 +476,18 @@ int radeon_vm_bo_add(struct radeon_device *rdev, | |||
476 | 476 | ||
477 | mutex_lock(&vm->mutex); | 477 | mutex_lock(&vm->mutex); |
478 | if (last_pfn > vm->last_pfn) { | 478 | if (last_pfn > vm->last_pfn) { |
479 | /* grow va space 32M by 32M */ | 479 | /* release mutex and lock in right order */ |
480 | unsigned align = ((32 << 20) >> 12) - 1; | 480 | mutex_unlock(&vm->mutex); |
481 | radeon_mutex_lock(&rdev->cs_mutex); | 481 | radeon_mutex_lock(&rdev->cs_mutex); |
482 | radeon_vm_unbind_locked(rdev, vm); | 482 | mutex_lock(&vm->mutex); |
483 | /* and check again */ | ||
484 | if (last_pfn > vm->last_pfn) { | ||
485 | /* grow va space 32M by 32M */ | ||
486 | unsigned align = ((32 << 20) >> 12) - 1; | ||
487 | radeon_vm_unbind_locked(rdev, vm); | ||
488 | vm->last_pfn = (last_pfn + align) & ~align; | ||
489 | } | ||
483 | radeon_mutex_unlock(&rdev->cs_mutex); | 490 | radeon_mutex_unlock(&rdev->cs_mutex); |
484 | vm->last_pfn = (last_pfn + align) & ~align; | ||
485 | } | 491 | } |
486 | head = &vm->va; | 492 | head = &vm->va; |
487 | last_offset = 0; | 493 | last_offset = 0; |
@@ -595,8 +601,8 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev, | |||
595 | if (bo_va == NULL) | 601 | if (bo_va == NULL) |
596 | return 0; | 602 | return 0; |
597 | 603 | ||
598 | mutex_lock(&vm->mutex); | ||
599 | radeon_mutex_lock(&rdev->cs_mutex); | 604 | radeon_mutex_lock(&rdev->cs_mutex); |
605 | mutex_lock(&vm->mutex); | ||
600 | radeon_vm_bo_update_pte(rdev, vm, bo, NULL); | 606 | radeon_vm_bo_update_pte(rdev, vm, bo, NULL); |
601 | radeon_mutex_unlock(&rdev->cs_mutex); | 607 | radeon_mutex_unlock(&rdev->cs_mutex); |
602 | list_del(&bo_va->vm_list); | 608 | list_del(&bo_va->vm_list); |
@@ -641,9 +647,8 @@ void radeon_vm_fini(struct radeon_device *rdev, struct radeon_vm *vm) | |||
641 | struct radeon_bo_va *bo_va, *tmp; | 647 | struct radeon_bo_va *bo_va, *tmp; |
642 | int r; | 648 | int r; |
643 | 649 | ||
644 | mutex_lock(&vm->mutex); | ||
645 | |||
646 | radeon_mutex_lock(&rdev->cs_mutex); | 650 | radeon_mutex_lock(&rdev->cs_mutex); |
651 | mutex_lock(&vm->mutex); | ||
647 | radeon_vm_unbind_locked(rdev, vm); | 652 | radeon_vm_unbind_locked(rdev, vm); |
648 | radeon_mutex_unlock(&rdev->cs_mutex); | 653 | radeon_mutex_unlock(&rdev->cs_mutex); |
649 | 654 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index f1016a5820d1..5c58d7d90cb2 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -273,7 +273,7 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
273 | break; | 273 | break; |
274 | case RADEON_INFO_MAX_PIPES: | 274 | case RADEON_INFO_MAX_PIPES: |
275 | if (rdev->family >= CHIP_TAHITI) | 275 | if (rdev->family >= CHIP_TAHITI) |
276 | value = rdev->config.si.max_pipes_per_simd; | 276 | value = rdev->config.si.max_cu_per_sh; |
277 | else if (rdev->family >= CHIP_CAYMAN) | 277 | else if (rdev->family >= CHIP_CAYMAN) |
278 | value = rdev->config.cayman.max_pipes_per_simd; | 278 | value = rdev->config.cayman.max_pipes_per_simd; |
279 | else if (rdev->family >= CHIP_CEDAR) | 279 | else if (rdev->family >= CHIP_CEDAR) |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 08825548ee69..5b37e283ec38 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -801,9 +801,13 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work) | |||
801 | int i; | 801 | int i; |
802 | 802 | ||
803 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { | 803 | for (i = 0; i < RADEON_NUM_RINGS; ++i) { |
804 | not_processed += radeon_fence_count_emitted(rdev, i); | 804 | struct radeon_ring *ring = &rdev->ring[i]; |
805 | if (not_processed >= 3) | 805 | |
806 | break; | 806 | if (ring->ready) { |
807 | not_processed += radeon_fence_count_emitted(rdev, i); | ||
808 | if (not_processed >= 3) | ||
809 | break; | ||
810 | } | ||
807 | } | 811 | } |
808 | 812 | ||
809 | if (not_processed >= 3) { /* should upclock */ | 813 | if (not_processed >= 3) { /* should upclock */ |
diff --git a/drivers/gpu/drm/radeon/radeon_prime.c b/drivers/gpu/drm/radeon/radeon_prime.c index 8ddab4c76710..6bef46ace831 100644 --- a/drivers/gpu/drm/radeon/radeon_prime.c +++ b/drivers/gpu/drm/radeon/radeon_prime.c | |||
@@ -169,11 +169,17 @@ struct dma_buf *radeon_gem_prime_export(struct drm_device *dev, | |||
169 | struct radeon_bo *bo = gem_to_radeon_bo(obj); | 169 | struct radeon_bo *bo = gem_to_radeon_bo(obj); |
170 | int ret = 0; | 170 | int ret = 0; |
171 | 171 | ||
172 | ret = radeon_bo_reserve(bo, false); | ||
173 | if (unlikely(ret != 0)) | ||
174 | return ERR_PTR(ret); | ||
175 | |||
172 | /* pin buffer into GTT */ | 176 | /* pin buffer into GTT */ |
173 | ret = radeon_bo_pin(bo, RADEON_GEM_DOMAIN_GTT, NULL); | 177 | ret = radeon_bo_pin(bo, RADEON_GEM_DOMAIN_GTT, NULL); |
174 | if (ret) | 178 | if (ret) { |
179 | radeon_bo_unreserve(bo); | ||
175 | return ERR_PTR(ret); | 180 | return ERR_PTR(ret); |
176 | 181 | } | |
182 | radeon_bo_unreserve(bo); | ||
177 | return dma_buf_export(bo, &radeon_dmabuf_ops, obj->size, flags); | 183 | return dma_buf_export(bo, &radeon_dmabuf_ops, obj->size, flags); |
178 | } | 184 | } |
179 | 185 | ||
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 25f9eef12c42..e95c5e61d4e2 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -908,12 +908,6 @@ static int rs600_startup(struct radeon_device *rdev) | |||
908 | return r; | 908 | return r; |
909 | } | 909 | } |
910 | 910 | ||
911 | r = r600_audio_init(rdev); | ||
912 | if (r) { | ||
913 | dev_err(rdev->dev, "failed initializing audio\n"); | ||
914 | return r; | ||
915 | } | ||
916 | |||
917 | r = radeon_ib_pool_start(rdev); | 911 | r = radeon_ib_pool_start(rdev); |
918 | if (r) | 912 | if (r) |
919 | return r; | 913 | return r; |
@@ -922,6 +916,12 @@ static int rs600_startup(struct radeon_device *rdev) | |||
922 | if (r) | 916 | if (r) |
923 | return r; | 917 | return r; |
924 | 918 | ||
919 | r = r600_audio_init(rdev); | ||
920 | if (r) { | ||
921 | dev_err(rdev->dev, "failed initializing audio\n"); | ||
922 | return r; | ||
923 | } | ||
924 | |||
925 | return 0; | 925 | return 0; |
926 | } | 926 | } |
927 | 927 | ||
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 3277ddecfe9f..159b6a43fda0 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
@@ -637,12 +637,6 @@ static int rs690_startup(struct radeon_device *rdev) | |||
637 | return r; | 637 | return r; |
638 | } | 638 | } |
639 | 639 | ||
640 | r = r600_audio_init(rdev); | ||
641 | if (r) { | ||
642 | dev_err(rdev->dev, "failed initializing audio\n"); | ||
643 | return r; | ||
644 | } | ||
645 | |||
646 | r = radeon_ib_pool_start(rdev); | 640 | r = radeon_ib_pool_start(rdev); |
647 | if (r) | 641 | if (r) |
648 | return r; | 642 | return r; |
@@ -651,6 +645,12 @@ static int rs690_startup(struct radeon_device *rdev) | |||
651 | if (r) | 645 | if (r) |
652 | return r; | 646 | return r; |
653 | 647 | ||
648 | r = r600_audio_init(rdev); | ||
649 | if (r) { | ||
650 | dev_err(rdev->dev, "failed initializing audio\n"); | ||
651 | return r; | ||
652 | } | ||
653 | |||
654 | return 0; | 654 | return 0; |
655 | } | 655 | } |
656 | 656 | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index c2f473bc13b8..b4f51c569c36 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -151,6 +151,8 @@ int rv770_pcie_gart_enable(struct radeon_device *rdev) | |||
151 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); | 151 | WREG32(MC_VM_MD_L1_TLB0_CNTL, tmp); |
152 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); | 152 | WREG32(MC_VM_MD_L1_TLB1_CNTL, tmp); |
153 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); | 153 | WREG32(MC_VM_MD_L1_TLB2_CNTL, tmp); |
154 | if (rdev->family == CHIP_RV740) | ||
155 | WREG32(MC_VM_MD_L1_TLB3_CNTL, tmp); | ||
154 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); | 156 | WREG32(MC_VM_MB_L1_TLB0_CNTL, tmp); |
155 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); | 157 | WREG32(MC_VM_MB_L1_TLB1_CNTL, tmp); |
156 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); | 158 | WREG32(MC_VM_MB_L1_TLB2_CNTL, tmp); |
@@ -363,180 +365,6 @@ void r700_cp_fini(struct radeon_device *rdev) | |||
363 | /* | 365 | /* |
364 | * Core functions | 366 | * Core functions |
365 | */ | 367 | */ |
366 | static u32 r700_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | ||
367 | u32 num_tile_pipes, | ||
368 | u32 num_backends, | ||
369 | u32 backend_disable_mask) | ||
370 | { | ||
371 | u32 backend_map = 0; | ||
372 | u32 enabled_backends_mask; | ||
373 | u32 enabled_backends_count; | ||
374 | u32 cur_pipe; | ||
375 | u32 swizzle_pipe[R7XX_MAX_PIPES]; | ||
376 | u32 cur_backend; | ||
377 | u32 i; | ||
378 | bool force_no_swizzle; | ||
379 | |||
380 | if (num_tile_pipes > R7XX_MAX_PIPES) | ||
381 | num_tile_pipes = R7XX_MAX_PIPES; | ||
382 | if (num_tile_pipes < 1) | ||
383 | num_tile_pipes = 1; | ||
384 | if (num_backends > R7XX_MAX_BACKENDS) | ||
385 | num_backends = R7XX_MAX_BACKENDS; | ||
386 | if (num_backends < 1) | ||
387 | num_backends = 1; | ||
388 | |||
389 | enabled_backends_mask = 0; | ||
390 | enabled_backends_count = 0; | ||
391 | for (i = 0; i < R7XX_MAX_BACKENDS; ++i) { | ||
392 | if (((backend_disable_mask >> i) & 1) == 0) { | ||
393 | enabled_backends_mask |= (1 << i); | ||
394 | ++enabled_backends_count; | ||
395 | } | ||
396 | if (enabled_backends_count == num_backends) | ||
397 | break; | ||
398 | } | ||
399 | |||
400 | if (enabled_backends_count == 0) { | ||
401 | enabled_backends_mask = 1; | ||
402 | enabled_backends_count = 1; | ||
403 | } | ||
404 | |||
405 | if (enabled_backends_count != num_backends) | ||
406 | num_backends = enabled_backends_count; | ||
407 | |||
408 | switch (rdev->family) { | ||
409 | case CHIP_RV770: | ||
410 | case CHIP_RV730: | ||
411 | force_no_swizzle = false; | ||
412 | break; | ||
413 | case CHIP_RV710: | ||
414 | case CHIP_RV740: | ||
415 | default: | ||
416 | force_no_swizzle = true; | ||
417 | break; | ||
418 | } | ||
419 | |||
420 | memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * R7XX_MAX_PIPES); | ||
421 | switch (num_tile_pipes) { | ||
422 | case 1: | ||
423 | swizzle_pipe[0] = 0; | ||
424 | break; | ||
425 | case 2: | ||
426 | swizzle_pipe[0] = 0; | ||
427 | swizzle_pipe[1] = 1; | ||
428 | break; | ||
429 | case 3: | ||
430 | if (force_no_swizzle) { | ||
431 | swizzle_pipe[0] = 0; | ||
432 | swizzle_pipe[1] = 1; | ||
433 | swizzle_pipe[2] = 2; | ||
434 | } else { | ||
435 | swizzle_pipe[0] = 0; | ||
436 | swizzle_pipe[1] = 2; | ||
437 | swizzle_pipe[2] = 1; | ||
438 | } | ||
439 | break; | ||
440 | case 4: | ||
441 | if (force_no_swizzle) { | ||
442 | swizzle_pipe[0] = 0; | ||
443 | swizzle_pipe[1] = 1; | ||
444 | swizzle_pipe[2] = 2; | ||
445 | swizzle_pipe[3] = 3; | ||
446 | } else { | ||
447 | swizzle_pipe[0] = 0; | ||
448 | swizzle_pipe[1] = 2; | ||
449 | swizzle_pipe[2] = 3; | ||
450 | swizzle_pipe[3] = 1; | ||
451 | } | ||
452 | break; | ||
453 | case 5: | ||
454 | if (force_no_swizzle) { | ||
455 | swizzle_pipe[0] = 0; | ||
456 | swizzle_pipe[1] = 1; | ||
457 | swizzle_pipe[2] = 2; | ||
458 | swizzle_pipe[3] = 3; | ||
459 | swizzle_pipe[4] = 4; | ||
460 | } else { | ||
461 | swizzle_pipe[0] = 0; | ||
462 | swizzle_pipe[1] = 2; | ||
463 | swizzle_pipe[2] = 4; | ||
464 | swizzle_pipe[3] = 1; | ||
465 | swizzle_pipe[4] = 3; | ||
466 | } | ||
467 | break; | ||
468 | case 6: | ||
469 | if (force_no_swizzle) { | ||
470 | swizzle_pipe[0] = 0; | ||
471 | swizzle_pipe[1] = 1; | ||
472 | swizzle_pipe[2] = 2; | ||
473 | swizzle_pipe[3] = 3; | ||
474 | swizzle_pipe[4] = 4; | ||
475 | swizzle_pipe[5] = 5; | ||
476 | } else { | ||
477 | swizzle_pipe[0] = 0; | ||
478 | swizzle_pipe[1] = 2; | ||
479 | swizzle_pipe[2] = 4; | ||
480 | swizzle_pipe[3] = 5; | ||
481 | swizzle_pipe[4] = 3; | ||
482 | swizzle_pipe[5] = 1; | ||
483 | } | ||
484 | break; | ||
485 | case 7: | ||
486 | if (force_no_swizzle) { | ||
487 | swizzle_pipe[0] = 0; | ||
488 | swizzle_pipe[1] = 1; | ||
489 | swizzle_pipe[2] = 2; | ||
490 | swizzle_pipe[3] = 3; | ||
491 | swizzle_pipe[4] = 4; | ||
492 | swizzle_pipe[5] = 5; | ||
493 | swizzle_pipe[6] = 6; | ||
494 | } else { | ||
495 | swizzle_pipe[0] = 0; | ||
496 | swizzle_pipe[1] = 2; | ||
497 | swizzle_pipe[2] = 4; | ||
498 | swizzle_pipe[3] = 6; | ||
499 | swizzle_pipe[4] = 3; | ||
500 | swizzle_pipe[5] = 1; | ||
501 | swizzle_pipe[6] = 5; | ||
502 | } | ||
503 | break; | ||
504 | case 8: | ||
505 | if (force_no_swizzle) { | ||
506 | swizzle_pipe[0] = 0; | ||
507 | swizzle_pipe[1] = 1; | ||
508 | swizzle_pipe[2] = 2; | ||
509 | swizzle_pipe[3] = 3; | ||
510 | swizzle_pipe[4] = 4; | ||
511 | swizzle_pipe[5] = 5; | ||
512 | swizzle_pipe[6] = 6; | ||
513 | swizzle_pipe[7] = 7; | ||
514 | } else { | ||
515 | swizzle_pipe[0] = 0; | ||
516 | swizzle_pipe[1] = 2; | ||
517 | swizzle_pipe[2] = 4; | ||
518 | swizzle_pipe[3] = 6; | ||
519 | swizzle_pipe[4] = 3; | ||
520 | swizzle_pipe[5] = 1; | ||
521 | swizzle_pipe[6] = 7; | ||
522 | swizzle_pipe[7] = 5; | ||
523 | } | ||
524 | break; | ||
525 | } | ||
526 | |||
527 | cur_backend = 0; | ||
528 | for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) { | ||
529 | while (((1 << cur_backend) & enabled_backends_mask) == 0) | ||
530 | cur_backend = (cur_backend + 1) % R7XX_MAX_BACKENDS; | ||
531 | |||
532 | backend_map |= (u32)(((cur_backend & 3) << (swizzle_pipe[cur_pipe] * 2))); | ||
533 | |||
534 | cur_backend = (cur_backend + 1) % R7XX_MAX_BACKENDS; | ||
535 | } | ||
536 | |||
537 | return backend_map; | ||
538 | } | ||
539 | |||
540 | static void rv770_gpu_init(struct radeon_device *rdev) | 368 | static void rv770_gpu_init(struct radeon_device *rdev) |
541 | { | 369 | { |
542 | int i, j, num_qd_pipes; | 370 | int i, j, num_qd_pipes; |
@@ -552,14 +380,17 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
552 | u32 sq_thread_resource_mgmt; | 380 | u32 sq_thread_resource_mgmt; |
553 | u32 hdp_host_path_cntl; | 381 | u32 hdp_host_path_cntl; |
554 | u32 sq_dyn_gpr_size_simd_ab_0; | 382 | u32 sq_dyn_gpr_size_simd_ab_0; |
555 | u32 backend_map; | ||
556 | u32 gb_tiling_config = 0; | 383 | u32 gb_tiling_config = 0; |
557 | u32 cc_rb_backend_disable = 0; | 384 | u32 cc_rb_backend_disable = 0; |
558 | u32 cc_gc_shader_pipe_config = 0; | 385 | u32 cc_gc_shader_pipe_config = 0; |
559 | u32 mc_arb_ramcfg; | 386 | u32 mc_arb_ramcfg; |
560 | u32 db_debug4; | 387 | u32 db_debug4, tmp; |
388 | u32 inactive_pipes, shader_pipe_config; | ||
389 | u32 disabled_rb_mask; | ||
390 | unsigned active_number; | ||
561 | 391 | ||
562 | /* setup chip specs */ | 392 | /* setup chip specs */ |
393 | rdev->config.rv770.tiling_group_size = 256; | ||
563 | switch (rdev->family) { | 394 | switch (rdev->family) { |
564 | case CHIP_RV770: | 395 | case CHIP_RV770: |
565 | rdev->config.rv770.max_pipes = 4; | 396 | rdev->config.rv770.max_pipes = 4; |
@@ -670,33 +501,70 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
670 | /* setup tiling, simd, pipe config */ | 501 | /* setup tiling, simd, pipe config */ |
671 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); | 502 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); |
672 | 503 | ||
504 | shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG); | ||
505 | inactive_pipes = (shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> INACTIVE_QD_PIPES_SHIFT; | ||
506 | for (i = 0, tmp = 1, active_number = 0; i < R7XX_MAX_PIPES; i++) { | ||
507 | if (!(inactive_pipes & tmp)) { | ||
508 | active_number++; | ||
509 | } | ||
510 | tmp <<= 1; | ||
511 | } | ||
512 | if (active_number == 1) { | ||
513 | WREG32(SPI_CONFIG_CNTL, DISABLE_INTERP_1); | ||
514 | } else { | ||
515 | WREG32(SPI_CONFIG_CNTL, 0); | ||
516 | } | ||
517 | |||
518 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; | ||
519 | tmp = R7XX_MAX_BACKENDS - r600_count_pipe_bits(cc_rb_backend_disable >> 16); | ||
520 | if (tmp < rdev->config.rv770.max_backends) { | ||
521 | rdev->config.rv770.max_backends = tmp; | ||
522 | } | ||
523 | |||
524 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; | ||
525 | tmp = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 8) & R7XX_MAX_PIPES_MASK); | ||
526 | if (tmp < rdev->config.rv770.max_pipes) { | ||
527 | rdev->config.rv770.max_pipes = tmp; | ||
528 | } | ||
529 | tmp = R7XX_MAX_SIMDS - r600_count_pipe_bits((cc_gc_shader_pipe_config >> 16) & R7XX_MAX_SIMDS_MASK); | ||
530 | if (tmp < rdev->config.rv770.max_simds) { | ||
531 | rdev->config.rv770.max_simds = tmp; | ||
532 | } | ||
533 | |||
673 | switch (rdev->config.rv770.max_tile_pipes) { | 534 | switch (rdev->config.rv770.max_tile_pipes) { |
674 | case 1: | 535 | case 1: |
675 | default: | 536 | default: |
676 | gb_tiling_config |= PIPE_TILING(0); | 537 | gb_tiling_config = PIPE_TILING(0); |
677 | break; | 538 | break; |
678 | case 2: | 539 | case 2: |
679 | gb_tiling_config |= PIPE_TILING(1); | 540 | gb_tiling_config = PIPE_TILING(1); |
680 | break; | 541 | break; |
681 | case 4: | 542 | case 4: |
682 | gb_tiling_config |= PIPE_TILING(2); | 543 | gb_tiling_config = PIPE_TILING(2); |
683 | break; | 544 | break; |
684 | case 8: | 545 | case 8: |
685 | gb_tiling_config |= PIPE_TILING(3); | 546 | gb_tiling_config = PIPE_TILING(3); |
686 | break; | 547 | break; |
687 | } | 548 | } |
688 | rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; | 549 | rdev->config.rv770.tiling_npipes = rdev->config.rv770.max_tile_pipes; |
689 | 550 | ||
551 | disabled_rb_mask = (RREG32(CC_RB_BACKEND_DISABLE) >> 16) & R7XX_MAX_BACKENDS_MASK; | ||
552 | tmp = (gb_tiling_config & PIPE_TILING__MASK) >> PIPE_TILING__SHIFT; | ||
553 | tmp = r6xx_remap_render_backend(rdev, tmp, rdev->config.rv770.max_backends, | ||
554 | R7XX_MAX_BACKENDS, disabled_rb_mask); | ||
555 | gb_tiling_config |= tmp << 16; | ||
556 | rdev->config.rv770.backend_map = tmp; | ||
557 | |||
690 | if (rdev->family == CHIP_RV770) | 558 | if (rdev->family == CHIP_RV770) |
691 | gb_tiling_config |= BANK_TILING(1); | 559 | gb_tiling_config |= BANK_TILING(1); |
692 | else | 560 | else { |
693 | gb_tiling_config |= BANK_TILING((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT); | 561 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) |
562 | gb_tiling_config |= BANK_TILING(1); | ||
563 | else | ||
564 | gb_tiling_config |= BANK_TILING(0); | ||
565 | } | ||
694 | rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3); | 566 | rdev->config.rv770.tiling_nbanks = 4 << ((gb_tiling_config >> 4) & 0x3); |
695 | gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); | 567 | gb_tiling_config |= GROUP_SIZE((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT); |
696 | if ((mc_arb_ramcfg & BURSTLENGTH_MASK) >> BURSTLENGTH_SHIFT) | ||
697 | rdev->config.rv770.tiling_group_size = 512; | ||
698 | else | ||
699 | rdev->config.rv770.tiling_group_size = 256; | ||
700 | if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { | 568 | if (((mc_arb_ramcfg & NOOFROWS_MASK) >> NOOFROWS_SHIFT) > 3) { |
701 | gb_tiling_config |= ROW_TILING(3); | 569 | gb_tiling_config |= ROW_TILING(3); |
702 | gb_tiling_config |= SAMPLE_SPLIT(3); | 570 | gb_tiling_config |= SAMPLE_SPLIT(3); |
@@ -708,47 +576,19 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
708 | } | 576 | } |
709 | 577 | ||
710 | gb_tiling_config |= BANK_SWAPS(1); | 578 | gb_tiling_config |= BANK_SWAPS(1); |
711 | |||
712 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE) & 0x00ff0000; | ||
713 | cc_rb_backend_disable |= | ||
714 | BACKEND_DISABLE((R7XX_MAX_BACKENDS_MASK << rdev->config.rv770.max_backends) & R7XX_MAX_BACKENDS_MASK); | ||
715 | |||
716 | cc_gc_shader_pipe_config = RREG32(CC_GC_SHADER_PIPE_CONFIG) & 0xffffff00; | ||
717 | cc_gc_shader_pipe_config |= | ||
718 | INACTIVE_QD_PIPES((R7XX_MAX_PIPES_MASK << rdev->config.rv770.max_pipes) & R7XX_MAX_PIPES_MASK); | ||
719 | cc_gc_shader_pipe_config |= | ||
720 | INACTIVE_SIMDS((R7XX_MAX_SIMDS_MASK << rdev->config.rv770.max_simds) & R7XX_MAX_SIMDS_MASK); | ||
721 | |||
722 | if (rdev->family == CHIP_RV740) | ||
723 | backend_map = 0x28; | ||
724 | else | ||
725 | backend_map = r700_get_tile_pipe_to_backend_map(rdev, | ||
726 | rdev->config.rv770.max_tile_pipes, | ||
727 | (R7XX_MAX_BACKENDS - | ||
728 | r600_count_pipe_bits((cc_rb_backend_disable & | ||
729 | R7XX_MAX_BACKENDS_MASK) >> 16)), | ||
730 | (cc_rb_backend_disable >> 16)); | ||
731 | |||
732 | rdev->config.rv770.tile_config = gb_tiling_config; | 579 | rdev->config.rv770.tile_config = gb_tiling_config; |
733 | rdev->config.rv770.backend_map = backend_map; | ||
734 | gb_tiling_config |= BACKEND_MAP(backend_map); | ||
735 | 580 | ||
736 | WREG32(GB_TILING_CONFIG, gb_tiling_config); | 581 | WREG32(GB_TILING_CONFIG, gb_tiling_config); |
737 | WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); | 582 | WREG32(DCP_TILING_CONFIG, (gb_tiling_config & 0xffff)); |
738 | WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff)); | 583 | WREG32(HDP_TILING_CONFIG, (gb_tiling_config & 0xffff)); |
739 | 584 | ||
740 | WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
741 | WREG32(CC_GC_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); | ||
742 | WREG32(GC_USER_SHADER_PIPE_CONFIG, cc_gc_shader_pipe_config); | ||
743 | WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
744 | |||
745 | WREG32(CGTS_SYS_TCC_DISABLE, 0); | 585 | WREG32(CGTS_SYS_TCC_DISABLE, 0); |
746 | WREG32(CGTS_TCC_DISABLE, 0); | 586 | WREG32(CGTS_TCC_DISABLE, 0); |
747 | WREG32(CGTS_USER_SYS_TCC_DISABLE, 0); | 587 | WREG32(CGTS_USER_SYS_TCC_DISABLE, 0); |
748 | WREG32(CGTS_USER_TCC_DISABLE, 0); | 588 | WREG32(CGTS_USER_TCC_DISABLE, 0); |
749 | 589 | ||
750 | num_qd_pipes = | 590 | |
751 | R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); | 591 | num_qd_pipes = R7XX_MAX_PIPES - r600_count_pipe_bits((cc_gc_shader_pipe_config & INACTIVE_QD_PIPES_MASK) >> 8); |
752 | WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK); | 592 | WREG32(VGT_OUT_DEALLOC_CNTL, (num_qd_pipes * 4) & DEALLOC_DIST_MASK); |
753 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); | 593 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, ((num_qd_pipes * 4) - 2) & VTX_REUSE_DEPTH_MASK); |
754 | 594 | ||
@@ -776,6 +616,9 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
776 | ACK_FLUSH_CTL(3) | | 616 | ACK_FLUSH_CTL(3) | |
777 | SYNC_FLUSH_CTL)); | 617 | SYNC_FLUSH_CTL)); |
778 | 618 | ||
619 | if (rdev->family != CHIP_RV770) | ||
620 | WREG32(SMX_SAR_CTL0, 0x00003f3f); | ||
621 | |||
779 | db_debug3 = RREG32(DB_DEBUG3); | 622 | db_debug3 = RREG32(DB_DEBUG3); |
780 | db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f); | 623 | db_debug3 &= ~DB_CLK_OFF_DELAY(0x1f); |
781 | switch (rdev->family) { | 624 | switch (rdev->family) { |
@@ -809,8 +652,6 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
809 | 652 | ||
810 | WREG32(VGT_NUM_INSTANCES, 1); | 653 | WREG32(VGT_NUM_INSTANCES, 1); |
811 | 654 | ||
812 | WREG32(SPI_CONFIG_CNTL, GPR_WRITE_PRIORITY(0)); | ||
813 | |||
814 | WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4)); | 655 | WREG32(SPI_CONFIG_CNTL_1, VTX_DONE_DELAY(4)); |
815 | 656 | ||
816 | WREG32(CP_PERFMON_CNTL, 0); | 657 | WREG32(CP_PERFMON_CNTL, 0); |
@@ -954,7 +795,7 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
954 | 795 | ||
955 | WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | | 796 | WREG32(PA_CL_ENHANCE, (CLIP_VTX_REORDER_ENA | |
956 | NUM_CLIP_SEQ(3))); | 797 | NUM_CLIP_SEQ(3))); |
957 | 798 | WREG32(VC_ENHANCE, 0); | |
958 | } | 799 | } |
959 | 800 | ||
960 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) | 801 | void r700_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc) |
@@ -1118,6 +959,12 @@ static int rv770_startup(struct radeon_device *rdev) | |||
1118 | if (r) | 959 | if (r) |
1119 | return r; | 960 | return r; |
1120 | 961 | ||
962 | r = r600_audio_init(rdev); | ||
963 | if (r) { | ||
964 | DRM_ERROR("radeon: audio init failed\n"); | ||
965 | return r; | ||
966 | } | ||
967 | |||
1121 | return 0; | 968 | return 0; |
1122 | } | 969 | } |
1123 | 970 | ||
@@ -1140,12 +987,6 @@ int rv770_resume(struct radeon_device *rdev) | |||
1140 | return r; | 987 | return r; |
1141 | } | 988 | } |
1142 | 989 | ||
1143 | r = r600_audio_init(rdev); | ||
1144 | if (r) { | ||
1145 | dev_err(rdev->dev, "radeon: audio init failed\n"); | ||
1146 | return r; | ||
1147 | } | ||
1148 | |||
1149 | return r; | 990 | return r; |
1150 | 991 | ||
1151 | } | 992 | } |
@@ -1254,12 +1095,6 @@ int rv770_init(struct radeon_device *rdev) | |||
1254 | rdev->accel_working = false; | 1095 | rdev->accel_working = false; |
1255 | } | 1096 | } |
1256 | 1097 | ||
1257 | r = r600_audio_init(rdev); | ||
1258 | if (r) { | ||
1259 | dev_err(rdev->dev, "radeon: audio init failed\n"); | ||
1260 | return r; | ||
1261 | } | ||
1262 | |||
1263 | return 0; | 1098 | return 0; |
1264 | } | 1099 | } |
1265 | 1100 | ||
diff --git a/drivers/gpu/drm/radeon/rv770d.h b/drivers/gpu/drm/radeon/rv770d.h index 9c549f702f2f..b0adfc595d75 100644 --- a/drivers/gpu/drm/radeon/rv770d.h +++ b/drivers/gpu/drm/radeon/rv770d.h | |||
@@ -106,10 +106,13 @@ | |||
106 | #define BACKEND_MAP(x) ((x) << 16) | 106 | #define BACKEND_MAP(x) ((x) << 16) |
107 | 107 | ||
108 | #define GB_TILING_CONFIG 0x98F0 | 108 | #define GB_TILING_CONFIG 0x98F0 |
109 | #define PIPE_TILING__SHIFT 1 | ||
110 | #define PIPE_TILING__MASK 0x0000000e | ||
109 | 111 | ||
110 | #define GC_USER_SHADER_PIPE_CONFIG 0x8954 | 112 | #define GC_USER_SHADER_PIPE_CONFIG 0x8954 |
111 | #define INACTIVE_QD_PIPES(x) ((x) << 8) | 113 | #define INACTIVE_QD_PIPES(x) ((x) << 8) |
112 | #define INACTIVE_QD_PIPES_MASK 0x0000FF00 | 114 | #define INACTIVE_QD_PIPES_MASK 0x0000FF00 |
115 | #define INACTIVE_QD_PIPES_SHIFT 8 | ||
113 | #define INACTIVE_SIMDS(x) ((x) << 16) | 116 | #define INACTIVE_SIMDS(x) ((x) << 16) |
114 | #define INACTIVE_SIMDS_MASK 0x00FF0000 | 117 | #define INACTIVE_SIMDS_MASK 0x00FF0000 |
115 | 118 | ||
@@ -174,6 +177,7 @@ | |||
174 | #define MC_VM_MD_L1_TLB0_CNTL 0x2654 | 177 | #define MC_VM_MD_L1_TLB0_CNTL 0x2654 |
175 | #define MC_VM_MD_L1_TLB1_CNTL 0x2658 | 178 | #define MC_VM_MD_L1_TLB1_CNTL 0x2658 |
176 | #define MC_VM_MD_L1_TLB2_CNTL 0x265C | 179 | #define MC_VM_MD_L1_TLB2_CNTL 0x265C |
180 | #define MC_VM_MD_L1_TLB3_CNTL 0x2698 | ||
177 | #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C | 181 | #define MC_VM_SYSTEM_APERTURE_DEFAULT_ADDR 0x203C |
178 | #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 | 182 | #define MC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x2038 |
179 | #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034 | 183 | #define MC_VM_SYSTEM_APERTURE_LOW_ADDR 0x2034 |
@@ -207,6 +211,7 @@ | |||
207 | #define SCRATCH_UMSK 0x8540 | 211 | #define SCRATCH_UMSK 0x8540 |
208 | #define SCRATCH_ADDR 0x8544 | 212 | #define SCRATCH_ADDR 0x8544 |
209 | 213 | ||
214 | #define SMX_SAR_CTL0 0xA008 | ||
210 | #define SMX_DC_CTL0 0xA020 | 215 | #define SMX_DC_CTL0 0xA020 |
211 | #define USE_HASH_FUNCTION (1 << 0) | 216 | #define USE_HASH_FUNCTION (1 << 0) |
212 | #define CACHE_DEPTH(x) ((x) << 1) | 217 | #define CACHE_DEPTH(x) ((x) << 1) |
@@ -306,6 +311,8 @@ | |||
306 | #define TCP_CNTL 0x9610 | 311 | #define TCP_CNTL 0x9610 |
307 | #define TCP_CHAN_STEER 0x9614 | 312 | #define TCP_CHAN_STEER 0x9614 |
308 | 313 | ||
314 | #define VC_ENHANCE 0x9714 | ||
315 | |||
309 | #define VGT_CACHE_INVALIDATION 0x88C4 | 316 | #define VGT_CACHE_INVALIDATION 0x88C4 |
310 | #define CACHE_INVALIDATION(x) ((x)<<0) | 317 | #define CACHE_INVALIDATION(x) ((x)<<0) |
311 | #define VC_ONLY 0 | 318 | #define VC_ONLY 0 |
diff --git a/drivers/gpu/drm/radeon/si.c b/drivers/gpu/drm/radeon/si.c index 549732e56ca9..c7b61f16ecfd 100644 --- a/drivers/gpu/drm/radeon/si.c +++ b/drivers/gpu/drm/radeon/si.c | |||
@@ -867,200 +867,6 @@ void dce6_bandwidth_update(struct radeon_device *rdev) | |||
867 | /* | 867 | /* |
868 | * Core functions | 868 | * Core functions |
869 | */ | 869 | */ |
870 | static u32 si_get_tile_pipe_to_backend_map(struct radeon_device *rdev, | ||
871 | u32 num_tile_pipes, | ||
872 | u32 num_backends_per_asic, | ||
873 | u32 *backend_disable_mask_per_asic, | ||
874 | u32 num_shader_engines) | ||
875 | { | ||
876 | u32 backend_map = 0; | ||
877 | u32 enabled_backends_mask = 0; | ||
878 | u32 enabled_backends_count = 0; | ||
879 | u32 num_backends_per_se; | ||
880 | u32 cur_pipe; | ||
881 | u32 swizzle_pipe[SI_MAX_PIPES]; | ||
882 | u32 cur_backend = 0; | ||
883 | u32 i; | ||
884 | bool force_no_swizzle; | ||
885 | |||
886 | /* force legal values */ | ||
887 | if (num_tile_pipes < 1) | ||
888 | num_tile_pipes = 1; | ||
889 | if (num_tile_pipes > rdev->config.si.max_tile_pipes) | ||
890 | num_tile_pipes = rdev->config.si.max_tile_pipes; | ||
891 | if (num_shader_engines < 1) | ||
892 | num_shader_engines = 1; | ||
893 | if (num_shader_engines > rdev->config.si.max_shader_engines) | ||
894 | num_shader_engines = rdev->config.si.max_shader_engines; | ||
895 | if (num_backends_per_asic < num_shader_engines) | ||
896 | num_backends_per_asic = num_shader_engines; | ||
897 | if (num_backends_per_asic > (rdev->config.si.max_backends_per_se * num_shader_engines)) | ||
898 | num_backends_per_asic = rdev->config.si.max_backends_per_se * num_shader_engines; | ||
899 | |||
900 | /* make sure we have the same number of backends per se */ | ||
901 | num_backends_per_asic = ALIGN(num_backends_per_asic, num_shader_engines); | ||
902 | /* set up the number of backends per se */ | ||
903 | num_backends_per_se = num_backends_per_asic / num_shader_engines; | ||
904 | if (num_backends_per_se > rdev->config.si.max_backends_per_se) { | ||
905 | num_backends_per_se = rdev->config.si.max_backends_per_se; | ||
906 | num_backends_per_asic = num_backends_per_se * num_shader_engines; | ||
907 | } | ||
908 | |||
909 | /* create enable mask and count for enabled backends */ | ||
910 | for (i = 0; i < SI_MAX_BACKENDS; ++i) { | ||
911 | if (((*backend_disable_mask_per_asic >> i) & 1) == 0) { | ||
912 | enabled_backends_mask |= (1 << i); | ||
913 | ++enabled_backends_count; | ||
914 | } | ||
915 | if (enabled_backends_count == num_backends_per_asic) | ||
916 | break; | ||
917 | } | ||
918 | |||
919 | /* force the backends mask to match the current number of backends */ | ||
920 | if (enabled_backends_count != num_backends_per_asic) { | ||
921 | u32 this_backend_enabled; | ||
922 | u32 shader_engine; | ||
923 | u32 backend_per_se; | ||
924 | |||
925 | enabled_backends_mask = 0; | ||
926 | enabled_backends_count = 0; | ||
927 | *backend_disable_mask_per_asic = SI_MAX_BACKENDS_MASK; | ||
928 | for (i = 0; i < SI_MAX_BACKENDS; ++i) { | ||
929 | /* calc the current se */ | ||
930 | shader_engine = i / rdev->config.si.max_backends_per_se; | ||
931 | /* calc the backend per se */ | ||
932 | backend_per_se = i % rdev->config.si.max_backends_per_se; | ||
933 | /* default to not enabled */ | ||
934 | this_backend_enabled = 0; | ||
935 | if ((shader_engine < num_shader_engines) && | ||
936 | (backend_per_se < num_backends_per_se)) | ||
937 | this_backend_enabled = 1; | ||
938 | if (this_backend_enabled) { | ||
939 | enabled_backends_mask |= (1 << i); | ||
940 | *backend_disable_mask_per_asic &= ~(1 << i); | ||
941 | ++enabled_backends_count; | ||
942 | } | ||
943 | } | ||
944 | } | ||
945 | |||
946 | |||
947 | memset((uint8_t *)&swizzle_pipe[0], 0, sizeof(u32) * SI_MAX_PIPES); | ||
948 | switch (rdev->family) { | ||
949 | case CHIP_TAHITI: | ||
950 | case CHIP_PITCAIRN: | ||
951 | case CHIP_VERDE: | ||
952 | force_no_swizzle = true; | ||
953 | break; | ||
954 | default: | ||
955 | force_no_swizzle = false; | ||
956 | break; | ||
957 | } | ||
958 | if (force_no_swizzle) { | ||
959 | bool last_backend_enabled = false; | ||
960 | |||
961 | force_no_swizzle = false; | ||
962 | for (i = 0; i < SI_MAX_BACKENDS; ++i) { | ||
963 | if (((enabled_backends_mask >> i) & 1) == 1) { | ||
964 | if (last_backend_enabled) | ||
965 | force_no_swizzle = true; | ||
966 | last_backend_enabled = true; | ||
967 | } else | ||
968 | last_backend_enabled = false; | ||
969 | } | ||
970 | } | ||
971 | |||
972 | switch (num_tile_pipes) { | ||
973 | case 1: | ||
974 | case 3: | ||
975 | case 5: | ||
976 | case 7: | ||
977 | DRM_ERROR("odd number of pipes!\n"); | ||
978 | break; | ||
979 | case 2: | ||
980 | swizzle_pipe[0] = 0; | ||
981 | swizzle_pipe[1] = 1; | ||
982 | break; | ||
983 | case 4: | ||
984 | if (force_no_swizzle) { | ||
985 | swizzle_pipe[0] = 0; | ||
986 | swizzle_pipe[1] = 1; | ||
987 | swizzle_pipe[2] = 2; | ||
988 | swizzle_pipe[3] = 3; | ||
989 | } else { | ||
990 | swizzle_pipe[0] = 0; | ||
991 | swizzle_pipe[1] = 2; | ||
992 | swizzle_pipe[2] = 1; | ||
993 | swizzle_pipe[3] = 3; | ||
994 | } | ||
995 | break; | ||
996 | case 6: | ||
997 | if (force_no_swizzle) { | ||
998 | swizzle_pipe[0] = 0; | ||
999 | swizzle_pipe[1] = 1; | ||
1000 | swizzle_pipe[2] = 2; | ||
1001 | swizzle_pipe[3] = 3; | ||
1002 | swizzle_pipe[4] = 4; | ||
1003 | swizzle_pipe[5] = 5; | ||
1004 | } else { | ||
1005 | swizzle_pipe[0] = 0; | ||
1006 | swizzle_pipe[1] = 2; | ||
1007 | swizzle_pipe[2] = 4; | ||
1008 | swizzle_pipe[3] = 1; | ||
1009 | swizzle_pipe[4] = 3; | ||
1010 | swizzle_pipe[5] = 5; | ||
1011 | } | ||
1012 | break; | ||
1013 | case 8: | ||
1014 | if (force_no_swizzle) { | ||
1015 | swizzle_pipe[0] = 0; | ||
1016 | swizzle_pipe[1] = 1; | ||
1017 | swizzle_pipe[2] = 2; | ||
1018 | swizzle_pipe[3] = 3; | ||
1019 | swizzle_pipe[4] = 4; | ||
1020 | swizzle_pipe[5] = 5; | ||
1021 | swizzle_pipe[6] = 6; | ||
1022 | swizzle_pipe[7] = 7; | ||
1023 | } else { | ||
1024 | swizzle_pipe[0] = 0; | ||
1025 | swizzle_pipe[1] = 2; | ||
1026 | swizzle_pipe[2] = 4; | ||
1027 | swizzle_pipe[3] = 6; | ||
1028 | swizzle_pipe[4] = 1; | ||
1029 | swizzle_pipe[5] = 3; | ||
1030 | swizzle_pipe[6] = 5; | ||
1031 | swizzle_pipe[7] = 7; | ||
1032 | } | ||
1033 | break; | ||
1034 | } | ||
1035 | |||
1036 | for (cur_pipe = 0; cur_pipe < num_tile_pipes; ++cur_pipe) { | ||
1037 | while (((1 << cur_backend) & enabled_backends_mask) == 0) | ||
1038 | cur_backend = (cur_backend + 1) % SI_MAX_BACKENDS; | ||
1039 | |||
1040 | backend_map |= (((cur_backend & 0xf) << (swizzle_pipe[cur_pipe] * 4))); | ||
1041 | |||
1042 | cur_backend = (cur_backend + 1) % SI_MAX_BACKENDS; | ||
1043 | } | ||
1044 | |||
1045 | return backend_map; | ||
1046 | } | ||
1047 | |||
1048 | static u32 si_get_disable_mask_per_asic(struct radeon_device *rdev, | ||
1049 | u32 disable_mask_per_se, | ||
1050 | u32 max_disable_mask_per_se, | ||
1051 | u32 num_shader_engines) | ||
1052 | { | ||
1053 | u32 disable_field_width_per_se = r600_count_pipe_bits(disable_mask_per_se); | ||
1054 | u32 disable_mask_per_asic = disable_mask_per_se & max_disable_mask_per_se; | ||
1055 | |||
1056 | if (num_shader_engines == 1) | ||
1057 | return disable_mask_per_asic; | ||
1058 | else if (num_shader_engines == 2) | ||
1059 | return disable_mask_per_asic | (disable_mask_per_asic << disable_field_width_per_se); | ||
1060 | else | ||
1061 | return 0xffffffff; | ||
1062 | } | ||
1063 | |||
1064 | static void si_tiling_mode_table_init(struct radeon_device *rdev) | 870 | static void si_tiling_mode_table_init(struct radeon_device *rdev) |
1065 | { | 871 | { |
1066 | const u32 num_tile_mode_states = 32; | 872 | const u32 num_tile_mode_states = 32; |
@@ -1562,18 +1368,151 @@ static void si_tiling_mode_table_init(struct radeon_device *rdev) | |||
1562 | DRM_ERROR("unknown asic: 0x%x\n", rdev->family); | 1368 | DRM_ERROR("unknown asic: 0x%x\n", rdev->family); |
1563 | } | 1369 | } |
1564 | 1370 | ||
1371 | static void si_select_se_sh(struct radeon_device *rdev, | ||
1372 | u32 se_num, u32 sh_num) | ||
1373 | { | ||
1374 | u32 data = INSTANCE_BROADCAST_WRITES; | ||
1375 | |||
1376 | if ((se_num == 0xffffffff) && (sh_num == 0xffffffff)) | ||
1377 | data = SH_BROADCAST_WRITES | SE_BROADCAST_WRITES; | ||
1378 | else if (se_num == 0xffffffff) | ||
1379 | data |= SE_BROADCAST_WRITES | SH_INDEX(sh_num); | ||
1380 | else if (sh_num == 0xffffffff) | ||
1381 | data |= SH_BROADCAST_WRITES | SE_INDEX(se_num); | ||
1382 | else | ||
1383 | data |= SH_INDEX(sh_num) | SE_INDEX(se_num); | ||
1384 | WREG32(GRBM_GFX_INDEX, data); | ||
1385 | } | ||
1386 | |||
1387 | static u32 si_create_bitmask(u32 bit_width) | ||
1388 | { | ||
1389 | u32 i, mask = 0; | ||
1390 | |||
1391 | for (i = 0; i < bit_width; i++) { | ||
1392 | mask <<= 1; | ||
1393 | mask |= 1; | ||
1394 | } | ||
1395 | return mask; | ||
1396 | } | ||
1397 | |||
1398 | static u32 si_get_cu_enabled(struct radeon_device *rdev, u32 cu_per_sh) | ||
1399 | { | ||
1400 | u32 data, mask; | ||
1401 | |||
1402 | data = RREG32(CC_GC_SHADER_ARRAY_CONFIG); | ||
1403 | if (data & 1) | ||
1404 | data &= INACTIVE_CUS_MASK; | ||
1405 | else | ||
1406 | data = 0; | ||
1407 | data |= RREG32(GC_USER_SHADER_ARRAY_CONFIG); | ||
1408 | |||
1409 | data >>= INACTIVE_CUS_SHIFT; | ||
1410 | |||
1411 | mask = si_create_bitmask(cu_per_sh); | ||
1412 | |||
1413 | return ~data & mask; | ||
1414 | } | ||
1415 | |||
1416 | static void si_setup_spi(struct radeon_device *rdev, | ||
1417 | u32 se_num, u32 sh_per_se, | ||
1418 | u32 cu_per_sh) | ||
1419 | { | ||
1420 | int i, j, k; | ||
1421 | u32 data, mask, active_cu; | ||
1422 | |||
1423 | for (i = 0; i < se_num; i++) { | ||
1424 | for (j = 0; j < sh_per_se; j++) { | ||
1425 | si_select_se_sh(rdev, i, j); | ||
1426 | data = RREG32(SPI_STATIC_THREAD_MGMT_3); | ||
1427 | active_cu = si_get_cu_enabled(rdev, cu_per_sh); | ||
1428 | |||
1429 | mask = 1; | ||
1430 | for (k = 0; k < 16; k++) { | ||
1431 | mask <<= k; | ||
1432 | if (active_cu & mask) { | ||
1433 | data &= ~mask; | ||
1434 | WREG32(SPI_STATIC_THREAD_MGMT_3, data); | ||
1435 | break; | ||
1436 | } | ||
1437 | } | ||
1438 | } | ||
1439 | } | ||
1440 | si_select_se_sh(rdev, 0xffffffff, 0xffffffff); | ||
1441 | } | ||
1442 | |||
1443 | static u32 si_get_rb_disabled(struct radeon_device *rdev, | ||
1444 | u32 max_rb_num, u32 se_num, | ||
1445 | u32 sh_per_se) | ||
1446 | { | ||
1447 | u32 data, mask; | ||
1448 | |||
1449 | data = RREG32(CC_RB_BACKEND_DISABLE); | ||
1450 | if (data & 1) | ||
1451 | data &= BACKEND_DISABLE_MASK; | ||
1452 | else | ||
1453 | data = 0; | ||
1454 | data |= RREG32(GC_USER_RB_BACKEND_DISABLE); | ||
1455 | |||
1456 | data >>= BACKEND_DISABLE_SHIFT; | ||
1457 | |||
1458 | mask = si_create_bitmask(max_rb_num / se_num / sh_per_se); | ||
1459 | |||
1460 | return data & mask; | ||
1461 | } | ||
1462 | |||
1463 | static void si_setup_rb(struct radeon_device *rdev, | ||
1464 | u32 se_num, u32 sh_per_se, | ||
1465 | u32 max_rb_num) | ||
1466 | { | ||
1467 | int i, j; | ||
1468 | u32 data, mask; | ||
1469 | u32 disabled_rbs = 0; | ||
1470 | u32 enabled_rbs = 0; | ||
1471 | |||
1472 | for (i = 0; i < se_num; i++) { | ||
1473 | for (j = 0; j < sh_per_se; j++) { | ||
1474 | si_select_se_sh(rdev, i, j); | ||
1475 | data = si_get_rb_disabled(rdev, max_rb_num, se_num, sh_per_se); | ||
1476 | disabled_rbs |= data << ((i * sh_per_se + j) * TAHITI_RB_BITMAP_WIDTH_PER_SH); | ||
1477 | } | ||
1478 | } | ||
1479 | si_select_se_sh(rdev, 0xffffffff, 0xffffffff); | ||
1480 | |||
1481 | mask = 1; | ||
1482 | for (i = 0; i < max_rb_num; i++) { | ||
1483 | if (!(disabled_rbs & mask)) | ||
1484 | enabled_rbs |= mask; | ||
1485 | mask <<= 1; | ||
1486 | } | ||
1487 | |||
1488 | for (i = 0; i < se_num; i++) { | ||
1489 | si_select_se_sh(rdev, i, 0xffffffff); | ||
1490 | data = 0; | ||
1491 | for (j = 0; j < sh_per_se; j++) { | ||
1492 | switch (enabled_rbs & 3) { | ||
1493 | case 1: | ||
1494 | data |= (RASTER_CONFIG_RB_MAP_0 << (i * sh_per_se + j) * 2); | ||
1495 | break; | ||
1496 | case 2: | ||
1497 | data |= (RASTER_CONFIG_RB_MAP_3 << (i * sh_per_se + j) * 2); | ||
1498 | break; | ||
1499 | case 3: | ||
1500 | default: | ||
1501 | data |= (RASTER_CONFIG_RB_MAP_2 << (i * sh_per_se + j) * 2); | ||
1502 | break; | ||
1503 | } | ||
1504 | enabled_rbs >>= 2; | ||
1505 | } | ||
1506 | WREG32(PA_SC_RASTER_CONFIG, data); | ||
1507 | } | ||
1508 | si_select_se_sh(rdev, 0xffffffff, 0xffffffff); | ||
1509 | } | ||
1510 | |||
1565 | static void si_gpu_init(struct radeon_device *rdev) | 1511 | static void si_gpu_init(struct radeon_device *rdev) |
1566 | { | 1512 | { |
1567 | u32 cc_rb_backend_disable = 0; | ||
1568 | u32 cc_gc_shader_array_config; | ||
1569 | u32 gb_addr_config = 0; | 1513 | u32 gb_addr_config = 0; |
1570 | u32 mc_shared_chmap, mc_arb_ramcfg; | 1514 | u32 mc_shared_chmap, mc_arb_ramcfg; |
1571 | u32 gb_backend_map; | ||
1572 | u32 cgts_tcc_disable; | ||
1573 | u32 sx_debug_1; | 1515 | u32 sx_debug_1; |
1574 | u32 gc_user_shader_array_config; | ||
1575 | u32 gc_user_rb_backend_disable; | ||
1576 | u32 cgts_user_tcc_disable; | ||
1577 | u32 hdp_host_path_cntl; | 1516 | u32 hdp_host_path_cntl; |
1578 | u32 tmp; | 1517 | u32 tmp; |
1579 | int i, j; | 1518 | int i, j; |
@@ -1581,9 +1520,9 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1581 | switch (rdev->family) { | 1520 | switch (rdev->family) { |
1582 | case CHIP_TAHITI: | 1521 | case CHIP_TAHITI: |
1583 | rdev->config.si.max_shader_engines = 2; | 1522 | rdev->config.si.max_shader_engines = 2; |
1584 | rdev->config.si.max_pipes_per_simd = 4; | ||
1585 | rdev->config.si.max_tile_pipes = 12; | 1523 | rdev->config.si.max_tile_pipes = 12; |
1586 | rdev->config.si.max_simds_per_se = 8; | 1524 | rdev->config.si.max_cu_per_sh = 8; |
1525 | rdev->config.si.max_sh_per_se = 2; | ||
1587 | rdev->config.si.max_backends_per_se = 4; | 1526 | rdev->config.si.max_backends_per_se = 4; |
1588 | rdev->config.si.max_texture_channel_caches = 12; | 1527 | rdev->config.si.max_texture_channel_caches = 12; |
1589 | rdev->config.si.max_gprs = 256; | 1528 | rdev->config.si.max_gprs = 256; |
@@ -1594,12 +1533,13 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1594 | rdev->config.si.sc_prim_fifo_size_backend = 0x100; | 1533 | rdev->config.si.sc_prim_fifo_size_backend = 0x100; |
1595 | rdev->config.si.sc_hiz_tile_fifo_size = 0x30; | 1534 | rdev->config.si.sc_hiz_tile_fifo_size = 0x30; |
1596 | rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; | 1535 | rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; |
1536 | gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN; | ||
1597 | break; | 1537 | break; |
1598 | case CHIP_PITCAIRN: | 1538 | case CHIP_PITCAIRN: |
1599 | rdev->config.si.max_shader_engines = 2; | 1539 | rdev->config.si.max_shader_engines = 2; |
1600 | rdev->config.si.max_pipes_per_simd = 4; | ||
1601 | rdev->config.si.max_tile_pipes = 8; | 1540 | rdev->config.si.max_tile_pipes = 8; |
1602 | rdev->config.si.max_simds_per_se = 5; | 1541 | rdev->config.si.max_cu_per_sh = 5; |
1542 | rdev->config.si.max_sh_per_se = 2; | ||
1603 | rdev->config.si.max_backends_per_se = 4; | 1543 | rdev->config.si.max_backends_per_se = 4; |
1604 | rdev->config.si.max_texture_channel_caches = 8; | 1544 | rdev->config.si.max_texture_channel_caches = 8; |
1605 | rdev->config.si.max_gprs = 256; | 1545 | rdev->config.si.max_gprs = 256; |
@@ -1610,13 +1550,14 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1610 | rdev->config.si.sc_prim_fifo_size_backend = 0x100; | 1550 | rdev->config.si.sc_prim_fifo_size_backend = 0x100; |
1611 | rdev->config.si.sc_hiz_tile_fifo_size = 0x30; | 1551 | rdev->config.si.sc_hiz_tile_fifo_size = 0x30; |
1612 | rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; | 1552 | rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; |
1553 | gb_addr_config = TAHITI_GB_ADDR_CONFIG_GOLDEN; | ||
1613 | break; | 1554 | break; |
1614 | case CHIP_VERDE: | 1555 | case CHIP_VERDE: |
1615 | default: | 1556 | default: |
1616 | rdev->config.si.max_shader_engines = 1; | 1557 | rdev->config.si.max_shader_engines = 1; |
1617 | rdev->config.si.max_pipes_per_simd = 4; | ||
1618 | rdev->config.si.max_tile_pipes = 4; | 1558 | rdev->config.si.max_tile_pipes = 4; |
1619 | rdev->config.si.max_simds_per_se = 2; | 1559 | rdev->config.si.max_cu_per_sh = 2; |
1560 | rdev->config.si.max_sh_per_se = 2; | ||
1620 | rdev->config.si.max_backends_per_se = 4; | 1561 | rdev->config.si.max_backends_per_se = 4; |
1621 | rdev->config.si.max_texture_channel_caches = 4; | 1562 | rdev->config.si.max_texture_channel_caches = 4; |
1622 | rdev->config.si.max_gprs = 256; | 1563 | rdev->config.si.max_gprs = 256; |
@@ -1627,6 +1568,7 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1627 | rdev->config.si.sc_prim_fifo_size_backend = 0x40; | 1568 | rdev->config.si.sc_prim_fifo_size_backend = 0x40; |
1628 | rdev->config.si.sc_hiz_tile_fifo_size = 0x30; | 1569 | rdev->config.si.sc_hiz_tile_fifo_size = 0x30; |
1629 | rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; | 1570 | rdev->config.si.sc_earlyz_tile_fifo_size = 0x130; |
1571 | gb_addr_config = VERDE_GB_ADDR_CONFIG_GOLDEN; | ||
1630 | break; | 1572 | break; |
1631 | } | 1573 | } |
1632 | 1574 | ||
@@ -1648,31 +1590,7 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1648 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); | 1590 | mc_shared_chmap = RREG32(MC_SHARED_CHMAP); |
1649 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); | 1591 | mc_arb_ramcfg = RREG32(MC_ARB_RAMCFG); |
1650 | 1592 | ||
1651 | cc_rb_backend_disable = RREG32(CC_RB_BACKEND_DISABLE); | ||
1652 | cc_gc_shader_array_config = RREG32(CC_GC_SHADER_ARRAY_CONFIG); | ||
1653 | cgts_tcc_disable = 0xffff0000; | ||
1654 | for (i = 0; i < rdev->config.si.max_texture_channel_caches; i++) | ||
1655 | cgts_tcc_disable &= ~(1 << (16 + i)); | ||
1656 | gc_user_rb_backend_disable = RREG32(GC_USER_RB_BACKEND_DISABLE); | ||
1657 | gc_user_shader_array_config = RREG32(GC_USER_SHADER_ARRAY_CONFIG); | ||
1658 | cgts_user_tcc_disable = RREG32(CGTS_USER_TCC_DISABLE); | ||
1659 | |||
1660 | rdev->config.si.num_shader_engines = rdev->config.si.max_shader_engines; | ||
1661 | rdev->config.si.num_tile_pipes = rdev->config.si.max_tile_pipes; | 1593 | rdev->config.si.num_tile_pipes = rdev->config.si.max_tile_pipes; |
1662 | tmp = ((~gc_user_rb_backend_disable) & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT; | ||
1663 | rdev->config.si.num_backends_per_se = r600_count_pipe_bits(tmp); | ||
1664 | tmp = (gc_user_rb_backend_disable & BACKEND_DISABLE_MASK) >> BACKEND_DISABLE_SHIFT; | ||
1665 | rdev->config.si.backend_disable_mask_per_asic = | ||
1666 | si_get_disable_mask_per_asic(rdev, tmp, SI_MAX_BACKENDS_PER_SE_MASK, | ||
1667 | rdev->config.si.num_shader_engines); | ||
1668 | rdev->config.si.backend_map = | ||
1669 | si_get_tile_pipe_to_backend_map(rdev, rdev->config.si.num_tile_pipes, | ||
1670 | rdev->config.si.num_backends_per_se * | ||
1671 | rdev->config.si.num_shader_engines, | ||
1672 | &rdev->config.si.backend_disable_mask_per_asic, | ||
1673 | rdev->config.si.num_shader_engines); | ||
1674 | tmp = ((~cgts_user_tcc_disable) & TCC_DISABLE_MASK) >> TCC_DISABLE_SHIFT; | ||
1675 | rdev->config.si.num_texture_channel_caches = r600_count_pipe_bits(tmp); | ||
1676 | rdev->config.si.mem_max_burst_length_bytes = 256; | 1594 | rdev->config.si.mem_max_burst_length_bytes = 256; |
1677 | tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; | 1595 | tmp = (mc_arb_ramcfg & NOOFCOLS_MASK) >> NOOFCOLS_SHIFT; |
1678 | rdev->config.si.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; | 1596 | rdev->config.si.mem_row_size_in_kb = (4 * (1 << (8 + tmp))) / 1024; |
@@ -1683,55 +1601,8 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1683 | rdev->config.si.num_gpus = 1; | 1601 | rdev->config.si.num_gpus = 1; |
1684 | rdev->config.si.multi_gpu_tile_size = 64; | 1602 | rdev->config.si.multi_gpu_tile_size = 64; |
1685 | 1603 | ||
1686 | gb_addr_config = 0; | 1604 | /* fix up row size */ |
1687 | switch (rdev->config.si.num_tile_pipes) { | 1605 | gb_addr_config &= ~ROW_SIZE_MASK; |
1688 | case 1: | ||
1689 | gb_addr_config |= NUM_PIPES(0); | ||
1690 | break; | ||
1691 | case 2: | ||
1692 | gb_addr_config |= NUM_PIPES(1); | ||
1693 | break; | ||
1694 | case 4: | ||
1695 | gb_addr_config |= NUM_PIPES(2); | ||
1696 | break; | ||
1697 | case 8: | ||
1698 | default: | ||
1699 | gb_addr_config |= NUM_PIPES(3); | ||
1700 | break; | ||
1701 | } | ||
1702 | |||
1703 | tmp = (rdev->config.si.mem_max_burst_length_bytes / 256) - 1; | ||
1704 | gb_addr_config |= PIPE_INTERLEAVE_SIZE(tmp); | ||
1705 | gb_addr_config |= NUM_SHADER_ENGINES(rdev->config.si.num_shader_engines - 1); | ||
1706 | tmp = (rdev->config.si.shader_engine_tile_size / 16) - 1; | ||
1707 | gb_addr_config |= SHADER_ENGINE_TILE_SIZE(tmp); | ||
1708 | switch (rdev->config.si.num_gpus) { | ||
1709 | case 1: | ||
1710 | default: | ||
1711 | gb_addr_config |= NUM_GPUS(0); | ||
1712 | break; | ||
1713 | case 2: | ||
1714 | gb_addr_config |= NUM_GPUS(1); | ||
1715 | break; | ||
1716 | case 4: | ||
1717 | gb_addr_config |= NUM_GPUS(2); | ||
1718 | break; | ||
1719 | } | ||
1720 | switch (rdev->config.si.multi_gpu_tile_size) { | ||
1721 | case 16: | ||
1722 | gb_addr_config |= MULTI_GPU_TILE_SIZE(0); | ||
1723 | break; | ||
1724 | case 32: | ||
1725 | default: | ||
1726 | gb_addr_config |= MULTI_GPU_TILE_SIZE(1); | ||
1727 | break; | ||
1728 | case 64: | ||
1729 | gb_addr_config |= MULTI_GPU_TILE_SIZE(2); | ||
1730 | break; | ||
1731 | case 128: | ||
1732 | gb_addr_config |= MULTI_GPU_TILE_SIZE(3); | ||
1733 | break; | ||
1734 | } | ||
1735 | switch (rdev->config.si.mem_row_size_in_kb) { | 1606 | switch (rdev->config.si.mem_row_size_in_kb) { |
1736 | case 1: | 1607 | case 1: |
1737 | default: | 1608 | default: |
@@ -1745,26 +1616,6 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1745 | break; | 1616 | break; |
1746 | } | 1617 | } |
1747 | 1618 | ||
1748 | tmp = (gb_addr_config & NUM_PIPES_MASK) >> NUM_PIPES_SHIFT; | ||
1749 | rdev->config.si.num_tile_pipes = (1 << tmp); | ||
1750 | tmp = (gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT; | ||
1751 | rdev->config.si.mem_max_burst_length_bytes = (tmp + 1) * 256; | ||
1752 | tmp = (gb_addr_config & NUM_SHADER_ENGINES_MASK) >> NUM_SHADER_ENGINES_SHIFT; | ||
1753 | rdev->config.si.num_shader_engines = tmp + 1; | ||
1754 | tmp = (gb_addr_config & NUM_GPUS_MASK) >> NUM_GPUS_SHIFT; | ||
1755 | rdev->config.si.num_gpus = tmp + 1; | ||
1756 | tmp = (gb_addr_config & MULTI_GPU_TILE_SIZE_MASK) >> MULTI_GPU_TILE_SIZE_SHIFT; | ||
1757 | rdev->config.si.multi_gpu_tile_size = 1 << tmp; | ||
1758 | tmp = (gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT; | ||
1759 | rdev->config.si.mem_row_size_in_kb = 1 << tmp; | ||
1760 | |||
1761 | gb_backend_map = | ||
1762 | si_get_tile_pipe_to_backend_map(rdev, rdev->config.si.num_tile_pipes, | ||
1763 | rdev->config.si.num_backends_per_se * | ||
1764 | rdev->config.si.num_shader_engines, | ||
1765 | &rdev->config.si.backend_disable_mask_per_asic, | ||
1766 | rdev->config.si.num_shader_engines); | ||
1767 | |||
1768 | /* setup tiling info dword. gb_addr_config is not adequate since it does | 1619 | /* setup tiling info dword. gb_addr_config is not adequate since it does |
1769 | * not have bank info, so create a custom tiling dword. | 1620 | * not have bank info, so create a custom tiling dword. |
1770 | * bits 3:0 num_pipes | 1621 | * bits 3:0 num_pipes |
@@ -1789,33 +1640,29 @@ static void si_gpu_init(struct radeon_device *rdev) | |||
1789 | rdev->config.si.tile_config |= (3 << 0); | 1640 | rdev->config.si.tile_config |= (3 << 0); |
1790 | break; | 1641 | break; |
1791 | } | 1642 | } |
1792 | rdev->config.si.tile_config |= | 1643 | if ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) |
1793 | ((mc_arb_ramcfg & NOOFBANK_MASK) >> NOOFBANK_SHIFT) << 4; | 1644 | rdev->config.si.tile_config |= 1 << 4; |
1645 | else | ||
1646 | rdev->config.si.tile_config |= 0 << 4; | ||
1794 | rdev->config.si.tile_config |= | 1647 | rdev->config.si.tile_config |= |
1795 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; | 1648 | ((gb_addr_config & PIPE_INTERLEAVE_SIZE_MASK) >> PIPE_INTERLEAVE_SIZE_SHIFT) << 8; |
1796 | rdev->config.si.tile_config |= | 1649 | rdev->config.si.tile_config |= |
1797 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; | 1650 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; |
1798 | 1651 | ||
1799 | rdev->config.si.backend_map = gb_backend_map; | ||
1800 | WREG32(GB_ADDR_CONFIG, gb_addr_config); | 1652 | WREG32(GB_ADDR_CONFIG, gb_addr_config); |
1801 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | 1653 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
1802 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); | 1654 | WREG32(HDP_ADDR_CONFIG, gb_addr_config); |
1803 | 1655 | ||
1804 | /* primary versions */ | 1656 | si_tiling_mode_table_init(rdev); |
1805 | WREG32(CC_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
1806 | WREG32(CC_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); | ||
1807 | WREG32(CC_GC_SHADER_ARRAY_CONFIG, cc_gc_shader_array_config); | ||
1808 | |||
1809 | WREG32(CGTS_TCC_DISABLE, cgts_tcc_disable); | ||
1810 | 1657 | ||
1811 | /* user versions */ | 1658 | si_setup_rb(rdev, rdev->config.si.max_shader_engines, |
1812 | WREG32(GC_USER_RB_BACKEND_DISABLE, cc_rb_backend_disable); | 1659 | rdev->config.si.max_sh_per_se, |
1813 | WREG32(GC_USER_SYS_RB_BACKEND_DISABLE, cc_rb_backend_disable); | 1660 | rdev->config.si.max_backends_per_se); |
1814 | WREG32(GC_USER_SHADER_ARRAY_CONFIG, cc_gc_shader_array_config); | ||
1815 | 1661 | ||
1816 | WREG32(CGTS_USER_TCC_DISABLE, cgts_tcc_disable); | 1662 | si_setup_spi(rdev, rdev->config.si.max_shader_engines, |
1663 | rdev->config.si.max_sh_per_se, | ||
1664 | rdev->config.si.max_cu_per_sh); | ||
1817 | 1665 | ||
1818 | si_tiling_mode_table_init(rdev); | ||
1819 | 1666 | ||
1820 | /* set HW defaults for 3D engine */ | 1667 | /* set HW defaults for 3D engine */ |
1821 | WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | | 1668 | WREG32(CP_QUEUE_THRESHOLDS, (ROQ_IB1_START(0x16) | |
diff --git a/drivers/gpu/drm/radeon/si_reg.h b/drivers/gpu/drm/radeon/si_reg.h index eda938a7cb6e..501f9d431d57 100644 --- a/drivers/gpu/drm/radeon/si_reg.h +++ b/drivers/gpu/drm/radeon/si_reg.h | |||
@@ -30,4 +30,76 @@ | |||
30 | #define SI_DC_GPIO_HPD_EN 0x65b8 | 30 | #define SI_DC_GPIO_HPD_EN 0x65b8 |
31 | #define SI_DC_GPIO_HPD_Y 0x65bc | 31 | #define SI_DC_GPIO_HPD_Y 0x65bc |
32 | 32 | ||
33 | #define SI_GRPH_CONTROL 0x6804 | ||
34 | # define SI_GRPH_DEPTH(x) (((x) & 0x3) << 0) | ||
35 | # define SI_GRPH_DEPTH_8BPP 0 | ||
36 | # define SI_GRPH_DEPTH_16BPP 1 | ||
37 | # define SI_GRPH_DEPTH_32BPP 2 | ||
38 | # define SI_GRPH_NUM_BANKS(x) (((x) & 0x3) << 2) | ||
39 | # define SI_ADDR_SURF_2_BANK 0 | ||
40 | # define SI_ADDR_SURF_4_BANK 1 | ||
41 | # define SI_ADDR_SURF_8_BANK 2 | ||
42 | # define SI_ADDR_SURF_16_BANK 3 | ||
43 | # define SI_GRPH_Z(x) (((x) & 0x3) << 4) | ||
44 | # define SI_GRPH_BANK_WIDTH(x) (((x) & 0x3) << 6) | ||
45 | # define SI_ADDR_SURF_BANK_WIDTH_1 0 | ||
46 | # define SI_ADDR_SURF_BANK_WIDTH_2 1 | ||
47 | # define SI_ADDR_SURF_BANK_WIDTH_4 2 | ||
48 | # define SI_ADDR_SURF_BANK_WIDTH_8 3 | ||
49 | # define SI_GRPH_FORMAT(x) (((x) & 0x7) << 8) | ||
50 | /* 8 BPP */ | ||
51 | # define SI_GRPH_FORMAT_INDEXED 0 | ||
52 | /* 16 BPP */ | ||
53 | # define SI_GRPH_FORMAT_ARGB1555 0 | ||
54 | # define SI_GRPH_FORMAT_ARGB565 1 | ||
55 | # define SI_GRPH_FORMAT_ARGB4444 2 | ||
56 | # define SI_GRPH_FORMAT_AI88 3 | ||
57 | # define SI_GRPH_FORMAT_MONO16 4 | ||
58 | # define SI_GRPH_FORMAT_BGRA5551 5 | ||
59 | /* 32 BPP */ | ||
60 | # define SI_GRPH_FORMAT_ARGB8888 0 | ||
61 | # define SI_GRPH_FORMAT_ARGB2101010 1 | ||
62 | # define SI_GRPH_FORMAT_32BPP_DIG 2 | ||
63 | # define SI_GRPH_FORMAT_8B_ARGB2101010 3 | ||
64 | # define SI_GRPH_FORMAT_BGRA1010102 4 | ||
65 | # define SI_GRPH_FORMAT_8B_BGRA1010102 5 | ||
66 | # define SI_GRPH_FORMAT_RGB111110 6 | ||
67 | # define SI_GRPH_FORMAT_BGR101111 7 | ||
68 | # define SI_GRPH_BANK_HEIGHT(x) (((x) & 0x3) << 11) | ||
69 | # define SI_ADDR_SURF_BANK_HEIGHT_1 0 | ||
70 | # define SI_ADDR_SURF_BANK_HEIGHT_2 1 | ||
71 | # define SI_ADDR_SURF_BANK_HEIGHT_4 2 | ||
72 | # define SI_ADDR_SURF_BANK_HEIGHT_8 3 | ||
73 | # define SI_GRPH_TILE_SPLIT(x) (((x) & 0x7) << 13) | ||
74 | # define SI_ADDR_SURF_TILE_SPLIT_64B 0 | ||
75 | # define SI_ADDR_SURF_TILE_SPLIT_128B 1 | ||
76 | # define SI_ADDR_SURF_TILE_SPLIT_256B 2 | ||
77 | # define SI_ADDR_SURF_TILE_SPLIT_512B 3 | ||
78 | # define SI_ADDR_SURF_TILE_SPLIT_1KB 4 | ||
79 | # define SI_ADDR_SURF_TILE_SPLIT_2KB 5 | ||
80 | # define SI_ADDR_SURF_TILE_SPLIT_4KB 6 | ||
81 | # define SI_GRPH_MACRO_TILE_ASPECT(x) (((x) & 0x3) << 18) | ||
82 | # define SI_ADDR_SURF_MACRO_TILE_ASPECT_1 0 | ||
83 | # define SI_ADDR_SURF_MACRO_TILE_ASPECT_2 1 | ||
84 | # define SI_ADDR_SURF_MACRO_TILE_ASPECT_4 2 | ||
85 | # define SI_ADDR_SURF_MACRO_TILE_ASPECT_8 3 | ||
86 | # define SI_GRPH_ARRAY_MODE(x) (((x) & 0x7) << 20) | ||
87 | # define SI_GRPH_ARRAY_LINEAR_GENERAL 0 | ||
88 | # define SI_GRPH_ARRAY_LINEAR_ALIGNED 1 | ||
89 | # define SI_GRPH_ARRAY_1D_TILED_THIN1 2 | ||
90 | # define SI_GRPH_ARRAY_2D_TILED_THIN1 4 | ||
91 | # define SI_GRPH_PIPE_CONFIG(x) (((x) & 0x1f) << 24) | ||
92 | # define SI_ADDR_SURF_P2 0 | ||
93 | # define SI_ADDR_SURF_P4_8x16 4 | ||
94 | # define SI_ADDR_SURF_P4_16x16 5 | ||
95 | # define SI_ADDR_SURF_P4_16x32 6 | ||
96 | # define SI_ADDR_SURF_P4_32x32 7 | ||
97 | # define SI_ADDR_SURF_P8_16x16_8x16 8 | ||
98 | # define SI_ADDR_SURF_P8_16x32_8x16 9 | ||
99 | # define SI_ADDR_SURF_P8_32x32_8x16 10 | ||
100 | # define SI_ADDR_SURF_P8_16x32_16x16 11 | ||
101 | # define SI_ADDR_SURF_P8_32x32_16x16 12 | ||
102 | # define SI_ADDR_SURF_P8_32x32_16x32 13 | ||
103 | # define SI_ADDR_SURF_P8_32x64_32x32 14 | ||
104 | |||
33 | #endif | 105 | #endif |
diff --git a/drivers/gpu/drm/radeon/sid.h b/drivers/gpu/drm/radeon/sid.h index 53ea2c42dbd6..db4067962868 100644 --- a/drivers/gpu/drm/radeon/sid.h +++ b/drivers/gpu/drm/radeon/sid.h | |||
@@ -24,6 +24,11 @@ | |||
24 | #ifndef SI_H | 24 | #ifndef SI_H |
25 | #define SI_H | 25 | #define SI_H |
26 | 26 | ||
27 | #define TAHITI_RB_BITMAP_WIDTH_PER_SH 2 | ||
28 | |||
29 | #define TAHITI_GB_ADDR_CONFIG_GOLDEN 0x12011003 | ||
30 | #define VERDE_GB_ADDR_CONFIG_GOLDEN 0x12010002 | ||
31 | |||
27 | #define CG_MULT_THERMAL_STATUS 0x714 | 32 | #define CG_MULT_THERMAL_STATUS 0x714 |
28 | #define ASIC_MAX_TEMP(x) ((x) << 0) | 33 | #define ASIC_MAX_TEMP(x) ((x) << 0) |
29 | #define ASIC_MAX_TEMP_MASK 0x000001ff | 34 | #define ASIC_MAX_TEMP_MASK 0x000001ff |
@@ -408,6 +413,12 @@ | |||
408 | #define SOFT_RESET_IA (1 << 15) | 413 | #define SOFT_RESET_IA (1 << 15) |
409 | 414 | ||
410 | #define GRBM_GFX_INDEX 0x802C | 415 | #define GRBM_GFX_INDEX 0x802C |
416 | #define INSTANCE_INDEX(x) ((x) << 0) | ||
417 | #define SH_INDEX(x) ((x) << 8) | ||
418 | #define SE_INDEX(x) ((x) << 16) | ||
419 | #define SH_BROADCAST_WRITES (1 << 29) | ||
420 | #define INSTANCE_BROADCAST_WRITES (1 << 30) | ||
421 | #define SE_BROADCAST_WRITES (1 << 31) | ||
411 | 422 | ||
412 | #define GRBM_INT_CNTL 0x8060 | 423 | #define GRBM_INT_CNTL 0x8060 |
413 | # define RDERR_INT_ENABLE (1 << 0) | 424 | # define RDERR_INT_ENABLE (1 << 0) |
@@ -480,6 +491,8 @@ | |||
480 | #define VGT_TF_MEMORY_BASE 0x89B8 | 491 | #define VGT_TF_MEMORY_BASE 0x89B8 |
481 | 492 | ||
482 | #define CC_GC_SHADER_ARRAY_CONFIG 0x89bc | 493 | #define CC_GC_SHADER_ARRAY_CONFIG 0x89bc |
494 | #define INACTIVE_CUS_MASK 0xFFFF0000 | ||
495 | #define INACTIVE_CUS_SHIFT 16 | ||
483 | #define GC_USER_SHADER_ARRAY_CONFIG 0x89c0 | 496 | #define GC_USER_SHADER_ARRAY_CONFIG 0x89c0 |
484 | 497 | ||
485 | #define PA_CL_ENHANCE 0x8A14 | 498 | #define PA_CL_ENHANCE 0x8A14 |
@@ -688,6 +701,12 @@ | |||
688 | #define RLC_MC_CNTL 0xC344 | 701 | #define RLC_MC_CNTL 0xC344 |
689 | #define RLC_UCODE_CNTL 0xC348 | 702 | #define RLC_UCODE_CNTL 0xC348 |
690 | 703 | ||
704 | #define PA_SC_RASTER_CONFIG 0x28350 | ||
705 | # define RASTER_CONFIG_RB_MAP_0 0 | ||
706 | # define RASTER_CONFIG_RB_MAP_1 1 | ||
707 | # define RASTER_CONFIG_RB_MAP_2 2 | ||
708 | # define RASTER_CONFIG_RB_MAP_3 3 | ||
709 | |||
691 | #define VGT_EVENT_INITIATOR 0x28a90 | 710 | #define VGT_EVENT_INITIATOR 0x28a90 |
692 | # define SAMPLE_STREAMOUTSTATS1 (1 << 0) | 711 | # define SAMPLE_STREAMOUTSTATS1 (1 << 0) |
693 | # define SAMPLE_STREAMOUTSTATS2 (2 << 0) | 712 | # define SAMPLE_STREAMOUTSTATS2 (2 << 0) |
diff --git a/drivers/gpu/drm/sis/sis_drv.c b/drivers/gpu/drm/sis/sis_drv.c index 30d98d14b5c5..dd14cd1a0033 100644 --- a/drivers/gpu/drm/sis/sis_drv.c +++ b/drivers/gpu/drm/sis/sis_drv.c | |||
@@ -47,9 +47,9 @@ static int sis_driver_load(struct drm_device *dev, unsigned long chipset) | |||
47 | if (dev_priv == NULL) | 47 | if (dev_priv == NULL) |
48 | return -ENOMEM; | 48 | return -ENOMEM; |
49 | 49 | ||
50 | idr_init(&dev_priv->object_idr); | ||
50 | dev->dev_private = (void *)dev_priv; | 51 | dev->dev_private = (void *)dev_priv; |
51 | dev_priv->chipset = chipset; | 52 | dev_priv->chipset = chipset; |
52 | idr_init(&dev->object_name_idr); | ||
53 | 53 | ||
54 | return 0; | 54 | return 0; |
55 | } | 55 | } |
diff --git a/drivers/gpu/drm/ttm/ttm_bo.c b/drivers/gpu/drm/ttm/ttm_bo.c index 36792bd4da77..36f4b28c1b90 100644 --- a/drivers/gpu/drm/ttm/ttm_bo.c +++ b/drivers/gpu/drm/ttm/ttm_bo.c | |||
@@ -1204,6 +1204,7 @@ int ttm_bo_init(struct ttm_bo_device *bdev, | |||
1204 | (*destroy)(bo); | 1204 | (*destroy)(bo); |
1205 | else | 1205 | else |
1206 | kfree(bo); | 1206 | kfree(bo); |
1207 | ttm_mem_global_free(mem_glob, acc_size); | ||
1207 | return -EINVAL; | 1208 | return -EINVAL; |
1208 | } | 1209 | } |
1209 | bo->destroy = destroy; | 1210 | bo->destroy = destroy; |
@@ -1307,22 +1308,14 @@ int ttm_bo_create(struct ttm_bo_device *bdev, | |||
1307 | struct ttm_buffer_object **p_bo) | 1308 | struct ttm_buffer_object **p_bo) |
1308 | { | 1309 | { |
1309 | struct ttm_buffer_object *bo; | 1310 | struct ttm_buffer_object *bo; |
1310 | struct ttm_mem_global *mem_glob = bdev->glob->mem_glob; | ||
1311 | size_t acc_size; | 1311 | size_t acc_size; |
1312 | int ret; | 1312 | int ret; |
1313 | 1313 | ||
1314 | acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object)); | ||
1315 | ret = ttm_mem_global_alloc(mem_glob, acc_size, false, false); | ||
1316 | if (unlikely(ret != 0)) | ||
1317 | return ret; | ||
1318 | |||
1319 | bo = kzalloc(sizeof(*bo), GFP_KERNEL); | 1314 | bo = kzalloc(sizeof(*bo), GFP_KERNEL); |
1320 | 1315 | if (unlikely(bo == NULL)) | |
1321 | if (unlikely(bo == NULL)) { | ||
1322 | ttm_mem_global_free(mem_glob, acc_size); | ||
1323 | return -ENOMEM; | 1316 | return -ENOMEM; |
1324 | } | ||
1325 | 1317 | ||
1318 | acc_size = ttm_bo_acc_size(bdev, size, sizeof(struct ttm_buffer_object)); | ||
1326 | ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, | 1319 | ret = ttm_bo_init(bdev, bo, size, type, placement, page_alignment, |
1327 | buffer_start, interruptible, | 1320 | buffer_start, interruptible, |
1328 | persistent_swap_storage, acc_size, NULL, NULL); | 1321 | persistent_swap_storage, acc_size, NULL, NULL); |
@@ -1834,6 +1827,7 @@ static int ttm_bo_swapout(struct ttm_mem_shrink *shrink) | |||
1834 | spin_unlock(&glob->lru_lock); | 1827 | spin_unlock(&glob->lru_lock); |
1835 | (void) ttm_bo_cleanup_refs(bo, false, false, false); | 1828 | (void) ttm_bo_cleanup_refs(bo, false, false, false); |
1836 | kref_put(&bo->list_kref, ttm_bo_release_list); | 1829 | kref_put(&bo->list_kref, ttm_bo_release_list); |
1830 | spin_lock(&glob->lru_lock); | ||
1837 | continue; | 1831 | continue; |
1838 | } | 1832 | } |
1839 | 1833 | ||
diff --git a/drivers/gpu/drm/udl/udl_drv.c b/drivers/gpu/drm/udl/udl_drv.c index 4d02c46a9420..6e52069894b3 100644 --- a/drivers/gpu/drm/udl/udl_drv.c +++ b/drivers/gpu/drm/udl/udl_drv.c | |||
@@ -13,8 +13,21 @@ | |||
13 | 13 | ||
14 | static struct drm_driver driver; | 14 | static struct drm_driver driver; |
15 | 15 | ||
16 | /* | ||
17 | * There are many DisplayLink-based graphics products, all with unique PIDs. | ||
18 | * So we match on DisplayLink's VID + Vendor-Defined Interface Class (0xff) | ||
19 | * We also require a match on SubClass (0x00) and Protocol (0x00), | ||
20 | * which is compatible with all known USB 2.0 era graphics chips and firmware, | ||
21 | * but allows DisplayLink to increment those for any future incompatible chips | ||
22 | */ | ||
16 | static struct usb_device_id id_table[] = { | 23 | static struct usb_device_id id_table[] = { |
17 | {.idVendor = 0x17e9, .match_flags = USB_DEVICE_ID_MATCH_VENDOR,}, | 24 | {.idVendor = 0x17e9, .bInterfaceClass = 0xff, |
25 | .bInterfaceSubClass = 0x00, | ||
26 | .bInterfaceProtocol = 0x00, | ||
27 | .match_flags = USB_DEVICE_ID_MATCH_VENDOR | | ||
28 | USB_DEVICE_ID_MATCH_INT_CLASS | | ||
29 | USB_DEVICE_ID_MATCH_INT_SUBCLASS | | ||
30 | USB_DEVICE_ID_MATCH_INT_PROTOCOL,}, | ||
18 | {}, | 31 | {}, |
19 | }; | 32 | }; |
20 | MODULE_DEVICE_TABLE(usb, id_table); | 33 | MODULE_DEVICE_TABLE(usb, id_table); |
diff --git a/drivers/gpu/drm/via/via_map.c b/drivers/gpu/drm/via/via_map.c index 1f182254e81e..c126182ac07e 100644 --- a/drivers/gpu/drm/via/via_map.c +++ b/drivers/gpu/drm/via/via_map.c | |||
@@ -100,12 +100,11 @@ int via_driver_load(struct drm_device *dev, unsigned long chipset) | |||
100 | if (dev_priv == NULL) | 100 | if (dev_priv == NULL) |
101 | return -ENOMEM; | 101 | return -ENOMEM; |
102 | 102 | ||
103 | idr_init(&dev_priv->object_idr); | ||
103 | dev->dev_private = (void *)dev_priv; | 104 | dev->dev_private = (void *)dev_priv; |
104 | 105 | ||
105 | dev_priv->chipset = chipset; | 106 | dev_priv->chipset = chipset; |
106 | 107 | ||
107 | idr_init(&dev->object_name_idr); | ||
108 | |||
109 | pci_set_master(dev->pdev); | 108 | pci_set_master(dev->pdev); |
110 | 109 | ||
111 | ret = drm_vblank_init(dev, 1); | 110 | ret = drm_vblank_init(dev, 1); |
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c index 51c9ba5cd2fb..21ee78226560 100644 --- a/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_gmr.c | |||
@@ -66,7 +66,7 @@ static int vmw_gmr2_bind(struct vmw_private *dev_priv, | |||
66 | cmd += sizeof(remap_cmd) / sizeof(uint32); | 66 | cmd += sizeof(remap_cmd) / sizeof(uint32); |
67 | 67 | ||
68 | for (i = 0; i < num_pages; ++i) { | 68 | for (i = 0; i < num_pages; ++i) { |
69 | if (VMW_PPN_SIZE > 4) | 69 | if (VMW_PPN_SIZE <= 4) |
70 | *cmd = page_to_pfn(*pages++); | 70 | *cmd = page_to_pfn(*pages++); |
71 | else | 71 | else |
72 | *((uint64_t *)cmd) = page_to_pfn(*pages++); | 72 | *((uint64_t *)cmd) = page_to_pfn(*pages++); |