Module Name: src
Committed By: riastradh
Date: Mon Jul 21 20:01:19 UTC 2014
Modified Files:
src/sys/external/bsd/drm2/dist/drm/i915: i915_gem_gtt.c
Log Message:
Avoid bus_space_read/write_8 on i386.
Would be nice if there were a clearer way to detect it than _LP64,
and if its absence caused a compile error instead of a link error.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 \
src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c
diff -u src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.2 src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.3
--- src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c:1.2 Wed Jul 16 20:56:24 2014
+++ src/sys/external/bsd/drm2/dist/drm/i915/i915_gem_gtt.c Mon Jul 21 20:01:18 2014
@@ -2029,7 +2029,38 @@ int i915_gem_gtt_prepare_object(struct d
#endif
}
-#ifndef __NetBSD__
+#ifdef __NetBSD__
+static inline uint64_t
+gen8_get_pte(bus_space_tag_t bst, bus_space_handle_t bsh, unsigned i)
+{
+ CTASSERT(_BYTE_ORDER == _LITTLE_ENDIAN); /* x86 */
+ CTASSERT(sizeof(gen8_gtt_pte_t) == 8);
+#ifdef _LP64 /* XXX How to detect bus_space_read_8? */
+ return bus_space_read_8(bst, bsh, 8*i);
+#else
+ /*
+ * XXX I'm not sure this case can actually happen in practice:
+ * 32-bit gen8 chipsets?
+ */
+ return bus_space_read_4(bst, bsh, 8*i) |
+ ((uint64_t)bus_space_read_4(bst, bsh, 8*i + 4) << 32);
+#endif
+}
+
+static inline void
+gen8_set_pte(bus_space_tag_t bst, bus_space_handle_t bsh, unsigned i,
+ gen8_gtt_pte_t pte)
+{
+ CTASSERT(_BYTE_ORDER == _LITTLE_ENDIAN); /* x86 */
+ CTASSERT(sizeof(gen8_gtt_pte_t) == 8);
+#ifdef _LP64 /* XXX How to detect bus_space_write_8? */
+ bus_space_write_8(bst, bsh, 8*i, pte);
+#else
+ bus_space_write_4(bst, bsh, 8*i, (uint32_t)pte);
+ bus_space_write_4(bst, bsh, 8*i + 4, (uint32_t)(pte >> 32));
+#endif
+}
+#else
static inline void gen8_set_pte(void __iomem *addr, gen8_gtt_pte_t pte)
{
#ifdef writeq
@@ -2055,13 +2086,12 @@ gen8_ggtt_insert_entries(struct i915_add
KASSERT(0 < dmamap->dm_nsegs);
for (i = 0; i < dmamap->dm_nsegs; i++) {
KASSERT(dmamap->dm_segs[i].ds_len == PAGE_SIZE);
- CTASSERT(sizeof(gen8_gtt_pte_t) == 8);
- bus_space_write_8(bst, bsh, 8*(first_entry + i),
+ gen8_set_pte(bst, bsh, first_entry + i,
gen8_pte_encode(dmamap->dm_segs[i].ds_addr, level, true));
}
if (0 < i) {
/* Posting read. */
- WARN_ON(bus_space_read_8(bst, bsh, 8*(first_entry + i - 1))
+ WARN_ON(gen8_get_pte(bst, bsh, (first_entry + i - 1))
!= gen8_pte_encode(dmamap->dm_segs[i - 1].ds_addr, level,
true));
}
@@ -2212,8 +2242,8 @@ static void gen8_ggtt_clear_range(struct
#ifdef __NetBSD__
CTASSERT(sizeof(gen8_gtt_pte_t) == 8);
for (i = 0; i < num_entries; i++)
- bus_space_write_8(bst, bsh, 8*(first_entry + i), scratch_pte);
- (void)bus_space_read_8(bst, bsh, 8*first_entry);
+ gen8_set_pte(bst, bsh, first_entry + i, scratch_pte);
+ (void)gen8_get_pte(bst, bsh, first_entry);
#else
for (i = 0; i < num_entries; i++)
gen8_set_pte(>t_base[i], scratch_pte);