From bc8ff62bd231458aa397c7079e46db9b0ab36091 Mon Sep 17 00:00:00 2001 From: Dave Airlie Date: Fri, 30 Jan 2009 08:39:30 +0000 Subject: [PATCH] - rebase to 2.4.4 --- .cvsignore | 2 +- i915modeset | 1 - libdrm-radeon-update.patch | 309 +++++++++++++++++++++++++++++++++++++ libdrm.spec | 13 +- sources | 2 +- 5 files changed, 318 insertions(+), 9 deletions(-) delete mode 100644 i915modeset create mode 100644 libdrm-radeon-update.patch diff --git a/.cvsignore b/.cvsignore index 71baad4..098b52e 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1 +1 @@ -libdrm-2.4.3.tar.bz2 +libdrm-2.4.4.tar.bz2 diff --git a/i915modeset b/i915modeset deleted file mode 100644 index 948cd05..0000000 --- a/i915modeset +++ /dev/null @@ -1 +0,0 @@ -install i915 { /bin/grep "i915.modeset=1" /proc/cmdline ; if /usr/bin/test $? = 0 ; then MYASS="modeset=1" ; else MYASS=""; fi ; /sbin/modprobe --ignore-install i915 $MYASS ; } diff --git a/libdrm-radeon-update.patch b/libdrm-radeon-update.patch new file mode 100644 index 0000000..74d3cf3 --- /dev/null +++ b/libdrm-radeon-update.patch @@ -0,0 +1,309 @@ +diff --git a/libdrm/radeon/radeon_bo.h b/libdrm/radeon/radeon_bo.h +index 44dc090..3cabdfc 100644 +--- a/libdrm/radeon/radeon_bo.h ++++ b/libdrm/radeon/radeon_bo.h +@@ -52,6 +52,7 @@ struct radeon_bo { + #endif + void *ptr; + struct radeon_bo_manager *bom; ++ uint32_t space_accounted; + }; + + /* bo functions */ +@@ -66,6 +67,7 @@ struct radeon_bo_funcs { + struct radeon_bo *(*bo_unref)(struct radeon_bo *bo); + int (*bo_map)(struct radeon_bo *bo, int write); + int (*bo_unmap)(struct radeon_bo *bo); ++ int (*bo_wait)(struct radeon_bo *bo); + }; + + struct radeon_bo_manager { +@@ -151,6 +153,14 @@ static inline int _radeon_bo_unmap(struct radeon_bo *bo, + return bo->bom->funcs->bo_unmap(bo); + } + ++static inline int _radeon_bo_wait(struct radeon_bo *bo, ++ const char *file, ++ const char *func, ++ int line) ++{ ++ return bo->bom->funcs->bo_wait(bo); ++} ++ + #define radeon_bo_open(bom, h, s, a, d, f)\ + _radeon_bo_open(bom, h, s, a, d, f, __FILE__, __FUNCTION__, __LINE__) + #define radeon_bo_ref(bo)\ +@@ -163,5 +173,7 @@ static inline int _radeon_bo_unmap(struct radeon_bo *bo, + _radeon_bo_unmap(bo, __FILE__, __FUNCTION__, __LINE__) + #define radeon_bo_debug(bo, opcode)\ + _radeon_bo_debug(bo, opcode, __FILE__, __FUNCTION__, __LINE__) ++#define radeon_bo_wait(bo) \ ++ _radeon_bo_wait(bo, __FILE__, __func__, __LINE__) + + #endif +diff --git a/libdrm/radeon/radeon_bo_gem.c b/libdrm/radeon/radeon_bo_gem.c +index fdf852a..932afeb 100644 +--- a/libdrm/radeon/radeon_bo_gem.c ++++ b/libdrm/radeon/radeon_bo_gem.c +@@ -35,6 +35,7 @@ + #include + #include + #include ++#include + #include "xf86drm.h" + #include "drm.h" + #include "radeon_drm.h" +@@ -176,12 +177,26 @@ static int bo_unmap(struct radeon_bo *bo) + return 0; + } + ++static int bo_wait(struct radeon_bo *bo) ++{ ++ struct drm_radeon_gem_wait_rendering args; ++ int ret; ++ ++ args.handle = bo->handle; ++ do { ++ ret = drmCommandWriteRead(bo->bom->fd, DRM_RADEON_GEM_WAIT_RENDERING, ++ &args, sizeof(args)); ++ } while (ret == -EAGAIN); ++ return ret; ++} ++ + static struct radeon_bo_funcs bo_gem_funcs = { + bo_open, + bo_ref, + bo_unref, + bo_map, +- bo_unmap ++ bo_unmap, ++ bo_wait + }; + + struct radeon_bo_manager *radeon_bo_manager_gem_ctor(int fd) +diff --git a/libdrm/radeon/radeon_cs.h b/libdrm/radeon/radeon_cs.h +index 8b1a999..8b5a2a9 100644 +--- a/libdrm/radeon/radeon_cs.h ++++ b/libdrm/radeon/radeon_cs.h +@@ -33,6 +33,8 @@ + #define RADEON_CS_H + + #include ++#include "drm.h" ++#include "radeon_drm.h" + #include "radeon_bo.h" + + struct radeon_cs_reloc { +@@ -42,6 +44,18 @@ struct radeon_cs_reloc { + uint32_t flags; + }; + ++ ++#define RADEON_CS_SPACE_OK 0 ++#define RADEON_CS_SPACE_OP_TO_BIG 1 ++#define RADEON_CS_SPACE_FLUSH 2 ++ ++struct radeon_cs_space_check { ++ struct radeon_bo *bo; ++ uint32_t read_domains; ++ uint32_t write_domain; ++ uint32_t new_accounted; ++}; ++ + struct radeon_cs_manager; + + struct radeon_cs { +@@ -58,6 +72,7 @@ struct radeon_cs { + const char *section_file; + const char *section_func; + int section_line; ++ + }; + + /* cs functions */ +@@ -84,11 +99,16 @@ struct radeon_cs_funcs { + int (*cs_erase)(struct radeon_cs *cs); + int (*cs_need_flush)(struct radeon_cs *cs); + void (*cs_print)(struct radeon_cs *cs, FILE *file); ++ int (*cs_space_check)(struct radeon_cs *cs, struct radeon_cs_space_check *bos, ++ int num_bo); + }; + + struct radeon_cs_manager { + struct radeon_cs_funcs *funcs; + int fd; ++ uint32_t vram_limit, gart_limit; ++ uint32_t vram_write_used, gart_write_used; ++ uint32_t read_used; + }; + + static inline struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm, +@@ -157,4 +177,19 @@ static inline void radeon_cs_print(struct radeon_cs *cs, FILE *file) + cs->csm->funcs->cs_print(cs, file); + } + ++static inline int radeon_cs_space_check(struct radeon_cs *cs, ++ struct radeon_cs_space_check *bos, ++ int num_bo) ++{ ++ return cs->csm->funcs->cs_space_check(cs, bos, num_bo); ++} ++ ++static inline void radeon_cs_set_limit(struct radeon_cs *cs, uint32_t domain, uint32_t limit) ++{ ++ ++ if (domain == RADEON_GEM_DOMAIN_VRAM) ++ cs->csm->vram_limit = limit; ++ else ++ cs->csm->gart_limit = limit; ++} + #endif +diff --git a/libdrm/radeon/radeon_cs_gem.c b/libdrm/radeon/radeon_cs_gem.c +index bfc5aca..c9cf345 100644 +--- a/libdrm/radeon/radeon_cs_gem.c ++++ b/libdrm/radeon/radeon_cs_gem.c +@@ -229,6 +229,16 @@ static int cs_gem_end(struct radeon_cs *cs, + return 0; + } + ++ ++static void dump_cmdbuf(struct radeon_cs *cs) ++{ ++ int i; ++ for (i = 0; i < cs->cdw; i++){ ++ fprintf(stderr,"%x: %08x\n", i, cs->packets[i]); ++ } ++ ++} ++ + static int cs_gem_emit(struct radeon_cs *cs) + { + struct cs_gem *csg = (struct cs_gem*)cs; +@@ -236,6 +246,7 @@ static int cs_gem_emit(struct radeon_cs *cs) + unsigned i; + int r; + ++ dump_cmdbuf(cs); + csg->chunks[0].length_dw = cs->cdw; + + chunk_array[0] = (uint64_t)(intptr_t)&csg->chunks[0]; +@@ -387,6 +398,97 @@ static void cs_gem_print(struct radeon_cs *cs, FILE *file) + } + } + ++static int cs_gem_check_space(struct radeon_cs *cs, struct radeon_cs_space_check *bos, int num_bo) ++{ ++ struct radeon_cs_manager *csm = cs->csm; ++ int this_op_read = 0, this_op_gart_write = 0, this_op_vram_write = 0; ++ uint32_t read_domains, write_domain; ++ int i; ++ struct radeon_bo *bo; ++ ++ /* check the totals for this operation */ ++ ++ if (num_bo == 0) ++ return 0; ++ ++ /* prepare */ ++ for (i = 0; i < num_bo; i++) { ++ bo = bos[i].bo; ++ ++ bos[i].new_accounted = 0; ++ read_domains = bos[i].read_domains; ++ write_domain = bos[i].write_domain; ++ ++ /* already accounted this bo */ ++ if (write_domain && (write_domain == bo->space_accounted)) ++ continue; ++ ++ if (read_domains && ((read_domains << 16) == bo->space_accounted)) ++ continue; ++ ++ if (bo->space_accounted == 0) { ++ if (write_domain == RADEON_GEM_DOMAIN_VRAM) ++ this_op_vram_write += bo->size; ++ else if (write_domain == RADEON_GEM_DOMAIN_GTT) ++ this_op_gart_write += bo->size; ++ else ++ this_op_read += bo->size; ++ bos[i].new_accounted = (read_domains << 16) | write_domain; ++ } else { ++ uint16_t old_read, old_write; ++ ++ old_read = bo->space_accounted >> 16; ++ old_write = bo->space_accounted & 0xffff; ++ ++ if (write_domain && (old_read & write_domain)) { ++ bos[i].new_accounted = write_domain; ++ /* moving from read to a write domain */ ++ if (write_domain == RADEON_GEM_DOMAIN_VRAM) { ++ this_op_read -= bo->size; ++ this_op_vram_write += bo->size; ++ } else if (write_domain == RADEON_GEM_DOMAIN_VRAM) { ++ this_op_read -= bo->size; ++ this_op_gart_write += bo->size; ++ } ++ } else if (read_domains & old_write) { ++ bos[i].new_accounted = bo->space_accounted & 0xffff; ++ } else { ++ /* rewrite the domains */ ++ if (write_domain != old_write) ++ fprintf(stderr,"WRITE DOMAIN RELOC FAILURE 0x%x %d %d\n", bo->handle, write_domain, old_write); ++ if (read_domains != old_read) ++ fprintf(stderr,"READ DOMAIN RELOC FAILURE 0x%x %d %d\n", bo->handle, read_domains, old_read); ++ return RADEON_CS_SPACE_FLUSH; ++ } ++ } ++ } ++ ++ if (this_op_read < 0) ++ this_op_read = 0; ++ ++ /* check sizes - operation first */ ++ if ((this_op_read + this_op_gart_write > csm->gart_limit) || ++ (this_op_vram_write > csm->vram_limit)) { ++ return RADEON_CS_SPACE_OP_TO_BIG; ++ } ++ ++ if (((csm->vram_write_used + this_op_vram_write) > csm->vram_limit) || ++ ((csm->read_used + csm->gart_write_used + this_op_gart_write + this_op_read) > csm->gart_limit)) { ++ return RADEON_CS_SPACE_FLUSH; ++ } ++ ++ csm->gart_write_used += this_op_gart_write; ++ csm->vram_write_used += this_op_vram_write; ++ csm->read_used += this_op_read; ++ /* commit */ ++ for (i = 0; i < num_bo; i++) { ++ bo = bos[i].bo; ++ bo->space_accounted = bos[i].new_accounted; ++ } ++ ++ return RADEON_CS_SPACE_OK; ++} ++ + static struct radeon_cs_funcs radeon_cs_gem_funcs = { + cs_gem_create, + cs_gem_write_dword, +@@ -397,7 +499,8 @@ static struct radeon_cs_funcs radeon_cs_gem_funcs = { + cs_gem_destroy, + cs_gem_erase, + cs_gem_need_flush, +- cs_gem_print ++ cs_gem_print, ++ cs_gem_check_space, + }; + + struct radeon_cs_manager *radeon_cs_manager_gem_ctor(int fd) +diff --git a/shared-core/radeon_drm.h b/shared-core/radeon_drm.h +index fd26eee..b989649 100644 +--- a/shared-core/radeon_drm.h ++++ b/shared-core/radeon_drm.h +@@ -711,6 +711,7 @@ typedef struct drm_radeon_indirect { + #define RADEON_PARAM_FB_LOCATION 14 /* FB location */ + #define RADEON_PARAM_NUM_GB_PIPES 15 /* num GB pipes */ + #define RADEON_PARAM_KERNEL_MM 16 ++#define RADEON_PARAM_DEVICE_ID 17 + + typedef struct drm_radeon_getparam { + int param; diff --git a/libdrm.spec b/libdrm.spec index 63bc51d..98a50da 100644 --- a/libdrm.spec +++ b/libdrm.spec @@ -2,8 +2,8 @@ Summary: Direct Rendering Manager runtime library Name: libdrm -Version: 2.4.3 -Release: 0.3%{?dist} +Version: 2.4.4 +Release: 1%{?dist} License: MIT Group: System Environment/Libraries URL: http://dri.sourceforge.net @@ -19,7 +19,6 @@ BuildRequires: kernel-headers >= 2.6.27-0.317.rc5.git10.fc10 BuildRequires: libxcb-devel Source2: 91-drm-modeset.rules -Source3: i915modeset #Patch1: libdrm-modesetting.patch Patch2: libdrm-2.4.0-no-freaking-mknod.patch @@ -28,6 +27,7 @@ Patch2: libdrm-2.4.0-no-freaking-mknod.patch Patch3: libdrm-make-dri-perms-okay.patch Patch4: libdrm-2.4.0-no-bc.patch Patch8: libdrm-radeon.patch +Patch9: libdrm-radeon-update.patch %description Direct Rendering Manager runtime library @@ -47,6 +47,7 @@ Direct Rendering Manager development package %patch3 -p1 -b .forceperms %patch4 -p1 -b .no-bc %patch8 -p1 -b .radeon +%patch9 -p1 -b .radeon2 %build autoreconf -v --install || exit 1 @@ -59,8 +60,6 @@ make install DESTDIR=$RPM_BUILD_ROOT # SUBDIRS=libdrm mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d/ install -m 0644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/udev/rules.d/ -mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/modprobe.d/ -install -m 0644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/modprobe.d/ # NOTE: We intentionally don't ship *.la files find $RPM_BUILD_ROOT -type f -name '*.la' | xargs rm -f -- || : @@ -86,7 +85,6 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/libdrm_radeon.so.1 %{_libdir}/libdrm_radeon.so.1.0.0 %{_sysconfdir}/udev/rules.d/91-drm-modeset.rules -%{_sysconfdir}/modprobe.d/i915modeset %files devel %defattr(-,root,root,-) @@ -101,6 +99,9 @@ rm -rf $RPM_BUILD_ROOT %{_libdir}/pkgconfig/libdrm.pc %changelog +* Fri Jan 30 2009 Dave Airlie 2.4.4-1 +- rebase to 2.4.4 + * Mon Dec 22 2008 Dave Airlie 2.4.3-0.3 - radeon: make library name correct diff --git a/sources b/sources index 55c3345..eacf48b 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -e6c89878001cb2c25b2dce411b40eb3a libdrm-2.4.3.tar.bz2 +c183ee614b25f61ea325d57882a2fab2 libdrm-2.4.4.tar.bz2